about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-03-12 17:31:03 -0700
committerBrian Anderson <banderson@mozilla.com>2012-03-12 17:31:17 -0700
commitd60813146d883d2b364817c2e5b6fd538b4b7819 (patch)
tree73552487ba5a2dffb9ae74f973fbc53883e4325d /src/libstd
parent59a56ad043d30d69f7c14dea1abeda2899fd1f28 (diff)
downloadrust-d60813146d883d2b364817c2e5b6fd538b4b7819.tar.gz
rust-d60813146d883d2b364817c2e5b6fd538b4b7819.zip
std: Sort test failures. Closes #1929
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/test.rs72
1 files changed, 57 insertions, 15 deletions
diff --git a/src/libstd/test.rs b/src/libstd/test.rs
index d8d14df667a..a82ec1e668f 100644
--- a/src/libstd/test.rs
+++ b/src/libstd/test.rs
@@ -85,20 +85,20 @@ fn parse_opts(args: [str]) -> opt_res {
 
 enum test_result { tr_ok, tr_failed, tr_ignored, }
 
+type console_test_state =
+    @{out: io::writer,
+      use_color: bool,
+      mutable total: uint,
+      mutable passed: uint,
+      mutable failed: uint,
+      mutable ignored: uint,
+      mutable failures: [test_desc]};
+
 // A simple console test runner
 fn run_tests_console(opts: test_opts,
                      tests: [test_desc]) -> bool {
 
-    type test_state =
-        @{out: io::writer,
-          use_color: bool,
-          mutable total: uint,
-          mutable passed: uint,
-          mutable failed: uint,
-          mutable ignored: uint,
-          mutable failures: [test_desc]};
-
-    fn callback(event: testevent, st: test_state) {
+    fn callback(event: testevent, st: console_test_state) {
         alt event {
           te_filtered(filtered_tests) {
             st.total = vec::len(filtered_tests);
@@ -143,11 +143,7 @@ fn run_tests_console(opts: test_opts,
     let success = st.failed == 0u;
 
     if !success {
-        st.out.write_line("\nfailures:");
-        for test: test_desc in st.failures {
-            let testname = test.name; // Satisfy alias analysis
-            st.out.write_line(#fmt["    %s", testname]);
-        }
+        print_failures(st);
     }
 
     st.out.write_str(#fmt["\nresult: "]);
@@ -183,6 +179,52 @@ fn run_tests_console(opts: test_opts,
     }
 }
 
+fn print_failures(st: console_test_state) {
+    st.out.write_line("\nfailures:");
+    let failures = vec::map(copy st.failures) {|test| test.name};
+    let failures = sort::merge_sort(str::le, failures);
+    for name in failures {
+        st.out.write_line(#fmt["    %s", name]);
+    }
+}
+
+#[test]
+fn should_sort_failures_before_printing_them() {
+    let buffer = io::mk_mem_buffer();
+    let writer = io::mem_buffer_writer(buffer);
+
+    let test_a = {
+        name: "a",
+        fn: fn~() { },
+        ignore: false,
+        should_fail: false
+    };
+
+    let test_b = {
+        name: "b",
+        fn: fn~() { },
+        ignore: false,
+        should_fail: false
+    };
+
+    let st =
+        @{out: writer,
+          use_color: false,
+          mutable total: 0u,
+          mutable passed: 0u,
+          mutable failed: 0u,
+          mutable ignored: 0u,
+          mutable failures: [test_b, test_a]};
+
+    print_failures(st);
+
+    let s = io::mem_buffer_str(buffer);
+
+    let apos = option::get(str::find_str(s, "a"));
+    let bpos = option::get(str::find_str(s, "b"));
+    assert apos < bpos;
+}
+
 fn use_color() -> bool { ret get_concurrency() == 1u; }
 
 enum testevent {