@kyanny's blog

My thoughts, my life. Views/opinions are my own.

Test::Base でこういうのどう書けば良いのだろう

追記

http://d.hatena.ne.jp/a666666/20090406/1238986138#c1238990265 でご指摘いただいたように、 yaml フィルターを使って - ~ で undef を表現してやれば良いそうです。

#!/usr/bin/perl
use strict;
use warnings;
use Test::Base;
plan tests => 1 * blocks;

sub match {
    my $input = shift;
    my $re = qr/^(\w+)\s(\w+)\s(\w+)\s?(\w+)?$/;
    my @matched = $input =~ $re;
    return \@matched;
}

filters {
    expected => [qw(lines chomp array)],
};

run_is_deeply input => 'expected';


__END__
===
--- input chomp match
foo bar baz
--- expected
foo
bar
baz
--- LAST

結果

$ ./t.pl 
1..1
not ok 1
#   Failed test at /Library/Perl/5.8.8/Test/Base.pm line 338.
#     Structures begin differing at:
#          $got->[3] = undef
#     $expected->[3] = Does not exist
# Looks like you failed 1 test of 1.

is_deeply で @matched と expected のデータ構造を比較したときに、合わなくなる。 expected を

--- expected
foo
bar
baz

--- LAST

などしてもダメ。 chomp で削られてしまうんだと思うけど、 chomp を外せば外したで改行の有無でマッチしなくなってしまうし。 undef になる特殊なシンボルとかがあるのかなと思って POD を undef で i-search してみたけど見つからず。