Exemple #1
0
class DealerTests(unittest.TestCase):

    def setUp(self):
        self.trait1 = TraitCard(CARNIVORE)
        self.trait2 = TraitCard(SCAVENGER)
        self.long_neck0 = TraitCard(LONG_NECK, 0)
        self.horns0 = TraitCard(HORNS, 0)
        self.fertile0 = TraitCard(FERTILE, 0)
        self.fat_tissue0 = TraitCard(FAT_TISSUE, 0)
        self.scav0 = TraitCard(SCAVENGER, 0)
        self.forage0 = TraitCard(FORAGING, 0)
        self.carn2 = TraitCard(CARNIVORE, 2)
        self.horns1 = TraitCard(HORNS, 1)
        self.scav_neg_1 = TraitCard(SCAVENGER, -1)
        self.scav3 = TraitCard(SCAVENGER, 3)
        self.forage1 = TraitCard(FORAGING, 1)
        self.carn0 = TraitCard(CARNIVORE, 0)
        self.warning0 = TraitCard(WARNING_CALL, 0)

        self.p1_hand = [self.long_neck0, self.horns0, self.fertile0, self.fat_tissue0, self.scav0, self.forage0]
        self.p2_hand = [self.carn2, self.horns0, self.fertile0, self.horns1, self.scav_neg_1, self.forage0]
        self.p3_hand = [self.carn0, self.horns0, self.warning0, self.horns0, self.scav3, self.forage1]

        self.coop = Species(2, 5, 6, [TraitCard(COOPERATION)])
        self.forage_coop = Species(2, 5, 3, [TraitCard(FORAGING), TraitCard(COOPERATION)])
        self.coop2 = Species(2, 5, 3, [TraitCard(COOPERATION)])
        self.fat_long_neck = Species(2, 5, 4, [TraitCard(FAT_TISSUE), TraitCard(LONG_NECK)], 4)
        self.fertile_long_neck = Species(2, 1, 6, [TraitCard(FERTILE), TraitCard(LONG_NECK)])

        self.player1 = PlayerState(1, 0, [self.coop, self.forage_coop, self.coop2], self.p1_hand)
        self.player2 = PlayerState(2, 0, [self.fat_long_neck], self.p2_hand)
        self.player3 = PlayerState(3, 0, [self.fertile_long_neck], self.p3_hand)

        self.dealer = Dealer([self.player1, self.player2, self.player3], 3, [self.trait1, self.trait2])
        self.dealer.add_silly_players()

        self.bt = BoardTrade(4, [0, 2, 3])
        self.rt = ReplaceTrait(2, 0, 5)
        self.gb = GrowBody(0, 0)
        self.gp = GrowPopulation(0, 1)
        self.bt2 = BoardTrade(1, [2])
        self.bt3 = BoardTrade(3, [4, 5])

        self.p1_actions = PlayerAction(1, [], [], [self.bt], [self.rt])
        self.p2_actions = PlayerAction(4, [self.gp], [self.gb], [], [])
        self.p3_actions = PlayerAction(0, [], [], [self.bt2, self.bt3], [])

        self.valid_actions = [self.p1_actions, self.p2_actions, self.p3_actions]

    def tearDown(self):
        del self.trait1
        del self.trait2
        del self.long_neck0
        del self.horns0
        del self.fertile0
        del self.fat_tissue0
        del self.scav0
        del self.forage0
        del self.carn2
        del self.horns1
        del self.scav_neg_1
        del self.scav3
        del self.forage1
        del self.carn0
        del self.warning0

        del self.p1_hand
        del self.p2_hand
        del self.p3_hand

        del self.coop
        del self.forage_coop
        del self.coop2
        del self.fat_long_neck
        del self.fertile_long_neck

        del self.player1
        del self.player2
        del self.player3

        del self.dealer

        del self.bt
        del self.rt
        del self.gb
        del self.gp
        del self.bt2
        del self.bt3

        del self.p1_actions
        del self.p2_actions
        del self.p3_actions

        del self.valid_actions

    def test_new(self):
        players = [Player(i) for i in range(1, 5)]

        dealer = Dealer.new(players)

        self.assertEquals(len(dealer.hand), 122)
        self.assertEquals(dealer.wateringHole, 0)
        self.assertEquals(len(dealer.playerStates), 4)

    def test_create_hand(self):
        hand = Dealer.create_hand()

        self.assertEquals(hand[0], TraitCard(AMBUSH, -3))
        self.assertEquals(hand[121], TraitCard(WARNING_CALL, 3))
        self.assertEquals(len(hand), 122)

        ambushes = 0
        for trait in hand:
            if trait.name == AMBUSH:
                ambushes += 1
        self.assertEquals(ambushes, 7)

        carnivores = 0
        for trait in hand:
            if trait.name == CARNIVORE:
                carnivores += 1
        self.assertEquals(carnivores, 17)

        warnings = 0
        for trait in hand:
            if trait.name == WARNING_CALL:
                warnings += 1
        self.assertEquals(warnings, 7)

        longs = 0
        for trait in hand:
            if trait.name == LONG_NECK:
                longs += 1
        self.assertEquals(longs, 7)

    def test_run_game(self):
        dealer = Dealer.new([Player(1), Player(2)])
        dealer.hand = []
        expected_dealer1 = copy.deepcopy(dealer)

        dealer.runGame()

        self.assertEquals(dealer, expected_dealer1)

        dealer.hand = [TraitCard(AMBUSH, -1), TraitCard(AMBUSH), TraitCard(AMBUSH, 1), TraitCard(BURROWING),
                       TraitCard(BURROWING, 3), TraitCard(CARNIVORE, -1), TraitCard(CLIMBING), TraitCard(CLIMBING, 2),
                       TraitCard(CLIMBING, 3), TraitCard(WARNING_CALL)]

        expected_player1_species = [Species(0, 0, 2, [TraitCard(AMBUSH, 1)])]
        expected_player2_species = [Species(0, 0, 1, [TraitCard(CLIMBING)])]
        expected_player1 = PlayerState(1, 2, expected_player1_species,
                                       [], Player(1))
        expected_player2 = PlayerState(2, 1, expected_player2_species,
                                       [TraitCard(CLIMBING, 3), TraitCard(WARNING_CALL)], Player(2))
        self.assertEquals(dealer.wateringHole, 0)
        dealer.runGame()
        self.assertEquals(dealer.playerStates[0].trait_cards, [TraitCard(CLIMBING, 3), TraitCard(WARNING_CALL)])
        self.assertEquals(dealer.playerStates[1].trait_cards, [])

        self.assertEquals(dealer.hand, [])
        self.assertEquals(dealer.playerStates[1].species[0].trait_cards, expected_player1_species[0].trait_cards)
        self.assertEquals(dealer.playerStates[0].species[0], expected_player2_species[0])
        self.assertEquals(dealer.wateringHole, 0)
        self.assertEquals(dealer.playerStates[1].foodbag, 2)
        self.assertEquals(dealer.playerStates[0].foodbag, 1)

        self.assertEquals(dealer.playerStates[1].species, expected_player1.species)
        self.assertEquals(dealer.playerStates[0].species, expected_player2.species)
        self.assertEquals(dealer.playerStates[1].trait_cards, expected_player1.trait_cards)
        self.assertEquals(dealer.playerStates[0].trait_cards, expected_player2.trait_cards)

        self.assertEquals(dealer.playerStates[1], expected_player1)

        self.assertEquals(dealer.playerStates, [expected_player2, expected_player1])

        exp_dealer2 = Dealer([expected_player2, expected_player1], 0, [])
        self.assertEquals(dealer, exp_dealer2)

        dealer3 = Dealer.new([Player(1), Player(1), Player(1), Player(1), Player(1), Player(1), Player(1), Player(1)])
        dealer3.runGame()
        dealer4 = Dealer.new([Player(1), Player(1), Player(1), Player(1)])
        dealer4.runGame()

    def test_cycle_players(self):
        dealer = Dealer.new([Player(1), Player(2), Player(3), Player(4), Player(5), Player(6), Player(7), Player(8)])
        dealer.cycle_players()
        self.assertEquals(dealer.playerStates[0].id, 2)
        self.assertEquals(dealer.playerStates[1].id, 3)
        self.assertEquals(dealer.playerStates[2].id, 4)
        self.assertEquals(dealer.playerStates[3].id, 5)
        self.assertEquals(dealer.playerStates[4].id, 6)
        self.assertEquals(dealer.playerStates[5].id, 7)
        self.assertEquals(dealer.playerStates[6].id, 8)
        self.assertEquals(dealer.playerStates[7].id, 1)


    def test_turn(self):
        dealer = Dealer.new([Player(1), Player(2), Player(3)])
        result_dealer = copy.deepcopy(dealer)
        result_dealer.hand = result_dealer.hand[24:]
        result_dealer.playerStates[0] = PlayerState(1, 0, [], [TraitCard(BURROWING, 2), TraitCard(BURROWING, 3),
                                                               TraitCard(CARNIVORE, -8), TraitCard(CARNIVORE, -7)])
        result_dealer.playerStates[1] = PlayerState(2, 0, [], [TraitCard(CARNIVORE, -6), TraitCard(CARNIVORE, -5),
                                                               TraitCard(CARNIVORE, -4), TraitCard(CARNIVORE, -3)])
        result_dealer.playerStates[2] = PlayerState(3, 0, [], [TraitCard(CARNIVORE, -2), TraitCard(CARNIVORE, -1),
                                                               TraitCard(CARNIVORE, 0), TraitCard(CARNIVORE, 1)])
        dealer.turn()
        self.assertEquals(dealer, result_dealer)

    def test_is_game_over(self):
        traits = [TraitCard(CARNIVORE), TraitCard(AMBUSH), TraitCard(WARNING_CALL), TraitCard(LONG_NECK),
                  TraitCard(CARNIVORE), TraitCard(AMBUSH), TraitCard(WARNING_CALL), TraitCard(LONG_NECK)]
        enough_traits = [TraitCard(CARNIVORE), TraitCard(AMBUSH), TraitCard(WARNING_CALL), TraitCard(LONG_NECK),
                         TraitCard(CARNIVORE), TraitCard(AMBUSH), TraitCard(WARNING_CALL), TraitCard(LONG_NECK),
                         TraitCard(CARNIVORE), TraitCard(AMBUSH), TraitCard(FERTILE), TraitCard(FERTILE, 3)]

        dealer = Dealer.new([Player(1), Player(2), Player(3)])

        dealer.hand = traits
        self.assertTrue(dealer.is_game_over())

        dealer.hand = enough_traits
        self.assertFalse(dealer.is_game_over())

    def test_step1(self):
        species1 = Species(3, 4, 5)
        species2 = Species(3, 3, 3)
        speciesList1 = [species1, species2]
        dealer_hand = [TraitCard(CARNIVORE), TraitCard(AMBUSH), TraitCard(WARNING_CALL), TraitCard(LONG_NECK),
                         TraitCard(CARNIVORE), TraitCard(AMBUSH), TraitCard(WARNING_CALL), TraitCard(LONG_NECK),
                         TraitCard(CARNIVORE), TraitCard(AMBUSH)]

        play_strat1 = Player(1)
        play_strat2 = Player(2)
        player1 = PlayerState(1, 0, [], [], play_strat1)
        player2 = PlayerState(2, 2, speciesList1, [], play_strat2)

        expected_player1 = copy.deepcopy(player1)
        expected_player1.species.append(Species(0, 0, 1))
        expected_player1.trait_cards = [TraitCard(AMBUSH), TraitCard(CARNIVORE),
                                        TraitCard(LONG_NECK), TraitCard(WARNING_CALL)]
        expected_player2 = copy.deepcopy(player2)
        expected_player2.trait_cards = [TraitCard(AMBUSH), TraitCard(CARNIVORE), TraitCard(CARNIVORE),
                                        TraitCard(LONG_NECK), TraitCard(WARNING_CALL)]

        dealer = Dealer([player1, player2], 4, dealer_hand)
        dealer.step1()

        self.assertEquals(player1.player_reference.playerState, expected_player1)
        self.assertEquals(player2.player_reference.playerState, expected_player2)
        self.assertEquals(dealer.hand, [TraitCard(AMBUSH)])

    def test_get_player_choices(self):
        species1 = Species(3, 4, 5)
        species2 = Species(3, 3, 3)
        speciesList1 = [species1, species2]
        traits = [TraitCard(AMBUSH, -2), TraitCard(CARNIVORE, -2), TraitCard(LONG_NECK, -2), TraitCard(WARNING_CALL, -2)]
        traits2 = [TraitCard(AMBUSH, -1), TraitCard(AMBUSH, 0), TraitCard(AMBUSH, 1), TraitCard(CARNIVORE, -1),
                   TraitCard(CARNIVORE), TraitCard(CARNIVORE, 1), TraitCard(LONG_NECK), TraitCard(LONG_NECK, 1),
                         TraitCard(WARNING_CALL), TraitCard(WARNING_CALL, 1)]

        play_strat1 = Player(1)
        play_strat2 = Player(2)
        player1 = PlayerState(1, 0, [], [], play_strat1)
        player2 = PlayerState(2, 2, speciesList1, traits, play_strat2)

        dealer = Dealer([player1, player2], 4, traits2)
        dealer.step1()
        play_act1 = PlayerAction(0, [GrowPopulation(1, 3)], [], [BoardTrade(1, [2])], [])
        play_act2 = PlayerAction(0, [GrowPopulation(2, 5)], [GrowBody(2, 2)], [BoardTrade(1, [4])],
                                    [ReplaceTrait(2, 0, 6)])

        choices = dealer.get_player_choices()
        self.assertEquals(choices, [play_act1, play_act2])

    def test_add_silly_players(self):
        species1 = Species(3, 4, 5)
        species2 = Species(3, 3, 3)
        species3 = Species(1, 2, 3)
        species4 = Species(1, 2, 3)
        speciesList1 = [species1, species2]
        speciesList2 = [species3, species4]

        player1 = PlayerState(1, 0, speciesList1, [])
        player2 = PlayerState(2, 2, speciesList2, [])

        dealer = Dealer([player1, player2], 4, [])
        dealer.add_silly_players()

        self.assertEquals(dealer.playerStates[0].player_reference.playerId, 1)
        self.assertEquals(dealer.playerStates[1].player_reference.playerId, 2)

    def test_step4(self):
        new_p1_hand = []
        new_p2_hand = [self.fertile0, self.horns1, self.forage0]
        new_p3_hand = []

        new_coop = Species(2, 5, 6, [TraitCard(COOPERATION)])
        new_forage_coop = Species(2, 5, 3, [TraitCard(FORAGING), TraitCard(COOPERATION)])
        new_coop2 = Species(2, 5, 3, [TraitCard(FORAGING)])
        added_spec = Species(1, 0, 2, [TraitCard(LONG_NECK), TraitCard(FERTILE), TraitCard(FAT_TISSUE)])
        new_fat_long_neck = Species(5, 6, 5, [TraitCard(FAT_TISSUE), TraitCard(LONG_NECK)], 2)
        new_fertile_long_neck = Species(2, 1, 7, [TraitCard(FERTILE), TraitCard(LONG_NECK)])
        added_warning = Species(0, 0, 1, [TraitCard(WARNING_CALL)])
        added_scav_forage = Species(0, 0, 1, [TraitCard(SCAVENGER, 3), TraitCard(FORAGING, 1)])

        new_player1 = PlayerState(1, 0, [new_coop, new_forage_coop, new_coop2, added_spec], new_p1_hand)
        new_player2 = PlayerState(2, 0, [new_fat_long_neck], new_p2_hand)
        new_player3 = PlayerState(3, 0, [new_fertile_long_neck, added_warning, added_scav_forage], new_p3_hand)

        new_dealer = Dealer([new_player1, new_player2, new_player3], 0, [self.trait1, self.trait2])

        self.dealer.step4(self.valid_actions)

        self.assertEquals(self.dealer, new_dealer)

    def test_end_turn(self):
        species1 = Species(3, 4, 5, [TraitCard(CARNIVORE)])
        species2 = Species(3, 3, 3)
        species3 = Species(0, 2, 3)
        species4 = Species(1, 2, 3)
        species5 = Species(0, 3, 3)
        speciesList1 = [species1, species2]
        speciesList2 = [species3, species4, species5]

        dealer_hand = [TraitCard(CARNIVORE), TraitCard(AMBUSH), TraitCard(WARNING_CALL)]

        player1 = PlayerState(1, 0, speciesList1, [], Player(1))
        player2 = PlayerState(2, 2, speciesList2, [], Player(2))

        new_player1 = copy.deepcopy(player1)
        new_player1.species = [Species(0, 4, 3, [TraitCard(CARNIVORE)]), Species(0, 3, 3)]
        new_player1.foodbag = 6
        new_player2 = copy.deepcopy(player2)
        new_player2.species = [Species(0, 2, 1)]
        new_player2.trait_cards = [TraitCard(CARNIVORE), TraitCard(AMBUSH), TraitCard(WARNING_CALL)]
        new_player2.foodbag = 3

        dealer = Dealer([player1, player2], 4, dealer_hand)
        new_dealer = copy.deepcopy(dealer)
        new_dealer.playerStates = [new_player1, new_player2]
        new_dealer.hand = []

        dealer.end_turn()

        self.assertEquals(dealer, new_dealer)

    def feeding(self):
        unchanged_dealer = copy.deepcopy(self.dealer)
        self.dealer.fullPlayerIds = [1, 2, 3]
        self.dealer.feeding()

        self.assertEquals(self.dealer, unchanged_dealer)

        self.dealer.fullPlayerIds = []
        self.dealer.wateringHole = 0
        unchanged_dealer.wateringHole = 0
        self.dealer.feeding()

        self.assertEquals(self.dealer, unchanged_dealer)

        self.dealer.fullPlayerIds = [1]
        self.dealer.wateringHole = 2
        self.dealer.feeding()

        new_fat_long_neck = Species(2, 5, 4, [TraitCard(FAT_TISSUE), TraitCard(LONG_NECK)], 5)
        new_fertile_long_neck = Species(3, 1, 6, [TraitCard(FERTILE), TraitCard(LONG_NECK)])
        changed_dealer = copy.deepcopy(self.dealer)
        changed_dealer.wateringHole = 0
        changed_dealer.playerStates[1].species[0] = new_fat_long_neck
        changed_dealer.playerStates[2].species[0] = new_fertile_long_neck

        self.assertEquals(self.dealer, changed_dealer)

    def testVegFeed1(self):
        species1 = Species(3, 4, 5)
        species2 = Species(3, 3, 3)
        species3 = Species(1, 2, 3)
        species4 = Species(1, 2, 3)
        speciesList1 = [species1, species2]
        speciesList2 = [species3, species4]

        player1 = PlayerState(1, 0, speciesList1, [])
        player2 = PlayerState(2, 2, speciesList2, [])

        dealer = Dealer([player1, player2], 4, [])
        self.assertEquals(dealer.playerStates[0].species[0].food, 3)
        dealer.feed1()
        dealer.playerStates.append(dealer.playerStates.pop(0))
        self.assertEquals(dealer.wateringHole, 3)
        self.assertEquals(dealer.playerStates[0].id, 2)
        self.assertEquals(dealer.playerStates[1].species[0].food, 4)

    def testFatFoodFeed1(self):
        species1 = Species(3, 4, 5, [TraitCard(FAT_TISSUE)], 1)
        species2 = Species(3, 3, 3)
        species3 = Species(1, 4, 3, [TraitCard(FAT_TISSUE)], 0)
        species4 = Species(1, 2, 3)
        speciesList1 = [species1, species2]
        speciesList2 = [species3, species4]

        player1 = PlayerState(1, 0, speciesList1, [])
        player2 = PlayerState(2, 2, speciesList2, [])

        dealer = Dealer([player1, player2], 5, [])
        dealer.add_silly_players()
        self.assertEquals(dealer.wateringHole, 5)
        dealer.request_feed()
        dealer.playerStates.append(dealer.playerStates.pop(0))
        self.assertEquals(dealer.wateringHole, 2)
        self.assertEquals(dealer.playerStates[1].species[0].fatFood, 4)
        dealer.request_feed()
        dealer.playerStates.append(dealer.playerStates.pop(0))
        self.assertEquals(dealer.wateringHole, 0)
        self.assertEquals(dealer.playerStates[1].species[0].fatFood, 2)

    def testCarnivoreFeed1(self):
        species1 = Species(3, 4, 5, [TraitCard(CARNIVORE)], 1)
        species2 = Species(3, 3, 3)
        species3 = Species(1, 5, 4)
        species4 = Species(1, 2, 6)
        speciesList1 = [species1, species2]
        speciesList2 = [species3, species4]

        player1 = PlayerState(1, 0, speciesList1, [])
        player2 = PlayerState(2, 2, speciesList2, [])

        dealer = Dealer([player1, player2], 5, [])
        dealer.add_silly_players()
        self.assertEquals(dealer.wateringHole, 5)

        self.assertEquals(dealer.playerStates[0].species[0].food, 3)
        self.assertEquals(dealer.playerStates[1].species[1].population, 6)

        dealer.feed1()
        dealer.playerStates.append(dealer.playerStates.pop(0))
        self.assertEquals(dealer.wateringHole, 4)
        self.assertEquals(dealer.playerStates[1].species[0].food, 4)
        self.assertEquals(dealer.playerStates[0].species[1].population, 5)

    def testCarnivoreFeed1_withHorns(self):
        species1 = Species(2, 4, 3, [TraitCard(CARNIVORE)])
        species2 = Species(0, 2, 1, [TraitCard(CARNIVORE)])

        species4 = Species(1, 2, 6, [TraitCard(HORNS)])
        speciesList1 = [species1, species2]
        speciesList2 = [species4]

        player1 = PlayerState(1, 0, speciesList1, [])
        player2 = PlayerState(2, 2, speciesList2, [])

        dealer = Dealer([player1, player2], 5, [])
        dealer.add_silly_players()
        self.assertEquals(dealer.wateringHole, 5)

        self.assertEquals(dealer.playerStates[0].species[0].food, 2) # carnivore
        self.assertEquals(dealer.playerStates[1].species[0].population, 6) # horns

        dealer.feed1() #carnivore attacks horns
        dealer.playerStates.append(dealer.playerStates.pop(0))
        self.assertEquals(dealer.wateringHole, 5)
        self.assertEquals(dealer.playerStates[1].species[0].food, 2) # carnivore
        self.assertEquals(dealer.playerStates[1].species[0].population, 2) # carnivore
        self.assertEquals(dealer.playerStates[0].species[0].population, 5) # horns

        dealer.feed1() #horns feeds
        dealer.playerStates.append(dealer.playerStates.pop(0))
        self.assertEquals(dealer.wateringHole, 4)
        self.assertEquals(dealer.playerStates[1].species[0].food, 2) # horns
        self.assertEquals(dealer.playerStates[1].species[0].population, 5) # horns
        self.assertEquals(dealer.playerStates[0].species[0].food, 2) # carnivore
        self.assertEquals(dealer.playerStates[0].species[0].population, 2) # carnivore

        self.assertEquals(len(dealer.playerStates[0].species), 2)
        dealer.feed1()
        dealer.playerStates.append(dealer.playerStates.pop(0))
        # carnivore 2 went extinct
        self.assertEquals(len(dealer.playerStates[0].species), 1)

        self.assertEquals(dealer.wateringHole, 4)
        self.assertEquals(dealer.playerStates[1].species[0].population, 2) # carnivore
        self.assertEquals(dealer.playerStates[0].species[0].population, 4) # horns

    def test_feed_result_vegetarian(self):
        species1 = Species(3, 4, 5)
        species2 = Species(3, 3, 3)
        species3 = Species(1, 2, 3)
        species4 = Species(1, 2, 3)
        speciesList1 = [species1, species2]
        speciesList2 = [species3, species4]

        player1 = PlayerState(1, 0, speciesList1, [])
        player2 = PlayerState(2, 2, speciesList2, [])

        dealer = Dealer([player1, player2], 4, [])
        self.assertEquals(dealer.playerStates[0].species[0].food, 3)
        dealer.feed_result_vegetarian(0)
        self.assertEquals(dealer.wateringHole, 3)
        self.assertEquals(dealer.playerStates[1].id, 2)
        self.assertEquals(dealer.playerStates[0].species[0].food, 4)

    def test_feed_result_fat_food(self):
        species1 = Species(3, 4, 5, [TraitCard(FAT_TISSUE)], 1)
        species2 = Species(3, 3, 3)
        species3 = Species(1, 4, 3, [TraitCard(FAT_TISSUE)], 0)
        species4 = Species(1, 2, 3)
        speciesList1 = [species1, species2]
        speciesList2 = [species3, species4]

        player1 = PlayerState(1, 0, speciesList1, [])
        player2 = PlayerState(2, 2, speciesList2, [])

        dealer = Dealer([player1, player2], 5, [])
        dealer.add_silly_players()
        self.assertEquals(dealer.wateringHole, 5)
        dealer.feed_result_fat_food(0, 4)
        self.assertEquals(dealer.wateringHole, 2)
        self.assertEquals(dealer.playerStates[0].species[0].fatFood, 4)

        # Requesting too much fat food, catch this exception in feeding cycle and throw player out
        with self.assertRaises(Exception):
            dealer.feed_result_fat_food(1, 2)

        self.assertEquals(dealer.wateringHole, 2)
        self.assertEquals(dealer.playerStates[0].species[1].fatFood, 0)

    def testfeed_result_carnivore(self):
        species1 = Species(1, 4, 2, [TraitCard(CARNIVORE)], 1)
        species4 = Species(1, 2, 6, [TraitCard(HORNS)])
        speciesList1 = [species1]
        speciesList2 = [species4]

        player1 = PlayerState(1, 0, speciesList1, [])
        player2 = PlayerState(2, 2, speciesList2, [])

        dealer = Dealer([player1, player2], 5, [])
        self.assertEquals(dealer.wateringHole, 5)

        self.assertEquals(dealer.playerStates[0].species[0].food, 1) # carnivore
        self.assertEquals(dealer.playerStates[1].species[0].population, 6) # horns

        dealer.feed_result_carnivore(0, 1, 0) #carnivore attacks horns
        self.assertEquals(dealer.wateringHole, 5)
        self.assertEquals(dealer.playerStates[0].species[0].food, 1) # carnivore
        self.assertEquals(dealer.playerStates[0].species[0].population, 1) # carnivore
        self.assertEquals(dealer.playerStates[1].species[0].population, 5) # horns

        dealer.feed_result_carnivore(0, 1, 0) #carnivore attacks horns
        self.assertEquals(dealer.wateringHole, 5)
        self.assertEquals(len(dealer.playerStates[0].species), 0)
        self.assertEquals(len(dealer.playerStates[1].species), 1)
        self.assertTrue(dealer.playerStates[1].species[0].hasTrait(HORNS))

    def test_execute_attack(self):
        carnivore1 = Species(1, 4, 3, [TraitCard(CARNIVORE)], 1)
        horns1 = Species(1, 2, 6, [TraitCard(HORNS)])
        carnivore2 = Species(1, 4, 1, [TraitCard(CARNIVORE)], 1)
        horns2 = Species(1, 2, 1, [TraitCard(HORNS)])

        player1carn = PlayerState(1, 0, [carnivore1], [])
        player2horn = PlayerState(2, 2, [horns1], [])
        player3carn = PlayerState(3, 3, [carnivore2])
        player4horn = PlayerState(4, 4, [horns2])

        traits = [TraitCard(CARNIVORE), TraitCard(SCAVENGER), TraitCard(LONG_NECK)]

        dealer = Dealer([player1carn, player2horn], 5, traits)
        self.assertEquals(dealer.wateringHole, 5)

        self.assertEquals(dealer.playerStates[0].species[0].food, 1) # carnivore
        self.assertEquals(dealer.playerStates[1].species[0].population, 6) # horns
        self.assertEquals(dealer.hand, traits)

        dealer.execute_attack(carnivore1, horns1, player1carn, player2horn, 0, 0) #carnivore attacks horns
        self.assertEquals(dealer.wateringHole, 4)
        self.assertEquals(carnivore1.food, 2) # carnivore
        self.assertEquals(carnivore1.population, 2) # carnivore
        self.assertEquals(horns1.population, 5) # horns
        self.assertEquals(carnivore2.food, 1) # carnivore
        self.assertEquals(horns2.population, 1) # horns


        # tests below show species going extinct
        dealer2 = Dealer([player3carn, player4horn], 5, traits)
        self.assertEquals(dealer2.hand, traits)

        self.assertEquals(dealer2.wateringHole, 5)
        self.assertEquals(len(player3carn.species), 1)
        self.assertEquals(len(player4horn.species), 1)
        self.assertEquals(dealer2.hand, [TraitCard(CARNIVORE), TraitCard(SCAVENGER), TraitCard(LONG_NECK)])
        self.assertEquals(player4horn.trait_cards, [])
        self.assertEquals(player3carn.trait_cards, [])

        dealer2.execute_attack(carnivore2, horns2, player3carn, player4horn, 0, 0) #both die

        self.assertEquals(dealer2.wateringHole, 5)
        self.assertEquals(len(player3carn.species), 0)
        self.assertEquals(len(player4horn.species), 0)
        self.assertEquals(dealer2.hand, [])
        self.assertEquals(player4horn.trait_cards, [TraitCard(CARNIVORE), TraitCard(SCAVENGER)])
        self.assertEquals(player3carn.trait_cards, [TraitCard(LONG_NECK)])

    def testFeedAllSpeciesWithTrait(self):
        # Species(food, body, population, traits, fatfood)
        species1 = Species(3, 4, 5, [TraitCard(SCAVENGER)]) # will feed
        species2 = Species(3, 3, 3, [TraitCard(SCAVENGER)]) # won't feed
        species3 = Species(1, 5, 4, [TraitCard(SCAVENGER), TraitCard(FORAGING)]) # will feed
        species4 = Species(1, 2, 6, [TraitCard(SCAVENGER)]) # can't feed (watering hole empty)
        speciesList1 = [species1, species2]
        speciesList2 = [species3, species4]

        player1 = PlayerState(1, 0, speciesList1, [])
        player2 = PlayerState(2, 2, speciesList2, [])

        dealer = Dealer([player1, player2], 3, [])

        self.assertEquals(species1.food, 3)
        self.assertEquals(species2.food, 3)
        self.assertEquals(species3.food, 1)
        self.assertEquals(species4.food, 1)
        self.assertEquals(dealer.wateringHole, 3)

        dealer.feed_all_species_with_trait(SCAVENGER)
        self.assertEquals(species1.food, 4)
        self.assertEquals(species2.food, 3)
        self.assertEquals(species3.food, 3)
        self.assertEquals(species4.food, 1)
        self.assertEquals(dealer.wateringHole, 0)

    def test_add_fertile_populations(self):
        # Species(food, body, population, traits, fatfood)
        fertile1 = Species(3, 4, 5, [TraitCard(FERTILE)]) # will feed
        scavenger = Species(3, 3, 3, [TraitCard(SCAVENGER)]) # won't feed
        fertile2 = Species(1, 5, 4, [TraitCard(FERTILE), TraitCard(FORAGING)]) # will feed
        fertile3 = Species(1, 2, 7, [TraitCard(FERTILE)]) # can't feed (watering hole empty)
        speciesList1 = [fertile1, scavenger]
        speciesList2 = [fertile2, fertile3]

        player1 = PlayerState(1, 0, speciesList1, [])
        player2 = PlayerState(2, 2, speciesList2, [])

        dealer = Dealer([player1, player2], 3, [])

        dealer.add_fertile_populations()

        self.assertEquals(fertile1, Species(3, 4, 6, [TraitCard(FERTILE)]))
        self.assertEquals(scavenger, Species(3, 3, 3, [TraitCard(SCAVENGER)]))
        self.assertEquals(fertile2, Species(1, 5, 5, [TraitCard(FERTILE), TraitCard(FORAGING)]))
        self.assertEquals(fertile3, Species(1, 2, 7, [TraitCard(FERTILE)]))

    def test_transfer_fat_food(self):
        fat1 = Species(2, 5, 7, [TraitCard(FAT_TISSUE)], 3)
        empty_fat = Species(2, 5, 7, [TraitCard(FAT_TISSUE)], 0)
        fat2 = Species(2, 5, 7, [TraitCard(FAT_TISSUE)], 6)
        non_fat = Species(2, 3, 4)
        non_fat2 = Species(1, 1, 4, [TraitCard(CARNIVORE), TraitCard(FERTILE)])

        new_fat1 = Species(5, 5, 7, [TraitCard(FAT_TISSUE)], 0)
        new_empty_fat = Species(2, 5, 7, [TraitCard(FAT_TISSUE)], 0)
        new_fat2 = Species(7, 5, 7, [TraitCard(FAT_TISSUE)], 1)
        new_non_fat = Species(2, 3, 4)
        new_non_fat2 = Species(1, 1, 4, [TraitCard(CARNIVORE), TraitCard(FERTILE)])

        player1 = PlayerState(1, 2, [fat1, non_fat, empty_fat])
        player2 = PlayerState(2, 5, [fat2])
        player3 = PlayerState(3, 4, [non_fat2])
        new_player1 = PlayerState(1, 2, [new_fat1, new_non_fat, new_empty_fat])
        new_player2 = PlayerState(2, 5, [new_fat2])
        new_player3 = PlayerState(3, 4, [new_non_fat2])

        dealer = Dealer([player1, player2, player3], 100, [])
        dealer.transfer_fat_food()
        new_dealer = Dealer([new_player1, new_player2, new_player3], 100, [])

        self.assertEquals(player1, new_player1)
        self.assertEquals(player2, new_player2)
        self.assertEquals(player3, new_player3)
        self.assertEquals(dealer, new_dealer)

    def testForagingFeed(self):
        # Species(food, body, population, traits, fatfood)
        species1 = Species(3, 4, 5, [TraitCard(FORAGING)])
        species2 = Species(3, 3, 5, [TraitCard(FORAGING)])
        species3 = Species(3, 5, 4, [TraitCard(FORAGING)])
        speciesList1 = [species1, species2]
        speciesList2 = [species3]

        player1 = PlayerState(1, 0, speciesList1, [])
        player2 = PlayerState(2, 2, speciesList2, [])

        dealer = Dealer([player1, player2], 4, [])
        dealer.add_silly_players()
        self.assertEquals(dealer.wateringHole, 4)
        dealer.feed1()
        dealer.playerStates.append(dealer.playerStates.pop(0))
        self.assertEquals(dealer.wateringHole, 2)
        self.assertEquals(dealer.playerStates[1].species[0].food, 5)

        dealer.feed1()
        dealer.playerStates.append(dealer.playerStates.pop(0))
        self.assertEquals(dealer.wateringHole, 1)
        self.assertEquals(dealer.playerStates[1].species[0].food, 4)

        dealer.feed1()
        dealer.playerStates.append(dealer.playerStates.pop(0))
        self.assertEquals(dealer.playerStates[1].species[1].food, 4)

    def testFeedFromWateringHole(self):
        # Species(food, body, population, traits, fatfood)
        species1 = Species(5, 4, 5, [TraitCard(FORAGING)])
        species2 = Species(3, 3, 5, [TraitCard(FORAGING)])
        species3 = Species(3, 5, 4, [TraitCard(FORAGING)])
        species4 = Species(3, 5, 5, [TraitCard(FORAGING)])
        speciesList1 = [species1, species2, species3, species4]

        player1 = PlayerState(1, 0, speciesList1, [])

        dealer = Dealer([player1], 4, [])

        dealer.feedFromWateringHole(0, 0)

        self.assertEquals(dealer.playerStates[0].species[0].food, 5)
        self.assertEquals(dealer.wateringHole, 4)

        dealer.feedFromWateringHole(0, 1)

        self.assertEquals(dealer.playerStates[0].species[1].food, 5)
        self.assertEquals(dealer.wateringHole, 2)

        dealer.feedFromWateringHole(0, 2)

        self.assertEquals(dealer.playerStates[0].species[2].food, 4)
        self.assertEquals(dealer.wateringHole, 1)

        dealer.feedFromWateringHole(0, 3)

        self.assertEquals(dealer.playerStates[0].species[3].food, 4)
        self.assertEquals(dealer.wateringHole, 0)

    def testDoneFeeding(self):
        species1 = Species(5, 4, 5)
        species2 = Species(3, 3, 3)
        species3 = Species(4, 5, 4)
        speciesList1 = [species1, species2]
        speciesList2 = [species3]

        player1 = PlayerState(1, 0, speciesList1, [])
        player2 = PlayerState(2, 2, speciesList2, [])

        dealer = Dealer([player1, player2], 4, [])

        dealer.feed1()
        dealer.playerStates.append(dealer.playerStates.pop(0))
        self.assertEquals(len(dealer.fullPlayerIds), 1)
        self.assertEquals(dealer.fullPlayerIds[0], 1)

    def testAutoFeed(self):
        species1 = Species(5, 4, 5)
        species2 = Species(3, 3, 3)
        species3 = Species(3, 5, 4)
        species3a = Species(1, 5, 4)
        species4 = Species(4, 3, 4, [TraitCard("fat-tissue", 0)], 3)
        species5 = Species(4, 3 ,4, [TraitCard("fat-tissue", 0)], 1)
        carn1 = Species(3, 2, 4, [TraitCard("carnivore")])
        carn2 = Species(4, 2, 5, [TraitCard("carnivore"), TraitCard("climbing")])
        attackable = Species(3, 3, 5)
        speciesList1 = [species1, species2]
        speciesList2 = [species3, species3a]
        carnList1 = [carn1]
        carnList2 = [carn2, attackable]

        player1 = PlayerState(1, 0, speciesList1, [])
        player2 = PlayerState(2, 2, speciesList2, [])
        player3 = PlayerState(3, 3, [species4, species5], [])
        player4 = PlayerState(4, 4, [species3], [])
        player5 = PlayerState(5, 5, carnList1)
        player6 = PlayerState(6, 5, carnList2)

        dealer1 = Dealer([player1, player2], 4, [])
        dealer2 = Dealer([player2], 4, [])
        dealer3 = Dealer([player3], 3, [])
        dealer4 = Dealer([player4], 3, [])
        dealer5 = Dealer([player5, player6], 6, [])

        unchanged_player1 = copy.deepcopy(player1)
        unchanged_player2 = copy.deepcopy(player2)
        self.assertTrue(dealer1.auto_feed())
        self.assertEquals(dealer1.fullPlayerIds, [1])
        self.assertEquals(unchanged_player1, player1)
        self.assertEquals(unchanged_player2, player2)

        unchanged_species4 = copy.deepcopy(species4)
        self.assertFalse(dealer3.auto_feed())
        self.assertEquals(species5.fatFood, 1)
        self.assertEquals(unchanged_species4, species4)

        self.assertFalse(dealer2.auto_feed())
        self.assertEquals(species3.food, 3)
        self.assertEquals(species3a.food, 1)

        self.assertTrue(dealer4.auto_feed())
        self.assertEquals(species3.food, 4)

        # no autofeeding on carnivores
        self.assertEquals(carn1.food, 3)
        unchanged_carn2 = copy.deepcopy(carn2)
        self.assertFalse(dealer5.auto_feed())
        self.assertEquals(carn1.food, 3)
        self.assertEquals(unchanged_carn2, carn2)
        self.assertEquals(attackable.population, 5)

    def test_auto_feed_one_hungry(self):
        carn1 = Species(3, 2, 4, [TraitCard("carnivore")])
        full_fat = Species(4, 3, 4, [TraitCard("fat-tissue", 0)], 3)
        veg1 = Species(5, 4, 5)
        veg2 = Species(3, 3, 4)

        player1 = PlayerState(1, 3, [full_fat, carn1])
        attackable_player1 = PlayerState(2, 3, [veg1])
        attackable_player2 = PlayerState(3, 4, [veg2])

        dealer1 = Dealer([player1, attackable_player1], 3, [])
        dealer2 = Dealer([player1], 3, [])
        dealer3 = Dealer([player1, attackable_player1, attackable_player2], 5, [])
        dealer4 = Dealer([attackable_player2], 4, [])

        unchanged_full_fat = copy.deepcopy(full_fat)
        self.assertEquals(carn1.food, 3)
        self.assertEquals(carn1.population, 4)
        self.assertEquals(carn1.body, 2)
        self.assertEquals(veg1.food, 5)
        self.assertEquals(veg1.population, 5)
        self.assertEquals(veg1.body, 4)

        # contains player who has carnivore, no autofeed
        self.assertFalse(dealer1.auto_feed_one_hungry(1))

        self.assertEquals(unchanged_full_fat, full_fat)
        self.assertEquals(carn1.food, 3)
        self.assertEquals(carn1.population, 4)
        self.assertEquals(carn1.body, 2)
        self.assertEquals(veg1.food, 5)
        self.assertEquals(veg1.population, 5)
        self.assertEquals(veg1.body, 4)

        unchanged_dealer2 = copy.deepcopy(dealer2)
        self.assertFalse(dealer2.auto_feed_one_hungry(1))
        self.assertEquals(unchanged_dealer2, dealer2)

        unchanged_dealer3 = copy.deepcopy(dealer3)
        self.assertFalse(dealer3.auto_feed_one_hungry(1))
        self.assertEquals(unchanged_dealer3, dealer3)

        changed_veg = copy.deepcopy(veg2)
        changed_veg.food += 1
        self.assertTrue(dealer4.auto_feed_one_hungry(0))
        self.assertEquals(changed_veg, veg2)

    def test_get_hungry_and_fat_tissue_lists(self):
        species1 = Species(5, 4, 5)
        species2 = Species(3, 3, 3)
        species3 = Species(3, 5, 4)
        species4 = Species(3, 3, 4, [TraitCard("fat-tissue", 0)], 3)
        species5 = Species(3, 3 ,4, [TraitCard("fat-tissue", 0)], 1)
        speciesList1 = [species1, species2, species3, species4, species5]

        player1 = PlayerState(1, 0, speciesList1, [])
        player2 = PlayerState(2, 2, [species1, species1, species2])

        dealer1 = Dealer([player1], 4, [])
        dealer2 = Dealer([player2], 3, [])

        self.assertEquals(dealer1.get_hungry_and_fat_tissue_lists(), ([2, 3, 4], [4]))
        self.assertEquals(dealer2.get_hungry_and_fat_tissue_lists(), ([], []))

    def test_deal_x_cards(self):
        species1 = Species(5, 4, 5)
        species2 = Species(3, 3, 3)
        species3 = Species(3, 5, 4)
        species4 = Species(3, 3, 4, [TraitCard("fat-tissue", 0)], 3)
        species5 = Species(3, 3 ,4, [TraitCard("fat-tissue", 0)], 1)
        speciesList1 = [species1, species2, species3, species4, species5]

        player1 = PlayerState(1, 0, speciesList1, [])
        player2 = PlayerState(2, 2, [species1, species1, species2])

        dealer1 = Dealer([player1], 4, [TraitCard(CARNIVORE), TraitCard(SCAVENGER), TraitCard(LONG_NECK)])

        self.assertEquals(len(dealer1.hand), 3)

        dealer1.deal_x_cards(player1, 2)

        self.assertEquals(len(dealer1.hand), 1)
        self.assertEquals(player1.trait_cards, [TraitCard(CARNIVORE), TraitCard(SCAVENGER)])
        self.assertEquals(len(player2.trait_cards), 0)
        self.assertEquals(dealer1.hand, [TraitCard(LONG_NECK)])

        dealer1.deal_x_cards(player2, 2)

        self.assertEquals(len(dealer1.hand), 0)
        self.assertEquals(player2.trait_cards, [TraitCard(LONG_NECK)])
        self.assertEquals(len(player1.trait_cards), 2)
        self.assertEquals(dealer1.hand, [])

    def test_remove_cheater(self):
        player1 = PlayerState(1, 0, [])
        player2 = PlayerState(2, 2, [])

        dealer1 = Dealer([player1, player2], 4, [TraitCard(CARNIVORE), TraitCard(SCAVENGER), TraitCard(LONG_NECK)])
        new_dealer1 = Dealer([player1], 4, [TraitCard(CARNIVORE), TraitCard(SCAVENGER), TraitCard(LONG_NECK)])
        dealer1.fullPlayerIds = [1, 2]
        dealer1.add_silly_players()

        self.assertEquals(dealer1.fullPlayerIds, [1, 2])
        dealer1.remove_cheater(1)

        self.assertEquals(dealer1, new_dealer1)
        self.assertEquals(dealer1.fullPlayerIds, [1])

    def test_remove_players_at_indices(self):
        player1 = PlayerState(1, 0, [])
        player2 = PlayerState(2, 2, [])
        player3 = PlayerState(3, 1, [])

        dealer1 = Dealer([player1, player2, player3], 4, [TraitCard(CARNIVORE), TraitCard(SCAVENGER), TraitCard(LONG_NECK)])
        new_dealer1 = Dealer([player2], 4, [TraitCard(CARNIVORE), TraitCard(SCAVENGER), TraitCard(LONG_NECK)])
        dealer1.fullPlayerIds = [1, 2, 3]
        dealer1.add_silly_players()
        self.assertEquals(len(dealer1.originalPlayerOrder), 3)
        self.assertEquals(dealer1.fullPlayerIds, [1, 2, 3])

        dealer1.remove_players_at_indices([0, 2])

        self.assertEquals(dealer1, new_dealer1)
        self.assertEquals(dealer1.fullPlayerIds, [2])
        self.assertEquals(len(dealer1.originalPlayerOrder), 1)

    def test_remove_id_from_original_player_order(self):
        player1 = PlayerState(1, 0, [])
        player2 = PlayerState(2, 2, [])
        player3 = PlayerState(1, 1, [])

        dealer1 = Dealer([player1, player2, player3], 4, [TraitCard(CARNIVORE), TraitCard(SCAVENGER), TraitCard(LONG_NECK)])
        dealer1.add_silly_players()
        dealer1.fullPlayerIds = [1, 2, 3]

        dealer1.remove_id_from_original_player_order(1)

        self.assertEquals(dealer1.originalPlayerOrder, [player2, player3])
        self.assertEquals(dealer1.fullPlayerIds, [1, 2, 3])



    # JSON Configuration
    input1 = [
          [
            [["id", 1], ["species", []], ["bag", 0]],
            [["id", 2], ["species", []], ["bag", 0]],
            [["id", 3], ["species", [[["food", 6],
                                       ["body", 5],
                                       ["population", 6],
                                       ["traits", ["fat-tissue"]]]]],
              ["bag", 0]]
          ],
          2,
          [
            [4, "carnivore"],
            [3, "scavenger"]
          ]
        ]

    def testCreateDealerFromJson(self):

        dealer = Dealer.create_dealer_from_configuration(self.input1)
        self.assertEquals(len(dealer.playerStates[0].species), 0)
        self.assertEquals(len(dealer.playerStates[1].species), 0)
        self.assertEquals(len(dealer.playerStates[2].species), 1)
        self.assertEquals(dealer.playerStates[2].species[0].food, 6)
        self.assertEquals(dealer.playerStates[2].species[0].trait_cards[0].name, "fat-tissue")

    def testCreateJsonFromDealer(self):

        species1 = Species(6, 5, 6, [TraitCard("fat-tissue")])
        speciesList1 = []
        speciesList2 = []
        speciesList3 = [species1]

        trait1 = TraitCard("carnivore", 4)
        trait2 = TraitCard("scavenger", 3)

        player1 = PlayerState(1, 0, speciesList1, [])
        player2 = PlayerState(2, 0, speciesList2, [])
        player3 = PlayerState(3, 0, speciesList3, [])

        dealer = Dealer([player1, player2, player3], 2, [trait1, trait2])

        json_dealer = dealer.create_json_from_dealer()

        self.assertEquals(json_dealer, self.input1)

    def test_get_hand(self):
        json_hand = [[4, "carnivore"], [3, "scavenger"], [3, "long-neck"], [3, "scavenger"]]
        traits = [TraitCard(CARNIVORE, 4), TraitCard(SCAVENGER, 3), TraitCard(LONG_NECK, 3), TraitCard(SCAVENGER, 3)]

        self.assertEquals(Dealer.get_hand(json_hand), traits)

    def test_validate_hand(self):
        veg_dict = {"scavenger": MAX_OTHER_TRAITS + 1}
        with self.assertRaises(Exception):
            Dealer.validate_hand(veg_dict)

        carn_dict = {"carnivore": MAX_CARNIVORE_TRAITS + 1}
        with self.assertRaises(Exception):
            Dealer.validate_hand(carn_dict)

        Dealer.validate_hand({"carnivore": 4, "scavenger": 5})