@@ -479,52 +479,20 @@ pub fn write_summary_table(
479479 . unwrap_or_else ( || "N/A" . to_string ( ) )
480480 }
481481
482- let columns = [
483- " " , // we want at least 10 spaces to accommodate "count[^1]"
484- "Regressions πΏ <br />(primary)" ,
485- "Regressions πΏ <br />(secondary)" ,
486- "Improvements π <br />(primary)" ,
487- "Improvements π <br />(secondary)" ,
488- "All πΏ π <br />(primary)" ,
489- ] ;
490- let counts: Vec < usize > = columns
491- . iter ( )
492- . map ( |s| {
493- // Unicode emojis usually have width equal to ~2 chars (maybe? :) ).
494- let count = s. chars ( ) . count ( ) ;
495- if s. chars ( ) . any ( |c| !c. is_whitespace ( ) ) {
496- count + 1
497- } else {
498- count
499- }
500- } )
501- . collect ( ) ;
502- for column in & columns {
503- write ! ( result, "| {} " , column) . unwrap ( ) ;
504- }
505- result. push_str ( "|\n " ) ;
506- for & count in & counts {
507- write ! ( result, "|:{}:" , "-" . repeat( count) ) . unwrap ( ) ;
508- }
509- result. push_str ( "|\n " ) ;
510-
511- let mut render_row = |row : Vec < String > | {
512- debug_assert_eq ! ( row. len( ) , columns. len( ) ) ;
513- for ( column, & count) in row. into_iter ( ) . zip ( & counts) {
514- write ! ( result, "| {:<1$} " , column, count) . unwrap ( ) ;
515- }
516- result. push_str ( "|\n " ) ;
517- } ;
518- render_row ( vec ! [
519- format!( "count{}" , if with_footnotes { "[^1]" } else { "" } ) ,
520- primary. num_regressions. to_string( ) ,
521- secondary. num_regressions. to_string( ) ,
522- primary. num_improvements. to_string( ) ,
523- secondary. num_improvements. to_string( ) ,
524- ( primary. num_regressions + primary. num_improvements) . to_string( ) ,
482+ // (label, mean, max, count)
483+ let mut column_data = vec ! [ ] ;
484+
485+ // label
486+ column_data. push ( vec ! [
487+ "Regressions πΏ <br /> (primary)" . to_string( ) ,
488+ "Regressions πΏ <br /> (secondary)" . to_string( ) ,
489+ "Improvements π <br /> (primary)" . to_string( ) ,
490+ "Improvements π <br /> (secondary)" . to_string( ) ,
491+ "All πΏπ (primary)" . to_string( ) ,
525492 ] ) ;
526- render_row ( vec ! [
527- format!( "mean{}" , if with_footnotes { "[^2]" } else { "" } ) ,
493+
494+ // mean
495+ column_data. push ( vec ! [
528496 render_stat( primary. num_regressions, || {
529497 Some ( primary. arithmetic_mean_of_regressions( ) )
530498 } ) ,
@@ -569,8 +537,8 @@ pub fn write_summary_table(
569537 format ! ( "{:.1}%" , change * 100.0 )
570538 } ;
571539
572- render_row ( vec ! [
573- "max" . to_string ( ) ,
540+ // max
541+ column_data . push ( vec ! [
574542 render_stat( primary. num_regressions, || {
575543 primary
576544 . largest_regression( )
@@ -593,14 +561,55 @@ pub fn write_summary_table(
593561 } ) ,
594562 largest_change,
595563 ] ) ;
564+
565+ // count
566+ column_data. push ( vec ! [
567+ primary. num_regressions. to_string( ) ,
568+ secondary. num_regressions. to_string( ) ,
569+ primary. num_improvements. to_string( ) ,
570+ secondary. num_improvements. to_string( ) ,
571+ ( primary. num_regressions + primary. num_improvements) . to_string( ) ,
572+ ] ) ;
573+
574+ let column_labels = [
575+ " " . to_string ( ) , // we want at least 10 spaces to accommodate "count[^2]"
576+ format ! ( "mean{}" , if with_footnotes { "[^1]" } else { "" } ) ,
577+ "max" . to_string ( ) ,
578+ format ! ( "count{}" , if with_footnotes { "[^2]" } else { "" } ) ,
579+ ] ;
580+ let counts: Vec < usize > = column_labels. iter ( ) . map ( |s| s. chars ( ) . count ( ) ) . collect ( ) ;
581+ for column in & column_labels {
582+ write ! ( result, "| {} " , column) . unwrap ( ) ;
583+ }
584+ result. push_str ( "|\n " ) ;
585+ for & count in & counts {
586+ write ! ( result, "|:{}:" , "-" . repeat( count) ) . unwrap ( ) ;
587+ }
588+ result. push_str ( "|\n " ) ;
589+
590+ let mut render_row = |row : Vec < String > | {
591+ debug_assert_eq ! ( row. len( ) , column_labels. len( ) ) ;
592+ for ( column, & count) in row. into_iter ( ) . zip ( & counts) {
593+ write ! ( result, "| {:<1$} " , column, count) . unwrap ( ) ;
594+ }
595+ result. push_str ( "|\n " ) ;
596+ } ;
597+
598+ for row in 0 ..5 {
599+ let row_data = column_data
600+ . iter ( )
601+ . map ( |rows| rows[ row] . clone ( ) )
602+ . collect :: < Vec < _ > > ( ) ;
603+ render_row ( row_data) ;
604+ }
596605}
597606
598607pub fn write_summary_table_footer ( result : & mut String ) {
599608 writeln ! (
600609 result,
601610 r#"
602- [^1]: *number of relevant changes *
603- [^2]: *the arithmetic mean of the percent change *"#
611+ [^1]: *the arithmetic mean of the percent change *
612+ [^2]: *number of relevant changes *"#
604613 )
605614 . unwrap ( ) ;
606615}
@@ -1314,11 +1323,13 @@ mod tests {
13141323 ( Category :: Primary , 1.0 , 3.0 ) ,
13151324 ] ,
13161325 r#"
1317- | | Regressions πΏ <br />(primary) | Regressions πΏ <br />(secondary) | Improvements π <br />(primary) | Improvements π <br />(secondary) | All πΏ π <br />(primary) |
1318- |:----------:|:------------------------------:|:--------------------------------:|:-------------------------------:|:---------------------------------:|:------------------------:|
1319- | count[^1] | 3 | 0 | 0 | 0 | 3 |
1320- | mean[^2] | 146.7% | N/A | N/A | N/A | 146.7% |
1321- | max | 200.0% | N/A | N/A | N/A | 200.0% |
1326+ | | mean[^1] | max | count[^2] |
1327+ |:----------:|:--------:|:---:|:---------:|
1328+ | Regressions πΏ <br /> (primary) | 146.7% | 200.0% | 3 |
1329+ | Regressions πΏ <br /> (secondary) | N/A | N/A | 0 |
1330+ | Improvements π <br /> (primary) | N/A | N/A | 0 |
1331+ | Improvements π <br /> (secondary) | N/A | N/A | 0 |
1332+ | All πΏπ (primary) | 146.7% | 200.0% | 3 |
13221333"#
13231334 . trim_start ( ) ,
13241335 ) ;
@@ -1333,11 +1344,13 @@ mod tests {
13331344 ( Category :: Primary , 4.0 , 1.0 ) ,
13341345 ] ,
13351346 r#"
1336- | | Regressions πΏ <br />(primary) | Regressions πΏ <br />(secondary) | Improvements π <br />(primary) | Improvements π <br />(secondary) | All πΏ π <br />(primary) |
1337- |:----------:|:------------------------------:|:--------------------------------:|:-------------------------------:|:---------------------------------:|:------------------------:|
1338- | count[^1] | 0 | 0 | 3 | 0 | 3 |
1339- | mean[^2] | N/A | N/A | -71.7% | N/A | -71.7% |
1340- | max | N/A | N/A | -80.0% | N/A | -80.0% |
1347+ | | mean[^1] | max | count[^2] |
1348+ |:----------:|:--------:|:---:|:---------:|
1349+ | Regressions πΏ <br /> (primary) | N/A | N/A | 0 |
1350+ | Regressions πΏ <br /> (secondary) | N/A | N/A | 0 |
1351+ | Improvements π <br /> (primary) | -71.7% | -80.0% | 3 |
1352+ | Improvements π <br /> (secondary) | N/A | N/A | 0 |
1353+ | All πΏπ (primary) | -71.7% | -80.0% | 3 |
13411354"#
13421355 . trim_start ( ) ,
13431356 ) ;
@@ -1352,13 +1365,15 @@ mod tests {
13521365 ( Category :: Secondary , 4.0 , 1.0 ) ,
13531366 ] ,
13541367 r#"
1355- | | Regressions πΏ <br />(primary) | Regressions πΏ <br />(secondary) | Improvements π <br />(primary) | Improvements π <br />(secondary) | All πΏ π <br />(primary) |
1356- |:----------:|:------------------------------:|:--------------------------------:|:-------------------------------:|:---------------------------------:|:------------------------:|
1357- | count[^1] | 0 | 0 | 0 | 3 | 0 |
1358- | mean[^2] | N/A | N/A | N/A | -71.7% | N/A |
1359- | max | N/A | N/A | N/A | -80.0% | N/A |
1368+ | | mean[^1] | max | count[^2] |
1369+ |:----------:|:--------:|:---:|:---------:|
1370+ | Regressions πΏ <br /> (primary) | N/A | N/A | 0 |
1371+ | Regressions πΏ <br /> (secondary) | N/A | N/A | 0 |
1372+ | Improvements π <br /> (primary) | N/A | N/A | 0 |
1373+ | Improvements π <br /> (secondary) | -71.7% | -80.0% | 3 |
1374+ | All πΏπ (primary) | N/A | N/A | 0 |
13601375"#
1361- . trim_start ( ) ,
1376+ . trim_start ( ) ,
13621377 ) ;
13631378 }
13641379
@@ -1371,13 +1386,15 @@ mod tests {
13711386 ( Category :: Secondary , 1.0 , 3.0 ) ,
13721387 ] ,
13731388 r#"
1374- | | Regressions πΏ <br />(primary) | Regressions πΏ <br />(secondary) | Improvements π <br />(primary) | Improvements π <br />(secondary) | All πΏ π <br />(primary) |
1375- |:----------:|:------------------------------:|:--------------------------------:|:-------------------------------:|:---------------------------------:|:------------------------:|
1376- | count[^1] | 0 | 3 | 0 | 0 | 0 |
1377- | mean[^2] | N/A | 146.7% | N/A | N/A | N/A |
1378- | max | N/A | 200.0% | N/A | N/A | N/A |
1389+ | | mean[^1] | max | count[^2] |
1390+ |:----------:|:--------:|:---:|:---------:|
1391+ | Regressions πΏ <br /> (primary) | N/A | N/A | 0 |
1392+ | Regressions πΏ <br /> (secondary) | 146.7% | 200.0% | 3 |
1393+ | Improvements π <br /> (primary) | N/A | N/A | 0 |
1394+ | Improvements π <br /> (secondary) | N/A | N/A | 0 |
1395+ | All πΏπ (primary) | N/A | N/A | 0 |
13791396"#
1380- . trim_start ( ) ,
1397+ . trim_start ( ) ,
13811398 ) ;
13821399 }
13831400
@@ -1391,11 +1408,13 @@ mod tests {
13911408 ( Category :: Primary , 4.0 , 1.0 ) ,
13921409 ] ,
13931410 r#"
1394- | | Regressions πΏ <br />(primary) | Regressions πΏ <br />(secondary) | Improvements π <br />(primary) | Improvements π <br />(secondary) | All πΏ π <br />(primary) |
1395- |:----------:|:------------------------------:|:--------------------------------:|:-------------------------------:|:---------------------------------:|:------------------------:|
1396- | count[^1] | 2 | 0 | 2 | 0 | 4 |
1397- | mean[^2] | 150.0% | N/A | -62.5% | N/A | 43.8% |
1398- | max | 200.0% | N/A | -75.0% | N/A | 200.0% |
1411+ | | mean[^1] | max | count[^2] |
1412+ |:----------:|:--------:|:---:|:---------:|
1413+ | Regressions πΏ <br /> (primary) | 150.0% | 200.0% | 2 |
1414+ | Regressions πΏ <br /> (secondary) | N/A | N/A | 0 |
1415+ | Improvements π <br /> (primary) | -62.5% | -75.0% | 2 |
1416+ | Improvements π <br /> (secondary) | N/A | N/A | 0 |
1417+ | All πΏπ (primary) | 43.8% | 200.0% | 4 |
13991418"#
14001419 . trim_start ( ) ,
14011420 ) ;
@@ -1413,13 +1432,15 @@ mod tests {
14131432 ( Category :: Primary , 4.0 , 1.0 ) ,
14141433 ] ,
14151434 r#"
1416- | | Regressions πΏ <br />(primary) | Regressions πΏ <br />(secondary) | Improvements π <br />(primary) | Improvements π <br />(secondary) | All πΏ π <br />(primary) |
1417- |:----------:|:------------------------------:|:--------------------------------:|:-------------------------------:|:---------------------------------:|:------------------------:|
1418- | count[^1] | 2 | 1 | 2 | 1 | 4 |
1419- | mean[^2] | 150.0% | 100.0% | -62.5% | -66.7% | 43.8% |
1420- | max | 200.0% | 100.0% | -75.0% | -66.7% | 200.0% |
1435+ | | mean[^1] | max | count[^2] |
1436+ |:----------:|:--------:|:---:|:---------:|
1437+ | Regressions πΏ <br /> (primary) | 150.0% | 200.0% | 2 |
1438+ | Regressions πΏ <br /> (secondary) | 100.0% | 100.0% | 1 |
1439+ | Improvements π <br /> (primary) | -62.5% | -75.0% | 2 |
1440+ | Improvements π <br /> (secondary) | -66.7% | -66.7% | 1 |
1441+ | All πΏπ (primary) | 43.8% | 200.0% | 4 |
14211442"#
1422- . trim_start ( ) ,
1443+ . trim_start ( ) ,
14231444 ) ;
14241445 }
14251446
@@ -1431,13 +1452,15 @@ mod tests {
14311452 ( Category :: Primary , 5.0 , 6.0 ) ,
14321453 ] ,
14331454 r#"
1434- | | Regressions πΏ <br />(primary) | Regressions πΏ <br />(secondary) | Improvements π <br />(primary) | Improvements π <br />(secondary) | All πΏ π <br />(primary) |
1435- |:----------:|:------------------------------:|:--------------------------------:|:-------------------------------:|:---------------------------------:|:------------------------:|
1436- | count[^1] | 1 | 0 | 1 | 0 | 2 |
1437- | mean[^2] | 20.0% | N/A | -50.0% | N/A | -15.0% |
1438- | max | 20.0% | N/A | -50.0% | N/A | -50.0% |
1455+ | | mean[^1] | max | count[^2] |
1456+ |:----------:|:--------:|:---:|:---------:|
1457+ | Regressions πΏ <br /> (primary) | 20.0% | 20.0% | 1 |
1458+ | Regressions πΏ <br /> (secondary) | N/A | N/A | 0 |
1459+ | Improvements π <br /> (primary) | -50.0% | -50.0% | 1 |
1460+ | Improvements π <br /> (secondary) | N/A | N/A | 0 |
1461+ | All πΏπ (primary) | -15.0% | -50.0% | 2 |
14391462"#
1440- . trim_start ( ) ,
1463+ . trim_start ( ) ,
14411464 ) ;
14421465 }
14431466
@@ -1449,13 +1472,15 @@ mod tests {
14491472 ( Category :: Primary , 6.0 , 5.0 ) ,
14501473 ] ,
14511474 r#"
1452- | | Regressions πΏ <br />(primary) | Regressions πΏ <br />(secondary) | Improvements π <br />(primary) | Improvements π <br />(secondary) | All πΏ π <br />(primary) |
1453- |:----------:|:------------------------------:|:--------------------------------:|:-------------------------------:|:---------------------------------:|:------------------------:|
1454- | count[^1] | 1 | 0 | 1 | 0 | 2 |
1455- | mean[^2] | 100.0% | N/A | -16.7% | N/A | 41.7% |
1456- | max | 100.0% | N/A | -16.7% | N/A | 100.0% |
1475+ | | mean[^1] | max | count[^2] |
1476+ |:----------:|:--------:|:---:|:---------:|
1477+ | Regressions πΏ <br /> (primary) | 100.0% | 100.0% | 1 |
1478+ | Regressions πΏ <br /> (secondary) | N/A | N/A | 0 |
1479+ | Improvements π <br /> (primary) | -16.7% | -16.7% | 1 |
1480+ | Improvements π <br /> (secondary) | N/A | N/A | 0 |
1481+ | All πΏπ (primary) | 41.7% | 100.0% | 2 |
14571482"#
1458- . trim_start ( ) ,
1483+ . trim_start ( ) ,
14591484 ) ;
14601485 }
14611486
0 commit comments