Beispiel #1
0
def test_first_constraint():
    # v  U D
    # 0  0 0
    # 1  x 1
    # 2  1-2
    # 3  2 3
    # 4  3
    manager = ConstraintManager({RomVariant.USA, RomVariant.DEMO})
    constraint = Constraint()
    constraint.romA = RomVariant.USA
    constraint.addressA = 1
    constraint.romB = RomVariant.DEMO
    constraint.addressB = 2
    manager.add_constraint(constraint)
    manager.rebuild_relations()
    assert_same_address(manager, RomVariant.USA, 0)
    assert_same_address(manager, RomVariant.DEMO, 0)
    assert_same_address(manager, RomVariant.DEMO, 1)
    assert_same_address(manager, RomVariant.DEMO, 2)
    assert_same_address(manager, RomVariant.DEMO, 3)
    assert_same_address(manager, RomVariant.DEMO, 0xffffff)
    assert_differing_address(manager, RomVariant.USA, 1, 2)
    assert_differing_address(manager, RomVariant.USA, 2, 3)
    assert_differing_address(manager, RomVariant.USA, 0xffffff, 0xffffff + 1)
    print('---')
    assert -1 == manager.to_local(RomVariant.USA, 1)
Beispiel #2
0
def add_u_d_constraint(manager: ConstraintManager, usa_address: int,
                       demo_address: int):
    constraint = Constraint()
    constraint.romA = RomVariant.USA
    constraint.addressA = usa_address
    constraint.romB = RomVariant.DEMO
    constraint.addressB = demo_address
    manager.add_constraint(constraint)
Beispiel #3
0
def add_e_d_constraint(manager: ConstraintManager, eu_address: int,
                       demo_address: int):
    constraint = Constraint()
    constraint.romA = RomVariant.EU
    constraint.addressA = eu_address
    constraint.romB = RomVariant.DEMO
    constraint.addressB = demo_address
    manager.add_constraint(constraint)
Beispiel #4
0
def add_u_e_constraint(manager: ConstraintManager, usa_address: int,
                       eu_address: int):
    constraint = Constraint()
    constraint.romA = RomVariant.USA
    constraint.addressA = usa_address
    constraint.romB = RomVariant.EU
    constraint.addressB = eu_address
    manager.add_constraint(constraint)
Beispiel #5
0
def add_u_j_constraint(manager: ConstraintManager, usa_address: int,
                       jp_address: int):
    constraint = Constraint()
    constraint.romA = RomVariant.USA
    constraint.addressA = usa_address
    constraint.romB = RomVariant.JP
    constraint.addressB = jp_address
    manager.add_constraint(constraint)
Beispiel #6
0
def add_j_e_constraint(manager: ConstraintManager, jp_address: int,
                       eu_address: int):
    constraint = Constraint()
    constraint.romA = RomVariant.JP
    constraint.addressA = jp_address
    constraint.romB = RomVariant.EU
    constraint.addressB = eu_address
    manager.add_constraint(constraint)
Beispiel #7
0
def add_j_d_constraint(manager: ConstraintManager, jp_address: int,
                       demo_address: int):
    constraint = Constraint()
    constraint.romA = RomVariant.JP
    constraint.addressA = jp_address
    constraint.romB = RomVariant.DEMO
    constraint.addressB = demo_address
    manager.add_constraint(constraint)
Beispiel #8
0
def test_many_small_differences():
    #  v  U  J  E  D
    #  0  0  0  0  0
    #  1  1  x
    #  2  2  x
    #  3  3--1     3
    #  4  4  2     x
    #  5  5  3  5--4-
    #  6  x  x  6
    #  7  x  4--7
    #  8  x  5  8
    #  9  6--6  x  8
    # 10  x  7  x  x
    # 11  7--8--9--9  # constraints from J to all
    # 12  8  9  x 10
    # 13  9 10 10-11
    # 14  x 11-11 x
    # 15 10-12 12 x
    # 16 11 13 13-12
    manager = ConstraintManager(
        {RomVariant.USA, RomVariant.JP, RomVariant.EU, RomVariant.DEMO})
    add_u_d_constraint(manager, 5, 4)
    add_u_j_constraint(manager, 10, 12)
    add_u_j_constraint(manager, 3, 1)
    manager.add_constraint(Constraint(RomVariant.JP, 8, RomVariant.DEMO, 9))
    add_j_e_constraint(manager, 4, 7)
    add_u_j_constraint(manager, 6, 6)
    add_j_e_constraint(manager, 8, 9)
    add_j_e_constraint(manager, 11, 11)
    add_e_d_constraint(manager, 13, 12)
    add_e_d_constraint(manager, 5, 4)
    add_u_j_constraint(manager, 7, 8)
    add_e_d_constraint(manager, 10, 11)
    manager.rebuild_relations()
    manager.print_relations()
    assert_u_j_e_d_address(manager, 0, 0, 0, 0, 0)
    assert_u_j_e_d_address(manager, 1, 1, -1, 1, 1)
    assert_u_j_e_d_address(manager, 2, 2, -1, 2, 2)
    assert_u_j_e_d_address(manager, 3, 3, 1, 3, 3)
    assert_u_j_e_d_address(manager, 4, 4, 2, 4, -1)
    assert_u_j_e_d_address(manager, 5, 5, 3, 5, 4)
    assert_u_j_e_d_address(manager, 6, -1, -1, 6, 5)
    assert_u_j_e_d_address(manager, 7, -1, 4, 7, 6)
    assert_u_j_e_d_address(manager, 8, -1, 5, 8, 7)
    assert_u_j_e_d_address(manager, 9, 6, 6, -1, 8)
    assert_u_j_e_d_address(manager, 10, -1, 7, -1, -1)
    assert_u_j_e_d_address(manager, 11, 7, 8, 9, 9)
    assert_u_j_e_d_address(manager, 12, 8, 9, -1, 10)
    assert_u_j_e_d_address(manager, 13, 9, 10, 10, 11)
    assert_u_j_e_d_address(manager, 14, -1, 11, 11, -1)
    assert_u_j_e_d_address(manager, 15, 10, 12, 12, -1)
    assert_u_j_e_d_address(manager, 16, 11, 13, 13, 12)
