Skip to content

Commit bae3134

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 abdacec commit bae3134

File tree

1 file changed

+19
-13
lines changed

1 file changed

+19
-13
lines changed

src/libtest/lib.rs

Lines changed: 19 additions & 13 deletions
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(~str)
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) -> ~str {
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 {
@@ -572,7 +578,7 @@ impl<T: Writer> ConsoleTestState<T> {
572578
TrIgnored => "ignored".to_owned(),
573579
TrMetrics(ref mm) => fmt_metrics(mm),
574580
TrBench(ref bs) => fmt_bench_samples(bs)
575-
}, test.name.to_str());
581+
}, test.name.as_slice());
576582
o.write(s.as_bytes())
577583
}
578584
}
@@ -586,7 +592,7 @@ impl<T: Writer> ConsoleTestState<T> {
586592
failures.push(f.name.to_str());
587593
if stdout.len() > 0 {
588594
fail_out.push_str(format!("---- {} stdout ----\n\t",
589-
f.name.to_str()));
595+
f.name.as_slice()));
590596
let output = str::from_utf8_lossy(stdout.as_slice());
591597
fail_out.push_str(output.as_slice().replace("\n", "\n\t"));
592598
fail_out.push_str("\n");
@@ -600,7 +606,7 @@ impl<T: Writer> ConsoleTestState<T> {
600606
try!(self.write_plain("\nfailures:\n"));
601607
failures.as_mut_slice().sort();
602608
for name in failures.iter() {
603-
try!(self.write_plain(format!(" {}\n", name.to_str())));
609+
try!(self.write_plain(format!(" {}\n", name.as_slice())));
604610
}
605611
Ok(())
606612
}
@@ -735,7 +741,7 @@ pub fn run_tests_console(opts: &TestOpts,
735741
TrOk => st.passed += 1,
736742
TrIgnored => st.ignored += 1,
737743
TrMetrics(mm) => {
738-
let tname = test.name.to_str();
744+
let tname = test.name.as_slice();
739745
let MetricMap(mm) = mm;
740746
for (k,v) in mm.iter() {
741747
st.metrics.insert_metric(tname + "." + *k,
@@ -744,7 +750,7 @@ pub fn run_tests_console(opts: &TestOpts,
744750
st.measured += 1
745751
}
746752
TrBench(bs) => {
747-
st.metrics.insert_metric(test.name.to_str(),
753+
st.metrics.insert_metric(test.name.as_slice(),
748754
bs.ns_iter_summ.median,
749755
bs.ns_iter_summ.max - bs.ns_iter_summ.min);
750756
st.measured += 1
@@ -762,12 +768,12 @@ pub fn run_tests_console(opts: &TestOpts,
762768
fn len_if_padded(t: &TestDescAndFn) -> uint {
763769
match t.testfn.padding() {
764770
PadNone => 0u,
765-
PadOnLeft | PadOnRight => t.desc.name.to_str().len(),
771+
PadOnLeft | PadOnRight => t.desc.name.as_slice().len(),
766772
}
767773
}
768774
match tests.iter().max_by(|t|len_if_padded(*t)) {
769775
Some(t) => {
770-
let n = t.desc.name.to_str();
776+
let n = t.desc.name.as_slice();
771777
st.max_name_len = n.len();
772778
},
773779
None => {}
@@ -958,7 +964,7 @@ pub fn filter_tests(
958964
};
959965

960966
// Sort the tests alphabetically
961-
filtered.sort_by(|t1, t2| t1.desc.name.to_str().cmp(&t2.desc.name.to_str()));
967+
filtered.sort_by(|t1, t2| t1.desc.name.as_slice().cmp(&t2.desc.name.as_slice()));
962968

963969
// Shard the remaining tests, if sharding requested.
964970
match opts.test_shard {

0 commit comments

Comments
 (0)