1#!/usr/bin/env perl 2 3use strict; 4use warnings; 5 6use lib 'lib'; 7use App::Prove::State; 8use List::Util 'sum'; 9use Lingua::EN::Numbers 'num2en'; 10use Text::Table; 11use Carp; 12 13sub minutes_and_seconds { 14 my $seconds = shift; 15 return ( int( $seconds / 60 ), int( $seconds % 60 ) ); 16} 17 18my $state = App::Prove::State->new( { store => '.prove' } ); 19my $results = $state->results; 20my $generation = $results->generation; 21my @tests = $results->tests; 22 23my $total = sum( map { $_->elapsed } @tests ); 24my ( $minutes, $seconds ) = minutes_and_seconds($total); 25 26my $num_tests = shift || 10; 27my $total_tests = scalar $results->test_names; 28 29if ( $num_tests > $total_tests ) { 30 $num_tests = $total_tests; 31} 32 33my $num_word = num2en($num_tests); 34 35my %time_for; 36foreach my $test (@tests) { 37 $time_for{ $test->name } = $test->elapsed; 38} 39 40my @sorted_by_time_desc 41 = sort { $time_for{$b} <=> $time_for{$a} } keys %time_for; 42 43print "Number of test programs: $total_tests\n"; 44print "Total runtime approximately $minutes minutes $seconds seconds\n\n"; 45print "\u$num_word slowest tests:\n"; 46 47my @rows; 48for ( 0 .. $num_tests - 1 ) { 49 my $test = $sorted_by_time_desc[$_]; 50 my $time = $time_for{$test}; 51 my ( $minutes, $seconds ) = minutes_and_seconds($time); 52 push @rows => [ "${minutes}m ${seconds}s", $test, ]; 53} 54 55print make_table( 56 [qw/Time Test/], 57 \@rows, 58); 59 60sub make_table { 61 my ( $headers, $rows ) = @_; 62 63 my @rule = qw(- +); 64 my @headers = \'| '; 65 push @headers => map { $_ => \' | ' } @$headers; 66 pop @headers; 67 push @headers => \' |'; 68 69 unless ( 'ARRAY' eq ref $rows 70 && 'ARRAY' eq ref $rows->[0] 71 && @$headers == @{ $rows->[0] } ) 72 { 73 croak( 74 "make_table() rows must be an AoA with rows being same size as headers" 75 ); 76 } 77 my $table = Text::Table->new(@headers); 78 $table->rule(@rule); 79 $table->body_rule(@rule); 80 $table->load(@$rows); 81 return $table->rule(@rule), 82 $table->title, 83 $table->rule(@rule), 84 map( { $table->body($_) } 0 .. @$rows ), 85 $table->rule(@rule); 86} 87