Example #1
0
class Player:
    def __init__(self, name, race):
        self.race = race
        self.town = Town(race)
        self.gold = 1000
        self.hero = None
        self.name = name

    def hire_hero(self, name):
        self.hero = Hero(name)

    def upgrade_building(self, building):
        """ Accepts the building you want to upgrade """
        if building.price > self.gold:
            raise NoGold

        if not building.upgrade_available():
            raise BuildingAtMaxLevel

        self.gold -= building.price
        building.upgrade()

    def move_army_from_town_to_hero(self, unit_type, unit_count):
        if self.hero.is_in_town == False:
            raise HeroNotInTown

        if self.hero == None:
            raise NoHero

        if self.town.army[unit_type] < unit_count:
            raise NoUnits

        self.town.decrease_army(unit_type, unit_count)
        self.hero.increase_army(unit_type, unit_count)

    def move_army_from_hero_to_town(self, unit_type, unit_count):
        if self.hero == None:
            raise NoHero

        if self.hero.is_in_town == False:
            raise HeroNotInTown

        if self.hero.army[unit_type] < unit_count:
            raise NoUnits

        self.hero.decrease_army(unit_type, unit_count)
        self.town.increase_army(unit_type, unit_count)

    def train_army(self, unit_type, unit_count):
        if self.town.castle.units_available_to_train < unit_count:
            raise NoDailyUnits

        if ALL_RACE_UNITS[self.race][self.town.barracs.\
        army[unit_type]].price * unit_count > self.gold:
            raise NoGold

        self.town.army[unit_type] += unit_count

        self.gold -= ALL_RACE_UNITS[self.race][self.town.\
            barracs.army[unit_type]].price * unit_count
class TestHero(unittest.TestCase):
    def setUp(self):
        self.hero = Hero('San')

    def test_hero_constructor(self):
        self.assertEqual(self.hero.name, 'San')
        self.assertEqual(self.hero.level, 1)

    def test_level_up(self):
        self.hero.experience = 245
        self.hero.check_for_level_up()

        self.assertEqual(self.hero.level, 2)
        self.assertEqual(self.hero.experience, 45)
        self.assertEqual(self.hero.experience_to_level_up, 300)

    def test_town_conditions(self):
        self.assertTrue(self.hero.is_in_town)
        self.hero.leave_town()
        self.assertFalse(self.hero.is_in_town)
        self.hero.arrive_at_town()

    def test_increase_decrease_army(self):
        self.hero.increase_army(1, 20)
        self.assertEqual(self.hero.army, [0, 20, 0, 0])
        self.hero.decrease_army(1, 10)
        self.assertEqual(self.hero.army, [0, 10, 0, 0])
        self.assertRaises(NoUnits, self.hero.decrease_army, 1, 40)
        self.hero.increase_army(3, 100)
        self.assertEqual(self.hero.army, [0, 10, 0, 100])

    def test_upgrade_bonus(self):
        self.hero.upgrade_bonus('health')
        self.assertEqual(self.hero.bonuses['health'], 1)
        self.assertEqual(self.hero.bonuses['damage'], 0)
        self.hero.talent_points = 0
        self.assertRaises(NoTalentPoints, self.hero.upgrade_bonus, 'damage')

    def test_gain_experience(self):
        self.hero.gain_experience(300)

        self.assertEqual(self.hero.level, 2)
        self.assertEqual(self.hero.experience, 100)
        self.assertEqual(self.hero.experience_to_level_up, 300)