riichi/test/riichi_tests.erl

84 lines
2.6 KiB
Erlang

-module(riichi_tests).
-include("riichi.hrl").
-include_lib("eunit/include/eunit.hrl").
valid_tile_dragon_test_() ->
[?_assert(riichi:is_valid_tile(#tile{suit=dragon, value=Value})) || Value <- [white, green, red]].
valid_tile_wind_test_() ->
[?_assert(riichi:is_valid_tile(#tile{suit=wind, value=Value})) || Value <- [east, south, west, north]].
valid_tile_suit_test_() ->
[?_assert(riichi:is_valid_tile(#tile{suit=Suit, value=Value})) || Suit <- [pin, sou, man], Value <- lists:seq(1,9)].
invalid_tile_test_() ->
[?_assertNot(riichi:is_valid_tile(Tile))
|| Tile <-
[
#tile{suit=badsuit, value=1},
#tile{suit=dragon, value=hidden},
#tile{suit=wind, value=broken},
#tile{suit=pin, value=0},
#tile{suit=sou, value=-1},
#tile{suit=man, value=10},
not_a_tile
]
].
dora_dragon_test_() ->
[?_assertEqual(riichi:dora(#tile{suit=dragon, value=Indicator}), #tile{suit=dragon, value=Dora})
|| {Indicator, Dora} <-
[
{white, green},
{green, red},
{red, white}
]
].
dora_wind_test_() ->
[?_assertEqual(riichi:dora(#tile{suit=wind, value=Indicator}), #tile{suit=wind, value=Dora})
|| {Indicator, Dora} <-
[
{east, south},
{south, west},
{west, north},
{north, east}
]
].
dora_suit_test_() ->
[?_assertEqual(riichi:dora(#tile{suit=Suit, value=Indicator}), #tile{suit=Suit, value=Dora})
||
{Indicator, Dora} <-
[{1,2}, {2,3}, {3,4}, {4,5}, {5,6}, {6,7}, {7,8}, {8,9}, {9,1}],
Suit <- [pin, sou, man]
].
dora_invalid_test() ->
?assertException(throw, {error, invalid_tile}, riichi:dora(#tile{suit=pin, value=9001})).
nearest_test_() ->
[?_assertEqual(riichi:nearest(Val, 10), 80) || Val <- lists:seq(71,80)].
score_yaku_limit_test_() ->
[?_assertEqual(riichi:score(30, Han, true), Score)
|| {Han, Score} <-
[
{ 5, 2000},
{ 6, 3000},
{ 7, 3000},
{ 8, 4000},
{ 9, 4000},
{10, 4000},
{11, 6000},
{12, 6000},
{13, 6000},
{14, 8000},
{1000, 8000}
]
].
score_fu_limit_test() ->
?assertEqual(riichi:score(80, 4, true), 2000).
score_rounded_test() ->
?assertEqual(riichi:score(20, 1, true), 200). % 160 rounded up