@@ -20,6 +20,10 @@ mod test;
2020mod translator;
2121mod yaml;
2222
23+ use tabled:: {
24+ settings:: { object:: Rows , Border , Style } ,
25+ Table , Tabled ,
26+ } ;
2327use yaml:: YAMLParser ;
2428
2529#[ derive( Debug , Subcommand ) ]
@@ -46,9 +50,6 @@ enum Commands {
4650 /// Only show a summary of the test results
4751 #[ arg( short, long) ]
4852 summary : bool ,
49- /// Instead of printing all the failures only list the YAML files where a test failed
50- #[ arg( short, long) ]
51- list : bool ,
5253 /// YAML document(s) that specify the tests
5354 #[ arg( required = true ) ]
5455 yaml_files : Vec < PathBuf > ,
@@ -139,47 +140,98 @@ fn parse_line(line: String) {
139140 }
140141}
141142
142- fn percentage ( n : usize , total : usize ) -> String {
143- let n = n as f32 ;
144- let total = total as f32 ;
145- let result = ( n * 100.0 ) / total;
146- format ! ( "{:.1}%" , result)
143+ #[ derive( Tabled , Default ) ]
144+ #[ tabled( rename_all = "PascalCase" ) ]
145+ struct YAMLTestResult {
146+ #[ tabled( rename = "YAML File" ) ]
147+ yaml_file : String ,
148+ tests : usize ,
149+ #[ tabled( display_with( "Self::display_successes" , self ) ) ]
150+ successes : usize ,
151+ #[ tabled( display_with( "Self::display_failures" , self ) ) ]
152+ failures : usize ,
153+ #[ tabled(
154+ rename = "Expected\n Failures" ,
155+ display_with( "Self::display_expected" , self )
156+ ) ]
157+ expected_failures : usize ,
158+ #[ tabled(
159+ rename = "Unexpected\n Successes" ,
160+ display_with( "Self::display_unexpected" , self )
161+ ) ]
162+ unexpected_successes : usize ,
163+ }
164+
165+ fn percent ( n : usize , total : usize ) -> f64 {
166+ ( n as f64 * 100.0 ) / total as f64
147167}
148168
149- fn print_check_row ( label : & str , occurences : usize , total : usize ) {
150- println ! (
151- "{} {} [{}]" ,
152- occurences,
153- label,
154- percentage( occurences, total)
155- ) ;
169+ impl YAMLTestResult {
170+ fn display_successes ( & self ) -> String {
171+ format ! ( "{:.1}%" , percent( self . successes, self . tests) )
172+ }
173+ fn display_failures ( & self ) -> String {
174+ format ! ( "{:.1}%" , percent( self . failures, self . tests) )
175+ }
176+ fn display_expected ( & self ) -> String {
177+ format ! ( "{:.1}%" , percent( self . expected_failures, self . tests) )
178+ }
179+ fn display_unexpected ( & self ) -> String {
180+ format ! ( "{:.1}%" , percent( self . unexpected_successes, self . tests) )
181+ }
182+ fn update (
183+ & mut self ,
184+ tests : usize ,
185+ successes : usize ,
186+ failures : usize ,
187+ expected_failures : usize ,
188+ unexpected_successes : usize ,
189+ ) {
190+ self . tests += tests;
191+ self . successes += successes;
192+ self . failures += failures;
193+ self . expected_failures += expected_failures;
194+ self . unexpected_successes += unexpected_successes;
195+ }
156196}
157197
158- fn check_yaml ( paths : Vec < PathBuf > , summary : bool , list : bool ) {
159- let mut total = 0 ;
160- let mut successes = 0 ;
161- let mut failures = 0 ;
162- let mut expected_failures = 0 ;
163- let mut unexpected_successes = 0 ;
198+ fn check_yaml ( paths : Vec < PathBuf > , summary : bool ) {
199+ let mut total = YAMLTestResult :: default ( ) ;
200+ let mut yaml_results: Vec < YAMLTestResult > = Vec :: new ( ) ;
164201 for path in paths {
165202 match File :: open ( & path) {
166203 Ok ( file) => match YAMLParser :: new ( file) {
167204 Ok ( mut parser) => match parser. yaml ( ) {
168205 Ok ( test_results) => {
169- total + = test_results. len ( ) ;
170- successes + = test_results. iter ( ) . filter ( |r| r. is_success ( ) ) . count ( ) ;
171- failures + = test_results. iter ( ) . filter ( |r| r. is_failure ( ) ) . count ( ) ;
172- expected_failures + = test_results
206+ let tests = test_results. len ( ) ;
207+ let successes = test_results. iter ( ) . filter ( |r| r. is_success ( ) ) . count ( ) ;
208+ let failures = test_results. iter ( ) . filter ( |r| r. is_failure ( ) ) . count ( ) ;
209+ let expected_failures = test_results
173210 . iter ( )
174211 . filter ( |r| r. is_expected_failure ( ) )
175212 . count ( ) ;
176- unexpected_successes + = test_results
213+ let unexpected_successes = test_results
177214 . iter ( )
178215 . filter ( |r| r. is_unexpected_success ( ) )
179216 . count ( ) ;
180- if list && ( test_results. iter ( ) . filter ( |r| !r. is_success ( ) ) . count ( ) > 0 ) {
181- println ! ( "Failures in {:?}" , path) ;
182- } else if !summary {
217+ total. update (
218+ tests,
219+ successes,
220+ failures,
221+ expected_failures,
222+ unexpected_successes,
223+ ) ;
224+ yaml_results. push ( YAMLTestResult {
225+ yaml_file : path
226+ . file_name ( )
227+ . map_or ( "" . to_string ( ) , |f| f. to_string_lossy ( ) . into_owned ( ) ) ,
228+ tests,
229+ successes,
230+ failures,
231+ expected_failures,
232+ unexpected_successes,
233+ } ) ;
234+ if !summary {
183235 for res in test_results. iter ( ) . filter ( |r| !r. is_success ( ) ) {
184236 println ! ( "{:?}" , res) ;
185237 }
@@ -199,14 +251,12 @@ fn check_yaml(paths: Vec<PathBuf>, summary: bool, list: bool) {
199251 }
200252 }
201253 if summary {
202- println ! (
203- "================================================================================"
204- ) ;
205- println ! ( "{} tests run:" , total) ;
206- print_check_row ( "successes" , successes, total) ;
207- print_check_row ( "failures" , failures, total) ;
208- print_check_row ( "expected failures" , expected_failures, total) ;
209- print_check_row ( "unexpected successes" , unexpected_successes, total) ;
254+ total. yaml_file = "Total" . to_string ( ) ;
255+ yaml_results. push ( total) ;
256+ let mut table = Table :: new ( yaml_results) ;
257+ // add a special separator above the Total row
258+ table. modify ( Rows :: last ( ) , Border :: inherit ( Style :: ascii ( ) ) . top ( '=' ) ) ;
259+ println ! ( "{}" , table) ;
210260 }
211261}
212262
@@ -244,8 +294,7 @@ fn main() {
244294 Commands :: Check {
245295 yaml_files,
246296 summary,
247- list,
248- } => check_yaml ( yaml_files, summary, list) ,
297+ } => check_yaml ( yaml_files, summary) ,
249298 Commands :: Query { query } => match metadata:: index ( ) {
250299 Ok ( index) => {
251300 let query = query
0 commit comments