shithub: pokecrystal

Download patch

ref: 8df5bd88562bf987269d3bf01847757b7adb619e
parent: 33d8c7a11711258843ab5abd6944453e44897b9c
author: Bryan Bishop <[email protected]>
date: Sat Mar 24 18:59:46 EDT 2012

more tests related to analyze_incbins

--- a/extras/crystal.py
+++ b/extras/crystal.py
@@ -1,7 +1,8 @@
 # -*- coding: utf-8 -*-
 #utilities to help disassemble pokémon crystal
 import sys, os, inspect, md5, json
-from copy import copy
+from copy import copy, deepcopy
+import subprocess
 
 #for IntervalMap
 from bisect import bisect_left, bisect_right
@@ -4422,7 +4423,7 @@
 
 def isolate_incbins():
     "find each incbin line"
-    global incbin_lines
+    global incbin_lines, asm
     incbin_lines = []
     for line in asm:
         if line == "": continue
@@ -4507,7 +4508,7 @@
             return incbin_key
     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.
     you can replace the middle one with the new content of length bytecount
@@ -4544,12 +4545,19 @@
     output += "INCBIN \"baserom.gbc\",$" + hex(third[0])[2:] + ",$" + hex(third[1])[2:] #no newline
     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)
     newfile = deepcopy(asm)
     newfile[line_number] = newline #possibly inserting multiple lines
     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"
     newfile_filename = "fjiqefo.temp"
 
@@ -4564,13 +4572,16 @@
     try:
         diffcontent = subprocess.check_output("diff -u ../main.asm " + newfile_filename, shell=True)
     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:
-        diffcontent = exc.output
+        raise exc
 
     os.system("rm " + original_filename)
     os.system("rm " + newfile_filename)
 
+    if debug: print diffcontent
     return diffcontent
 
 def apply_diff(diff, try_fixing=True, do_compile=True):
@@ -5017,6 +5028,9 @@
             self.assertGreaterEqual(address, 0x4000)
             self.failIf(0x4000 <= address <= 0x7FFF)
             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):
     def test_intervals(self):
         i = IntervalMap()
@@ -5235,6 +5249,51 @@
         self.assertTrue(processed_incbins == {})
         #reset the original functions
         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):
     #def test_parse_warp_bytes(self):
     #    pass #or raise NotImplementedError, bryan_message