テストではまったお話 test::more
Post on 01-Nov-2014
243 Views
Preview:
DESCRIPTION
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