54 lines
No EOL
2.5 KiB
Python
54 lines
No EOL
2.5 KiB
Python
from __future__ import annotations
|
|
|
|
import unittest
|
|
|
|
from tools.poc_crusader_usecode_parser import render_structured_pseudocode
|
|
|
|
|
|
class UsecodeStructuringTests(unittest.TestCase):
|
|
def test_alarmbox_style_forward_flow_renders_without_block_labels(self) -> None:
|
|
blocks = [
|
|
("entry", ["set_info(0x0211, *(arg_06));", "process_exclude();", "if var goto block_0330;"]),
|
|
("block_026D", ["if !Intrinsic0000() goto block_02CB;"]),
|
|
("block_027C", ["if (Item.getFrame(arg_06) != 0) goto block_029B;"]),
|
|
("block_028B", ["goto block_02BA;"]),
|
|
("block_029B", ["if (Item.getFrame(arg_06) != 1) goto block_02BA;"]),
|
|
("block_02AA", ["goto block_02BA;"]),
|
|
("block_02BA", ["spawn class_0A0C_slot_3B(0x00000000);"]),
|
|
("block_02CB", ["a = Item.getStatus(arg_06);", "if ((a & 4) != 0) goto block_032D;"]),
|
|
("block_02E7", ["if (Item.getMapNum(arg_06) != 0) goto block_032D;"]),
|
|
("block_02F9", ["spawn class_0A18_slot_20(pid, 0, *(arg_06), arg_06);", "suspend;"]),
|
|
("block_032D", ["goto block_03C3;"]),
|
|
("block_0330", ["if Intrinsic0000() goto block_03C3;"]),
|
|
("block_033B", ["if (Item.getFrame(arg_06) != 2) goto block_035A;"]),
|
|
("block_034A", ["goto block_0379;"]),
|
|
("block_035A", ["if (Item.getFrame(arg_06) != 3) goto block_0379;"]),
|
|
("block_0369", ["goto block_0379;"]),
|
|
("block_0379", ["spawn class_0A0C_slot_3C(0x00000000);", "if (Item.getMapNum(arg_06) != 0) goto block_03C3;"]),
|
|
("block_039C", ["spawn class_0A18_slot_20(pid, 1, *(arg_06), arg_06);", "suspend;"]),
|
|
("block_03C3", ["return;"]),
|
|
]
|
|
|
|
rendered = render_structured_pseudocode(blocks)
|
|
|
|
self.assertIsNotNone(rendered)
|
|
text = "\n".join(rendered or [])
|
|
self.assertNotIn("block_027C:", text)
|
|
self.assertNotIn("goto block_03C3;", text)
|
|
self.assertIn("if (!var) {", text)
|
|
self.assertIn("if (Intrinsic0000()) {", text)
|
|
self.assertIn("if ((a & 4) == 0) {", text)
|
|
self.assertIn("if (!Intrinsic0000()) {", text)
|
|
|
|
def test_backward_jump_keeps_structured_renderer_disabled(self) -> None:
|
|
blocks = [
|
|
("entry", ["if flag goto block_0010;"]),
|
|
("block_0004", ["return;"]),
|
|
("block_0010", ["goto entry;"]),
|
|
]
|
|
|
|
self.assertIsNone(render_structured_pseudocode(blocks))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main() |