Skip to content

Commit 2f0f017

Browse files
committed
test: implement a no-alloc -> &str method for TestName.
This is far cheaper than the `.to_str` technique that was used previously.
1 parent fedffa7 commit 2f0f017

File tree

1 file changed

+19
-13
lines changed

1 file changed

+19
-13
lines changed

src/libtest/lib.rs

+19-13
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ use term::color::{Color, RED, YELLOW, GREEN, CYAN};
5353
use std::cmp;
5454
use std::f64;
5555
use std::fmt;
56+
use std::fmt::Show;
5657
use std::from_str::FromStr;
5758
use std::io::stdio::StdWriter;
5859
use std::io::{File, ChanReader, ChanWriter};
@@ -85,22 +86,27 @@ pub enum TestName {
8586
StaticTestName(&'static str),
8687
DynTestName(StrBuf)
8788
}
88-
impl fmt::Show for TestName {
89-
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
89+
impl TestName {
90+
fn as_slice<'a>(&'a self) -> &'a str {
9091
match *self {
91-
StaticTestName(s) => f.buf.write_str(s),
92-
DynTestName(ref s) => f.buf.write_str(s.as_slice()),
92+
StaticTestName(s) => s,
93+
DynTestName(ref s) => s.as_slice()
9394
}
9495
}
9596
}
97+
impl Show for TestName {
98+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
99+
self.as_slice().fmt(f)
100+
}
101+
}
96102

97103
#[deriving(Clone)]
98104
enum NamePadding { PadNone, PadOnLeft, PadOnRight }
99105

100106
impl TestDesc {
101107
fn padded_name(&self, column_count: uint, align: NamePadding) -> StrBuf {
102108
use std::num::Saturating;
103-
let mut name = StrBuf::from_str(self.name.to_str());
109+
let mut name = StrBuf::from_str(self.name.as_slice());
104110
let fill = column_count.saturating_sub(name.len());
105111
let mut pad = StrBuf::from_owned_str(" ".repeat(fill));
106112
match align {
@@ -590,7 +596,7 @@ impl<T: Writer> ConsoleTestState<T> {
590596
TrIgnored => "ignored".to_strbuf(),
591597
TrMetrics(ref mm) => fmt_metrics(mm),
592598
TrBench(ref bs) => fmt_bench_samples(bs)
593-
}, test.name.to_str());
599+
}, test.name.as_slice());
594600
o.write(s.as_bytes())
595601
}
596602
}
@@ -604,7 +610,7 @@ impl<T: Writer> ConsoleTestState<T> {
604610
failures.push(f.name.to_str());
605611
if stdout.len() > 0 {
606612
fail_out.push_str(format!("---- {} stdout ----\n\t",
607-
f.name.to_str()));
613+
f.name.as_slice()));
608614
let output = str::from_utf8_lossy(stdout.as_slice());
609615
fail_out.push_str(output.as_slice().replace("\n", "\n\t"));
610616
fail_out.push_str("\n");
@@ -618,7 +624,7 @@ impl<T: Writer> ConsoleTestState<T> {
618624
try!(self.write_plain("\nfailures:\n"));
619625
failures.as_mut_slice().sort();
620626
for name in failures.iter() {
621-
try!(self.write_plain(format!(" {}\n", name.to_str())));
627+
try!(self.write_plain(format!(" {}\n", name.as_slice())));
622628
}
623629
Ok(())
624630
}
@@ -753,7 +759,7 @@ pub fn run_tests_console(opts: &TestOpts,
753759
TrOk => st.passed += 1,
754760
TrIgnored => st.ignored += 1,
755761
TrMetrics(mm) => {
756-
let tname = test.name.to_str();
762+
let tname = test.name.as_slice();
757763
let MetricMap(mm) = mm;
758764
for (k,v) in mm.iter() {
759765
st.metrics
@@ -764,7 +770,7 @@ pub fn run_tests_console(opts: &TestOpts,
764770
st.measured += 1
765771
}
766772
TrBench(bs) => {
767-
st.metrics.insert_metric(test.name.to_str(),
773+
st.metrics.insert_metric(test.name.as_slice(),
768774
bs.ns_iter_summ.median,
769775
bs.ns_iter_summ.max - bs.ns_iter_summ.min);
770776
st.measured += 1
@@ -782,12 +788,12 @@ pub fn run_tests_console(opts: &TestOpts,
782788
fn len_if_padded(t: &TestDescAndFn) -> uint {
783789
match t.testfn.padding() {
784790
PadNone => 0u,
785-
PadOnLeft | PadOnRight => t.desc.name.to_str().len(),
791+
PadOnLeft | PadOnRight => t.desc.name.as_slice().len(),
786792
}
787793
}
788794
match tests.iter().max_by(|t|len_if_padded(*t)) {
789795
Some(t) => {
790-
let n = t.desc.name.to_str();
796+
let n = t.desc.name.as_slice();
791797
st.max_name_len = n.len();
792798
},
793799
None => {}
@@ -980,7 +986,7 @@ pub fn filter_tests(
980986
};
981987

982988
// Sort the tests alphabetically
983-
filtered.sort_by(|t1, t2| t1.desc.name.to_str().cmp(&t2.desc.name.to_str()));
989+
filtered.sort_by(|t1, t2| t1.desc.name.as_slice().cmp(&t2.desc.name.as_slice()));
984990

985991
// Shard the remaining tests, if sharding requested.
986992
match opts.test_shard {

0 commit comments

Comments
 (0)