import string import testcheck # ============================================================ # NoVTable multiple inheritance: a sibling-mixin self.helper() call (BaseB # calling helper defined in BaseA) must resolve the symbol to BaseA/Combined. # ============================================================ novirtual class BaseA: a: int def helper(self) -> int: return self.a novirtual class BaseB: b: int def caller(self) -> int: return self.helper() novirtual class Combined(BaseA, BaseB): pass def test_cross_mixin_call(): testcheck.section("Test 1: cross-mixin self. call") c: Combined = Combined() c.a = 42 c.b = 7 testcheck.check(c.caller() == 42, "caller()==42 (BaseB->BaseA)", "cross-mixin call fail") # ============================================================ # Test 2: multilevel mixin chain (parent inheritance + sibling) with field # writes, exercising this_adjust across sibling and parent field regions. # ============================================================ novirtual class MixinA2: a2: int def inner2(self) -> int: self.a2 = self.a2 + 10 return self.a2 novirtual class MixinB2(MixinA2): b2: int def mid2(self) -> int: return self.inner2() + self.b2 novirtual class MixinC2: c2: int def outer2(self) -> int: return self.mid2() + self.c2 novirtual class Combined2(MixinB2, MixinC2): pass def test_multilevel_chain(): testcheck.section("Test 2: multilevel mixin chain + field write") c: Combined2 = Combined2() c.a2 = 1 c.b2 = 2 c.c2 = 3 # outer2 -> mid2 -> inner2: inner2 writes a2 (1->11), mid2=13, outer2=16 testcheck.check(c.outer2() == 16, "outer2()==16 (C->B->A chain + field write)", "multilevel chain fail") # ============================================================ # Test 3: second-parent field offset (nonzero this_adjust) plus a pointer # field; self.val must adjust into DataMixin's field region. # ============================================================ novirtual class PtrMixin: name: char* def get_name(self) -> char*: return self.name novirtual class DataMixin: val: int def get_val(self) -> int: return self.val novirtual class Combined3(PtrMixin, DataMixin): pass def test_second_parent_offset(): testcheck.section("Test 3: second-parent field offset (this_adjust != 0)") c: Combined3 = Combined3() c.name = "hello" c.val = 99 testcheck.check(string.strcmp(c.get_name(), "hello") == 0, "get_name()==hello (first parent)", "first parent fail") testcheck.check(c.get_val() == 99, "get_val()==99 (second parent field offset)", "second parent this_adjust fail") def main() -> int: testcheck.begin("NoVTableCrossMixinTest") test_cross_mixin_call() test_multilevel_chain() test_second_parent_offset() return testcheck.end()