@@ -139,7 +139,103 @@ def test_action_plays():
139139 test_action = list_infosets [2 ].actions [0 ] # members' paths=[0, 1, 0], [0, 1]
140140
141141 expected_set_of_plays = {
142- list_nodes [4 ], list_nodes [7 ]
143- } # paths=[0, 1, 0], [0, 1]
142+ list_nodes [4 ], list_nodes [7 ] # paths=[0, 1, 0], [0, 1]
143+ }
144144
145145 assert set (test_action .plays ) == expected_set_of_plays
146+
147+
148+ @pytest .mark .parametrize (
149+ "game, player_ind, str_ind, infoset_ind, expected_action_ind" ,
150+ [
151+ (games .read_from_file ("e01.efg" ), 0 , 0 , 0 , 0 ),
152+ (games .read_from_file ("e01.efg" ), 0 , 1 , 0 , 1 ),
153+ (games .read_from_file ("e01.efg" ), 1 , 0 , 1 , 0 ),
154+ (games .read_from_file ("e01.efg" ), 1 , 1 , 1 , 1 ),
155+ (games .read_from_file ("e01.efg" ), 2 , 0 , 2 , 0 ),
156+ (games .read_from_file ("e01.efg" ), 2 , 1 , 2 , 1 ),
157+ (games .read_from_file ("e02.efg" ), 0 , 0 , 0 , 0 ),
158+ (games .read_from_file ("e02.efg" ), 0 , 1 , 0 , 1 ),
159+ (games .read_from_file ("e02.efg" ), 1 , 0 , 2 , 0 ),
160+ (games .read_from_file ("e02.efg" ), 1 , 1 , 2 , 1 ),
161+ (games .read_from_file ("basic_extensive_game.efg" ), 0 , 0 , 0 , 0 ),
162+ (games .read_from_file ("basic_extensive_game.efg" ), 0 , 1 , 0 , 1 ),
163+ (games .read_from_file ("basic_extensive_game.efg" ), 1 , 0 , 1 , 0 ),
164+ (games .read_from_file ("basic_extensive_game.efg" ), 1 , 1 , 1 , 1 ),
165+ (games .read_from_file ("basic_extensive_game.efg" ), 2 , 0 , 2 , 0 ),
166+ (games .read_from_file ("basic_extensive_game.efg" ), 2 , 1 , 2 , 1 ),
167+ ],
168+ )
169+ def test_strategy_action_defined (game , player_ind , str_ind , infoset_ind , expected_action_ind ):
170+ """Verify `Strategy.action` retrieves the correct action for defined actions.
171+ """
172+ player = game .players [player_ind ]
173+ strategy = player .strategies [str_ind ]
174+ infoset = game .infosets [infoset_ind ]
175+ expected_action = infoset .actions [expected_action_ind ]
176+
177+ prescribed_action = strategy .action (infoset )
178+
179+ assert prescribed_action == expected_action
180+
181+
182+ @pytest .mark .parametrize (
183+ "game, player_ind, str_ind, infoset_ind" ,
184+ [
185+ (games .read_from_file ("e02.efg" ), 0 , 0 , 1 ),
186+ (games .read_from_file ("cent3.efg" ), 0 , 0 , 1 ),
187+ (games .read_from_file ("cent3.efg" ), 0 , 0 , 2 ),
188+ (games .read_from_file ("cent3.efg" ), 0 , 1 , 2 ),
189+ (games .read_from_file ("cent3.efg" ), 1 , 0 , 7 ),
190+ (games .read_from_file ("cent3.efg" ), 1 , 0 , 7 ),
191+ (games .read_from_file ("cent3.efg" ), 1 , 1 , 8 ),
192+ ],
193+ )
194+ def test_strategy_action_undefined_returns_none (game , player_ind , str_ind , infoset_ind ):
195+ """Verify `Strategy.action` returns None when called on an unreached player's infoset
196+ """
197+ player = game .players [player_ind ]
198+ strategy = player .strategies [str_ind ]
199+ infoset = game .infosets [infoset_ind ]
200+
201+ prescribed_action = strategy .action (infoset )
202+
203+ assert prescribed_action is None
204+
205+
206+ @pytest .mark .parametrize (
207+ "game, player_ind, infoset_ind" ,
208+ [
209+ (games .read_from_file ("e01.efg" ), 0 , 1 ),
210+ (games .read_from_file ("e01.efg" ), 1 , 0 ),
211+ (games .read_from_file ("e02.efg" ), 0 , 2 ),
212+ (games .read_from_file ("e02.efg" ), 1 , 0 ),
213+ (games .read_from_file ("basic_extensive_game.efg" ), 0 , 1 ),
214+ (games .read_from_file ("basic_extensive_game.efg" ), 1 , 2 ),
215+ (games .read_from_file ("basic_extensive_game.efg" ), 2 , 0 ),
216+ ],
217+ )
218+ def test_strategy_action_raises_value_error_for_wrong_player (game , player_ind , infoset_ind ):
219+ """
220+ Verify `Strategy.action` raises ValueError when the infoset belongs
221+ to a different player than the strategy.
222+ """
223+ player = game .players [player_ind ]
224+ strategy = player .strategies [0 ]
225+ other_players_infoset = game .infosets [infoset_ind ]
226+
227+ with pytest .raises (ValueError ):
228+ strategy .action (other_players_infoset )
229+
230+
231+ def test_strategy_action_raises_error_for_strategic_game ():
232+ """Verify `Strategy.action` retrieves the action prescribed by the strategy
233+ """
234+ game_efg = games .read_from_file ("e02.efg" )
235+ game_nfg = game_efg .from_arrays (game_efg .to_arrays ()[0 ], game_efg .to_arrays ()[1 ])
236+ alice = game_nfg .players [0 ]
237+ strategy = alice .strategies [0 ]
238+ test_infoset = game_efg .infosets [0 ]
239+
240+ with pytest .raises (gbt .UndefinedOperationError ):
241+ strategy .action (test_infoset )
0 commit comments