def test_got_moved(self): """Make sure you can't finish moving if you're warped""" started = self.alice.region londo = self.get_region("Orange Londo") # For testing purposes, londo is now alice's londo.owner = self.alice.team # But she's at the fight self.alice.region = self.get_region('sapphire') order = self.alice.move(100, londo, 60 * 60 * 24)[0] n = self.sess.query(db.MarchingOrder).count() self.assertEqual(n, 1) # The sapphire battle ends poorly for alice's team, and she gets # booted out self.alice.region = self.get_region('oraistedarg') # Invoke the update routine to set everyone's location order.arrival = now() arrived = MarchingOrder.update_all(self.sess) self.assert_(arrived) # Alice should be back where she started, as the move isn't valid self.assertEqual(started, self.alice.region) n = self.sess.query(db.MarchingOrder).count() self.assertEqual(n, 0)
def test_situation_changes(self): """Can't move somewhere that changes hands while you're moving""" started = self.alice.region londo = self.get_region("Orange Londo") # For testing purposes, londo is now alice's londo.owner = self.alice.team order = self.alice.move(100, londo, 60 * 60 * 24)[0] n = self.sess.query(db.MarchingOrder).count() self.assertEqual(n, 1) # BUT WAIT! Londo's government is overthrown! londo.owner = self.bob.team # Push back arrival time order.arrival = now() self.sess.commit() # Invoke the update routine to set everyone's location arrived = MarchingOrder.update_all(self.sess) self.assert_(arrived) # Alice should be back where she started, as she can't be in londo self.assertEqual(started, self.alice.region) n = self.sess.query(db.MarchingOrder).count() self.assertEqual(n, 0)
def test_delayed_movement(self): """Most movement should take a while""" home = self.alice.region londo = self.get_region("Orange Londo") # Everything's fine self.assertFalse(self.alice.is_moving()) # Ideally, this test will not take a day to complete order = self.alice.move(100, londo, 60 * 60 * 24) self.assert_(order) # Alice should be moving self.assert_(self.alice.is_moving()) # For record-keeping purposes, she's in her source city self.assertEqual(home, self.alice.region) # Well, we don't want to wait an entire day, so let's cheat and push # back the arrival time order.arrival = time.mktime(time.localtime()) self.sess.commit() self.assert_(order.has_arrived()) # But we're not actually there yet self.assertEqual(home, self.alice.region) # Invoke the update routine to set everyone's location arrived = MarchingOrder.update_all(self.sess) self.assert_(arrived) # Now we're there! self.assertEqual(londo, self.alice.region) # Shouldn't be any marching orders left orders = self.sess.query(MarchingOrder).count() self.assertEqual(orders, 0)
def update_game(self): session = self.session MarchingOrder.update_all(session, self.config) results = Region.update_all(session, self.config) to_add = [] for newternal in results['new_eternal']: title = "The Eternal Battle Rages On" post = InvadeCommand.post_invasion(title, newternal, self.reddit) if post: newternal.submission_id = post.name to_add.append(newternal) else: logging.warn("Couldn't submit eternal battle thread") session.rollback() if to_add: session.add_all(to_add) session.commit() results = Battle.update_all(session, self.config) for ready in results['begin']: ready.display_ends = (ready.begins + self.config["game"]["battle_time"]) # Actual ending is within battle_lockout of the end chooserange = self.config["game"]["battle_lockout"] chosen = random.randint(0, chooserange) ready.ends = ready.display_ends - (chooserange / 2) + chosen text = ("War is now at your doorstep! Mobilize your armies! " "The battle has begun now, and will end at %s.\n\n" "> Enter your commands in this thread, prefixed with " "'>'") % ready.ends_str() post = self.reddit.get_submission( submission_id=name_to_id(ready.submission_id)) post.edit(text) session.commit() self.update_skirmish_summaries(results['skirmish_ended']) for done in results['ended']: report = ["The battle is complete...\n"] report += done.report(self.config) report.append("") if done.old_buffs: report.append("Buffs in effect for Team %s\n" % num_to_team(done.old_owner, self.config)) for buff in done.old_buffs: report.append(" * %s" % buff.name) report.append("") team0_name = num_to_team(0, self.config) team1_name = num_to_team(1, self.config) # Homeland buffs? if done.homeland_buffs: report.append("Homeland buffs in effect:") for team in range(0, 2): name = num_to_team(team, self.config) report.append("%s: %d%%" % (name, done.homeland_buffs[team])) report.append(("## Final Score: Team %s: %d " "Team %s: %d") % (team0_name, done.score0, team1_name, done.score1)) if done.victor is not None: report.append("\n# The Victor: Team %s" % num_to_team(done.victor, self.config)) else: report.append("# TIE") text = "\n".join(report) post = self.reddit.get_submission( submission_id=name_to_id(done.submission_id)) post.edit(text) # Update all the skirmish summaries self.update_skirmish_summaries(done.toplevel_skirmishes()) session.delete(done) session.commit() db.Buff.update_all(session)
def test_multimove_situation_changes(self): """Can't multimove somewhere that's changed hands""" sapp = self.get_region("Sapphire") sapp.owner = self.alice.team self.sess.commit() DAY = 60 * 60 * 24 movements = self.sess.query(MarchingOrder).count() self.assertEqual(movements, 0) path = [self.get_region(name) for name in ('Orange Londo', 'Sapphire')] then = now() # We'll need this to check timing self.alice.move(100, path, DAY) movements = self.sess.query(MarchingOrder).all() self.assertEqual(len(movements), 2) # The first should be to londo londomove = movements[0] self.assertEqual(londomove.source, self.get_region('Oraistedarg')) self.assertEqual(londomove.dest, self.get_region('Orange Londo')) # Note, if self.alice.move takes longer than 10 minutes to run, this # will fail. self.assertAlmostEqual(londomove.arrival, then + DAY, delta=600) # Next, sapphire sappmove = movements[1] self.assertEqual(sappmove.source, self.get_region('Orange Londo')) self.assertEqual(sappmove.dest, self.get_region('Sapphire')) # Should arrive 2 days from now, +/- 5 minutes self.assertAlmostEqual(sappmove.arrival, then + DAY + DAY, delta=600) n = (self.sess.query(db.MarchingOrder). filter_by(leader=self.alice)).count() self.assertEqual(n, 2) # Sapphire falls to the enemy! sappmove.dest.owner = self.bob.team self.sess.commit() # Tired of waiting movements[0].arrival = now() self.sess.commit() self.assert_(movements[0].has_arrived()) arrived = MarchingOrder.update_all(self.sess) self.assert_(arrived) # Should be in londo self.assertEqual(londomove.dest, self.alice.region) # One order left n = (self.sess.query(db.MarchingOrder). filter_by(leader=self.alice)).count() self.assertEqual(n, 1) movements[1].arrival = now() self.sess.commit() self.assert_(movements[1].has_arrived()) arrived = MarchingOrder.update_all(self.sess) self.assert_(arrived) # But we fail to arrive because this movement's no longer valid. self.assertEqual(londomove.dest, self.alice.region) # Done moving n = (self.sess.query(db.MarchingOrder). filter_by(leader=self.alice)).count() self.assertEqual(n, 0)
def test_multimove(self): """Should be able to more more than one hop. (with corresponding increase in times)""" sapp = self.get_region("Sapphire") sapp.owner = self.alice.team self.sess.commit() DAY = 60 * 60 * 24 movements = self.sess.query(MarchingOrder).count() self.assertEqual(movements, 0) path = [self.get_region(name) for name in ('Orange Londo', 'Sapphire')] then = now() # We'll need this to check timing self.alice.move(100, path, DAY) movements = self.sess.query(MarchingOrder).all() self.assertEqual(len(movements), 2) # The first should be to londo londomove = movements[0] self.assertEqual(londomove.source, self.get_region('Oraistedarg')) self.assertEqual(londomove.dest, self.get_region('Orange Londo')) # Note, if self.alice.move takes longer than 10 minutes to run, this # will fail. self.assertAlmostEqual(londomove.arrival, then + DAY, delta=600) # Next, sapphire sappmove = movements[1] self.assertEqual(sappmove.source, self.get_region('Orange Londo')) self.assertEqual(sappmove.dest, self.get_region('Sapphire')) # Should arrive 2 days from now, +/- 5 minutes self.assertAlmostEqual(sappmove.arrival, then + DAY + DAY, delta=600) n = (self.sess.query(db.MarchingOrder). filter_by(leader=self.alice)).count() self.assertEqual(n, 2) # Tired of waiting movements[0].arrival = now() self.sess.commit() self.assert_(movements[0].has_arrived()) arrived = MarchingOrder.update_all(self.sess) self.assert_(arrived) # Should be in londo self.assertEqual(londomove.dest, self.alice.region) # One order left n = (self.sess.query(db.MarchingOrder). filter_by(leader=self.alice)).count() self.assertEqual(n, 1) movements[1].arrival = now() self.sess.commit() self.assert_(movements[1].has_arrived()) arrived = MarchingOrder.update_all(self.sess) self.assert_(arrived) # And now in sapphire self.assertEqual(sappmove.dest, self.alice.region) # Done moving n = (self.sess.query(db.MarchingOrder). filter_by(leader=self.alice)).count() self.assertEqual(n, 0)