@@ -1396,7 +1396,7 @@ defmodule Mjw.GameTest do
1396
1396
}
1397
1397
1398
1398
{ :ok , game } = Mjw.Game . discard ( orig_game , 3 , "n3-3" )
1399
- game = Mjw.Game . undo ( game )
1399
+ game = Mjw.Game . undo ( game , 3 )
1400
1400
1401
1401
expected_event_log = [ { "name3 undid their action." , nil } , { "name3 discarded." , "n3-3" } ]
1402
1402
assert game == % { orig_game | event_log: expected_event_log }
@@ -1423,7 +1423,7 @@ defmodule Mjw.GameTest do
1423
1423
game =
1424
1424
orig_game
1425
1425
|> Mjw.Game . draw_discard ( 3 , [ "dp-0" ] , "dp-0" )
1426
- |> Mjw.Game . undo ( )
1426
+ |> Mjw.Game . undo ( 3 )
1427
1427
1428
1428
expected_event_log = [
1429
1429
{ "name3 undid their action." , nil } ,
@@ -1454,7 +1454,7 @@ defmodule Mjw.GameTest do
1454
1454
game =
1455
1455
orig_game
1456
1456
|> Mjw.Game . pong ( 1 , [ "dp-0" ] , "dp-0" )
1457
- |> Mjw.Game . undo ( )
1457
+ |> Mjw.Game . undo ( 1 )
1458
1458
1459
1459
expected_event_log = [
1460
1460
{ "name1 undid their action." , nil } ,
@@ -1487,7 +1487,7 @@ defmodule Mjw.GameTest do
1487
1487
orig_game
1488
1488
|> Mjw.Game . peek_deck_tile ( 3 )
1489
1489
|> Mjw.Game . clear_peektile ( 3 )
1490
- |> Mjw.Game . undo ( )
1490
+ |> Mjw.Game . undo ( 3 )
1491
1491
1492
1492
expected_event_log = [
1493
1493
{ "name3 undid their action." , nil } ,
@@ -1519,7 +1519,7 @@ defmodule Mjw.GameTest do
1519
1519
{ game , "b1-0" } =
1520
1520
orig_game |> Mjw.Game . draw_correction_tile ( 3 , [ "n1-3" , "n2-3" , "n3-3" , "decktile" ] )
1521
1521
1522
- game = game |> Mjw.Game . undo ( )
1522
+ game = game |> Mjw.Game . undo ( 3 )
1523
1523
1524
1524
expected_event_log = [
1525
1525
{ "name3 undid their action." , nil } ,
@@ -1550,7 +1550,7 @@ defmodule Mjw.GameTest do
1550
1550
game =
1551
1551
orig_game
1552
1552
|> Mjw.Game . declare_win_from_discards ( 1 , "dp-0" )
1553
- |> Mjw.Game . undo ( )
1553
+ |> Mjw.Game . undo ( 1 )
1554
1554
1555
1555
expected_event_log = [ { "name1 undid their action." , nil } , { "name1 went out!" , "dp-0" } ]
1556
1556
assert game == % { orig_game | event_log: expected_event_log }
@@ -1577,7 +1577,7 @@ defmodule Mjw.GameTest do
1577
1577
game =
1578
1578
orig_game
1579
1579
|> Mjw.Game . declare_win_from_hand ( 1 , "n3-1" )
1580
- |> Mjw.Game . undo ( )
1580
+ |> Mjw.Game . undo ( 1 )
1581
1581
1582
1582
expected_event_log = [ { "name1 undid their action." , nil } , { "name1 went out!" , "n3-1" } ]
1583
1583
assert game == % { orig_game | event_log: expected_event_log }
@@ -1615,7 +1615,7 @@ defmodule Mjw.GameTest do
1615
1615
{ :ok , game } = Mjw.Game . discard ( orig_game , 0 , "b5-0" )
1616
1616
1617
1617
{ :draw_discard , game } = Mjw.Game . bot_draw ( game )
1618
- game = Mjw.Game . undo ( game )
1618
+ game = Mjw.Game . undo ( game , 0 )
1619
1619
1620
1620
expected_event_log = [
1621
1621
{ "name0 undid their action." , nil } ,
@@ -2039,4 +2039,71 @@ defmodule Mjw.GameTest do
2039
2039
assert game . turn_state == :discarding
2040
2040
end
2041
2041
end
2042
+
2043
+ describe "can_undo?" do
2044
+ test "is false for all players before the first discard" do
2045
+ game =
2046
+ Mjw.Game . new ( )
2047
+ |> Mjw.Game . seat_player ( "id0" , "name0" )
2048
+ |> Mjw.Game . seat_player ( "id1" , "name1" )
2049
+ |> Mjw.Game . seat_player ( "id2" , "name2" )
2050
+ |> Mjw.Game . seat_bot ( )
2051
+ |> Mjw.Game . pick_random_available_wind ( 0 )
2052
+ |> Mjw.Game . pick_random_available_wind ( 1 )
2053
+ |> Mjw.Game . pick_random_available_wind ( 2 )
2054
+ |> Mjw.Game . pick_random_available_wind ( 3 )
2055
+ |> Mjw.Game . roll_dice_and_reseat_players ( )
2056
+ |> Mjw.Game . roll_dice_and_deal ( )
2057
+
2058
+ refute Mjw.Game . can_undo? ( game , 0 )
2059
+ refute Mjw.Game . can_undo? ( game , 1 )
2060
+ refute Mjw.Game . can_undo? ( game , 2 )
2061
+ refute Mjw.Game . can_undo? ( game , 3 )
2062
+ end
2063
+
2064
+ test "is true for all human players after the first bot discard" do
2065
+ { :ok , game } =
2066
+ Mjw.Game . new ( )
2067
+ |> Mjw.Game . seat_player ( "id0" , "name0" )
2068
+ |> Mjw.Game . seat_player ( "id1" , "name1" )
2069
+ |> Mjw.Game . seat_player ( "id2" , "name2" )
2070
+ |> Mjw.Game . seat_bot ( )
2071
+ |> Mjw.Game . pick_random_available_wind ( 0 )
2072
+ |> Mjw.Game . pick_random_available_wind ( 1 )
2073
+ |> Mjw.Game . pick_random_available_wind ( 2 )
2074
+ |> Mjw.Game . pick_random_available_wind ( 3 )
2075
+ |> Mjw.Game . roll_dice_and_reseat_players ( )
2076
+ |> Mjw.Game . roll_dice_and_deal ( )
2077
+ |> Map . merge ( % { turn_seatno: 3 } )
2078
+ |> Mjw.Game . bot_discard ( )
2079
+
2080
+ assert Mjw.Game . can_undo? ( game , 0 )
2081
+ assert Mjw.Game . can_undo? ( game , 1 )
2082
+ assert Mjw.Game . can_undo? ( game , 2 )
2083
+ end
2084
+
2085
+ test "when undo_seatno is set, is true only for the undo_seatno player id" do
2086
+ orig_game =
2087
+ Mjw.Game . new ( )
2088
+ |> Mjw.Game . seat_player ( "id0" , "name0" )
2089
+ |> Mjw.Game . seat_player ( "id1" , "name1" )
2090
+ |> Mjw.Game . seat_player ( "id2" , "name2" )
2091
+ |> Mjw.Game . seat_bot ( )
2092
+ |> Mjw.Game . pick_random_available_wind ( 0 )
2093
+ |> Mjw.Game . pick_random_available_wind ( 1 )
2094
+ |> Mjw.Game . pick_random_available_wind ( 2 )
2095
+ |> Mjw.Game . pick_random_available_wind ( 3 )
2096
+ |> Mjw.Game . roll_dice_and_reseat_players ( )
2097
+ |> Mjw.Game . roll_dice_and_deal ( )
2098
+ |> Map . merge ( % { turn_seatno: 0 } )
2099
+
2100
+ tile = orig_game . seats |> Enum . at ( 0 ) |> Map . get ( :concealed ) |> Enum . random ( )
2101
+ { :ok , game } = orig_game |> Mjw.Game . discard ( 0 , tile )
2102
+
2103
+ assert Mjw.Game . can_undo? ( game , 0 )
2104
+ refute Mjw.Game . can_undo? ( game , 1 )
2105
+ refute Mjw.Game . can_undo? ( game , 2 )
2106
+ refute Mjw.Game . can_undo? ( game , 3 )
2107
+ end
2108
+ end
2042
2109
end
0 commit comments