Test結果に色づけしたいというちょっと古いネタ。

ふと本棚を見てPerlHacksをみて、「あぁTestにFailした物だけを表示するやつやってなかったなぁ」
と思ってパッっと作ってみた。最初PerlHacksのやつコピペしただけで行けるかな?と思ったけど
動かなかったのでちょこちょこ直した。

#!/usr/bin/perl
use strict;
use warnings;
use Term::ANSIColor;
use Test::Harness::Straps;


open *STDERR, '>/dev/null' or die;


my $simple = $ARGV[0] eq '-s' ? shift @ARGV : 0;
my $strap = Test::Harness::Straps->new();
my $all_cnt = 0;
my $err_cnt = 0;


for my $file (@ARGV) {

	unless (-e $file)	{
		my @files = glob $file;
		next unless @files;

		push @ARGV, @files and next;
	}


    my $result = $strap->analyze_file($file);


	my $out = sprintf "%-40s", $file;
		$out =~ s/ /./g;
	print $out unless $simple;


	print $result->skip_all
		? coloring('bold yellow' => 'Skipped')
		: $result->passing
			? coloring('blue bold' => 'Success')
			: coloring('bold red' => sprintf("failed test %d of %d", $result->max - $result->ok, $result->max) ) unless $simple;

	print	map { "-----> $_->{name}\n" }
				grep { not $_->{actual_ok} }
					@{$result->details} unless $simple;

	$all_cnt += @{$result->details};
	$err_cnt += $result->max - $result->ok;
}

print $err_cnt == 0 ? "\n" : "E$err_cnt/A$all_cnt\n";


sub coloring	{
	my($color,$string) = @_;
	return color($color), $string, color('reset'), "\n";
}

とりあえずこんなとこで良いかな。細かいところはちょこちょこ変えて行こう。でももうちょっとエラー以外の出力減らしていいかも。
$simpleと最後の$err_cntがなかったら改行だけを出力してるのはscreenのstatuslineで使いたかったからです。

あとこれでつかったTest::Harness::Strapsて面白いね。テストの出力好き勝手にいじれます。