Skip to content

Commit 170c415

Browse files
committed
---
yaml --- r: 4288 b: refs/heads/master c: b8c209c h: refs/heads/master v: v3
1 parent ba9c0da commit 170c415

File tree

2 files changed

+109
-71
lines changed

2 files changed

+109
-71
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 4e6bb137fe89674e8f41f85a56e63444a8608231
2+
refs/heads/master: b8c209cba1038c64dea98d46b35b4bde30316dff

trunk/src/lib/test.rs

Lines changed: 108 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -99,105 +99,143 @@ fn run_tests_console(opts: &test_opts, tests: &test_desc[]) -> bool {
9999
fn run_tests_console_(opts: &test_opts, tests: &test_desc[],
100100
to_task: &test_to_task) -> bool {
101101

102-
let filtered_tests = filter_tests(opts, tests);
103-
104-
let out = io::stdout();
105-
106-
let total = ivec::len(filtered_tests);
107-
out.write_line(#fmt("\nrunning %u tests", total));
108-
109-
let futures = ~[];
110-
111-
let passed = 0u;
112-
let failed = 0u;
113-
let ignored = 0u;
114-
115-
let failures = ~[];
116-
117-
// It's tempting to just spawn all the tests at once but that doesn't
118-
// provide a great user experience because you might sit waiting for the
119-
// result of a particular test for an unusually long amount of time.
120-
let concurrency = get_concurrency();
121-
log #fmt("using %u test tasks", concurrency);
122-
let run_idx = 0u;
123-
let wait_idx = 0u;
124-
125-
while wait_idx < total {
126-
while ivec::len(futures) < concurrency && run_idx < total {
127-
futures += ~[run_test(filtered_tests.(run_idx), to_task)];
128-
run_idx += 1u;
129-
}
130-
131-
let future = futures.(0);
132-
out.write_str(#fmt("running %s ... ", future.test.name));
133-
let result = future.wait();
134-
alt result {
135-
tr_ok. {
136-
passed += 1u;
137-
write_ok(out, concurrency);
138-
out.write_line("");
139-
}
140-
tr_failed. {
141-
failed += 1u;
142-
write_failed(out, concurrency);
143-
out.write_line("");
144-
failures += ~[future.test];
102+
type test_state = @{
103+
out: io::writer,
104+
use_color: bool,
105+
mutable total: uint,
106+
mutable passed: uint,
107+
mutable failed: uint,
108+
mutable ignored: uint,
109+
mutable failures: test_desc[]
110+
};
111+
112+
fn callback(event: testevent, st: test_state) {
113+
alt event {
114+
te_filtered(filtered_tests) {
115+
st.total = ivec::len(filtered_tests);
116+
st.out.write_line(#fmt("\nrunning %u tests", st.total));
145117
}
146-
tr_ignored. {
147-
ignored += 1u;
148-
write_ignored(out, concurrency);
149-
out.write_line("");
118+
te_result(test, result) {
119+
st.out.write_str(#fmt("test %s ... ", test.name));
120+
alt result {
121+
tr_ok. {
122+
st.passed += 1u;
123+
write_ok(st.out, st.use_color);
124+
st.out.write_line("");
125+
}
126+
tr_failed. {
127+
st.failed += 1u;
128+
write_failed(st.out, st.use_color);
129+
st.out.write_line("");
130+
st.failures += ~[test];
131+
}
132+
tr_ignored. {
133+
st.ignored += 1u;
134+
write_ignored(st.out, st.use_color);
135+
st.out.write_line("");
136+
}
137+
}
150138
}
151139
}
152-
futures = ivec::slice(futures, 1u, ivec::len(futures));
153-
wait_idx += 1u;
154140
}
155141

156-
assert (passed + failed + ignored == total);
157-
let success = failed == 0u;
142+
let st = @{
143+
out: io::stdout(),
144+
use_color: use_color(),
145+
mutable total: 0u,
146+
mutable passed: 0u,
147+
mutable failed: 0u,
148+
mutable ignored: 0u,
149+
mutable failures: ~[]
150+
};
151+
152+
run_tests(opts, tests, to_task,
153+
bind callback(_, st));
154+
155+
assert st.passed + st.failed + st.ignored == st.total;
156+
let success = st.failed == 0u;
158157

159158
if !success {
160-
out.write_line("\nfailures:");
161-
for test: test_desc in failures {
162-
out.write_line(#fmt(" %s", test.name));
159+
st.out.write_line("\nfailures:");
160+
for test: test_desc in st.failures {
161+
let testname = test.name; // Satisfy alias analysis
162+
st.out.write_line(#fmt(" %s", testname));
163163
}
164164
}
165165

166-
out.write_str(#fmt("\nresult: "));
166+
st.out.write_str(#fmt("\nresult: "));
167167
if success {
168-
write_ok(out, concurrency);
169-
} else { write_failed(out, concurrency); }
170-
out.write_str(#fmt(". %u passed; %u failed; %u ignored\n\n", passed,
171-
failed, ignored));
168+
write_ok(st.out, st.use_color);
169+
} else { write_failed(st.out, st.use_color); }
170+
st.out.write_str(#fmt(". %u passed; %u failed; %u ignored\n\n",
171+
st.passed, st.failed, st.ignored));
172172

173173
ret success;
174174

175-
fn write_ok(out: &io::writer, concurrency: uint) {
176-
write_pretty(out, "ok", term::color_green, concurrency);
175+
fn write_ok(out: &io::writer, use_color: bool) {
176+
write_pretty(out, "ok", term::color_green, use_color);
177177
}
178178

179-
fn write_failed(out: &io::writer, concurrency: uint) {
180-
write_pretty(out, "FAILED", term::color_red, concurrency);
179+
fn write_failed(out: &io::writer, use_color: bool) {
180+
write_pretty(out, "FAILED", term::color_red, use_color);
181181
}
182182

183-
fn write_ignored(out: &io::writer, concurrency: uint) {
184-
write_pretty(out, "ignored", term::color_yellow, concurrency);
183+
fn write_ignored(out: &io::writer, use_color: bool) {
184+
write_pretty(out, "ignored", term::color_yellow, use_color);
185185
}
186186

187187
fn write_pretty(out: &io::writer, word: &str, color: u8,
188-
concurrency: uint) {
189-
// In the presence of concurrency, outputing control characters
190-
// can cause some crazy artifacting
191-
if concurrency == 1u && term::color_supported() {
188+
use_color: bool) {
189+
if use_color && term::color_supported() {
192190
term::fg(out.get_buf_writer(), color);
193191
}
194192
out.write_str(word);
195-
if concurrency == 1u && term::color_supported() {
193+
if use_color && term::color_supported() {
196194
term::reset(out.get_buf_writer());
197195
}
198196
}
199197
}
200198

199+
fn use_color() -> bool {
200+
ret get_concurrency() == 1u;
201+
}
202+
203+
tag testevent {
204+
te_filtered(test_desc[]);
205+
te_result(test_desc, test_result);
206+
}
207+
208+
fn run_tests(opts: &test_opts, tests: &test_desc[],
209+
to_task: &test_to_task, callback: fn(testevent)) {
210+
211+
let filtered_tests = filter_tests(opts, tests);
212+
213+
callback(te_filtered(filtered_tests));
214+
215+
// It's tempting to just spawn all the tests at once but that doesn't
216+
// provide a great user experience because you might sit waiting for the
217+
// result of a particular test for an unusually long amount of time.
218+
let concurrency = get_concurrency();
219+
log #fmt("using %u test tasks", concurrency);
220+
let total = ivec::len(filtered_tests);
221+
let run_idx = 0u;
222+
let wait_idx = 0u;
223+
let futures = ~[];
224+
225+
while wait_idx < total {
226+
while ivec::len(futures) < concurrency && run_idx < total {
227+
futures += ~[run_test(filtered_tests.(run_idx), to_task)];
228+
run_idx += 1u;
229+
}
230+
231+
let future = futures.(0);
232+
let result = future.wait();
233+
callback(te_result(future.test, result));
234+
futures = ivec::slice(futures, 1u, ivec::len(futures));
235+
wait_idx += 1u;
236+
}
237+
}
238+
201239
fn get_concurrency() -> uint {
202240
alt getenv("RUST_THREADS") {
203241
option::some(t) {

0 commit comments

Comments
 (0)