def setUp(self):
     self.baseball_simulator = BaseballSimulator()
class TestBaseBallSimulator(unittest.TestCase):
    def setUp(self):
        self.baseball_simulator = BaseballSimulator()

    def test_strike(self):
        self.baseball_simulator.strike()
        self.assertEqual(self.baseball_simulator.get_num_strikes(), 1)

        self.assertEqual(self.baseball_simulator.get_num_outs(), 0)
        self.baseball_simulator.strike()
        self.baseball_simulator.strike()
        self.assertEqual(self.baseball_simulator.get_num_outs(), 1)

        self.assertEqual(self.baseball_simulator.get_num_strikes(), 0)

    def test_ball(self):
        self.assertEqual(self.baseball_simulator.get_num_balls(), 0)
        self.baseball_simulator.ball()
        self.assertEqual(self.baseball_simulator.get_num_balls(), 1)
        
        self.baseball_simulator.ball()
        self.baseball_simulator.ball()
        self.baseball_simulator.ball()

        self.assertEqual(self.baseball_simulator.get_num_balls(), 0)

    def test_foul(self):
        self.assertEqual(self.baseball_simulator.get_num_strikes(), 0)
        self.baseball_simulator.foul()
        self.assertEqual(self.baseball_simulator.get_num_strikes(), 1)
        self.baseball_simulator.foul()
        self.baseball_simulator.foul()
        self.assertEqual(self.baseball_simulator.get_num_strikes(), 2)

    def test_inning(self):
        self.assertEqual(self.baseball_simulator.get_inning(), 1)
        self.assertEqual(self.baseball_simulator.get_inning_half(), TOP_OF_INNING)

        for i in range(THREE_STRIKES * THREE_OUTS):
            self.baseball_simulator.strike()

        self.assertEqual(self.baseball_simulator.get_inning(), 1)
        self.assertEqual(self.baseball_simulator.get_inning_half(), BOTTOM_OF_INNING)

        for i in range(THREE_STRIKES * THREE_OUTS):
            self.baseball_simulator.strike()

        self.assertEqual(self.baseball_simulator.get_inning(), 2)
        self.assertEqual(self.baseball_simulator.get_inning_half(), TOP_OF_INNING)

    def test_game_over(self):
        self.assertFalse(self.baseball_simulator.is_game_over())
        for i in range(THREE_STRIKES * THREE_OUTS * INNING_HALVES * INNINGS):
            self.baseball_simulator.strike()

        self.assertFalse(self.baseball_simulator.is_game_over())

        
        self.baseball_simulator.hit(DoubleStrategy())
        self.baseball_simulator.hit(DoubleStrategy())

        for i in range(THREE_STRIKES * THREE_OUTS * INNING_HALVES):
            self.baseball_simulator.strike()

        self.assertTrue(self.baseball_simulator.is_game_over())
        
    def test_hit(self):
        self.baseball_simulator.hit(DoubleStrategy())
        self.assertFalse(self.baseball_simulator.bases.first_base.is_runner_on())
        self.assertTrue(self.baseball_simulator.bases.second_base.is_runner_on())

        self.baseball_simulator.hit(SingleStrategy())
        self.assertTrue(self.baseball_simulator.bases.first_base.is_runner_on())
        self.assertFalse(self.baseball_simulator.bases.second_base.is_runner_on())
        self.assertTrue(self.baseball_simulator.bases.third_base.is_runner_on())

        self.baseball_simulator.hit(SingleStrategy())
        self.assertEqual(self.baseball_simulator.visiting_team.get_score(), 1)

        self.baseball_simulator.hit(OutStrategy())
        self.assertEqual(self.baseball_simulator.get_num_outs(), 0)
        self.assertEqual(self.baseball_simulator.get_inning_half(), BOTTOM_OF_INNING)