mirror of
https://github.com/correl/riichi.git
synced 2024-11-30 11:09:56 +00:00
128 lines
4.4 KiB
Erlang
128 lines
4.4 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, 8000},
|
|
{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
|
|
|
|
score_hand_dai_san_gan_test() ->
|
|
Hand = #hand{
|
|
tiles = lists:flatten([
|
|
lists:duplicate(3, #tile{suit=dragon, value=red}),
|
|
lists:duplicate(3, #tile{suit=dragon, value=white}),
|
|
lists:duplicate(3, #tile{suit=dragon, value=green}),
|
|
lists:duplicate(3, #tile{suit=wind, value=east}),
|
|
[#tile{suit=pin, value=V} || V <- [5,6,7]],
|
|
lists:duplicate(2, #tile{suit=wind, value=north})])
|
|
},
|
|
?assertEqual(riichi:score_hand(Hand, 30), 8000).
|
|
|
|
score_hand_suu_an_kou_test() ->
|
|
Hand = #hand{
|
|
tiles = lists:flatten([
|
|
lists:duplicate(3, #tile{suit=pin, value=1}),
|
|
lists:duplicate(3, #tile{suit=pin, value=4}),
|
|
lists:duplicate(3, #tile{suit=sou, value=2}),
|
|
lists:duplicate(3, #tile{suit=man, value=8}),
|
|
lists:duplicate(2, #tile{suit=wind, value=north})])
|
|
},
|
|
?assertEqual(riichi:score_hand(Hand, 30), 8000).
|
|
|
|
score_hand_kokushi_musou_test() ->
|
|
Hand = #hand{
|
|
tiles = lists:flatten([
|
|
[#tile{suit=S, value=V} || S <- [pin, sou, man], V <- [1,9]], % Terminals
|
|
[#tile{suit=wind, value=V} || V <- [east, south, west, north]], % Winds
|
|
[#tile{suit=dragon, value=V} || V <- [red, white, green]], % Dragons
|
|
[#tile{suit=pin, value=1}]])
|
|
},
|
|
?assertEqual(riichi:score_hand(Hand, 30), 8000).
|
|
|
|
score_hand_ryuu_ii_sou_test() ->
|
|
Hand = #hand{
|
|
tiles = lists:flatten([
|
|
[#tile{suit=sou, value=V} || V <- [2,3,4]],
|
|
[#tile{suit=sou, value=V} || V <- [2,3,4]],
|
|
lists:duplicate(3, #tile{suit=sou, value=6}),
|
|
lists:duplicate(3, #tile{suit=sou, value=8}),
|
|
lists:duplicate(2, #tile{suit=dragon, value=green})])
|
|
},
|
|
?assertEqual(riichi:score_hand(Hand, 30), 8000).
|