summaryrefslogtreecommitdiff
path: root/tests/test_vba_battle.py
blob: c6debc3b6549dd9aee83337fb52c38f2204bfcb6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
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()