Beispiel #9
0
    def add_new_constraint(self, constraint: Constraint) -> None:
        # Check that constraint is valid
        constraint_manager = ConstraintManager({RomVariant.USA, RomVariant.DEMO, RomVariant.EU, RomVariant.JP, RomVariant.DEMO_JP, RomVariant.CUSTOM, RomVariant.CUSTOM_EU, RomVariant.CUSTOM_JP, RomVariant.CUSTOM_DEMO_USA, RomVariant.CUSTOM_DEMO_JP})
        constraint_manager.add_all_constraints(
            get_constraint_database().get_constraints())
        try:
            constraint_manager.add_constraint(constraint)
            constraint_manager.rebuild_relations()
        except InvalidConstraintError as e:
            QMessageBox.critical(self.parent(), 'Add constraint', 'Invalid Constraint')
            return

        get_constraint_database().add_constraint(constraint)
Beispiel #10
0
def test_longer_constraint():
    # v   E   J
    # 0   0   0
    # 1   x   1
    # ... ... ...
    # 100 1---100
    # 101 2   101
    manager = ConstraintManager({RomVariant.EU, RomVariant.JP})
    constraint = Constraint()
    constraint.romA = RomVariant.JP
    constraint.addressA = 100
    constraint.romB = RomVariant.EU
    constraint.addressB = 1
    manager.add_constraint(constraint)
    manager.rebuild_relations()
    assert_same_address(manager, RomVariant.EU, 0)
    assert_same_address(manager, RomVariant.JP, 0)
    assert_same_address(manager, RomVariant.JP, 100)
    assert_same_address(manager, RomVariant.JP, 5000)
    assert -1 == manager.to_local(RomVariant.EU, 1)
    assert_differing_address(manager, RomVariant.EU, 1, 100)
    assert_differing_address(manager, RomVariant.EU, 100, 199)
Beispiel #11
0
    def process(self) -> None:
        print('Start processing')

        progress = 0

        # Test using a constraint manager with all variations
        manager = ConstraintManager({
            RomVariant.USA, RomVariant.JP, RomVariant.EU, RomVariant.DEMO,
            RomVariant.DEMO_JP
        })
        constraint_database = get_constraint_database()
        constraints = constraint_database.get_constraints()

        i = 0
        count = len(constraints)

        for constraint in constraints:
            if not constraint.enabled:
                i = i + 1
                continue

            # test if constraint is redundant
            va_a = manager.to_virtual(constraint.romA, constraint.addressA)
            va_b = manager.to_virtual(constraint.romB, constraint.addressB)
            if va_a == va_b:
                print(f'Disable {constraint}')
                constraint.enabled = False
            else:
                #print(f'Keep {constraint}')
                manager.add_constraint(constraint)
                try:
                    manager.rebuild_relations()
                except InvalidConstraintError as e:
                    print(e)
                    print(constraint)
                    self.signal_fail.emit()
                    return

            i = i + 1
            new_progress = (i * 50) // count
            if new_progress != progress:
                progress = new_progress
                self.signal_progress.emit(new_progress)

        self.signal_progress.emit(50)

        i = 0
        # Test that there are no disabled constraints that are still needed
        for constraint in constraints:
            if constraint.enabled:
                i = i + 1
                continue

            # test if constraint is redundant
            va_a = manager.to_virtual(constraint.romA, constraint.addressA)
            va_b = manager.to_virtual(constraint.romB, constraint.addressB)
            if va_a != va_b:
                print(f'Need to reenable {constraint}')
                constraint.enabled = True
                manager.add_constraint(constraint)
                try:
                    manager.rebuild_relations()
                except InvalidConstraintError as e:
                    print(e)
                    print(constraint)
                    self.signal_fail.emit()
                    return

            i = i + 1
            new_progress = (i * 50) // count + 50
            if new_progress != progress:
                progress = new_progress
                self.signal_progress.emit(new_progress)

        constraint_database._write_constraints(
        )  # TODO add a public method to update changed constraints in the database?
        constraint_database.constraints_changed.emit()

        self.signal_done.emit()