From 64d43be6471b682037fb1dce13cdb3ea14ddc983 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Sat, 16 Jul 2011 17:04:20 -0700 Subject: [PATCH] Sort tests before running them. Issue #428 --- src/lib/test.rs | 12 +++++++++++ src/test/stdtest/test.rs | 45 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) 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 write_pretty(&io::writer out, &str word, u8 color) { 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 = test.fn, 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 = fn() {}, 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; -- GitLab