OXYGENHUB
◆ main enhanced-x16-emulator / testbench / selftest.py
7.5 KiB · Python · last changed chore(): initial commit 25 days ago source blame history raw
1
import unittest
2
from testbench import X16TestBench
3
from testbench import Status
4
5
class SelfTest(unittest.TestCase):
6
    e = None
7
8
    def __init__(self, *args, **kwargs):
9
        super(SelfTest, self).__init__(*args, **kwargs)
10
        
11
        self.e = X16TestBench("../x16emu", ["-warp"])
12
        self.e.waitReady()
13
14
    def test_rombank(self):
15
        self.e.setRomBank(0)
16
        self.assertEqual(self.e.getMemory(1),0)
17
18
        self.e.setRomBank(10)
19
        self.assertEqual(self.e.getMemory(1),10)
20
21
    def test_rambank(self):
22
        self.e.setRamBank(0)
23
        self.assertEqual(self.e.getMemory(0),0)
24
25
        self.e.setRamBank(10)
26
        self.assertEqual(self.e.getMemory(0),10)
27
28
    def test_mem(self):
29
        #Set and retrieve value 0
30
        self.e.setMemory(0x6000, 0)
31
        self.assertEqual(self.e.getMemory(0x6000), 0)
32
33
        #Set and retrieve value 255
34
        self.e.setMemory(0x6000, 255)
35
        self.assertEqual(self.e.getMemory(0x6000), 255)
36
37
        #Set value -1, should cause an exception
38
        with self.assertRaises(Exception):
39
            self.e.setMemory(0x6000, -1)
40
41
        #Set value 256, should cause an exception
42
        with self.assertRaises(Exception):
43
            self.e.setMemory(0x6000, 256)
44
45
        #Use address -1, should cause an exception
46
        with self.assertRaises(Exception):
47
            self.e.setMemory(-1, 0)
48
        
49
        #Use address 10000, should cause an exception
50
        with self.assertRaises(Exception):
51
            self.e.setMemory(0x10000, 0)
52
53
    def test_fillmemory(self):
54
        self.e.fillMemory(0x6000, 0x61ff, 0x80)
55
        self.e.fillMemory(0x6001, 0x61fe, 0xff)
56
        
57
        self.assertEqual(self.e.getMemory(0x6000), 0x80)
58
        self.assertEqual(self.e.getMemory(0x6001), 0xff)
59
        self.assertEqual(self.e.getMemory(0x61fe), 0xff)
60
        self.assertEqual(self.e.getMemory(0x61ff), 0x80)
61
62
    def test_a(self):
63
        #Set and retrieve value 0
64
        self.e.setA(0)
65
        self.assertEqual(self.e.getA(), 0)
66
67
        #Set and retrieve value 255
68
        self.e.setA(255)
69
        self.assertEqual(self.e.getA(), 255)
70
71
        #Set value -1, should cause an exception
72
        with self.assertRaises(Exception):
73
            self.e.setA(-1)
74
75
        #Set value 256, should cause an exception
76
        with self.assertRaises(Exception):
77
            self.e.setA(256)
78
79
    def test_x(self):
80
        #Set and retrieve value 0
81
        self.e.setX(0)
82
        self.assertEqual(self.e.getX(), 0)
83
84
        #Set and retrieve value 255
85
        self.e.setX(255)
86
        self.assertEqual(self.e.getX(), 255)
87
88
        #Set value -1, should cause an exception
89
        with self.assertRaises(Exception):
90
            self.e.setX(-1)
91
92
        #Set value 256, should cause an exception
93
        with self.assertRaises(Exception):
94
            self.e.setX(256)
95
96
    def test_y(self):
97
        #Set and retrieve value 0
98
        self.e.setY(0)
99
        self.assertEqual(self.e.getY(), 0)
100
101
        #Set and retrieve value 255
102
        self.e.setY(255)
103
        self.assertEqual(self.e.getY(), 255)
104
105
        #Set value -1, should cause an exception
106
        with self.assertRaises(Exception):
107
            self.e.setY(-1)
108
109
        #Set value 256, should cause an exception
110
        with self.assertRaises(Exception):
111
            self.e.setY(256)
112
113
    def test_stackpointer(self):
114
        #Set and retrieve value 0
115
        self.e.setStackPointer(0)
116
        self.assertEqual(self.e.getStackPointer(), 0)
117
118
        #Set and retrieve value 255
119
        self.e.setStackPointer(255)
120
        self.assertEqual(self.e.getStackPointer(), 255)
121
122
        #Set value -1, should cause an exception
123
        with self.assertRaises(Exception):
124
            self.e.setStackPointer(-1)
125
126
        #Set value 256, should cause an exception
127
        with self.assertRaises(Exception):
128
            self.e.setStackPointer(256)
129
130
    def test_statusregister(self):
