pokemon-reverse-engineering.../tests/test_vba_battle.py
Bryan Bishop 966985411f detect the "mandatory switch" menu
This requires a slightly slower text_wait function. There is probably a
way to refactor that function in a way that doesn't cause cancer.
2013-11-11 00:55:54 -06:00

94 lines
2.3 KiB
Python

"""
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.vba.write_memory_at(0xc63c, 0)
self.vba.write_memory_at(0xc63d, 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())
if __name__ == "__main__":
unittest.main()