テストではまったお話 test::more

Post on 01-Nov-2014

243 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

Perl Test::More usage.

TRANSCRIPT

テストではまったお話

Perl Beginners#12 @dokechin

自己紹介 @dokechin

• Perl歴2年目

• PerlのWAF Mojoliciousで自作Webアプリケーションを作って運用中

• Mishima.pm主催

複数の配列を1つの配列にまとめたい。ただし、以下のようなルールで @array1=(1,1,3,8);

@array2=(2,3);

@array3=(5,6);

@array=(1,2,5,1,3,6,3,8);

こんな感じの関数をつくりたい

my @array1=(1,2,3,8);

my @array2=(1,3);

my @array3=(5,6);

my @sorted = my_sort(¥@array1,¥@array2,¥@array3);

my @sorted = my_sort(@array1,@array2,@array3);

とりあえず実装した package Sort;

use strict;

use warnings;

sub my_sort {

my @sorted;

my $total = 0;

for my $array(@_){

$total = $total + scalar(@$array);

}

until( $total == scalar @sorted){

foreach (@_) {

if (my $item = shift (@$_)){

push @sorted , $item;

}

}

}

return @sorted;

}

テスト1 use strict;

use warnings;

use Test::More;

my @result =Sort::my_sort ([1,2,3,8],[1,3],[5,6]);

is(@result, (1,1,5,2,3,6,3,8), "sort 3 list");

テスト2

use strict;

Use warnings;

Use Test::More;

my @result =Sort::my_sort ([],[],[]);

is(@result, (), "sort empty list");

# got: '0' # expected: undef

← scalar @result ← scalar ()

is はスカラーにした結果値を比較している Test::Moreのソース

sub is ($$;$) {

my $tb = Test::More->builder;

return $tb->is_eq(@_);

}

プロトタイプ この場合、引数をスカラー評価してから処理する

Test::Moreのis はリストコンテキストの値のテストはできない

待てよ、テスト1に戻る

テスト1 use strict;

use warnings;

use Test::More;

my @result =Sort::my_sort ([1,2,3,8],[1,3],[5,6]);

is(@result, (1,1,5,2,3,6,3,8), "sort 3 list");

scalar @result →配列の要素数 8 Scalar(1,1,5,2,3,6,3,8) →リストの末尾の要素 8

書き直し

is_deeply

テスト1 use strict;

use warnings;

use Test::More;

my @result =Sort::my_sort ([1,2,3,8],[1,3],[5,6]);

is_deeply(¥@result, [1,1,5,2,3,6,3,8], "sort 3 list");

テスト2

use strict;

Use warnings;

Use Test::More;

my @result =Sort::my_sort ([],[],[]);

is_deeply(¥@result, [], "sort empty list");

tokuhiromさんからのコメント

`if (my $hit = shift (@$_)){` を `if (defined(my $hit = shift (@$_))){` にしないと、0がはいると無限ループになりますね。

tsucchiさんからのコメント

List::MoreUtils のzip(mesh)も近いけど、詰めてくれないからちょっと違うか...(undef がデータとして入ってこないなら grep で undef 除けば多分所望の動作になりますが...) my @result = grep { defined $_ } zip @aa, @bb, @cc, @dd;

結論

Listの操作で困ったら、List::Util,List::MoreUtilsのドキュメントを読もう。 イケてないからクールへ。

• ご清聴ありがとうございました

コメントいただいた xtetsujiさん、tokuhiromさん、tsucchiさん、magnolia_k_さん

ありがとうございました。

top related