1- use super :: event:: CaseComplete ;
1+ use super :: event:: CaseMessage ;
22use super :: Event ;
33use super :: RunStatus ;
44use super :: FAILED ;
@@ -11,14 +11,14 @@ pub(crate) struct Summary {
1111 /// filter-in pattern or by `--skip` arguments).
1212 num_filtered_out : usize ,
1313
14- status : std:: collections:: HashMap < String , CaseComplete > ,
14+ status : std:: collections:: HashMap < String , CaseStatus > ,
1515 elapsed_s : Option < super :: Elapsed > ,
1616}
1717
1818impl Summary {
1919 pub ( crate ) fn get_status ( & self , name : & str ) -> Option < RunStatus > {
20- let event = self . status . get ( name) ?;
21- event . status
20+ let status = self . status . get ( name) ?;
21+ find_run_status ( status)
2222 }
2323
2424 pub ( crate ) fn write_start ( & self , writer : & mut dyn std:: io:: Write ) -> std:: io:: Result < ( ) > {
@@ -34,12 +34,27 @@ impl Summary {
3434 let mut num_failed = 0 ;
3535 let mut num_ignored = 0 ;
3636 let mut failures = std:: collections:: BTreeMap :: new ( ) ;
37- for event in self . status . values ( ) {
38- match event. status {
37+ for ( name, case_status) in & self . status {
38+ let mut status = find_run_status ( case_status) ;
39+ if !case_status. started {
40+ // Even override `Ignored`
41+ status = Some ( RunStatus :: Failed ) ;
42+ failures. insert ( name, Some ( "test found that never started" ) ) ;
43+ }
44+ if !case_status. completed {
45+ // Even override `Ignored`
46+ status = Some ( RunStatus :: Failed ) ;
47+ failures. insert ( name, Some ( "test never completed" ) ) ;
48+ }
49+ match status {
3950 Some ( RunStatus :: Ignored ) => num_ignored += 1 ,
4051 Some ( RunStatus :: Failed ) => {
4152 num_failed += 1 ;
42- failures. insert ( & event. name , & event. message ) ;
53+ for event in & case_status. messages {
54+ if Some ( event. status ) == status {
55+ failures. insert ( name, event. message . as_deref ( ) ) ;
56+ }
57+ }
4358 }
4459 None => num_passed += 1 ,
4560 }
@@ -106,9 +121,30 @@ impl super::Notifier for Summary {
106121 }
107122 Event :: DiscoverComplete ( _) => { }
108123 Event :: RunStart ( _) => { }
109- Event :: CaseStart ( _) => { }
124+ Event :: CaseStart ( inner) => {
125+ self . status . entry ( inner. name ) . or_default ( ) . started = true ;
126+ }
127+ Event :: CaseMessage ( inner) => {
128+ self . status
129+ . entry ( inner. name . clone ( ) )
130+ . or_default ( )
131+ . messages
132+ . push ( inner) ;
133+ }
110134 Event :: CaseComplete ( inner) => {
111- self . status . insert ( inner. name . clone ( ) , inner) ;
135+ if let Some ( status) = inner. status {
136+ self . status
137+ . entry ( inner. name . clone ( ) )
138+ . or_default ( )
139+ . messages
140+ . push ( CaseMessage {
141+ name : inner. name . clone ( ) ,
142+ status,
143+ message : inner. message . clone ( ) ,
144+ elapsed_s : inner. elapsed_s ,
145+ } ) ;
146+ }
147+ self . status . entry ( inner. name ) . or_default ( ) . completed = true ;
112148 }
113149 Event :: RunComplete ( inner) => {
114150 self . elapsed_s = inner. elapsed_s ;
@@ -117,3 +153,23 @@ impl super::Notifier for Summary {
117153 Ok ( ( ) )
118154 }
119155}
156+
157+ fn find_run_status ( case_status : & CaseStatus ) -> Option < RunStatus > {
158+ let mut status = None ;
159+ for event in & case_status. messages {
160+ status = match ( status, event. status ) {
161+ ( None , _) => Some ( event. status ) ,
162+ ( Some ( RunStatus :: Ignored ) , _) => status,
163+ ( _, RunStatus :: Ignored ) => Some ( event. status ) ,
164+ ( Some ( RunStatus :: Failed ) , _) => status,
165+ }
166+ }
167+ status
168+ }
169+
170+ #[ derive( Default , Clone , Debug ) ]
171+ struct CaseStatus {
172+ messages : Vec < CaseMessage > ,
173+ started : bool ,
174+ completed : bool ,
175+ }
0 commit comments