class TestBandit(TestCase):
    """Tests related to the bandit"""

    def setUp(self):
        self.bandit = Bandit()

    def test_create_bandits(self):
        """We can create a bunch of 10 bandits"""
        bandits = [Bandit() for x in range(10)]
        self.assertEqual(len(bandits), 10, "We are expecting 10 Bandits" "")
        self.assertEqual(type(bandits[0]), Bandit)

    def test_bandit_has_choices(self):
        """Verify that Bandit has 10 actions by default"""
        self.assertEqual(len(self.bandit.actions), 10, "Bandit should have 10 " "actions")
        bandit2 = Bandit(20)
        self.assertEqual(len(bandit2.actions), 20, "Bandit should have 20 " "actions")

    def test_bandit_explores(self):
        """Let's explore"""
        self.assertFalse(self.bandit.last_action)
        self.bandit.explores()
        self.assertTrue(self.bandit.last_action)

    def test_bandit_exploits(self):
        """Play a greedy move"""
        # Get the greed move
        greedy_action = self.bandit.greedy
        self.bandit.exploits()
        self.assertIs(self.bandit.last_action, greedy_action, "The last action" " should be the greedy action")

    def test_bandit_e_greedy(self):
        """Test that bandit can mix exploitation and exploration"""
        epsilon = 0  # greedy
        greedy_move = self.bandit.greedy  # greedy might change after a play
        self.bandit.play_egreedy(epsilon)
        self.assertIs(self.bandit.last_action, greedy_move, "The last action should be the greedy action")

        epsilon = 0.1  # play egreedy
        nb_greedy = 0
        for i in range(1000):
            greedy_move = self.bandit.greedy
            self.bandit.play_egreedy(epsilon)
            if self.bandit.last_action == greedy_move:
                nb_greedy += 1
        percent = float(1000 - nb_greedy) / 1000
        self.assertLess(percent, 0.13, "%s > 0.1, wrong !" % percent)

    def test_game(self):
        """tests on the main.game() function"""
        self.assertIsNone(game(nb_plays=100, nb_bandits=10))
        # Example for tests
        test_data = Result("Test data")
        test_data[0] = greedy
        test_data[0.1] = egreedy_0_1
        drawMock = Mock(draw)
        drawMock(test_data)
        self.assertTrue(drawMock.called)
 def setUp(self):
     self.bandit = Bandit()