@@ -102,13 +102,44 @@ type console_test_state =
102
102
fn run_tests_console( opts: test_opts,
103
103
tests: [ test_desc] ) -> bool {
104
104
105
- fn callback( event: testevent, st: console_test_state) {
106
- alt event {
105
+ let log_out = alt opts. logfile {
106
+ some( path) {
107
+ alt io:: file_writer( path, [ io:: create, io:: truncate] ) {
108
+ result:: ok( w) { some( w) }
109
+ result:: err( s) {
110
+ fail( #fmt( "can't open output file: %s" , s) )
111
+ }
112
+ }
113
+ }
114
+ none { none }
115
+ } ;
116
+
117
+ let st =
118
+ @{ out: io:: stdout ( ) ,
119
+ log_out: log_out,
120
+ use_color: use_color ( ) ,
121
+ mut total: 0 u,
122
+ mut passed: 0 u,
123
+ mut failed: 0 u,
124
+ mut ignored: 0 u,
125
+ mut failures: [ ] } ;
126
+
127
+ let p = comm:: port :: < testevent > ( ) ;
128
+ let reporter = comm:: chan ( p) ;
129
+
130
+ task:: spawn { ||
131
+ run_tests ( opts, tests, reporter) ;
132
+ } ;
133
+
134
+ while true {
135
+ alt comm:: recv ( p) {
107
136
te_filtered ( filtered_tests) {
108
137
st. total = vec:: len ( filtered_tests) ;
109
138
st. out . write_line ( #fmt[ "\n running %u tests" , st. total ] ) ;
110
139
}
111
- te_wait( test) { st. out. write_str( #fmt[ "test %s ... " , test. name] ) ; }
140
+ te_wait ( test) {
141
+ st. out . write_str ( #fmt[ "test %s ... " , test. name ] ) ;
142
+ }
112
143
te_result ( test, result) {
113
144
alt st. log_out {
114
145
some ( f) {
@@ -135,33 +166,12 @@ fn run_tests_console(opts: test_opts,
135
166
}
136
167
}
137
168
}
169
+ te_done {
170
+ break ;
171
+ }
138
172
}
139
173
}
140
174
141
- let log_out = alt opts. logfile {
142
- some ( path) {
143
- alt io:: file_writer ( path, [ io:: create, io:: truncate] ) {
144
- result:: ok ( w) { some ( w) }
145
- result:: err ( s) {
146
- fail ( #fmt ( "can't open output file: %s" , s) )
147
- }
148
- }
149
- }
150
- none { none }
151
- } ;
152
-
153
- let st =
154
- @{ out: io:: stdout ( ) ,
155
- log_out: log_out,
156
- use_color: use_color ( ) ,
157
- mut total: 0 u,
158
- mut passed: 0 u,
159
- mut failed: 0 u,
160
- mut ignored: 0 u,
161
- mut failures: [ ] } ;
162
-
163
- run_tests ( opts, tests, bind callback ( _, st) ) ;
164
-
165
175
assert ( st. passed + st. failed + st. ignored == st. total ) ;
166
176
let success = st. failed == 0 u;
167
177
@@ -171,7 +181,6 @@ fn run_tests_console(opts: test_opts,
171
181
172
182
st. out . write_str ( #fmt[ "\n result: " ] ) ;
173
183
if success {
174
- // There's no parallelism at this point so it's safe to use color
175
184
write_ok ( st. out , true ) ;
176
185
} else { write_failed ( st. out , true ) ; }
177
186
st. out . write_str ( #fmt[ ". %u passed; %u failed; %u ignored\n \n " , st. passed ,
@@ -264,15 +273,16 @@ enum testevent {
264
273
te_filtered( [ test_desc ] ) ,
265
274
te_wait( test_desc ) ,
266
275
te_result( test_desc , test_result ) ,
276
+ te_done,
267
277
}
268
278
269
279
type monitor_msg = ( test_desc , test_result ) ;
270
280
271
281
fn run_tests ( opts : test_opts , tests : [ test_desc ] ,
272
- callback : fn @ ( testevent ) ) {
282
+ reporter : comm :: chan < testevent > ) {
273
283
274
284
let mut filtered_tests = filter_tests ( opts, tests) ;
275
- callback ( te_filtered ( filtered_tests) ) ;
285
+ comm :: send ( reporter , te_filtered ( filtered_tests) ) ;
276
286
277
287
// It's tempting to just spawn all the tests at once, but since we have
278
288
// many tests that run in other processes we would be making a big mess.
@@ -294,7 +304,7 @@ fn run_tests(opts: test_opts, tests: [test_desc],
294
304
// We are doing one test at a time so we can print the name
295
305
// of the test before we run it. Useful for debugging tests
296
306
// that hang forever.
297
- callback ( te_wait ( test) ) ;
307
+ comm :: send ( reporter , te_wait ( test) ) ;
298
308
}
299
309
run_test ( test, ch) ;
300
310
wait_idx += 1 u;
@@ -303,12 +313,13 @@ fn run_tests(opts: test_opts, tests: [test_desc],
303
313
304
314
let ( test, result) = comm:: recv ( p) ;
305
315
if concurrency != 1 u {
306
- callback ( te_wait ( test) ) ;
316
+ comm :: send ( reporter , te_wait ( test) ) ;
307
317
}
308
- callback ( te_result ( test, result) ) ;
318
+ comm :: send ( reporter , te_result ( test, result) ) ;
309
319
wait_idx -= 1 u;
310
320
done_idx += 1 u;
311
321
}
322
+ comm:: send ( reporter, te_done) ;
312
323
}
313
324
314
325
// Windows tends to dislike being overloaded with threads.
0 commit comments