def play_starting_in(self, initial_state: State) -> GameInfo:
        game_info = GameInfo()

        player_state = self._play_stage(initial_state=initial_state,
                                        policy=self._player_policy,
                                        log_action=game_info.log_player)

        if player_state == BUST:
            game_info.set_winner(Winner.DEALER)
            return game_info

        dealer_cards = (initial_state.opponent_points,
                        self._deck.get_next_card())
        dealer_state = self._play_stage(initial_state=State.from_deal(
            *dealer_cards, player_state.current_sum),
                                        policy=self._dealer_policy,
                                        log_action=game_info.log_dealer)

        if dealer_state == BUST:
            game_info.set_winner(Winner.PLAYER)
            return game_info

        if player_state.current_sum > dealer_state.current_sum:
            game_info.set_winner(Winner.PLAYER)
        elif player_state.current_sum == dealer_state.current_sum:
            game_info.set_winner(Winner.DRAW)
        else:
            game_info.set_winner(Winner.DEALER)

        return game_info
 def check_sum_of_deal(self, expected_sum: int, first_card: Card, second_card: Card):
     state = State.from_deal(first_card, second_card, blank)
     self.assertEqual(expected_sum, state.current_sum)
 def play(self) -> GameInfo:
     player_cards = (self._deck.get_next_card(), self._deck.get_next_card())
     dealer_card = self._deck.get_next_card()
     return self.play_starting_in(
         State.from_deal(*player_cards, dealer_card))