import stdio
import t, c


# ============================================================
# 场景 A: @t.NoVTable 类 + 函数级 @t.CVTable
#
# NoVTableClass 标记 @t.NoVTable（类级别禁用虚表）
# 但 VirtualMethod 标记 @t.CVTable → 该方法单独进入虚表
# NormalMethod 无装饰器 → 不进入虚表
# 预期: 虚表 1 个方法 (VirtualMethod)
# ============================================================
@t.NoVTable
class NoVTableClass:
    val: t.CInt

    def __init__(self, v: t.CInt):
        self.val = v

    @t.CVTable
    def VirtualMethod(self) -> t.CInt:
        return self.val + 10

    def NormalMethod(self) -> t.CInt:
        return self.val + 20


# ============================================================
# 场景 B: @t.CVTable 类 + 函数级 @t.NoVTable
#
# CVTableClass 标记 @t.CVTable（所有方法进入虚表）
# KeptMethod 无装饰器 → 进入虚表
# ExcludedMethod 标记 @t.NoVTable → 排除出虚表
# 预期: 虚表 1 个方法 (KeptMethod)
# ============================================================
@t.CVTable
class CVTableClass:
    val: t.CInt

    def __init__(self, v: t.CInt):
        self.val = v

    def KeptMethod(self) -> t.CInt:
        return self.val + 30

    @t.NoVTable
    def ExcludedMethod(self) -> t.CInt:
        return self.val + 40


# ============================================================
# 场景 C: 默认类（无装饰器无继承）+ 函数级 @t.CVTable
#
# DefaultClass 无装饰器（默认无虚表）
# VirtualMethod 标记 @t.CVTable → 单独进入虚表
# NormalMethod 无装饰器 → 不进入虚表
# 预期: 虚表 1 个方法 (VirtualMethod)
# ============================================================
class DefaultClass:
    val: t.CInt

    def __init__(self, v: t.CInt):
        self.val = v

    @t.CVTable
    def VirtualMethod(self) -> t.CInt:
        return self.val + 50

    def NormalMethod(self) -> t.CInt:
        return self.val + 60


def func_vtable_test() -> int:
    stdio.printf("funcvt: === Test Start ===\n")

    # 场景 A: NoVTableClass
    nvt: NoVTableClass = NoVTableClass(5)
    a1: int = nvt.VirtualMethod()
    stdio.printf("funcvt: A.VirtualMethod()=%d (expected 15)\n", a1)
    if a1 != 15:
        stdio.printf("[FAIL] A.VirtualMethod()=%d expected 15\n", a1)
        return 1
    a2: int = nvt.NormalMethod()
    stdio.printf("funcvt: A.NormalMethod()=%d (expected 25)\n", a2)
    if a2 != 25:
        stdio.printf("[FAIL] A.NormalMethod()=%d expected 25\n", a2)
        return 1

    # 场景 B: CVTableClass
    cvt: CVTableClass = CVTableClass(7)
    b1: int = cvt.KeptMethod()
    stdio.printf("funcvt: B.KeptMethod()=%d (expected 37)\n", b1)
    if b1 != 37:
        stdio.printf("[FAIL] B.KeptMethod()=%d expected 37\n", b1)
        return 1
    b2: int = cvt.ExcludedMethod()
    stdio.printf("funcvt: B.ExcludedMethod()=%d (expected 47)\n", b2)
    if b2 != 47:
        stdio.printf("[FAIL] B.ExcludedMethod()=%d expected 47\n", b2)
        return 1

    # 场景 C: DefaultClass
    dfc: DefaultClass = DefaultClass(9)
    c1: int = dfc.VirtualMethod()
    stdio.printf("funcvt: C.VirtualMethod()=%d (expected 59)\n", c1)
    if c1 != 59:
        stdio.printf("[FAIL] C.VirtualMethod()=%d expected 59\n", c1)
        return 1
    c2: int = dfc.NormalMethod()
    stdio.printf("funcvt: C.NormalMethod()=%d (expected 69)\n", c2)
    if c2 != 69:
        stdio.printf("[FAIL] C.NormalMethod()=%d expected 69\n", c2)
        return 1

    stdio.printf("funcvt: === All Tests Passed ===\n")
    return 0
