def test_is_won(self):
        world = WorldWatten()

        world.refresh()

        world.player_A_score = 15
        result = world.is_won(-1)
        self.assertTrue(result)

        world.refresh()

        world.player_A_score = 15
        world.player_B_score = 15
        self.assertRaises(InconsistentStateError, world.is_won, 1)

        world.refresh()

        world.player_B_score = 15
        result = world.is_won(-1)
        self.assertFalse(result)

        world.refresh()

        world.player_B_score = 15
        result = world.is_won(1)
        self.assertTrue(result)
    def test_set_initial_game_prize_player_B_ahead(self):
        world = WorldWatten()

        self.assertEqual(world.current_game_prize, 2)

        world = WorldWatten()
        world.player_B_score = 13
        world.player_A_score = 4

        world._set_initial_game_prize()

        self.assertEqual(world.current_game_prize, 4)

        world = WorldWatten()
        world.player_B_score = 13
        world.player_A_score = 10

        world._set_initial_game_prize()

        self.assertEqual(world.current_game_prize, 3)
    def test_is_game_end(self):
        world = WorldWatten()

        world.refresh()

        result = world.is_game_end()
        self.assertFalse(result)

        world.player_A_score = 15
        result = world.is_game_end()
        self.assertTrue(result)

        world.refresh()

        world.player_B_score = 13
        result = world.is_game_end()
        self.assertFalse(result)

        world.refresh()

        world.player_B_score = 18
        result = world.is_game_end()
        self.assertTrue(result)
    def test_act_fold(self):
        world = WorldWatten()

        world.player_A_score = 4
        world.player_B_score = 7

        world.current_game_prize = 3

        world.current_player = 1
        world.distributing_cards_player = -1
        world.is_last_move_raise = True

        result, next_player = world.act(watten.moves["fold_hand"])

        self.assertEqual("end", result)
        self.assertEqual(7 + 2, world.player_B_score)

        self.assertEqual(-1, world.current_player)
        self.assertEqual(-1, next_player)
    def test_observe(self):
        world = WorldWatten()
        world.first_card_deck = 32
        world.last_card_deck = 32
        world.player_A_hand = [0, 1, 2, 3, 4]
        world.player_B_hand = [31, 30, 29, 28, 27]
        world.rank = 8
        world.suit = 0
        world.played_cards = [10, 11, 12, 13, 14]
        world.current_game_player_A_score = 1
        world.current_game_player_B_score = 2
        world.player_A_score = 14
        world.player_B_score = 1
        world.is_last_move_raise = True
        world.is_last_move_accepted_raise = True
        world.is_last_hand_raise_valid = False
        world.current_game_prize = 15

        expected_player_A = [
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,  # 9
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,  # 19
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,  # 29
            0,
            0,
            1,
            0,
            0,
            0,
            0,
            0,
            0,
            0,  # 39
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,  # 49
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,  # 59
            0,
            0,
            0,
            0,
            0,
            0,
            1,
            1,
            1,
            1,  # 69
            1,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,  # 79
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,  # 89
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,  # 99
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            1,
            1,
            0,  # 109
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,  # 119
            0,
            0,
            0,
            0,
            0,
            0,
            1,
            0,
            0,
            0,  # 129
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,  # 139
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,  # 149
            0,
            0,
            0,
            0,
            0,
            1,
            1,
            1,
            1,
            1,  # 159
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,  # 169
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            1,
            0,  # 179
            0,
            1,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,  # 189
            0,
            0,
            0,
            0,
            0,
            1,
            1,
            0,
            0,
            0,  # 199
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,  # 209
            1,
            1,
            1,
            0,
            0,
            0,
            0,
            0,
            0,
            0,  # 219
            0,
            0,
            0,
            0,
            0,
            1
        ]  # 225

        expected_player_B = [
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,  # 9
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,  # 19
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,  # 29
            0,
            0,
            1,
            0,
            0,
            0,
            0,
            0,
            0,
            0,  # 39
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,  # 49
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,  # 59
            0,
            0,
            0,
            0,
            0,
            1,
            0,
            0,
            0,
            0,  # 69
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,  # 79
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,  # 89
            0,
            0,
            0,
            1,
            1,
            1,
            1,
            1,
            0,
            0,  # 99
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            1,
            1,
            0,  # 109
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,  # 119
            0,
            0,
            0,
            0,
            0,
            0,
            1,
            0,
            0,
            0,  # 129
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,  # 139
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,  # 149
            0,
            0,
            0,
            0,
            0,
            1,
            1,
            1,
            1,
            1,  # 159
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,  # 169
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            1,  # 179
            1,
            0,
            1,
            0,
            0,
            0,
            0,
            0,
            0,
            0,  # 189
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,  # 199
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            1,  # 209
            1,
            1,
            1,
            0,
            0,
            0,
            0,
            0,
            0,
            0,  # 219
            0,
            0,
            0,
            0,
            0,
            1
        ]  # 225

        observation_player_A = world.observe(1)
        observation_player_B = world.observe(-1)
        np.testing.assert_array_equal(
            observation_player_A,
            np.array(expected_player_A).reshape((226, 1)))
        np.testing.assert_array_equal(
            observation_player_B,
            np.array(expected_player_B).reshape((226, 1)))
    def test_assign_points_fold(self):
        # player -1 fold
        world = WorldWatten()

        world.current_player = -1
        world.current_game_prize = 5
        world.player_A_score = 3
        world.player_B_score = 8
        world.is_last_hand_raise_valid = None

        world._assign_points_fold()

        self.assertEqual(world.player_A_score, 7)
        self.assertEqual(world.player_B_score, 8)

        # player 1 fold
        world = WorldWatten()

        world.current_player = 1
        world.current_game_prize = 5
        world.player_A_score = 3
        world.player_B_score = 8
        world.is_last_hand_raise_valid = None

        world._assign_points_fold()

        self.assertEqual(world.player_A_score, 3)
        self.assertEqual(world.player_B_score, 12)

        # player 1 fold is last hand raise not valid
        world = WorldWatten()

        world.current_player = 1
        world.current_game_prize = 5
        world.player_A_score = 3
        world.player_B_score = 8
        world.is_last_hand_raise_valid = False

        world._assign_points_fold()

        self.assertEqual(world.player_A_score, 7)
        self.assertEqual(world.player_B_score, 8)

        # player 1 fold is last hand raise valid
        world = WorldWatten()

        world.current_player = 1
        world.current_game_prize = 5
        world.player_A_score = 3
        world.player_B_score = 8
        world.is_last_hand_raise_valid = True

        world._assign_points_fold()

        self.assertEqual(world.player_A_score, 3)
        self.assertEqual(world.player_B_score, 12)

        # player -1 fold is last hand raise not valid
        world = WorldWatten()

        world.current_player = -1
        world.current_game_prize = 5
        world.player_A_score = 3
        world.player_B_score = 8
        world.is_last_hand_raise_valid = False

        world._assign_points_fold()

        self.assertEqual(world.player_A_score, 3)
        self.assertEqual(world.player_B_score, 12)

        # player -1 fold is last hand raise valid
        world = WorldWatten()

        world.current_player = -1
        world.current_game_prize = 5
        world.player_A_score = 3
        world.player_B_score = 8
        world.is_last_hand_raise_valid = True

        world._assign_points_fold()

        self.assertEqual(world.player_A_score, 7)
        self.assertEqual(world.player_B_score, 8)