about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/lib/test.rs12
-rw-r--r--src/test/stdtest/test.rs45
2 files changed, 57 insertions, 0 deletions
diff --git a/src/lib/test.rs b/src/lib/test.rs
index f9917ba283d..57ff0c308a2 100644
--- a/src/lib/test.rs
+++ b/src/lib/test.rs
@@ -3,6 +3,8 @@
 // simplest interface possible for representing and running tests
 // while providing a base that other test frameworks may build off of.
 
+import sort = sort::ivector;
+
 export test_name;
 export test_fn;
 export test_desc;
@@ -165,6 +167,7 @@ fn run_tests(&test_opts opts, &test_desc[] tests) -> bool {
 fn filter_tests(&test_opts opts, &test_desc[] tests) -> test_desc[] {
     auto filtered = tests;
 
+    // Remove tests that don't match the test filter
     filtered = if (option::is_none(opts.filter)) {
         filtered
     } else {
@@ -183,6 +186,7 @@ fn filter_tests(&test_opts opts, &test_desc[] tests) -> test_desc[] {
         ivec::filter_map(filter, filtered)
     };
 
+    // Maybe pull out the ignored test and unignore them
     filtered = if (!opts.run_ignored) {
         filtered
     } else {
@@ -199,6 +203,14 @@ fn filter_tests(&test_opts opts, &test_desc[] tests) -> test_desc[] {
         ivec::filter_map(filter, filtered)
     };
 
+    // Sort the tests alphabetically
+    filtered = {
+        fn lteq(&test_desc t1, &test_desc t2) -> bool {
+            str::lteq(t1.name, t2.name)
+        }
+        sort::merge_sort(lteq, filtered)
+    };
+
     ret filtered;
 }
 
diff --git a/src/test/stdtest/test.rs b/src/test/stdtest/test.rs
index f2d8df4e4ed..8ef20ece2db 100644
--- a/src/test/stdtest/test.rs
+++ b/src/test/stdtest/test.rs
@@ -66,6 +66,51 @@ fn filter_for_ignored_option() {
     assert filtered.(0).ignore == false;
 }
 
+#[test]
+fn sort_tests() {
+    auto opts = rec(filter = option::none,
+                    run_ignored = false);
+
+    auto names = ~["sha1::test",
+                   "int::test_to_str",
+                   "int::test_pow",
+                   "test::do_not_run_ignored_tests",
+                   "test::ignored_tests_result_in_ignored",
+                   "test::first_free_arg_should_be_a_filter",
+                   "test::parse_ignored_flag",
+                   "test::filter_for_ignored_option",
+                   "test::sort_tests"];
+    auto tests = {
+        auto testfn = fn() {};
+        auto tests = ~[];
+        for (str name in names) {
+            auto test = rec(name = name,
+                            fn = testfn,
+                            ignore = false);
+            tests += ~[test];
+        }
+        tests
+    };
+    auto filtered = test::filter_tests(opts, tests);
+
+    auto expected = ~["int::test_pow",
+                      "int::test_to_str",
+                      "sha1::test",
+                      "test::do_not_run_ignored_tests",
+                      "test::filter_for_ignored_option",
+                      "test::first_free_arg_should_be_a_filter",
+                      "test::ignored_tests_result_in_ignored",
+                      "test::parse_ignored_flag",
+                      "test::sort_tests"];
+
+    auto pairs = ivec::zip(expected, filtered);
+
+    for (tup(str, test::test_desc) p in pairs) {
+        log_err #fmt("e: %s a: %s", p._0, p._1.name);
+        assert p._0 == p._1.name;
+    }
+}
+
 // Local Variables:
 // mode: rust;
 // fill-column: 78;