mirror of
https://github.com/pret/pokemon-reverse-engineering-tools.git
synced 2026-08-09 02:44:05 -05:00
These tests require extra assets to complete. At the moment they shouldn't work because the data isn't available.
209 lines
5.6 KiB
Python
209 lines
5.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
import os
|
|
from copy import copy
|
|
import hashlib
|
|
import random
|
|
import json
|
|
|
|
from pokemontools.interval_map import IntervalMap
|
|
from pokemontools.chars import chars, jap_chars
|
|
|
|
from pokemontools.romstr import (
|
|
RomStr,
|
|
AsmList,
|
|
)
|
|
|
|
from pokemontools.item_constants import (
|
|
item_constants,
|
|
find_item_label_by_id,
|
|
generate_item_constants,
|
|
)
|
|
|
|
from pokemontools.pointers import (
|
|
calculate_bank,
|
|
calculate_pointer,
|
|
)
|
|
|
|
from pokemontools.pksv import (
|
|
pksv_gs,
|
|
pksv_crystal,
|
|
)
|
|
|
|
from pokemontools.labels import (
|
|
remove_quoted_text,
|
|
line_has_comment_address,
|
|
line_has_label,
|
|
get_label_from_line,
|
|
)
|
|
|
|
from pokemontools.crystal import (
|
|
rom,
|
|
load_rom,
|
|
rom_until,
|
|
direct_load_rom,
|
|
parse_script_engine_script_at,
|
|
parse_text_engine_script_at,
|
|
parse_text_at2,
|
|
find_all_text_pointers_in_script_engine_script,
|
|
SingleByteParam,
|
|
HexByte,
|
|
MultiByteParam,
|
|
PointerLabelParam,
|
|
ItemLabelByte,
|
|
DollarSignByte,
|
|
DecimalParam,
|
|
rom_interval,
|
|
map_names,
|
|
Label,
|
|
scan_for_predefined_labels,
|
|
all_labels,
|
|
write_all_labels,
|
|
parse_map_header_at,
|
|
old_parse_map_header_at,
|
|
process_00_subcommands,
|
|
parse_all_map_headers,
|
|
translate_command_byte,
|
|
map_name_cleaner,
|
|
load_map_group_offsets,
|
|
load_asm,
|
|
asm,
|
|
is_valid_address,
|
|
index,
|
|
how_many_until,
|
|
grouper,
|
|
get_pokemon_constant_by_id,
|
|
generate_map_constant_labels,
|
|
get_map_constant_label_by_id,
|
|
get_id_for_map_constant_label,
|
|
calculate_pointer_from_bytes_at,
|
|
isolate_incbins,
|
|
process_incbins,
|
|
get_labels_between,
|
|
generate_diff_insert,
|
|
find_labels_without_addresses,
|
|
rom_text_at,
|
|
get_label_for,
|
|
split_incbin_line_into_three,
|
|
reset_incbins,
|
|
)
|
|
|
|
import unittest
|
|
|
|
class BasicTestCase(unittest.TestCase):
|
|
"this is where i cram all of my unit tests together"
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
global rom
|
|
cls.rom = direct_load_rom()
|
|
rom = cls.rom
|
|
|
|
@classmethod
|
|
def tearDownClass(cls):
|
|
del cls.rom
|
|
|
|
def test_direct_load_rom(self):
|
|
rom = self.rom
|
|
self.assertEqual(len(rom), 2097152)
|
|
self.failUnless(isinstance(rom, RomStr))
|
|
|
|
def test_load_rom(self):
|
|
global rom
|
|
rom = None
|
|
load_rom()
|
|
self.failIf(rom == None)
|
|
rom = RomStr(None)
|
|
load_rom()
|
|
self.failIf(rom == RomStr(None))
|
|
|
|
def test_load_asm(self):
|
|
asm = load_asm()
|
|
joined_lines = "\n".join(asm)
|
|
self.failUnless("SECTION" in joined_lines)
|
|
self.failUnless("bank" in joined_lines)
|
|
self.failUnless(isinstance(asm, AsmList))
|
|
|
|
def test_rom_file_existence(self):
|
|
"ROM file must exist"
|
|
self.failUnless("baserom.gbc" in os.listdir("../"))
|
|
|
|
def test_rom_md5(self):
|
|
"ROM file must have the correct md5 sum"
|
|
rom = self.rom
|
|
correct = "9f2922b235a5eeb78d65594e82ef5dde"
|
|
md5 = hashlib.md5()
|
|
md5.update(rom)
|
|
md5sum = md5.hexdigest()
|
|
self.assertEqual(md5sum, correct)
|
|
|
|
def test_bizarre_http_presence(self):
|
|
rom_segment = self.rom[0x112116:0x112116+8]
|
|
self.assertEqual(rom_segment, "HTTP/1.0")
|
|
|
|
def test_rom_interval(self):
|
|
address = 0x100
|
|
interval = 10
|
|
correct_strings = ['0x0', '0xc3', '0x6e', '0x1', '0xce',
|
|
'0xed', '0x66', '0x66', '0xcc', '0xd']
|
|
byte_strings = rom_interval(address, interval, strings=True)
|
|
self.assertEqual(byte_strings, correct_strings)
|
|
correct_ints = [0, 195, 110, 1, 206, 237, 102, 102, 204, 13]
|
|
ints = rom_interval(address, interval, strings=False)
|
|
self.assertEqual(ints, correct_ints)
|
|
|
|
def test_rom_until(self):
|
|
address = 0x1337
|
|
byte = 0x13
|
|
bytes = rom_until(address, byte, strings=True)
|
|
self.failUnless(len(bytes) == 3)
|
|
self.failUnless(bytes[0] == '0xd5')
|
|
bytes = rom_until(address, byte, strings=False)
|
|
self.failUnless(len(bytes) == 3)
|
|
self.failUnless(bytes[0] == 0xd5)
|
|
|
|
def test_how_many_until(self):
|
|
how_many = how_many_until(chr(0x13), 0x1337)
|
|
self.assertEqual(how_many, 3)
|
|
|
|
def test_calculate_pointer_from_bytes_at(self):
|
|
addr1 = calculate_pointer_from_bytes_at(0x100, bank=False)
|
|
self.assertEqual(addr1, 0xc300)
|
|
addr2 = calculate_pointer_from_bytes_at(0x100, bank=True)
|
|
self.assertEqual(addr2, 0x2ec3)
|
|
|
|
def test_rom_text_at(self):
|
|
self.assertEquals(rom_text_at(0x112116, 8), "HTTP/1.0")
|
|
|
|
class TestRomStr(unittest.TestCase):
|
|
sample_text = "hello world!"
|
|
sample = None
|
|
|
|
def test_rom_interval(self):
|
|
global rom
|
|
load_rom()
|
|
address = 0x100
|
|
interval = 10
|
|
correct_strings = ['0x0', '0xc3', '0x6e', '0x1', '0xce',
|
|
'0xed', '0x66', '0x66', '0xcc', '0xd']
|
|
byte_strings = rom.interval(address, interval, strings=True)
|
|
self.assertEqual(byte_strings, correct_strings)
|
|
correct_ints = [0, 195, 110, 1, 206, 237, 102, 102, 204, 13]
|
|
ints = rom.interval(address, interval, strings=False)
|
|
self.assertEqual(ints, correct_ints)
|
|
|
|
def test_rom_until(self):
|
|
global rom
|
|
load_rom()
|
|
address = 0x1337
|
|
byte = 0x13
|
|
bytes = rom.until(address, byte, strings=True)
|
|
self.failUnless(len(bytes) == 3)
|
|
self.failUnless(bytes[0] == '0xd5')
|
|
bytes = rom.until(address, byte, strings=False)
|
|
self.failUnless(len(bytes) == 3)
|
|
self.failUnless(bytes[0] == 0xd5)
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|