simplify the vba-related tests

The imports for the emulator-related tests are now simplified in the
tests/ folder. The bootstrapping.py file contains some shared functions
that multiple test files might choose to use. Those functions probably
belong in the actual module instead of in tests/.

The battle-related tests have been separated from the other emulator
tests.
This commit is contained in:
Bryan Bishop
2013-11-09 15:45:03 -06:00
parent 54e2b189b8
commit 3868fb1e06
4 changed files with 114 additions and 63 deletions

51
tests/bootstrapping.py Normal file
View File

@@ -0,0 +1,51 @@
"""
Functions to bootstrap the emulator state
"""
from setup_vba import (
vba,
autoplayer,
)
def bootstrap():
"""
Every test needs to be run against a certain minimum context. That context
is constructed by this function.
"""
cry = vba.crystal(config=None)
runner = autoplayer.SpeedRunner(cry=cry)
# skip=False means run the skip_intro function instead of just skipping to
# a saved state.
runner.skip_intro(skip=True)
state = cry.vba.state
# clean everything up again
cry.vba.shutdown()
return state
def bootstrap_trainer_battle():
"""
Start a trainer battle.
"""
# setup
cry = vba.crystal(config=None)
runner = autoplayer.SpeedRunner(cry=cry)
runner.skip_intro(skip=True)
runner.handle_mom(skip=True)
runner.walk_into_new_bark_town(skip=True)
runner.handle_elm("totodile", skip=True)
# levelgrind a pokemon
# TODO: make new_bark_level_grind able to figure out how to construct its
# initial state if none is provided.
runner.new_bark_level_grind(17, skip=True)
# TODO: figure out a better way to start a trainer battle :(
runner.cry.start_trainer_battle_lamely()
return runner.cry.vba.state

4
tests/setup_vba.py Normal file
View File

@@ -0,0 +1,4 @@
import pokemontools.vba.vba as vba
import pokemontools.vba.keyboard as keyboard
import pokemontools.vba.autoplayer as autoplayer
autoplayer.vba = vba

View File

@@ -4,20 +4,16 @@ Tests for VBA automation tools
import unittest
import pokemontools.vba.vba as vba
from pokemontools.vba.battle import (
Battle,
BattleException,
from setup_vba import (
vba,
autoplayer,
keyboard,
)
try:
import pokemontools.vba.vba_autoplayer as autoplayer
except ImportError:
import pokemontools.vba.autoplayer as autoplayer
autoplayer.vba = vba
import pokemontools.vba.keyboard as keyboard
from bootstrapping import (
bootstrap,
bootstrap_trainer_battle,
)
def setup_wram():
"""
@@ -39,49 +35,6 @@ def setup_wram():
return wram
def bootstrap():
"""
Every test needs to be run against a certain minimum context. That context
is constructed by this function.
"""
cry = vba.crystal(config=None)
runner = autoplayer.SpeedRunner(cry=cry)
# skip=False means run the skip_intro function instead of just skipping to
# a saved state.
runner.skip_intro(skip=True)
state = cry.vba.state
# clean everything up again
cry.vba.shutdown()
return state
def bootstrap_trainer_battle():
"""
Start a trainer battle.
"""
# setup
cry = vba.crystal(config=None)
runner = autoplayer.SpeedRunner(cry=cry)
runner.skip_intro(skip=True)
runner.handle_mom(skip=True)
runner.walk_into_new_bark_town(skip=True)
runner.handle_elm("totodile", skip=True)
# levelgrind a pokemon
# TODO: make new_bark_level_grind able to figure out how to construct its
# initial state if none is provided.
runner.new_bark_level_grind(17, skip=True)
# TODO: figure out a better way to start a trainer battle :(
runner.cry.start_trainer_battle_lamely()
return runner.cry.vba.state
class OtherVbaTests(unittest.TestCase):
def test_keyboard_planner(self):
button_sequence = keyboard.plan_typing("an")
@@ -329,13 +282,5 @@ class VbaTests(unittest.TestCase):
pname = self.cry.get_player_name().replace("@", "")
self.assertEqual(name, pname)
def test_battle_is_player_turn(self):
state = bootstrap_trainer_battle()
self.cry.vba.state = state
battle = Battle(emulator=self.cry)
self.assertTrue(battle.is_player_turn())
if __name__ == "__main__":
unittest.main()

51
tests/test_vba_battle.py Normal file
View File

@@ -0,0 +1,51 @@
"""
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
def test_battle_is_player_turn(self):
self.cry.vba.state = self.bootstrap_state
battle = Battle(emulator=self.cry)
self.assertTrue(battle.is_player_turn())
if __name__ == "__main__":
unittest.main()