mirror of
https://gitlab.com/xCrystal/pokecrystal-board.git
synced 2024-11-16 11:27:33 -08:00
more tests related to analyze_incbins
This commit is contained in:
parent
33d8c7a117
commit
8df5bd8856
@ -1,7 +1,8 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
#utilities to help disassemble pokémon crystal
|
#utilities to help disassemble pokémon crystal
|
||||||
import sys, os, inspect, md5, json
|
import sys, os, inspect, md5, json
|
||||||
from copy import copy
|
from copy import copy, deepcopy
|
||||||
|
import subprocess
|
||||||
|
|
||||||
#for IntervalMap
|
#for IntervalMap
|
||||||
from bisect import bisect_left, bisect_right
|
from bisect import bisect_left, bisect_right
|
||||||
@ -4422,7 +4423,7 @@ processed_incbins = {}
|
|||||||
|
|
||||||
def isolate_incbins():
|
def isolate_incbins():
|
||||||
"find each incbin line"
|
"find each incbin line"
|
||||||
global incbin_lines
|
global incbin_lines, asm
|
||||||
incbin_lines = []
|
incbin_lines = []
|
||||||
for line in asm:
|
for line in asm:
|
||||||
if line == "": continue
|
if line == "": continue
|
||||||
@ -4507,7 +4508,7 @@ def find_incbin_to_replace_for(address, debug=False, rom_file="../baserom.gbc"):
|
|||||||
return incbin_key
|
return incbin_key
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def split_incbin_line_into_three(line, start_address, byte_count):
|
def split_incbin_line_into_three(line, start_address, byte_count, rom_file="../baserom.gbc"):
|
||||||
"""
|
"""
|
||||||
splits an incbin line into three pieces.
|
splits an incbin line into three pieces.
|
||||||
you can replace the middle one with the new content of length bytecount
|
you can replace the middle one with the new content of length bytecount
|
||||||
@ -4544,12 +4545,19 @@ def split_incbin_line_into_three(line, start_address, byte_count):
|
|||||||
output += "INCBIN \"baserom.gbc\",$" + hex(third[0])[2:] + ",$" + hex(third[1])[2:] #no newline
|
output += "INCBIN \"baserom.gbc\",$" + hex(third[0])[2:] + ",$" + hex(third[1])[2:] #no newline
|
||||||
return output
|
return output
|
||||||
|
|
||||||
def generate_diff_insert(line_number, newline):
|
def generate_diff_insert(line_number, newline, debug=False):
|
||||||
|
"""generates a diff between the old main.asm and the new main.asm
|
||||||
|
note: requires python2.7 i think? b/c of subprocess.check_output"""
|
||||||
|
global asm
|
||||||
original = "\n".join(line for line in asm)
|
original = "\n".join(line for line in asm)
|
||||||
newfile = deepcopy(asm)
|
newfile = deepcopy(asm)
|
||||||
newfile[line_number] = newline #possibly inserting multiple lines
|
newfile[line_number] = newline #possibly inserting multiple lines
|
||||||
newfile = "\n".join(line for line in newfile)
|
newfile = "\n".join(line for line in newfile)
|
||||||
|
|
||||||
|
#make sure there's a newline at the end of the file
|
||||||
|
if newfile[-1] != "\n":
|
||||||
|
newfile += "\n"
|
||||||
|
|
||||||
original_filename = "ejroqjfoad.temp"
|
original_filename = "ejroqjfoad.temp"
|
||||||
newfile_filename = "fjiqefo.temp"
|
newfile_filename = "fjiqefo.temp"
|
||||||
|
|
||||||
@ -4564,13 +4572,16 @@ def generate_diff_insert(line_number, newline):
|
|||||||
try:
|
try:
|
||||||
diffcontent = subprocess.check_output("diff -u ../main.asm " + newfile_filename, shell=True)
|
diffcontent = subprocess.check_output("diff -u ../main.asm " + newfile_filename, shell=True)
|
||||||
except AttributeError, exc:
|
except AttributeError, exc:
|
||||||
raise exc
|
p = subprocess.Popen(["diff", "-u", "../main.asm", newfile_filename], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
|
out, err = p.communicate()
|
||||||
|
diffcontent = out
|
||||||
except Exception, exc:
|
except Exception, exc:
|
||||||
diffcontent = exc.output
|
raise exc
|
||||||
|
|
||||||
os.system("rm " + original_filename)
|
os.system("rm " + original_filename)
|
||||||
os.system("rm " + newfile_filename)
|
os.system("rm " + newfile_filename)
|
||||||
|
|
||||||
|
if debug: print diffcontent
|
||||||
return diffcontent
|
return diffcontent
|
||||||
|
|
||||||
def apply_diff(diff, try_fixing=True, do_compile=True):
|
def apply_diff(diff, try_fixing=True, do_compile=True):
|
||||||
@ -5017,6 +5028,9 @@ class TestCram(unittest.TestCase):
|
|||||||
self.assertGreaterEqual(address, 0x4000)
|
self.assertGreaterEqual(address, 0x4000)
|
||||||
self.failIf(0x4000 <= address <= 0x7FFF)
|
self.failIf(0x4000 <= address <= 0x7FFF)
|
||||||
self.failIf(address <= 0x4000)
|
self.failIf(address <= 0x4000)
|
||||||
|
def test_index(self):
|
||||||
|
self.assertTrue(index([1,2,3,4], lambda f: True) == 0)
|
||||||
|
self.assertTrue(index([1,2,3,4], lambda f: f==3) == 2)
|
||||||
class TestIntervalMap(unittest.TestCase):
|
class TestIntervalMap(unittest.TestCase):
|
||||||
def test_intervals(self):
|
def test_intervals(self):
|
||||||
i = IntervalMap()
|
i = IntervalMap()
|
||||||
@ -5235,6 +5249,51 @@ class TestAsmList(unittest.TestCase):
|
|||||||
self.assertTrue(processed_incbins == {})
|
self.assertTrue(processed_incbins == {})
|
||||||
#reset the original functions
|
#reset the original functions
|
||||||
load_asm, isolate_incbins, process_incbins = temp1, temp2, temp3
|
load_asm, isolate_incbins, process_incbins = temp1, temp2, temp3
|
||||||
|
def test_find_incbin_to_replace_for(self):
|
||||||
|
global asm, incbin_lines, processed_incbins
|
||||||
|
asm = ['first line', 'second line', 'third line',
|
||||||
|
'INCBIN "baserom.gbc",$90,$200 - $90',
|
||||||
|
'fifth line', 'last line']
|
||||||
|
isolate_incbins()
|
||||||
|
process_incbins()
|
||||||
|
line_num = find_incbin_to_replace_for(0x100)
|
||||||
|
#must be the 4th line (the INBIN line)
|
||||||
|
self.assertEqual(line_num, 3)
|
||||||
|
def test_split_incbin_line_into_three(self):
|
||||||
|
global asm, incbin_lines, processed_incbins
|
||||||
|
asm = ['first line', 'second line', 'third line',
|
||||||
|
'INCBIN "baserom.gbc",$90,$200 - $90',
|
||||||
|
'fifth line', 'last line']
|
||||||
|
isolate_incbins()
|
||||||
|
process_incbins()
|
||||||
|
content = split_incbin_line_into_three(3, 0x100, 10)
|
||||||
|
#must end up with three INCBINs in output
|
||||||
|
self.failUnless(content.count("INCBIN") == 3)
|
||||||
|
def test_analyze_intervals(self):
|
||||||
|
global asm, incbin_lines, processed_incbins
|
||||||
|
asm, incbin_lines, processed_incbins = None, [], {}
|
||||||
|
asm = ['first line', 'second line', 'third line',
|
||||||
|
'INCBIN "baserom.gbc",$90,$200 - $90',
|
||||||
|
'fifth line', 'last line',
|
||||||
|
'INCBIN "baserom.gbc",$33F,$4000 - $33F']
|
||||||
|
isolate_incbins()
|
||||||
|
process_incbins()
|
||||||
|
largest = analyze_intervals()
|
||||||
|
self.assertEqual(largest[0]["line_number"], 6)
|
||||||
|
self.assertEqual(largest[0]["line"], asm[6])
|
||||||
|
self.assertEqual(largest[1]["line_number"], 3)
|
||||||
|
self.assertEqual(largest[1]["line"], asm[3])
|
||||||
|
def test_generate_diff_insert(self):
|
||||||
|
global asm
|
||||||
|
asm = ['first line', 'second line', 'third line',
|
||||||
|
'INCBIN "baserom.gbc",$90,$200 - $90',
|
||||||
|
'fifth line', 'last line',
|
||||||
|
'INCBIN "baserom.gbc",$33F,$4000 - $33F']
|
||||||
|
diff = generate_diff_insert(0, "the real first line", debug=False)
|
||||||
|
self.assertIn("the real first line", diff)
|
||||||
|
self.assertIn("INCBIN", diff)
|
||||||
|
self.assertNotIn("No newline at end of file", diff)
|
||||||
|
self.assertIn("+"+asm[1], diff)
|
||||||
class TestMapParsing(unittest.TestCase):
|
class TestMapParsing(unittest.TestCase):
|
||||||
#def test_parse_warp_bytes(self):
|
#def test_parse_warp_bytes(self):
|
||||||
# pass #or raise NotImplementedError, bryan_message
|
# pass #or raise NotImplementedError, bryan_message
|
||||||
|
Loading…
Reference in New Issue
Block a user