Instantly share code, notes, and snippets.

Embed
What would you like to do?
チートシート

extreme fish bowl

問題

extreme fish bowlルール説明

  1. 2人1組になってプログラムを書く
  2. 書く人(ドライバー)と、横で考える人(ナビゲーター)は随時入れ替える
  3. コーディングするときは必ず何を書こうとしているのか喋りながら書く
  4. 15分の作業が終わる前にgit commitして、速やかに次のペアに席を譲る
  5. コーディング中のペア以外の人達は以下の様に何でも良いのでその場で口を出して良い。ただし、質問が優先されるべき。
  • 技術的な質問(このメソッド何なの?みたいな)
  • 書き方の間違いの指摘
  • 改善案の提案
  • コードの仕様上で気をつけなければならないことの指摘\

などなど...

問題1

Coding Dojo Wikiというサイトに載っている、型ボウリングの問題をみんなで解きましょう!

ボーリングのスコア計算のルール
  • 1ゲームは、10ターンで、1ターンをフレームと呼ぶ
  • 1フレーム中、プレイヤーはすべてのピンを倒すまでに2回投げられる
  • 2投で全てのピンを倒せなかった場合は、そのフレームでのプレイヤーのスコアは2投で倒せたピンの合計数
  • 2投の試行ですべてのピンを倒した場合は、スペアと呼ばれ、そのフレームでのスコアは、10+プレイヤーの次のターンの最初の1投で倒したピンの数
  • フレームの最初の1投で全てのピンを倒した場合はストライクと呼び、そのフレームのスコアは、10+プレイヤーの次の2投で倒したピンの単純な合計数
  • プレイヤーは最後の10フレーム目でスペアを取得した場合追加で1回、ストライクを取得した場合は追加で2回投げることが出来、追加で投げる分の得点計算は同じフレーム(10フレーム目)のものとして扱われる
  • ゲームのスコアは全てのフレームのスコアの合計
入力例

1つの文字が1投の結果を示し、数字を倒したピンの数、"X"をストライク、"/"をスペア、"-"をガーターとする

  • "XXXXXXXXXXXX"(12投:12ストライク)= 10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 = 300
  • "9-9-9-9-9-9-9-9-9-9-"(20投:9とガーターの10組)= 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 + 9 = 90
  • "5/5/5/5/5/5/5/5/5/5/5"(21投:5のスペア10フレームと最後の5)= 10 +5 +10 +5 +10 + 5 + 10 +5 +10 +5 +10 +5 +10 +5 +10 +5 +10 +5 +10 +5 = 150

テスト入門講義用チートシート

Perlのテスト用サブルーチン一覧

真偽値をテストしたい時

ok $true_or_false;

期待値と実測値を比較したテストをしたい時

is $got, $expect;

配列や、ハッシュの比較をしたい時

is_deeply \@got, \@expect;
is_deeply \%got, \%expect;

配列リファレンスや、ハッシュリファレンスの比較をしたい時

is_deeply $got, $ARRAYREF;
is_deeply $got, $HASHREF;

この辺りまで使えれば大体おk

例外が発生したかどうかのテスト

use Test::Exception;
dies_ok {....};      # 例外が発生すればテストをパス
lives_ok {....};     # 例外が発生しなければテストをパス

警告が出てるかどうかのテスト

use Test::Warn;
warning_is {  ... }, 'warn message';
warning_like {  ... }, [qr/warn message/];

テストダブル

ダミー・モック・スタブ

Test::MockObjectは便利なのでいろいろ出来る。 ただし、MockObjectによって書き換えたメソッドは、

ダミーオブジェクト

$mock_objはなんでもないTest::MockObjectのインスタンス

use Test::MockObject;
my $mock_obj = Test::MockObject->new;
$mock_obj->mock(foo => sub { print 'mock foo' });
$mock_obj->foo;                                  # => mock foo
ok $mock_obj->called('foo');
is $mock_obj->next_call, 'foo';   # 呼び出したかどうかのテスト

モック

$mock_objは、Foo::Barクラスになりすましたモックオブジェクト

use Test::MockObject;
my $mock_obj = Test::MockObject->new;
$mock_obj->fake_module('Foo::Bar', new => sub { $mock_obj });
$mock_obj->fake_new('Foo::Bar');
$mock_obj->mock(foo => sub { print 'mock foo'; });
my $foo_bar = Foo::Bar->new;
$foo_bar->foo;                                   # => mock foo

スタブ

常に同じ値を返す

use Test::MockObject;
my $mock_obj = Test::MockObject->new;
$mock_obj->set_always(foo => 'presto');
$mock_obj->foo;                                   # => presto
$mock_obj->set_true('bar');
$mock_obj->bar;                                   # => 1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment