mirror of
https://github.com/isledecomp/isle.git
synced 2025-10-23 08:24:16 +00:00
reccmp: Unique addresses and stub reporting (#554)
This commit is contained in:
82
tools/isledecomp/tests/test_compare_db.py
Normal file
82
tools/isledecomp/tests/test_compare_db.py
Normal file
@@ -0,0 +1,82 @@
|
||||
"""Testing compare database behavior, particularly matching"""
|
||||
import pytest
|
||||
from isledecomp.compare.db import CompareDb
|
||||
|
||||
|
||||
@pytest.fixture(name="db")
|
||||
def fixture_db():
|
||||
return CompareDb()
|
||||
|
||||
|
||||
def test_ignore_recomp_collision(db):
|
||||
"""Duplicate recomp addresses are ignored"""
|
||||
db.set_recomp_symbol(0x1234, None, "hello", None, 100)
|
||||
db.set_recomp_symbol(0x1234, None, "alias_for_hello", None, 100)
|
||||
syms = db.get_all()
|
||||
assert len(syms) == 1
|
||||
|
||||
|
||||
def test_orig_collision(db):
|
||||
"""Don't match if the original address is not unique"""
|
||||
db.set_recomp_symbol(0x1234, None, "hello", None, 100)
|
||||
assert db.match_function(0x5555, "hello") is True
|
||||
|
||||
# Second run on same address fails
|
||||
assert db.match_function(0x5555, "hello") is False
|
||||
|
||||
# Call set_pair directly without wrapper
|
||||
assert db.set_pair(0x5555, 0x1234) is False
|
||||
|
||||
|
||||
def test_name_match(db):
|
||||
db.set_recomp_symbol(0x1234, None, "hello", None, 100)
|
||||
assert db.match_function(0x5555, "hello") is True
|
||||
|
||||
match = db.get_by_orig(0x5555)
|
||||
assert match.name == "hello"
|
||||
assert match.recomp_addr == 0x1234
|
||||
|
||||
|
||||
def test_match_decorated(db):
|
||||
"""Should match using decorated name even though regular name is null"""
|
||||
db.set_recomp_symbol(0x1234, None, None, "?_hello", 100)
|
||||
assert db.match_function(0x5555, "?_hello") is True
|
||||
match = db.get_by_orig(0x5555)
|
||||
assert match is not None
|
||||
|
||||
|
||||
def test_duplicate_name(db):
|
||||
"""If recomp name is not unique, match only one row"""
|
||||
db.set_recomp_symbol(0x100, None, "_Construct", None, 100)
|
||||
db.set_recomp_symbol(0x200, None, "_Construct", None, 100)
|
||||
db.set_recomp_symbol(0x300, None, "_Construct", None, 100)
|
||||
db.match_function(0x5555, "_Construct")
|
||||
matches = db.get_matches()
|
||||
# We aren't testing _which_ one would be matched, just that only one _was_ matched
|
||||
assert len(matches) == 1
|
||||
|
||||
|
||||
def test_static_variable_match(db):
|
||||
"""Set up a situation where we can match a static function variable, then match it."""
|
||||
|
||||
# We need a matched function to start with.
|
||||
db.set_recomp_symbol(0x1234, None, "Isle::Tick", "?Tick@IsleApp@@QAEXH@Z", 100)
|
||||
db.match_function(0x5555, "Isle::Tick")
|
||||
|
||||
# Decorated variable name from PDB.
|
||||
db.set_recomp_symbol(
|
||||
0x2000, None, None, "?g_startupDelay@?1??Tick@IsleApp@@QAEXH@Z@4HA", 4
|
||||
)
|
||||
|
||||
# Provide variable name and orig function address from decomp markers
|
||||
assert db.match_static_variable(0xBEEF, "g_startupDelay", 0x5555) is True
|
||||
|
||||
|
||||
def test_match_options_bool(db):
|
||||
"""Test handling of boolean match options"""
|
||||
|
||||
# You don't actually need an existing orig addr for this.
|
||||
assert db.get_match_options(0x1234) == {}
|
||||
|
||||
db.mark_stub(0x1234)
|
||||
assert "stub" in db.get_match_options(0x1234)
|
Reference in New Issue
Block a user