summaryrefslogtreecommitdiff
path: root/tests/test_vba_battle.py
diff options
context:
space:
mode:
authoryenatch <yenatch@gmail.com>2013-11-18 21:03:31 -0500
committeryenatch <yenatch@gmail.com>2013-11-18 21:03:31 -0500
commitdfc88b9ac0369632bfa93a3859bf26dc2828ae9e (patch)
tree6243ede1e0a5a0bc2a76abf8c5027e21f1a72471 /tests/test_vba_battle.py
parent9d01c85d3bac2a6a7b5826dc2139f69731a901ab (diff)
parent3027746bd69db504f8d0e311d9f81593337ff236 (diff)
Merge branch 'master' of github.com:kanzure/pokemon-reverse-engineering-tools
Diffstat (limited to 'tests/test_vba_battle.py')
-rw-r--r--tests/test_vba_battle.py117
1 files changed, 117 insertions, 0 deletions
diff --git a/tests/test_vba_battle.py b/tests/test_vba_battle.py
new file mode 100644
index 0000000..c6debc3
--- /dev/null
+++ b/tests/test_vba_battle.py
@@ -0,0 +1,117 @@
+"""
+Tests for the battle controller
+"""
+
+import unittest
+
+from setup_vba import (
+ vba,
+ autoplayer,
+)
+
+from pokemontools.vba.battle import (
+ Battle,
+ BattleException,
+)
+
+from bootstrapping import (
+ bootstrap,
+ bootstrap_trainer_battle,
+)
+
+class BattleTests(unittest.TestCase):
+ cry = None
+ vba = None
+ bootstrap_state = None
+
+ @classmethod
+ def setUpClass(cls):
+ cls.cry = vba.crystal()
+ cls.vba = cls.cry.vba
+
+ cls.bootstrap_state = bootstrap_trainer_battle()
+ cls.vba.state = cls.bootstrap_state
+
+ @classmethod
+ def tearDownClass(cls):
+ cls.vba.shutdown()
+
+ def setUp(self):
+ # reset to whatever the bootstrapper created
+ self.vba.state = self.bootstrap_state
+ self.battle = Battle(emulator=self.cry)
+ self.battle.skip_start_text()
+
+ def test_is_in_battle(self):
+ self.assertTrue(self.battle.is_in_battle())
+
+ def test_is_player_turn(self):
+ self.battle.skip_start_text()
+ self.battle.skip_until_input_required()
+
+ # the initial state should be the player's turn
+ self.assertTrue(self.battle.is_player_turn())
+
+ def test_is_mandatory_switch_initial(self):
+ # should not be asking for a switch so soon in the battle
+ self.assertFalse(self.battle.is_mandatory_switch())
+
+ def test_is_mandatory_switch(self):
+ self.battle.skip_start_text()
+ self.battle.skip_until_input_required()
+
+ # press "FIGHT"
+ self.vba.press(["a"], after=20)
+
+ # press the first move ("SCRATCH")
+ self.vba.press(["a"], after=20)
+
+ # set partymon1 hp to very low
+ self.cry.set_battle_mon_hp(1)
+
+ # let the enemy attack and kill the pokemon
+ self.battle.skip_until_input_required()
+
+ self.assertTrue(self.battle.is_mandatory_switch())
+
+ def test_attack_loop(self):
+ self.battle.skip_start_text()
+ self.battle.skip_until_input_required()
+
+ # press "FIGHT"
+ self.vba.press(["a"], after=20)
+
+ # press the first move ("SCRATCH")
+ self.vba.press(["a"], after=20)
+
+ self.battle.skip_until_input_required()
+
+ self.assertTrue(self.battle.is_player_turn())
+
+ def test_is_battle_switch_prompt(self):
+ self.battle.skip_start_text()
+ self.battle.skip_until_input_required()
+
+ # press "FIGHT"
+ self.vba.press(["a"], after=20)
+
+ # press the first move ("SCRATCH")
+ self.vba.press(["a"], after=20)
+
+ # set enemy hp to very low
+ self.cry.lower_enemy_hp()
+
+ # attack the enemy and kill it
+ self.battle.skip_until_input_required()
+
+ # yes/no menu is present, should be detected
+ self.assertTrue(self.battle.is_trainer_switch_prompt())
+
+ # and input should be required
+ self.assertTrue(self.battle.is_input_required())
+
+ # but it's not mandatory
+ self.assertFalse(self.battle.is_mandatory_switch())
+
+if __name__ == "__main__":
+ unittest.main()