def test_part_two(self): "Test part two example of Wizsim object" # 1. Create Wizsim object from text myobj = wizsim.Wizsim(part2=True, text=BOSS14_TEXT) # 2. Check the part two result self.assertEqual(myobj.part_two(verbose=False), PART_TWO_RESULT)
def test_part_one(self): "Test part one example of Wizsim object" # 1. Create Wizsim object from text myobj = wizsim.Wizsim(text=BOSS13_TEXT) # 2. Check the part one result self.assertEqual(myobj.part_one(verbose=False), PART_ONE_RESULT)
def test_empty_init(self): "Test the default Wizsim creation" # 1. Create default Wizsim object myobj = wizsim.Wizsim() # 2. Make sure it has the default values self.assertEqual(myobj.part2, False) self.assertEqual(myobj.text, None) self.assertEqual(len(myobj.spells), 5) self.assertEqual(len(myobj.states), 0)
def part_one(args, input_lines): "Process part one of the puzzle" # 1. Create the puzzle solver solver = wizsim.Wizsim(part2=False, text=input_lines) # 2. Determine the solution for part one solution = solver.part_one(verbose=args.verbose, limit=args.limit) if solution is None: print("There is no solution") else: print("The solution for part one is %s" % (solution)) # 3. Return result return solution is not None
def test_text_init(self): "Test the Wizsim object creation from text" # 1. Create Wizsim object from text myobj = wizsim.Wizsim(text=BOSS13_TEXT) myobj.initial_state(wizard_text=WIZARD_TEXT) # 2. Make sure it has the expected values self.assertEqual(myobj.part2, False) self.assertEqual(len(myobj.text), 2) self.assertEqual(len(myobj.spells), 5) self.assertEqual(len(myobj.states), 1) self.assertEqual(myobj.states[0].wizard.name, "Wizard") self.assertEqual(myobj.states[0].wizard['hitpoints'], 50) self.assertEqual(myobj.states[0].wizard['damage'], 0) self.assertEqual(myobj.states[0].wizard['mana'], 500) self.assertEqual(myobj.states[0].wizard['used'], 0) self.assertEqual(myobj.states[0].boss.name, "Boss") self.assertEqual(myobj.states[0].boss['hitpoints'], 13) self.assertEqual(myobj.states[0].boss['damage'], 8) # 3. Reset using demo player myobj.initial_state(wizard_text=DEMO_WIZARD_TEXT, boss_text=BOSS13_TEXT) self.assertEqual(myobj.states[0].wizard.name, "Wizard") self.assertEqual(myobj.states[0].wizard['hitpoints'], 10) self.assertEqual(myobj.states[0].wizard['damage'], 0) self.assertEqual(myobj.states[0].wizard['mana'], 250) self.assertEqual(myobj.states[0].wizard['used'], 0) self.assertEqual(myobj.states[0].boss.name, "Boss") self.assertEqual(myobj.states[0].boss['hitpoints'], 13) self.assertEqual(myobj.states[0].boss['damage'], 8) # 4. Cast a Magic Missle nxt = myobj.turn(myobj.states[0], myobj.spells.named("Magic Missile")) self.assertEqual(nxt.turn, 1) self.assertEqual(nxt.wizard.name, "Wizard") self.assertEqual(nxt.wizard['hitpoints'], 2) self.assertEqual(nxt.wizard['damage'], 0) self.assertEqual(nxt.wizard['mana'], 197) self.assertEqual(nxt.wizard['used'], 53) self.assertEqual(nxt.boss.name, "Boss") self.assertEqual(nxt.boss['hitpoints'], 9) self.assertEqual(nxt.boss['damage'], 8)
def test_demo_two(self): # pylint: disable=too-many-statements "Test the Wizsim object using the second demo" # 0. All the possible spells all_spells = spells.Spells(text=spells.SPELLS) # 1. Create Wizsim object from text myobj = wizsim.Wizsim(text=BOSS14_TEXT) myobj.initial_state(wizard_text=DEMO_WIZARD_TEXT) self.assertEqual(myobj.states[0].wizard['hitpoints'], 10) self.assertEqual(myobj.states[0].wizard['mana'], 250) self.assertEqual(myobj.states[0].wizard['used'], 0) self.assertEqual(myobj.states[0].boss['hitpoints'], 14) # 2. Turn 1 -- Player casts recharge # -- Player turn -- # - Player has 10 hit points, 0 armor, 250 mana # - Boss has 14 hit points # Player casts Recharge. # -- Boss turn -- # - Player has 10 hit points, 0 armor, 21 mana # - Boss has 14 hit points # Recharge provides 101 mana; its timer is now 4. # Boss attacks for 8 damage! self.assertEqual( myobj.states[0].another(all_spells), ['Drain', 'Magic Missile', 'Poison', 'Recharge', 'Shield']) nxt = myobj.turn(myobj.states[0], myobj.spells.named("Recharge")) self.assertEqual(nxt.turn, 1) self.assertEqual(nxt.wizard['hitpoints'], 2) self.assertEqual(nxt.wizard['mana'], 122) self.assertEqual(nxt.wizard['used'], 229) self.assertEqual(nxt.boss['hitpoints'], 14) self.assertEqual(nxt.active.named("Recharge").turns, 4) # 3. Turn 2 -- Player casts Shield # -- Player turn -- # - Player has 2 hit points, 0 armor, 122 mana # - Boss has 14 hit points # Recharge provides 101 mana; its timer is now 3. # Player casts Shield, increasing armor by 7. # -- Boss turn -- # - Player has 2 hit points, 7 armor, 110 mana # - Boss has 14 hit points # Shield's timer is now 5. # Recharge provides 101 mana; its timer is now 2. # Boss attacks for 8 - 7 = 1 damage! self.assertEqual(nxt.another(all_spells), ['Drain', 'Magic Missile', 'Shield']) nxt = myobj.turn(nxt, myobj.spells.named("Shield")) self.assertEqual(nxt.turn, 2) self.assertEqual(nxt.wizard['hitpoints'], 1) self.assertEqual(nxt.wizard['mana'], 122 + 101 + 101 - 113) # 211 self.assertEqual(nxt.wizard['used'], 229 + 113) # 342 self.assertEqual(nxt.boss['hitpoints'], 14) self.assertEqual(nxt.active.named("Recharge").turns, 2) self.assertEqual(nxt.active.named("Shield").turns, 5) # 4. Turn 3 -- Player casts Drain # -- Player turn -- # - Player has 1 hit point, 7 armor, 211 mana # - Boss has 14 hit points # Shield's timer is now 4. # Recharge provides 101 mana; its timer is now 1. # Player casts Drain, dealing 2 damage, and healing 2 hit points. # -- Boss turn -- # - Player has 3 hit points, 7 armor, 239 mana # - Boss has 12 hit points # Shield's timer is now 3. # Recharge provides 101 mana; its timer is now 0. # Recharge wears off. # Boss attacks for 8 - 7 = 1 damage! self.assertEqual(nxt.another(all_spells), ['Drain', 'Magic Missile', 'Poison']) nxt = myobj.turn(nxt, myobj.spells.named("Drain")) self.assertEqual(nxt.turn, 3) self.assertEqual(nxt.wizard['hitpoints'], 2) self.assertEqual(nxt.wizard['armor'], 7) self.assertEqual(nxt.wizard['mana'], 211 + 101 + 101 - 73) # 340 self.assertEqual(nxt.wizard['used'], 229 + 113 + 73) # 415 self.assertEqual(nxt.boss['hitpoints'], 12) self.assertEqual(nxt.active.named("Recharge").turns, 0) self.assertEqual(nxt.active.named("Shield").turns, 3) # 5. Turn 4 -- Player casts Poison # -- Player turn -- # - Player has 2 hit points, 7 armor, 340 mana # - Boss has 12 hit points # Shield's timer is now 2. # Player casts Poison. # -- Boss turn -- # - Player has 2 hit points, 7 armor, 167 mana # - Boss has 12 hit points # Shield's timer is now 1. # Poison deals 3 damage; its timer is now 5. # Boss attacks for 8 - 7 = 1 damage! self.assertEqual(nxt.another(all_spells), ['Drain', 'Magic Missile', 'Poison', 'Recharge']) nxt = myobj.turn(nxt, myobj.spells.named("Poison")) self.assertEqual(nxt.turn, 4) self.assertEqual(nxt.wizard['hitpoints'], 1) self.assertEqual(nxt.wizard['armor'], 7) self.assertEqual(nxt.wizard['mana'], 340 - 173) # 167 self.assertEqual(nxt.wizard['used'], 229 + 113 + 73 + 173) self.assertEqual(nxt.boss['hitpoints'], 9) self.assertEqual(nxt.active.named("Shield").turns, 1) self.assertEqual(nxt.active.named("Poison").turns, 5) # 6. Turn 5 -- Player casts Magic Missile # -- Player turn -- # - Player has 1 hit point, 7 armor, 167 mana # - Boss has 9 hit points # Shield's timer is now 0. # Shield wears off, decreasing armor by 7. # Poison deals 3 damage; its timer is now 4. # Player casts Magic Missile, dealing 4 damage. # -- Boss turn -- # - Player has 1 hit point, 0 armor, 114 mana # - Boss has 2 hit points # Poison deals 3 damage. This kills the boss, and the player wins. self.assertEqual(nxt.another(all_spells), ['Drain', 'Magic Missile', 'Shield']) nxt = myobj.turn(nxt, myobj.spells.named("Magic Missile")) self.assertEqual(nxt.turn, 5) self.assertEqual(nxt.wizard['hitpoints'], 1) self.assertEqual(nxt.wizard['armor'], 0) self.assertEqual(nxt.wizard['mana'], 167 - 53) self.assertEqual(nxt.wizard['used'], 229 + 113 + 73 + 173 + 53) self.assertEqual(nxt.boss['hitpoints'], 0) self.assertEqual(nxt.active.named("Shield").turns, 0) self.assertEqual(nxt.active.named("Poison").turns, 3) print(nxt)
def test_demo_one(self): "Test the Wizsim object using the first demo" # 0. All the possible spells all_spells = spells.Spells(text=spells.SPELLS) # 1. Create Wizsim object from text myobj = wizsim.Wizsim(text=BOSS13_TEXT) myobj.initial_state(wizard_text=DEMO_WIZARD_TEXT) self.assertEqual(myobj.states[0].wizard.name, "Wizard") self.assertEqual(myobj.states[0].wizard['hitpoints'], 10) self.assertEqual(myobj.states[0].wizard['damage'], 0) self.assertEqual(myobj.states[0].wizard['mana'], 250) self.assertEqual(myobj.states[0].wizard['used'], 0) self.assertEqual(myobj.states[0].boss.name, "Boss") self.assertEqual(myobj.states[0].boss['hitpoints'], 13) self.assertEqual(myobj.states[0].boss['damage'], 8) # 2. Turn 1 -- Player casts Poison. # -- Player turn -- # - Player has 10 hit points, 0 armor, 250 mana # - Boss has 13 hit points # Player casts Poison # -- Boss turn -- # - Player has 10 hit points, 0 armor, 77 mana # - Boss has 13 hit points # Poison deals 3 damage; its timer is now 5. # Boss attacks for 8 damage. self.assertEqual( myobj.states[0].another(all_spells), ['Drain', 'Magic Missile', 'Poison', 'Recharge', 'Shield']) nxt = myobj.turn(myobj.states[0], myobj.spells.named("Poison")) self.assertEqual(nxt.turn, 1) self.assertEqual(nxt.wizard.name, "Wizard") self.assertEqual(nxt.wizard['hitpoints'], 2) self.assertEqual(nxt.wizard['damage'], 0) self.assertEqual(nxt.wizard['mana'], 77) self.assertEqual(nxt.wizard['used'], 173) self.assertEqual(nxt.boss.name, "Boss") self.assertEqual(nxt.boss['hitpoints'], 10) self.assertEqual(nxt.boss['damage'], 8) # 3. Turn 2 -- Player casts Magic Missle # -- Player turn -- # - Player has 2 hit points, 0 armor, 77 mana # - Boss has 10 hit points # Poison deals 3 damage; its timer is now 4. # Player casts Magic Missile, dealing 4 damage. # -- Boss turn -- # - Player has 2 hit points, 0 armor, 24 mana # - Boss has 3 hit points # Poison deals 3 damage. This kills the boss, and the player wins. self.assertEqual(nxt.another(all_spells), ['Drain', 'Magic Missile']) nxt = myobj.turn(nxt, myobj.spells.named("Magic Missile")) self.assertEqual(nxt.turn, 2) self.assertEqual(nxt.wizard.name, "Wizard") self.assertEqual(nxt.wizard['hitpoints'], 2) self.assertEqual(nxt.wizard['damage'], 0) self.assertEqual(nxt.wizard['mana'], 24) self.assertEqual(nxt.wizard['used'], 226) self.assertEqual(nxt.boss.name, "Boss") self.assertEqual(nxt.boss['hitpoints'], 0) self.assertEqual(nxt.boss['damage'], 8)