all repos — mgba @ 6b0847c4725c89f937f8107c28cc4fef611a85d4

mGBA Game Boy Advance Emulator

src/gba/test/cheats.c (view raw)

  1/* Copyright (c) 2013-2017 Jeffrey Pfau
  2 *
  3 * This Source Code Form is subject to the terms of the Mozilla Public
  4 * License, v. 2.0. If a copy of the MPL was not distributed with this
  5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  6#include "util/test/suite.h"
  7
  8#include <mgba/core/cheats.h>
  9#include <mgba/core/core.h>
 10#include <mgba/gba/core.h>
 11#include <mgba/internal/gba/cheats.h>
 12
 13#include "gba/cheats/parv3.h"
 14#include "gba/cheats/gameshark.h"
 15
 16M_TEST_SUITE_SETUP(GBACheats) {
 17	struct mCore* core = GBACoreCreate();
 18	core->init(core);
 19	core->cheatDevice(core);
 20	*state = core;
 21	return 0;
 22}
 23
 24M_TEST_SUITE_TEARDOWN(GBACheats) {
 25	if (!*state) {
 26		return 0;
 27	}
 28	struct mCore* core = *state;
 29	core->deinit(core);
 30	return 0;
 31}
 32
 33M_TEST_DEFINE(createSet) {
 34	struct mCore* core = *state;
 35	struct mCheatDevice* device = core->cheatDevice(core);
 36	assert_non_null(device);
 37	struct mCheatSet* set = device->createSet(device, NULL);
 38	assert_non_null(set);
 39	set->deinit(set);
 40}
 41
 42M_TEST_DEFINE(addRawPARv3) {
 43	struct mCore* core = *state;
 44	struct mCheatDevice* device = core->cheatDevice(core);
 45	assert_non_null(device);
 46	struct mCheatSet* set = device->createSet(device, NULL);
 47	assert_non_null(set);
 48	GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW);
 49	assert_true(set->addLine(set, "80000000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY));
 50	assert_false(set->addLine(set, "43000000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY));
 51	set->deinit(set);
 52}
 53
 54M_TEST_DEFINE(doPARv3Assign) {
 55	struct mCore* core = *state;
 56	struct mCheatDevice* device = core->cheatDevice(core);
 57	assert_non_null(device);
 58	struct mCheatSet* set = device->createSet(device, NULL);
 59	assert_non_null(set);
 60	GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW);
 61	assert_true(set->addLine(set, "00300000 00000078", GBA_CHEAT_PRO_ACTION_REPLAY));
 62	assert_true(set->addLine(set, "02300002 00005678", GBA_CHEAT_PRO_ACTION_REPLAY));
 63	assert_true(set->addLine(set, "04300004 12345678", GBA_CHEAT_PRO_ACTION_REPLAY));
 64
 65	core->reset(core);
 66	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0);
 67	assert_int_equal(core->rawRead16(core, 0x03000002, -1), 0);
 68	assert_int_equal(core->rawRead32(core, 0x03000004, -1), 0);
 69
 70	mCheatRefresh(device, set);
 71	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x78);
 72	assert_int_equal(core->rawRead16(core, 0x03000002, -1), 0x5678);
 73	assert_int_equal(core->rawRead32(core, 0x03000004, -1), 0x12345678);
 74
 75	set->deinit(set);
 76}
 77
 78M_TEST_DEFINE(doPARv3If1) {
 79	struct mCore* core = *state;
 80	struct mCheatDevice* device = core->cheatDevice(core);
 81	assert_non_null(device);
 82	struct mCheatSet* set = device->createSet(device, NULL);
 83	assert_non_null(set);
 84	GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW);
 85	assert_true(set->addLine(set, "00300001 00000011", GBA_CHEAT_PRO_ACTION_REPLAY));
 86	assert_true(set->addLine(set, "08300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY));
 87	assert_true(set->addLine(set, "00300001 00000012", GBA_CHEAT_PRO_ACTION_REPLAY));
 88	assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY));
 89
 90	core->reset(core);
 91	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0);
 92	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
 93
 94	mCheatRefresh(device, set);
 95	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
 96	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x12);
 97
 98	core->reset(core);
 99	core->rawWrite8(core, 0x03000000, -1, 0x1);
100	mCheatRefresh(device, set);
101	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
102	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x11);
103
104	set->deinit(set);
105}
106
107M_TEST_DEFINE(doPARv3If1x1) {
108	struct mCore* core = *state;
109	struct mCheatDevice* device = core->cheatDevice(core);
110	assert_non_null(device);
111	struct mCheatSet* set = device->createSet(device, NULL);
112	assert_non_null(set);
113	GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW);
114	assert_true(set->addLine(set, "00300002 00000021", GBA_CHEAT_PRO_ACTION_REPLAY));
115	assert_true(set->addLine(set, "00300003 00000031", GBA_CHEAT_PRO_ACTION_REPLAY));
116	assert_true(set->addLine(set, "08300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY));
117	assert_true(set->addLine(set, "00300002 00000022", GBA_CHEAT_PRO_ACTION_REPLAY));
118	assert_true(set->addLine(set, "08300001 00000000", GBA_CHEAT_PRO_ACTION_REPLAY));
119	assert_true(set->addLine(set, "00300003 00000032", GBA_CHEAT_PRO_ACTION_REPLAY));
120	assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY));
121
122	core->reset(core);
123	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0);
124	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
125	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0);
126	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0);
127
128	mCheatRefresh(device, set);
129	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
130	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
131	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22);
132	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32);
133
134	core->reset(core);
135	core->rawWrite8(core, 0x03000000, -1, 0x1);
136	mCheatRefresh(device, set);
137	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
138	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
139	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21);
140	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32);
141
142	core->reset(core);
143	core->rawWrite8(core, 0x03000001, -1, 0x1);
144	mCheatRefresh(device, set);
145	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
146	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1);
147	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22);
148	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31);
149
150	core->reset(core);
151	core->rawWrite8(core, 0x03000000, -1, 0x1);
152	core->rawWrite8(core, 0x03000001, -1, 0x1);
153	mCheatRefresh(device, set);
154	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
155	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1);
156	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21);
157	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31);
158
159	set->deinit(set);
160}
161
162M_TEST_DEFINE(doPARv3If2) {
163	struct mCore* core = *state;
164	struct mCheatDevice* device = core->cheatDevice(core);
165	assert_non_null(device);
166	struct mCheatSet* set = device->createSet(device, NULL);
167	assert_non_null(set);
168	GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW);
169	assert_true(set->addLine(set, "00300001 00000011", GBA_CHEAT_PRO_ACTION_REPLAY));
170	assert_true(set->addLine(set, "00300002 00000021", GBA_CHEAT_PRO_ACTION_REPLAY));
171	assert_true(set->addLine(set, "48300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY));
172	assert_true(set->addLine(set, "00300001 00000012", GBA_CHEAT_PRO_ACTION_REPLAY));
173	assert_true(set->addLine(set, "00300002 00000022", GBA_CHEAT_PRO_ACTION_REPLAY));
174	assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY));
175
176	core->reset(core);
177	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0);
178	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
179	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0);
180
181	mCheatRefresh(device, set);
182	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
183	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x12);
184	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22);
185
186	core->reset(core);
187	core->rawWrite8(core, 0x03000000, -1, 0x1);
188	mCheatRefresh(device, set);
189	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
190	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x11);
191	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21);
192
193	set->deinit(set);
194}
195
196M_TEST_DEFINE(doPARv3If2x2) {
197	struct mCore* core = *state;
198	struct mCheatDevice* device = core->cheatDevice(core);
199	assert_non_null(device);
200	struct mCheatSet* set = device->createSet(device, NULL);
201	assert_non_null(set);
202	GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW);
203	assert_true(set->addLine(set, "00300002 00000021", GBA_CHEAT_PRO_ACTION_REPLAY));
204	assert_true(set->addLine(set, "00300003 00000031", GBA_CHEAT_PRO_ACTION_REPLAY));
205	assert_true(set->addLine(set, "00300004 00000041", GBA_CHEAT_PRO_ACTION_REPLAY));
206	assert_true(set->addLine(set, "00300005 00000051", GBA_CHEAT_PRO_ACTION_REPLAY));
207	assert_true(set->addLine(set, "48300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY));
208	assert_true(set->addLine(set, "00300002 00000022", GBA_CHEAT_PRO_ACTION_REPLAY));
209	assert_true(set->addLine(set, "00300003 00000032", GBA_CHEAT_PRO_ACTION_REPLAY));
210	assert_true(set->addLine(set, "48300001 00000000", GBA_CHEAT_PRO_ACTION_REPLAY));
211	assert_true(set->addLine(set, "00300004 00000042", GBA_CHEAT_PRO_ACTION_REPLAY));
212	assert_true(set->addLine(set, "00300005 00000052", GBA_CHEAT_PRO_ACTION_REPLAY));
213	assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY));
214
215	core->reset(core);
216	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0);
217	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
218	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0);
219	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0);
220	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0);
221	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0);
222
223	mCheatRefresh(device, set);
224	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
225	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
226	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22);
227	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32);
228	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42);
229	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x52);
230
231	core->reset(core);
232	core->rawWrite8(core, 0x03000000, -1, 0x1);
233	mCheatRefresh(device, set);
234	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
235	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
236	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21);
237	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31);
238	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42);
239	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x52);
240
241	core->reset(core);
242	core->rawWrite8(core, 0x03000001, -1, 0x1);
243	mCheatRefresh(device, set);
244	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
245	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1);
246	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22);
247	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32);
248	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41);
249	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x51);
250
251	core->reset(core);
252	core->rawWrite8(core, 0x03000000, -1, 0x1);
253	core->rawWrite8(core, 0x03000001, -1, 0x1);
254	mCheatRefresh(device, set);
255	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
256	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1);
257	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21);
258	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31);
259	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41);
260	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x51);
261	set->deinit(set);
262}
263
264M_TEST_DEFINE(doPARv3If2Contain1) {
265	struct mCore* core = *state;
266	struct mCheatDevice* device = core->cheatDevice(core);
267	assert_non_null(device);
268	struct mCheatSet* set = device->createSet(device, NULL);
269	assert_non_null(set);
270	GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW);
271	assert_true(set->addLine(set, "00300002 00000021", GBA_CHEAT_PRO_ACTION_REPLAY));
272	assert_true(set->addLine(set, "48300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY));
273	assert_true(set->addLine(set, "08300001 00000000", GBA_CHEAT_PRO_ACTION_REPLAY));
274	assert_true(set->addLine(set, "00300002 00000022", GBA_CHEAT_PRO_ACTION_REPLAY));
275	assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY));
276
277	core->reset(core);
278	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0);
279	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
280	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0);
281
282	mCheatRefresh(device, set);
283	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
284	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
285	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22);
286
287	core->reset(core);
288	core->rawWrite8(core, 0x03000000, -1, 0x1);
289	mCheatRefresh(device, set);
290	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
291	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
292	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21);
293
294	core->reset(core);
295	core->rawWrite8(core, 0x03000001, -1, 0x1);
296	mCheatRefresh(device, set);
297	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
298	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1);
299	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21);
300
301	core->reset(core);
302	core->rawWrite8(core, 0x03000000, -1, 0x1);
303	core->rawWrite8(core, 0x03000001, -1, 0x1);
304	mCheatRefresh(device, set);
305	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
306	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1);
307	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21);
308	set->deinit(set);
309}
310
311M_TEST_DEFINE(doPARv3IfX) {
312	struct mCore* core = *state;
313	struct mCheatDevice* device = core->cheatDevice(core);
314	assert_non_null(device);
315	struct mCheatSet* set = device->createSet(device, NULL);
316	assert_non_null(set);
317	GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW);
318	assert_true(set->addLine(set, "00300001 00000011", GBA_CHEAT_PRO_ACTION_REPLAY));
319	assert_true(set->addLine(set, "88300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY));
320	assert_true(set->addLine(set, "00300001 00000012", GBA_CHEAT_PRO_ACTION_REPLAY));
321	assert_true(set->addLine(set, "00000000 40000000", GBA_CHEAT_PRO_ACTION_REPLAY));
322	assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY));
323
324	core->reset(core);
325	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0);
326	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
327
328	mCheatRefresh(device, set);
329	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
330	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x12);
331
332	core->reset(core);
333	core->rawWrite8(core, 0x03000000, -1, 0x1);
334	mCheatRefresh(device, set);
335	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
336	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x11);
337}
338
339M_TEST_DEFINE(doPARv3IfXxX) {
340	struct mCore* core = *state;
341	struct mCheatDevice* device = core->cheatDevice(core);
342	assert_non_null(device);
343	struct mCheatSet* set = device->createSet(device, NULL);
344	assert_non_null(set);
345	GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW);
346	assert_true(set->addLine(set, "00300002 00000021", GBA_CHEAT_PRO_ACTION_REPLAY));
347	assert_true(set->addLine(set, "00300003 00000031", GBA_CHEAT_PRO_ACTION_REPLAY));
348	assert_true(set->addLine(set, "00300004 00000041", GBA_CHEAT_PRO_ACTION_REPLAY));
349	assert_true(set->addLine(set, "88300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY));
350	assert_true(set->addLine(set, "00300002 00000022", GBA_CHEAT_PRO_ACTION_REPLAY));
351	assert_true(set->addLine(set, "00000000 40000000", GBA_CHEAT_PRO_ACTION_REPLAY));
352	assert_true(set->addLine(set, "00300003 00000032", GBA_CHEAT_PRO_ACTION_REPLAY));
353	assert_true(set->addLine(set, "88300001 00000000", GBA_CHEAT_PRO_ACTION_REPLAY));
354	assert_true(set->addLine(set, "00300004 00000042", GBA_CHEAT_PRO_ACTION_REPLAY));
355	assert_true(set->addLine(set, "00000000 40000000", GBA_CHEAT_PRO_ACTION_REPLAY));
356	assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY));
357
358	core->reset(core);
359	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0);
360	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
361	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0);
362	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0);
363	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0);
364
365	mCheatRefresh(device, set);
366	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
367	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
368	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22);
369	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32);
370	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42);
371
372	core->reset(core);
373	core->rawWrite8(core, 0x03000000, -1, 0x1);
374	mCheatRefresh(device, set);
375	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
376	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
377	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21);
378	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32);
379	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42);
380
381	core->reset(core);
382	core->rawWrite8(core, 0x03000001, -1, 0x1);
383	mCheatRefresh(device, set);
384	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
385	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1);
386	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22);
387	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32);
388	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41);
389
390	core->reset(core);
391	core->rawWrite8(core, 0x03000000, -1, 0x1);
392	core->rawWrite8(core, 0x03000001, -1, 0x1);
393	mCheatRefresh(device, set);
394	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
395	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1);
396	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21);
397	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32);
398	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41);
399}
400
401M_TEST_DEFINE(doPARv3IfXElse) {
402	struct mCore* core = *state;
403	struct mCheatDevice* device = core->cheatDevice(core);
404	assert_non_null(device);
405	struct mCheatSet* set = device->createSet(device, NULL);
406	assert_non_null(set);
407	GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW);
408	assert_true(set->addLine(set, "00300001 00000011", GBA_CHEAT_PRO_ACTION_REPLAY));
409	assert_true(set->addLine(set, "00300002 00000021", GBA_CHEAT_PRO_ACTION_REPLAY));
410	assert_true(set->addLine(set, "88300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY));
411	assert_true(set->addLine(set, "00300001 00000012", GBA_CHEAT_PRO_ACTION_REPLAY));
412	assert_true(set->addLine(set, "00000000 60000000", GBA_CHEAT_PRO_ACTION_REPLAY));
413	assert_true(set->addLine(set, "00300002 00000022", GBA_CHEAT_PRO_ACTION_REPLAY));
414	assert_true(set->addLine(set, "00000000 40000000", GBA_CHEAT_PRO_ACTION_REPLAY));
415	assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY));
416
417	core->reset(core);
418	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0);
419	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
420	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0);
421
422	mCheatRefresh(device, set);
423	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
424	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x12);
425	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21);
426
427	core->reset(core);
428	core->rawWrite8(core, 0x03000000, -1, 0x1);
429	mCheatRefresh(device, set);
430	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
431	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x11);
432	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22);
433}
434
435M_TEST_DEFINE(doPARv3IfXElsexX) {
436	struct mCore* core = *state;
437	struct mCheatDevice* device = core->cheatDevice(core);
438	assert_non_null(device);
439	struct mCheatSet* set = device->createSet(device, NULL);
440	assert_non_null(set);
441	GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW);
442	assert_true(set->addLine(set, "00300002 00000021", GBA_CHEAT_PRO_ACTION_REPLAY));
443	assert_true(set->addLine(set, "00300003 00000031", GBA_CHEAT_PRO_ACTION_REPLAY));
444	assert_true(set->addLine(set, "00300004 00000041", GBA_CHEAT_PRO_ACTION_REPLAY));
445	assert_true(set->addLine(set, "00300005 00000051", GBA_CHEAT_PRO_ACTION_REPLAY));
446	assert_true(set->addLine(set, "88300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY));
447	assert_true(set->addLine(set, "00300002 00000022", GBA_CHEAT_PRO_ACTION_REPLAY));
448	assert_true(set->addLine(set, "00000000 60000000", GBA_CHEAT_PRO_ACTION_REPLAY));
449	assert_true(set->addLine(set, "00300003 00000032", GBA_CHEAT_PRO_ACTION_REPLAY));
450	assert_true(set->addLine(set, "00000000 40000000", GBA_CHEAT_PRO_ACTION_REPLAY));
451	assert_true(set->addLine(set, "00300004 00000042", GBA_CHEAT_PRO_ACTION_REPLAY));
452	assert_true(set->addLine(set, "88300001 00000000", GBA_CHEAT_PRO_ACTION_REPLAY));
453	assert_true(set->addLine(set, "00300005 00000052", GBA_CHEAT_PRO_ACTION_REPLAY));
454	assert_true(set->addLine(set, "00000000 40000000", GBA_CHEAT_PRO_ACTION_REPLAY));
455	assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY));
456
457	core->reset(core);
458	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0);
459	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
460	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0);
461	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0);
462	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0);
463	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0);
464
465	mCheatRefresh(device, set);
466	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
467	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
468	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22);
469	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31);
470	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42);
471	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x52);
472
473	core->reset(core);
474	core->rawWrite8(core, 0x03000000, -1, 0x1);
475	mCheatRefresh(device, set);
476	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
477	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
478	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21);
479	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32);
480	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42);
481	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x52);
482
483	core->reset(core);
484	core->rawWrite8(core, 0x03000001, -1, 0x1);
485	mCheatRefresh(device, set);
486	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
487	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1);
488	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22);
489	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31);
490	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42);
491	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x51);
492
493	core->reset(core);
494	core->rawWrite8(core, 0x03000000, -1, 0x1);
495	core->rawWrite8(core, 0x03000001, -1, 0x1);
496	mCheatRefresh(device, set);
497	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
498	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1);
499	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21);
500	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32);
501	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42);
502	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x51);
503}
504
505M_TEST_DEFINE(doPARv3IfXElsexXElse) {
506	struct mCore* core = *state;
507	struct mCheatDevice* device = core->cheatDevice(core);
508	assert_non_null(device);
509	struct mCheatSet* set = device->createSet(device, NULL);
510	assert_non_null(set);
511	GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW);
512	assert_true(set->addLine(set, "00300002 00000021", GBA_CHEAT_PRO_ACTION_REPLAY));
513	assert_true(set->addLine(set, "00300003 00000031", GBA_CHEAT_PRO_ACTION_REPLAY));
514	assert_true(set->addLine(set, "00300004 00000041", GBA_CHEAT_PRO_ACTION_REPLAY));
515	assert_true(set->addLine(set, "00300005 00000051", GBA_CHEAT_PRO_ACTION_REPLAY));
516	assert_true(set->addLine(set, "00300006 00000061", GBA_CHEAT_PRO_ACTION_REPLAY));
517	assert_true(set->addLine(set, "88300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY));
518	assert_true(set->addLine(set, "00300002 00000022", GBA_CHEAT_PRO_ACTION_REPLAY));
519	assert_true(set->addLine(set, "00000000 60000000", GBA_CHEAT_PRO_ACTION_REPLAY));
520	assert_true(set->addLine(set, "00300003 00000032", GBA_CHEAT_PRO_ACTION_REPLAY));
521	assert_true(set->addLine(set, "00000000 40000000", GBA_CHEAT_PRO_ACTION_REPLAY));
522	assert_true(set->addLine(set, "00300004 00000042", GBA_CHEAT_PRO_ACTION_REPLAY));
523	assert_true(set->addLine(set, "88300001 00000000", GBA_CHEAT_PRO_ACTION_REPLAY));
524	assert_true(set->addLine(set, "00300005 00000052", GBA_CHEAT_PRO_ACTION_REPLAY));
525	assert_true(set->addLine(set, "00000000 60000000", GBA_CHEAT_PRO_ACTION_REPLAY));
526	assert_true(set->addLine(set, "00300006 00000062", GBA_CHEAT_PRO_ACTION_REPLAY));
527	assert_true(set->addLine(set, "00000000 40000000", GBA_CHEAT_PRO_ACTION_REPLAY));
528	assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY));
529
530	core->reset(core);
531	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0);
532	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
533	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0);
534	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0);
535	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0);
536	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0);
537	assert_int_equal(core->rawRead8(core, 0x03000006, -1), 0);
538
539	mCheatRefresh(device, set);
540	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
541	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
542	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22);
543	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31);
544	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42);
545	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x52);
546
547	core->reset(core);
548	core->rawWrite8(core, 0x03000000, -1, 0x1);
549	mCheatRefresh(device, set);
550	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
551	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
552	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21);
553	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32);
554	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42);
555	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x52);
556	assert_int_equal(core->rawRead8(core, 0x03000006, -1), 0x61);
557
558	core->reset(core);
559	core->rawWrite8(core, 0x03000001, -1, 0x1);
560	mCheatRefresh(device, set);
561	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
562	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1);
563	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22);
564	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31);
565	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42);
566	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x51);
567	assert_int_equal(core->rawRead8(core, 0x03000006, -1), 0x62);
568
569	core->reset(core);
570	core->rawWrite8(core, 0x03000000, -1, 0x1);
571	core->rawWrite8(core, 0x03000001, -1, 0x1);
572	mCheatRefresh(device, set);
573	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
574	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1);
575	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21);
576	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32);
577	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42);
578	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x51);
579	assert_int_equal(core->rawRead8(core, 0x03000006, -1), 0x62);
580}
581
582M_TEST_DEFINE(doPARv3IfXContain1) {
583	struct mCore* core = *state;
584	struct mCheatDevice* device = core->cheatDevice(core);
585	assert_non_null(device);
586	struct mCheatSet* set = device->createSet(device, NULL);
587	assert_non_null(set);
588	GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW);
589	assert_true(set->addLine(set, "00300002 00000021", GBA_CHEAT_PRO_ACTION_REPLAY));
590	assert_true(set->addLine(set, "00300003 00000031", GBA_CHEAT_PRO_ACTION_REPLAY));
591	assert_true(set->addLine(set, "00300004 00000041", GBA_CHEAT_PRO_ACTION_REPLAY));
592	assert_true(set->addLine(set, "88300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY));
593	assert_true(set->addLine(set, "00300002 00000022", GBA_CHEAT_PRO_ACTION_REPLAY));
594	assert_true(set->addLine(set, "08300001 00000000", GBA_CHEAT_PRO_ACTION_REPLAY));
595	assert_true(set->addLine(set, "00300003 00000032", GBA_CHEAT_PRO_ACTION_REPLAY));
596	assert_true(set->addLine(set, "00300004 00000042", GBA_CHEAT_PRO_ACTION_REPLAY));
597	assert_true(set->addLine(set, "00000000 40000000", GBA_CHEAT_PRO_ACTION_REPLAY));
598	assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY));
599
600	core->reset(core);
601	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0);
602	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
603	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0);
604	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0);
605	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0);
606
607	mCheatRefresh(device, set);
608	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
609	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
610	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22);
611	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32);
612	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42);
613
614	core->reset(core);
615	core->rawWrite8(core, 0x03000000, -1, 0x1);
616	mCheatRefresh(device, set);
617	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
618	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
619	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21);
620	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31);
621	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41);
622
623	core->reset(core);
624	core->rawWrite8(core, 0x03000001, -1, 0x1);
625	mCheatRefresh(device, set);
626	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
627	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1);
628	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22);
629	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31);
630	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42);
631
632	core->reset(core);
633	core->rawWrite8(core, 0x03000000, -1, 0x1);
634	core->rawWrite8(core, 0x03000001, -1, 0x1);
635	mCheatRefresh(device, set);
636	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
637	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1);
638	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21);
639	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31);
640	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41);
641}
642
643M_TEST_DEFINE(doPARv3IfXContain1Else) {
644	struct mCore* core = *state;
645	struct mCheatDevice* device = core->cheatDevice(core);
646	assert_non_null(device);
647	struct mCheatSet* set = device->createSet(device, NULL);
648	assert_non_null(set);
649	GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW);
650	assert_true(set->addLine(set, "00300002 00000021", GBA_CHEAT_PRO_ACTION_REPLAY));
651	assert_true(set->addLine(set, "00300003 00000031", GBA_CHEAT_PRO_ACTION_REPLAY));
652	assert_true(set->addLine(set, "00300004 00000041", GBA_CHEAT_PRO_ACTION_REPLAY));
653	assert_true(set->addLine(set, "00300005 00000051", GBA_CHEAT_PRO_ACTION_REPLAY));
654	assert_true(set->addLine(set, "88300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY));
655	assert_true(set->addLine(set, "00300002 00000022", GBA_CHEAT_PRO_ACTION_REPLAY));
656	assert_true(set->addLine(set, "08300001 00000000", GBA_CHEAT_PRO_ACTION_REPLAY));
657	assert_true(set->addLine(set, "00300003 00000032", GBA_CHEAT_PRO_ACTION_REPLAY));
658	assert_true(set->addLine(set, "00300004 00000042", GBA_CHEAT_PRO_ACTION_REPLAY));
659	assert_true(set->addLine(set, "00000000 60000000", GBA_CHEAT_PRO_ACTION_REPLAY));
660	assert_true(set->addLine(set, "00300005 00000052", GBA_CHEAT_PRO_ACTION_REPLAY));
661	assert_true(set->addLine(set, "00000000 40000000", GBA_CHEAT_PRO_ACTION_REPLAY));
662	assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY));
663
664	core->reset(core);
665	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0);
666	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
667	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0);
668	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0);
669	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0);
670	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0);
671
672	mCheatRefresh(device, set);
673	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
674	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
675	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22);
676	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32);
677	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42);
678	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x51);
679
680	core->reset(core);
681	core->rawWrite8(core, 0x03000000, -1, 0x1);
682	mCheatRefresh(device, set);
683	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
684	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
685	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21);
686	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31);
687	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41);
688	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x52);
689
690	core->reset(core);
691	core->rawWrite8(core, 0x03000001, -1, 0x1);
692	mCheatRefresh(device, set);
693	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
694	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1);
695	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22);
696	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31);
697	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42);
698	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x51);
699
700	core->reset(core);
701	core->rawWrite8(core, 0x03000000, -1, 0x1);
702	core->rawWrite8(core, 0x03000001, -1, 0x1);
703	mCheatRefresh(device, set);
704	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
705	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1);
706	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21);
707	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31);
708	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41);
709	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x52);
710}
711
712M_TEST_DEFINE(doPARv3IfXElseContain1) {
713	struct mCore* core = *state;
714	struct mCheatDevice* device = core->cheatDevice(core);
715	assert_non_null(device);
716	struct mCheatSet* set = device->createSet(device, NULL);
717	assert_non_null(set);
718	GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW);
719	assert_true(set->addLine(set, "00300002 00000021", GBA_CHEAT_PRO_ACTION_REPLAY));
720	assert_true(set->addLine(set, "00300003 00000031", GBA_CHEAT_PRO_ACTION_REPLAY));
721	assert_true(set->addLine(set, "00300004 00000041", GBA_CHEAT_PRO_ACTION_REPLAY));
722	assert_true(set->addLine(set, "00300005 00000051", GBA_CHEAT_PRO_ACTION_REPLAY));
723	assert_true(set->addLine(set, "88300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY));
724	assert_true(set->addLine(set, "00300002 00000022", GBA_CHEAT_PRO_ACTION_REPLAY));
725	assert_true(set->addLine(set, "00000000 60000000", GBA_CHEAT_PRO_ACTION_REPLAY));
726	assert_true(set->addLine(set, "00300003 00000032", GBA_CHEAT_PRO_ACTION_REPLAY));
727	assert_true(set->addLine(set, "08300001 00000000", GBA_CHEAT_PRO_ACTION_REPLAY));
728	assert_true(set->addLine(set, "00300004 00000042", GBA_CHEAT_PRO_ACTION_REPLAY));
729	assert_true(set->addLine(set, "00300005 00000052", GBA_CHEAT_PRO_ACTION_REPLAY));
730	assert_true(set->addLine(set, "00000000 40000000", GBA_CHEAT_PRO_ACTION_REPLAY));
731	assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY));
732
733	core->reset(core);
734	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0);
735	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
736	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0);
737	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0);
738	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0);
739	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0);
740
741	mCheatRefresh(device, set);
742	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
743	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
744	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22);
745	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31);
746	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41);
747	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x51);
748
749	core->reset(core);
750	core->rawWrite8(core, 0x03000000, -1, 0x1);
751	mCheatRefresh(device, set);
752	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
753	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
754	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21);
755	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32);
756	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42);
757	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x52);
758
759	core->reset(core);
760	core->rawWrite8(core, 0x03000001, -1, 0x1);
761	mCheatRefresh(device, set);
762	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
763	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1);
764	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22);
765	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31);
766	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41);
767	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x51);
768
769	core->reset(core);
770	core->rawWrite8(core, 0x03000000, -1, 0x1);
771	core->rawWrite8(core, 0x03000001, -1, 0x1);
772	mCheatRefresh(device, set);
773	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
774	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1);
775	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21);
776	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32);
777	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41);
778	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x52);
779}
780
781M_TEST_DEFINE(doPARv3IfXContain1ElseContain1) {
782	struct mCore* core = *state;
783	struct mCheatDevice* device = core->cheatDevice(core);
784	assert_non_null(device);
785	struct mCheatSet* set = device->createSet(device, NULL);
786	assert_non_null(set);
787	GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW);
788	assert_true(set->addLine(set, "00300003 00000031", GBA_CHEAT_PRO_ACTION_REPLAY));
789	assert_true(set->addLine(set, "00300004 00000041", GBA_CHEAT_PRO_ACTION_REPLAY));
790	assert_true(set->addLine(set, "00300005 00000051", GBA_CHEAT_PRO_ACTION_REPLAY));
791	assert_true(set->addLine(set, "00300006 00000061", GBA_CHEAT_PRO_ACTION_REPLAY));
792	assert_true(set->addLine(set, "00300007 00000071", GBA_CHEAT_PRO_ACTION_REPLAY));
793	assert_true(set->addLine(set, "00300008 00000081", GBA_CHEAT_PRO_ACTION_REPLAY));
794	assert_true(set->addLine(set, "88300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY));
795	assert_true(set->addLine(set, "00300003 00000032", GBA_CHEAT_PRO_ACTION_REPLAY));
796	assert_true(set->addLine(set, "08300001 00000000", GBA_CHEAT_PRO_ACTION_REPLAY));
797	assert_true(set->addLine(set, "00300004 00000042", GBA_CHEAT_PRO_ACTION_REPLAY));
798	assert_true(set->addLine(set, "00300005 00000052", GBA_CHEAT_PRO_ACTION_REPLAY));
799	assert_true(set->addLine(set, "00000000 60000000", GBA_CHEAT_PRO_ACTION_REPLAY));
800	assert_true(set->addLine(set, "00300006 00000062", GBA_CHEAT_PRO_ACTION_REPLAY));
801	assert_true(set->addLine(set, "08300002 00000000", GBA_CHEAT_PRO_ACTION_REPLAY));
802	assert_true(set->addLine(set, "00300007 00000072", GBA_CHEAT_PRO_ACTION_REPLAY));
803	assert_true(set->addLine(set, "00300008 00000082", GBA_CHEAT_PRO_ACTION_REPLAY));
804	assert_true(set->addLine(set, "00000000 40000000", GBA_CHEAT_PRO_ACTION_REPLAY));
805	assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY));
806
807	core->reset(core);
808	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0);
809	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
810	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0);
811	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0);
812	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0);
813	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0);
814	assert_int_equal(core->rawRead8(core, 0x03000006, -1), 0);
815	assert_int_equal(core->rawRead8(core, 0x03000007, -1), 0);
816	assert_int_equal(core->rawRead8(core, 0x03000008, -1), 0);
817
818	mCheatRefresh(device, set);
819	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
820	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
821	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0);
822	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32);
823	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42);
824	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x52);
825	assert_int_equal(core->rawRead8(core, 0x03000006, -1), 0x61);
826	assert_int_equal(core->rawRead8(core, 0x03000007, -1), 0x71);
827	assert_int_equal(core->rawRead8(core, 0x03000008, -1), 0x81);
828
829	core->reset(core);
830	core->rawWrite8(core, 0x03000000, -1, 0x1);
831	mCheatRefresh(device, set);
832	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
833	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
834	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0);
835	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31);
836	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41);
837	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x51);
838	assert_int_equal(core->rawRead8(core, 0x03000006, -1), 0x62);
839	assert_int_equal(core->rawRead8(core, 0x03000007, -1), 0x72);
840	assert_int_equal(core->rawRead8(core, 0x03000008, -1), 0x82);
841
842	core->reset(core);
843	core->rawWrite8(core, 0x03000001, -1, 0x1);
844	mCheatRefresh(device, set);
845	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
846	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1);
847	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0);
848	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32);
849	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41);
850	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x52);
851	assert_int_equal(core->rawRead8(core, 0x03000006, -1), 0x61);
852	assert_int_equal(core->rawRead8(core, 0x03000007, -1), 0x71);
853	assert_int_equal(core->rawRead8(core, 0x03000008, -1), 0x81);
854
855	core->reset(core);
856	core->rawWrite8(core, 0x03000002, -1, 0x1);
857	mCheatRefresh(device, set);
858	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
859	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
860	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x1);
861	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32);
862	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x42);
863	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x52);
864	assert_int_equal(core->rawRead8(core, 0x03000006, -1), 0x61);
865	assert_int_equal(core->rawRead8(core, 0x03000007, -1), 0x71);
866	assert_int_equal(core->rawRead8(core, 0x03000008, -1), 0x81);
867
868	core->reset(core);
869	core->rawWrite8(core, 0x03000000, -1, 0x1);
870	core->rawWrite8(core, 0x03000001, -1, 0x1);
871	mCheatRefresh(device, set);
872	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
873	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1);
874	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0);
875	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31);
876	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41);
877	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x51);
878	assert_int_equal(core->rawRead8(core, 0x03000006, -1), 0x62);
879	assert_int_equal(core->rawRead8(core, 0x03000007, -1), 0x72);
880	assert_int_equal(core->rawRead8(core, 0x03000008, -1), 0x82);
881
882	core->reset(core);
883	core->rawWrite8(core, 0x03000000, -1, 0x1);
884	core->rawWrite8(core, 0x03000002, -1, 0x1);
885	mCheatRefresh(device, set);
886	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
887	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0);
888	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x1);
889	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31);
890	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41);
891	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x51);
892	assert_int_equal(core->rawRead8(core, 0x03000006, -1), 0x62);
893	assert_int_equal(core->rawRead8(core, 0x03000007, -1), 0x71);
894	assert_int_equal(core->rawRead8(core, 0x03000008, -1), 0x82);
895
896	core->reset(core);
897	core->rawWrite8(core, 0x03000001, -1, 0x1);
898	core->rawWrite8(core, 0x03000002, -1, 0x1);
899	mCheatRefresh(device, set);
900	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
901	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1);
902	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x1);
903	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x32);
904	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41);
905	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x52);
906	assert_int_equal(core->rawRead8(core, 0x03000006, -1), 0x61);
907	assert_int_equal(core->rawRead8(core, 0x03000007, -1), 0x71);
908	assert_int_equal(core->rawRead8(core, 0x03000008, -1), 0x81);
909
910	core->reset(core);
911	core->rawWrite8(core, 0x03000000, -1, 0x1);
912	core->rawWrite8(core, 0x03000001, -1, 0x1);
913	core->rawWrite8(core, 0x03000002, -1, 0x1);
914	mCheatRefresh(device, set);
915	assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1);
916	assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x1);
917	assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x1);
918	assert_int_equal(core->rawRead8(core, 0x03000003, -1), 0x31);
919	assert_int_equal(core->rawRead8(core, 0x03000004, -1), 0x41);
920	assert_int_equal(core->rawRead8(core, 0x03000005, -1), 0x51);
921	assert_int_equal(core->rawRead8(core, 0x03000006, -1), 0x62);
922	assert_int_equal(core->rawRead8(core, 0x03000007, -1), 0x71);
923	assert_int_equal(core->rawRead8(core, 0x03000008, -1), 0x82);
924}
925
926M_TEST_SUITE_DEFINE_SETUP_TEARDOWN(GBACheats,
927	cmocka_unit_test(createSet),
928	cmocka_unit_test(addRawPARv3),
929	cmocka_unit_test(doPARv3Assign),
930	cmocka_unit_test(doPARv3If1),
931	cmocka_unit_test(doPARv3If1x1),
932	cmocka_unit_test(doPARv3If2),
933	cmocka_unit_test(doPARv3If2x2),
934	cmocka_unit_test(doPARv3If2Contain1),
935	cmocka_unit_test(doPARv3IfX),
936	cmocka_unit_test(doPARv3IfXxX),
937	cmocka_unit_test(doPARv3IfXElse),
938	cmocka_unit_test(doPARv3IfXElsexX),
939	cmocka_unit_test(doPARv3IfXElsexXElse),
940	cmocka_unit_test(doPARv3IfXContain1),
941	cmocka_unit_test(doPARv3IfXContain1Else),
942	cmocka_unit_test(doPARv3IfXElseContain1),
943	cmocka_unit_test(doPARv3IfXContain1ElseContain1))