def testCreateInBatch(self): char_series = Character().add_path(Lifepath(born=True)).add_path(Lifepath()).add_path(Lifepath()) char_batch = Character([Lifepath(born=True),Lifepath(),Lifepath()]) self.assertEquals(char_series.path_count(),char_batch.path_count()) self.assertEquals(char_series.age(),char_batch.age()) self.assertEquals(char_series.circles(),char_batch.circles()) self.assertEquals(char_series.resources(),char_batch.resources()) self.assertEquals(char_series.traits(),char_batch.traits()) self.assertEquals(char_series.lifepath_traits(),char_batch.lifepath_traits()) self.assertEquals(char_series.trait_points(),char_batch.trait_points())
class CharacterStatsTests(unittest.TestCase): def setUp(self): self.char = Character() def testStatPtsAge0(self): self.assertEquals(self.char.mental_pool(), 0) self.assertEquals(self.char.physical_pool(), 0) def testStatPtsRange(self): various_ages = {Character(age=1):[5,10], Character(age=10):[5,10], Character(age=11):[6,13], Character(age=14):[6,13], Character(age=15):[6,16], Character(age=16):[6,16], Character(age=17):[7,16], Character(age=25):[7,16], Character(age=26):[7,15], Character(age=29):[7,15], Character(age=30):[7,14], Character(age=35):[7,14], Character(age=36):[7,13], Character(age=40):[7,13], Character(age=41):[7,12], Character(age=55):[7,12], Character(age=56):[7,11], Character(age=65):[7,11], Character(age=66):[7,10], Character(age=79):[7,10], Character(age=80):[6,9], Character(age=100):[6,9]} for character, points in various_ages.iteritems(): self.assertEquals(character.mental_pool(), points[0]) self.assertEquals(character.physical_pool(), points[1]) def testStatsDefault(self): """Can characters start with any stat at 0? Paraplegics, I guess. """ self.assertEquals(self.char.perception, 0) self.assertEquals(self.char.will, 0) self.assertEquals(self.char.agility, 0) self.assertEquals(self.char.speed, 0) self.assertEquals(self.char.power, 0) self.assertEquals(self.char.forte, 0) def testBuyStats(self): char = Character(age=1) char.buy_agility() char.buy_speed() char.buy_power() char.buy_forte() char.buy_perception() char.buy_will() self.assertEquals(char.perception, 1) self.assertEquals(char.will, 1) self.assertEquals(char.agility, 1) self.assertEquals(char.speed, 1) self.assertEquals(char.power, 1) self.assertEquals(char.forte, 1) self.assertEquals(char.mental_pool(), 3) self.assertEquals(char.physical_pool(), 6) def testBuyStatsMultiple(self): char = Character(age=1) char.buy_agility(2) char.buy_speed(2) char.buy_power(2) char.buy_forte(2) char.buy_perception(2) char.buy_will(2) self.assertEquals(char.perception, 2) self.assertEquals(char.will, 2) self.assertEquals(char.agility, 2) self.assertEquals(char.speed, 2) self.assertEquals(char.power, 2) self.assertEquals(char.forte, 2) self.assertEquals(char.mental_pool(), 1) self.assertEquals(char.physical_pool(), 2) def testRemoveStats(self): char = Character(age=1) char.buy_agility(2) char.buy_speed(2) char.buy_power(2) char.buy_forte(2) char.buy_perception(2) char.buy_will(2) char.remove_agility() char.remove_speed() char.remove_power() char.remove_forte() char.remove_perception() char.remove_will() self.assertEquals(char.perception, 1) self.assertEquals(char.will, 1) self.assertEquals(char.agility, 1) self.assertEquals(char.speed, 1) self.assertEquals(char.power, 1) self.assertEquals(char.forte, 1) self.assertEquals(char.mental_pool(), 3) self.assertEquals(char.physical_pool(), 6) def testBuyStatsWithoutPoints(self): char = Character(age = 1) char.buy_will(5) self.assertEquals(char.will, 5) self.assertEquals(char.mental_pool(), 0) self.assertRaises(CantAfford, char.buy_will) self.assertRaises(CantAfford, char.buy_perception) char.buy_forte(3) char.buy_speed(3) char.buy_power(3) char.buy_agility(1) self.assertEquals(char.forte, 3) self.assertEquals(char.speed, 3) self.assertEquals(char.power, 3) self.assertEquals(char.agility,1) self.assertEquals(char.physical_pool(),0) self.assertRaises(CantAfford, char.buy_forte) self.assertRaises(CantAfford, char.buy_agility) self.assertRaises(CantAfford, char.buy_speed) self.assertRaises(CantAfford, char.buy_power) def testBuyStatsPastLimits(self): """for humans: will and perception 8, all others 6, with no stat can be above 6 in character creation """ char = Character(age = 11) char.buy_perception(6) self.assertRaises(ExceedsMaximum, char.buy_perception) char.remove_perception(6) char.buy_will(6) self.assertRaises(ExceedsMaximum, char.buy_will) char.remove_will(6) char.buy_agility(6) self.assertRaises(ExceedsMaximum, char.buy_agility) char.remove_agility(6) char.buy_speed(6) self.assertRaises(ExceedsMaximum, char.buy_speed) char.remove_speed(6) char.buy_power(6) self.assertRaises(ExceedsMaximum, char.buy_power) char.remove_power(6) char.buy_forte(6) self.assertRaises(ExceedsMaximum, char.buy_forte) char.remove_forte(6) def testAgeOver100(self): """Character's age cannot exceed 100 """ char = Character(age = 100) self.assertRaises(ExceedsMaximum, char.add_path, Lifepath(years=1)) self.assertFalse(Lifepath(years=1).allowed(char)) def testLoseStatsWithDecreasingAge(self): """Changes in Lifepaths can lead to altering point pools. Stats should be altered to avoid negative point pools. Assumption: higher stats should lose points first """ char = Character([Lifepath(years=14, born=True), Lifepath(years=3)]) self.assertEquals(char.age(), 17) self.assertEquals(char.mental_pool(), 7) self.assertEquals(char.physical_pool(), 16) char.buy_perception(4) char.buy_will(3) char.remove_path() self.assertEquals(char.age(), 14) self.assertEquals(char.mental_pool(), 0) self.assertEquals(char.perception, 3) self.assertEquals(char.will, 3) char.add_path(Lifepath(years=3)) char.buy_will() char.remove_path() self.assertEquals(char.age(), 14) self.assertEquals(char.mental_pool(), 0) self.assertEquals(char.perception, 3) self.assertEquals(char.will, 3) char.add_path(Lifepath(years=3)) self.assertEquals(char.physical_pool(), 16) char.buy_speed(6) char.buy_power(5) char.buy_forte(3) char.buy_agility(2) self.assertEquals(char.physical_pool(), 0) char.remove_path() self.assertEquals(char.speed, 4) self.assertEquals(char.power, 4) self.assertEquals(char.forte, 3) self.assertEquals(char.agility, 2) def testLoseStatsWithIncreasingAge(self): char = Character(age = 79) self.assertEquals(char.mental_pool(), 7) self.assertEquals(char.physical_pool(), 10) char.buy_perception(4) char.buy_will(3) char.add_path(Lifepath(born=True, years=1)) self.assertEquals(char.mental_pool(), 0) self.assertEquals(char.perception, 3) self.assertEquals(char.will, 3) char.remove_path() char.buy_will() char.add_path(Lifepath(born=True, years=1)) self.assertEquals(char.perception, 3) self.assertEquals(char.will, 3) char.remove_path() char.buy_speed(4) char.buy_power(3) char.buy_forte(2) char.buy_agility(1) self.assertEquals(char.physical_pool(), 0) char.add_path(human.BornNobility()) self.assertEquals(char.physical_pool(), 0) self.assertEquals(char.speed, 3) self.assertEquals(char.power, 3) self.assertEquals(char.forte, 2) self.assertEquals(char.agility, 1) def testBonusStatPoints(self): char = Character([Lifepath(years=1, born=True)]) char.add_path(Lifepath(physical_points=1)) self.assertEquals(char.physical_pool(), 11) char.remove_path() char.add_path(Lifepath(mental_points=1)) self.assertEquals(char.mental_pool(), 6) def testFloaterPoints(self): """Some lifepaths give a bonus point for physical or mental stats. These points should be spent last and refunded first. """ char = Character([Lifepath(born=True, years=1), Lifepath(years=1, floater_points=1)]) self.assertEquals(char.mental_pool(), 5) self.assertEquals(char.physical_pool(), 10) self.assertEquals(char.floater_pool(), 1) char.buy_perception(3) char.buy_will(2) char.buy_forte(4) char.buy_power(2) char.buy_agility(2) char.buy_speed(2) self.assertEquals(char.physical_pool(), 0) self.assertEquals(char.mental_pool(), 0) self.assertEquals(char.floater_pool(), 1) char.buy_perception() self.assertEquals(char.mental_pool(), 0) self.assertEquals(char.floater_pool(), 0) self.assertEquals(char.perception, 4) self.assertRaises(CantAfford, char.buy_will) self.assertRaises(CantAfford, char.buy_forte) self.assertRaises(CantAfford, char.buy_speed) self.assertRaises(CantAfford, char.buy_agility) self.assertRaises(CantAfford, char.buy_power) char.remove_perception() self.assertEquals(char.mental_pool(), 0) self.assertEquals(char.floater_pool(), 1) char.buy_will() self.assertEquals(char.mental_pool(), 0) self.assertEquals(char.floater_pool(), 0) self.assertEquals(char.will, 3) self.assertRaises(CantAfford, char.buy_perception) self.assertRaises(CantAfford, char.buy_forte) self.assertRaises(CantAfford, char.buy_speed) self.assertRaises(CantAfford, char.buy_agility) self.assertRaises(CantAfford, char.buy_power) char.remove_will() self.assertEquals(char.mental_pool(), 0) self.assertEquals(char.floater_pool(), 1) char.buy_forte() self.assertEquals(char.physical_pool(), 0) self.assertEquals(char.floater_pool(), 0) self.assertEquals(char.forte, 5) self.assertRaises(CantAfford, char.buy_will) self.assertRaises(CantAfford, char.buy_perception) self.assertRaises(CantAfford, char.buy_speed) self.assertRaises(CantAfford, char.buy_agility) self.assertRaises(CantAfford, char.buy_power) char.remove_forte() self.assertEquals(char.physical_pool(), 0) self.assertEquals(char.floater_pool(), 1) char.buy_power() self.assertEquals(char.physical_pool(), 0) self.assertEquals(char.floater_pool(), 0) self.assertEquals(char.power, 3) self.assertRaises(CantAfford, char.buy_will) self.assertRaises(CantAfford, char.buy_perception) self.assertRaises(CantAfford, char.buy_forte) self.assertRaises(CantAfford, char.buy_speed) self.assertRaises(CantAfford, char.buy_agility) char.remove_power() self.assertEquals(char.physical_pool(), 0) self.assertEquals(char.floater_pool(), 1) char.buy_agility() self.assertEquals(char.physical_pool(), 0) self.assertEquals(char.floater_pool(), 0) self.assertEquals(char.agility, 3) self.assertRaises(CantAfford, char.buy_will) self.assertRaises(CantAfford, char.buy_perception) self.assertRaises(CantAfford, char.buy_forte) self.assertRaises(CantAfford, char.buy_speed) self.assertRaises(CantAfford, char.buy_power) char.remove_agility() self.assertEquals(char.physical_pool(), 0) self.assertEquals(char.floater_pool(), 1) char.buy_speed() self.assertEquals(char.physical_pool(), 0) self.assertEquals(char.floater_pool(), 0) self.assertEquals(char.speed, 3) self.assertRaises(CantAfford, char.buy_will) self.assertRaises(CantAfford, char.buy_perception) self.assertRaises(CantAfford, char.buy_forte) self.assertRaises(CantAfford, char.buy_power) self.assertRaises(CantAfford, char.buy_agility) char.remove_speed() self.assertEquals(char.physical_pool(), 0) self.assertEquals(char.floater_pool(), 1) def testMortalWoundTolerance(self): char = Character([Lifepath(born=True, years=1)]) char.buy_power() char.buy_forte() self.assertEquals(char.mortal_wound(), 'H7') char.buy_forte() self.assertEquals(char.mortal_wound(), 'H7') char.buy_forte() self.assertEquals(char.mortal_wound(), 'H8') def testSuperficialWoundTolerance(self): char = Character([Lifepath(born=True, years=1)]) char.buy_forte() self.assertEquals(char.superficial_wound(), 'H1') char.buy_forte() self.assertEquals(char.superficial_wound(), 'H2') char.buy_forte() self.assertEquals(char.superficial_wound(), 'H2') def testInjuredWoundTolerance(self): char = Character([Lifepath(born=True, years=1)]) char.buy_forte() self.assertEquals(char.injured_wound(), 'H1') char.buy_forte() self.assertEquals(char.injured_wound(), 'H3') char.buy_forte() self.assertEquals(char.injured_wound(), 'H3') def testMaimedWoundTolerance(self): char = Character([Lifepath(born=True, years=1)]) char.buy_power() char.buy_forte() self.assertEquals(char.maimed_wound(), 'H5') char.buy_forte() self.assertEquals(char.maimed_wound(), 'H5') char.buy_forte() self.assertEquals(char.maimed_wound(), 'H6') def testResources(self): self.assertEquals(self.char.resources(), 0) self.char.add_path(Lifepath(born=True, resources=1)) self.assertEquals(self.char.resources(), 1) self.char.remove_path() self.assertEquals(self.char.resources(), 0) def testResourcesAfterMultiplePaths(self): """I assume only the exact same path counts as the same path, as opposed to any path with the same name """ self.char.add_path(human.BornLeague()).add_path(human.LeagueStudent()) self.assertEquals(self.char.resources(), 2) self.char.add_path(human.Accountant()).add_path(human.Accountant()).add_path(human.Accountant()) self.assertEquals(self.char.resources(), 7) self.char.remove_path(3).add_path(human.Scrivener()).add_path(human.Scrivener()).add_path(human.Scrivener()) self.assertEqual(self.char.resources(), 4) def testCircles(self): self.assertEquals(self.char.circles(), 0) self.char.add_path(Lifepath(born=True, circles=1)) self.assertEquals(self.char.circles(), 1) self.char.remove_path() self.assertEquals(self.char.circles(), 0) def testCirclesAfterMultiplePaths(self): self.char.add_path(human.BornNobility()).add_path(human.NobleCoeptir()).add_path(human.NobleArmiger()) self.assertEquals(self.char.circles(), 1) self.char.add_path(human.NobleLPAnvil()).add_path(human.NobleLPAnvil()).add_path(human.NobleLPAnvil()) self.assertEquals(self.char.circles(), 3) def testArtha(self): char = Character() self.assertEquals(char.artha_fate(),3) self.assertEquals(char.artha_persona(),2) self.assertEquals(char.artha_deeds(),1) char.add_path(Lifepath(born=True)) self.assertEquals(char.artha_fate(),3) self.assertEquals(char.artha_persona(),2) self.assertEquals(char.artha_deeds(),1) char.add_path(Lifepath()) self.assertEquals(char.artha_fate(),3) self.assertEquals(char.artha_persona(),2) self.assertEquals(char.artha_deeds(),1) char.add_path(Lifepath()) self.assertEquals(char.artha_fate(),3) self.assertEquals(char.artha_persona(),2) self.assertEquals(char.artha_deeds(),1) char.add_path(Lifepath()) self.assertEquals(char.artha_fate(),3) self.assertEquals(char.artha_persona(),2) self.assertEquals(char.artha_deeds(),1) char.add_path(Lifepath()) self.assertEquals(char.artha_fate(),3) self.assertEquals(char.artha_persona(),2) self.assertEquals(char.artha_deeds(),1) char.add_path(Lifepath()) self.assertEquals(char.artha_fate(),3) self.assertEquals(char.artha_persona(),2) self.assertEquals(char.artha_deeds(),0) char.add_path(Lifepath()) self.assertEquals(char.artha_fate(),2) self.assertEquals(char.artha_persona(),1) self.assertEquals(char.artha_deeds(),0) char.add_path(Lifepath()) self.assertEquals(char.artha_fate(),1) self.assertEquals(char.artha_persona(),1) self.assertEquals(char.artha_deeds(),0) char.add_path(Lifepath()) self.assertEquals(char.artha_fate(),1) self.assertEquals(char.artha_persona(),0) self.assertEquals(char.artha_deeds(),0) char.add_path(Lifepath()) self.assertEquals(char.artha_fate(),0) self.assertEquals(char.artha_persona(),0) self.assertEquals(char.artha_deeds(),0) char.add_path(Lifepath()) self.assertEquals(char.artha_fate(),0) self.assertEquals(char.artha_persona(),0) self.assertEquals(char.artha_deeds(),0)