class CountLearningAgentTest(unittest.TestCase):


    def setUp(self):
        # An agent every test can use
        self.agent = CountLearningAgent()

    def testNoCardNoCount(self):
        self.assertEqual(0, self.agent.count)        
        
    def testNoValCardsNoCount(self):
        hand = Hand(1)
        hand.addCard(Card(1, 6))        
        hand.addCard(Card(1, 6))
        self.agent.updateCount(hand)
        self.assertEqual(0, self.agent.count)
        
    def testOffsettingCardsNoCount(self):
        hand = Hand(1)
        hand.addCard(Card(1, 0))        
        hand.addCard(Card(1, 2))
        self.agent.updateCount(hand)
        self.assertEqual(0, self.agent.count)        
        
    def testEntireDeckNoCount(self):
        # The entire deck should be neutral
        deck = Deck(1, 4, 13)
        dealerHand = Hand(1)
        for _ in range(13):
            dealerHand.addCard(deck.take())
        playerHandMap = {}
        for i in range(3):
            hand = Hand(1)
            for _ in range(13):
                hand.addCard(deck.take())
            playerHandMap[hand] = i
                
        self.assertEqual(0, deck.numActiveCards())    
        gameState = GameState(playerHandMap, dealerHand, deck)
        self.agent.gameOver(gameState, playerHandMap.keys()[0], 1)
        self.assertEqual(0, self.agent.count)
        
    def testEntireDeckNoCountMultiRound(self):
        # The entire deck should be neutral
        deck = Deck(1, 4, 13)
        dealerHand = Hand(1)
        for _ in range(6):
            dealerHand.addCard(deck.take())
        playerHandMap = {}
        for i in range(3):
            hand = Hand(1)
            for _ in range(6):
                hand.addCard(deck.take())
            playerHandMap[hand] = i
                
        self.assertEqual(52-6*4, deck.numActiveCards())    
        gameState = GameState(playerHandMap, dealerHand, deck)
        self.agent.gameOver(gameState, playerHandMap.keys()[0], 1)
        
        dealerHand = Hand(1)
        for _ in range(7):
            dealerHand.addCard(deck.take())
        playerHandMap = {}
        for i in range(3):
            hand = Hand(1)
            for _ in range(7):
                hand.addCard(deck.take())
            playerHandMap[hand] = i
            
        self.assertEqual(0, deck.numActiveCards())   
        gameState = GameState(playerHandMap, dealerHand, deck)
        self.agent.gameOver(gameState, playerHandMap.keys()[0], 1)
        self.assertEqual(0, self.agent.count)
class CountLearningAgentTest(unittest.TestCase):
    def setUp(self):
        # An agent every test can use
        self.agent = CountLearningAgent()

    def testNoCardNoCount(self):
        self.assertEqual(0, self.agent.count)

    def testNoValCardsNoCount(self):
        hand = Hand(1)
        hand.addCard(Card(1, 6))
        hand.addCard(Card(1, 6))
        self.agent.updateCount(hand)
        self.assertEqual(0, self.agent.count)

    def testOffsettingCardsNoCount(self):
        hand = Hand(1)
        hand.addCard(Card(1, 0))
        hand.addCard(Card(1, 2))
        self.agent.updateCount(hand)
        self.assertEqual(0, self.agent.count)

    def testEntireDeckNoCount(self):
        # The entire deck should be neutral
        deck = Deck(1, 4, 13)
        dealerHand = Hand(1)
        for _ in range(13):
            dealerHand.addCard(deck.take())
        playerHandMap = {}
        for i in range(3):
            hand = Hand(1)
            for _ in range(13):
                hand.addCard(deck.take())
            playerHandMap[hand] = i

        self.assertEqual(0, deck.numActiveCards())
        gameState = GameState(playerHandMap, dealerHand, deck)
        self.agent.gameOver(gameState, playerHandMap.keys()[0], 1)
        self.assertEqual(0, self.agent.count)

    def testEntireDeckNoCountMultiRound(self):
        # The entire deck should be neutral
        deck = Deck(1, 4, 13)
        dealerHand = Hand(1)
        for _ in range(6):
            dealerHand.addCard(deck.take())
        playerHandMap = {}
        for i in range(3):
            hand = Hand(1)
            for _ in range(6):
                hand.addCard(deck.take())
            playerHandMap[hand] = i

        self.assertEqual(52 - 6 * 4, deck.numActiveCards())
        gameState = GameState(playerHandMap, dealerHand, deck)
        self.agent.gameOver(gameState, playerHandMap.keys()[0], 1)

        dealerHand = Hand(1)
        for _ in range(7):
            dealerHand.addCard(deck.take())
        playerHandMap = {}
        for i in range(3):
            hand = Hand(1)
            for _ in range(7):
                hand.addCard(deck.take())
            playerHandMap[hand] = i

        self.assertEqual(0, deck.numActiveCards())
        gameState = GameState(playerHandMap, dealerHand, deck)
        self.agent.gameOver(gameState, playerHandMap.keys()[0], 1)
        self.assertEqual(0, self.agent.count)