Skip to content

Commit 23d1520

Browse files
committed
Support running a subset of tests from the command line. Issue #428
1 parent 94e1b36 commit 23d1520

File tree

1 file changed

+36
-4
lines changed

1 file changed

+36
-4
lines changed

src/lib/test.rs

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,24 +28,37 @@ type test_desc = rec(test_name name,
2828
// The default console test runner. It accepts the command line
2929
// arguments and a vector of test_descs (generated at compile time).
3030
fn test_main(&vec[str] args, &test_desc[] tests) -> int {
31-
if (run_tests(tests)) {
31+
if (run_tests(parse_opts(args), tests)) {
3232
ret 0;
3333
} else {
3434
ret -1;
3535
}
3636
}
3737

38-
fn run_tests(&test_desc[] tests) -> bool {
38+
type test_opts = rec(option::t[str] filter);
39+
40+
fn parse_opts(&vec[str] args) -> test_opts {
41+
rec(filter = if (vec::len(args) > 1u) {
42+
option::some(args.(1))
43+
} else {
44+
option::none
45+
})
46+
}
47+
48+
// A simple console test runner
49+
fn run_tests(&test_opts opts, &test_desc[] tests) -> bool {
50+
51+
auto filtered_tests = filter_tests(opts, tests);
3952

4053
auto out = io::stdout();
4154

42-
auto total = ivec::len(tests);
55+
auto total = ivec::len(filtered_tests);
4356
out.write_line(#fmt("running %u tests", total));
4457

4558
auto passed = 0u;
4659
auto failed = 0u;
4760

48-
for (test_desc test in tests) {
61+
for (test_desc test in filtered_tests) {
4962
out.write_str(#fmt("running %s ... ", test.name));
5063
if (run_test(test)) {
5164
passed += 1u;
@@ -91,6 +104,25 @@ fn run_tests(&test_desc[] tests) -> bool {
91104
}
92105
}
93106

107+
fn filter_tests(&test_opts opts, &test_desc[] tests) -> test_desc[] {
108+
if (option::is_none(opts.filter)) {
109+
ret tests;
110+
}
111+
112+
auto filter_str = alt opts.filter { option::some(?f) { f }
113+
option::none { "" } };
114+
115+
auto filter = bind fn(&test_desc test,
116+
str filter_str) -> option::t[test_desc] {
117+
if (str::find(test.name, filter_str) >= 0) {
118+
ret option::some(test);
119+
} else {
120+
ret option::none;
121+
}
122+
} (_, filter_str);
123+
124+
ret ivec::filter_map(filter, tests);
125+
}
94126

95127

96128
// Local Variables:

0 commit comments

Comments
 (0)