Perl More でテストの書き方をスぶってた

参考

http://blog.ainam.me/2013/04/09/test-more-perl-testing/

use strict;
use warnings;

use Test::More 'no_plan';

subtest "array" => sub {
    my $subject;
    my $setup = sub { $subject = [1, 2, 3, 4] };
    my $teardown = sub { $subject = undef };

    subtest "pop" => sub {
        $setup->();

        my $actual1 = pop($subject);
        my $actual2 = pop($subject);
        is $actual1, 4, "配列の最後の要素がとれること";
        is $actual2, 3, "破壊メソッド";

        $teardown->();
    };


    subtest "shift" => sub {
        $setup->();

        my $actual1 = shift($subject);
        my $length = @$subject;

        is $actual1, 1, "配列の先頭要素がとれること";
        is $length, 3, "破壊メソッド";

        $teardown->();
    };
}
package FuzzBuzz;

use strict;
use warnings;
use Test::More 'no_plan';


sub fizzbuzz {
    my $array = [];
    for my $number (@_) {
        push($array, &convert($number));
    }
    return $array;
}

sub convert {
    my ($num) = @_;
    return "FizzBuzz" if($num % 15 == 0);
    return "Buzz" if($num % 5 == 0);
    return "Fizz" if($num % 3 == 0);
    return $num;
}

subtest "fizzbuzz" => sub{
    subtest "fizzbuzz配列に変換できること" => sub {
        is_deeply(&fizzbuzz(1..15),
                        [1, 2, "Fizz", 4, "Buzz",
                        "Fizz", 7, 8, "Fizz", "Buzz",
                        11, "Fizz", 13, 14, "FizzBuzz"]);
    };
};

subtest "convert" => sub {
    subtest "15の倍数はBuzzを返すこと" => sub {
        is &convert(15), 'FizzBuzz';
        is &convert(45), 'FizzBuzz';
    };

    subtest "5の倍数はBuzzを返すこと" => sub {
        is &convert(5), 'Buzz';
        is &convert(25), 'Buzz';
    };

    subtest "3の倍数はFizzを返すこと" => sub {
        is &convert(3), 'Fizz';
        is &convert(99), 'Fizz';
    };

    subtest "整数を返すこと" => sub {
        is &convert(1), 1;
        is &convert(2), 2;
        is &convert(4), 4;
    };
};

メモ

  • Perl 、 参照、配列、スカラで、変数名の付け方の$, @とかで迷う。。。
  • エラーレポートの視線の送り先のカラーリングが俺好みじゃないなぁ。
  • Test::More だと、 setup , teardown テストフレームワーク側でサポートしてないよう。
  • More以外の選択だと、Test::Classがあるもよう。