131
        #Set and retrieve value 0
132
        self.e.setStatus(0)
133
        self.assertEqual(self.e.getStatus(), 0)
134
135
        #Set and retrieve value 255
136
        self.e.setStatus(255)
137
        self.assertEqual(self.e.getStatus(), 255)
138
139
        #Set value -1, should cause an exception
140
        with self.assertRaises(Exception):
141
            self.e.setStatus(-1)
142
143
        #Set value 256, should cause an exception
144
        with self.assertRaises(Exception):
145
            self.e.setStatus(256)
146
147
    def test_carryflag(self):
148
        self.e.setStatus(self.e.getStatus() & (255-Status.C))
149
150
        self.e.setMemory(0x6000, 0x38)      #sec
151
        self.e.setMemory(0x6001, 0x60)      #rts
152
        self.e.run(0x6000)
153
        self.assertEqual(self.e.getStatus() & Status.C, Status.C)
154
155
        self.e.setMemory(0x6000, 0x18)      #clc
156
        self.e.run(0x6000)
157
        self.assertNotEqual(self.e.getStatus() & Status.C, Status.C)
158
159
    def test_zeroflag(self):
160
        #Clear zero flag
161
        self.e.setStatus(self.e.getStatus() & (255-Status.Z))
162
163
        #Run code that sets zero flag
164
        self.e.setMemory(0x6000, 0xa9)      #lda #0
165
        self.e.setMemory(0x6001, 0x00)
166
        self.e.setMemory(0x6002, 0x60)      #rts
167
        self.e.run(0x6000)
168
        self.assertEqual(self.e.getStatus() & Status.Z, Status.Z)
169
170
        #Run code that clears zero flag
171
        self.e.setMemory(0x6000, 0xa9)      #lda #1
172
        self.e.setMemory(0x6001, 0x01)
173
        self.e.setMemory(0x6002, 0x60)      #rts
174
        self.e.run(0x6000)
175
        self.assertNotEqual(self.e.getStatus() & Status.Z, Status.Z)
176
177
    def test_overflowflag(self):
178
        #Clear carry and overflow flags
179
        self.e.setStatus(self.e.getStatus() & (255-Status.C-Status.V))
180
181
        #Run code that doesn't cause overflow
182
        self.e.setMemory(0x6000, 0xa9)      #lda #1
183
        self.e.setMemory(0x6001, 0x01)
184
        self.e.setMemory(0x6002, 0x69)      #adc #1
185
        self.e.setMemory(0x6003, 0x01)
186
        self.e.setMemory(0x6004, 0x60)      #rts
187
        self.e.run(0x6000)
188
        self.assertNotEqual(self.e.getStatus() & Status.V, Status.V)
189
190
        #Run code that causes overflow
191
        self.e.setMemory(0x6000, 0xa9)      #lda #80
192
        self.e.setMemory(0x6001, 0x80)
193
        self.e.setMemory(0x6002, 0x69)      #adc #ff
194
        self.e.setMemory(0x6003, 0xff)
195
        self.e.setMemory(0x6004, 0x60)      #rts
196
        self.e.run(0x6000)
197
        self.assertEqual(self.e.getStatus() & Status.V, Status.V)
198
199
    def test_negativeflag(self):
200
        #Clear negative flag
201
        self.e.setStatus(self.e.getStatus() & (255-Status.N))
202
203
        #Run code that should set negative flag
204
        self.e.setMemory(0x6000, 0x38)      #sec
205
        self.e.setMemory(0x6001, 0xa9)      #lda #0
206
        self.e.setMemory(0x6002, 0x00)
207
        self.e.setMemory(0x6003, 0xe9)      #sbc #1
208
        self.e.setMemory(0x6004, 0x01)
209
        self.e.setMemory(0x6005, 0x60)      #rts
210
        self.e.run(0x6000)
211
        self.assertEqual(self.e.getStatus() & Status.N, Status.N)
212
213
        #Run code that should clear the negative flag
214
        self.e.setMemory(0x6000, 0x38)      #sec
215
        self.e.setMemory(0x6001, 0xa9)      #lda #ff
216
        self.e.setMemory(0x6002, 0xff)
217
        self.e.setMemory(0x6003, 0xe9)      #sbc #81
218
        self.e.setMemory(0x6004, 0x81)
219
        self.e.setMemory(0x6005, 0x60)      #rts
220
        self.e.run(0x6000)
221
        self.assertNotEqual(self.e.getStatus() & Status.N, Status.N)
222
223
    def test_run(self):
224
        #Use address -1, should cause an exception
225
        with self.assertRaises(Exception):
226
            self.e.run(-1)
227
        
228
        #Use address 10000, should cause an exception
229
        with self.assertRaises(Exception):
230
            self.e.run(0x10000)
231
232
if __name__ == '__main__':
233
    unittest.main()