@@ -85,20 +85,20 @@ fn parse_opts(args: [str]) -> opt_res {
85
85
86
86
enum test_result { tr_ok, tr_failed, tr_ignored, }
87
87
88
+ type console_test_state =
89
+ @{ out : io:: writer,
90
+ use_color : bool,
91
+ mutable total: uint,
92
+ mutable passed: uint,
93
+ mutable failed: uint,
94
+ mutable ignored : uint,
95
+ mutable failures : [ test_desc] } ;
96
+
88
97
// A simple console test runner
89
98
fn run_tests_console( opts: test_opts,
90
99
tests: [ test_desc] ) -> bool {
91
100
92
- type test_state =
93
- @{ out : io:: writer,
94
- use_color : bool,
95
- mutable total: uint,
96
- mutable passed: uint,
97
- mutable failed: uint,
98
- mutable ignored : uint,
99
- mutable failures : [ test_desc] } ;
100
-
101
- fn callback( event: testevent, st: test_state) {
101
+ fn callback( event: testevent, st: console_test_state) {
102
102
alt event {
103
103
te_filtered( filtered_tests) {
104
104
st. total = vec:: len( filtered_tests) ;
@@ -143,11 +143,7 @@ fn run_tests_console(opts: test_opts,
143
143
let success = st. failed == 0 u;
144
144
145
145
if !success {
146
- st. out . write_line ( "\n failures:" ) ;
147
- for test: test_desc in st. failures {
148
- let testname = test. name ; // Satisfy alias analysis
149
- st. out . write_line ( #fmt[ " %s" , testname] ) ;
150
- }
146
+ print_failures ( st) ;
151
147
}
152
148
153
149
st. out . write_str ( #fmt[ "\n result: " ] ) ;
@@ -183,6 +179,52 @@ fn run_tests_console(opts: test_opts,
183
179
}
184
180
}
185
181
182
+ fn print_failures ( st : console_test_state ) {
183
+ st. out . write_line ( "\n failures:" ) ;
184
+ let failures = vec:: map ( copy st. failures ) { |test| test. name } ;
185
+ let failures = sort:: merge_sort ( str:: le, failures) ;
186
+ for name in failures {
187
+ st. out . write_line ( #fmt[ " %s" , name] ) ;
188
+ }
189
+ }
190
+
191
+ #[ test]
192
+ fn should_sort_failures_before_printing_them( ) {
193
+ let buffer = io:: mk_mem_buffer ( ) ;
194
+ let writer = io:: mem_buffer_writer ( buffer) ;
195
+
196
+ let test_a = {
197
+ name: "a" ,
198
+ fn : fn ~( ) { } ,
199
+ ignore: false ,
200
+ should_fail: false
201
+ } ;
202
+
203
+ let test_b = {
204
+ name: "b",
205
+ fn: fn~() { },
206
+ ignore: false,
207
+ should_fail: false
208
+ };
209
+
210
+ let st =
211
+ @{out: writer,
212
+ use_color: false,
213
+ mutable total: 0u,
214
+ mutable passed: 0u,
215
+ mutable failed: 0u,
216
+ mutable ignored: 0u,
217
+ mutable failures: [test_b, test_a]};
218
+
219
+ print_failures(st);
220
+
221
+ let s = io::mem_buffer_str(buffer);
222
+
223
+ let apos = option::get(str::find_str(s, " a") ) ;
224
+ let bpos = option:: get ( str:: find_str ( s, "b" ) ) ;
225
+ assert apos < bpos;
226
+ }
227
+
186
228
fn use_color ( ) -> bool { ret get_concurrency ( ) == 1 u; }
187
229
188
230
enum testevent {
0 commit comments