pokemon-reverse-engineering.../tests/test_vba_battle.py
2016-08-29 15:13:18 -05:00

118 lines
3.0 KiB
Python

"""
Tests for the battle controller
"""
import unittest
from tests.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()