import t
import stdio
import testcheck
from linkedlist import GSListNode

# ============================================================
# G3: 测试 F-bounded polymorphism
# class Node(GSListNode[Node]) — 继承泛型基类，特化自身为类型参数
# 这与 TransPyV 中 class Value(GSListNode[Value]) 是相同的模式
# ============================================================

@t.NoVTable
class Node(GSListNode[Node]):
    value: t.CInt

    def __init__(self):
        self.value = 0
        self.Next = None


def test_node_create():
    testcheck.section("Test 1: Node(GSListNode[Node]) create")
    n: Node = Node()
    n.value = 42
    testcheck.check(n.value == 42, "Node.value = 42", "expect 42")


def test_node_next_field():
    testcheck.section("Test 2: Next field from GSListNode[Node]")
    n1: Node = Node()
    n2: Node = Node()
    n1.value = 10
    n2.value = 20
    n1.Next = n2
    next_node: Node = n1.Next
    v: t.CInt = next_node.value
    testcheck.check(v == 20, "n1.Next.value = 20", "expect 20")


def test_node_chain():
    testcheck.section("Test 3: Node chain traversal")
    a: Node = Node()
    b: Node = Node()
    c: Node = Node()
    a.value = 1
    b.value = 2
    c.value = 3
    a.Next = b
    b.Next = c
    sum: t.CInt = a.value
    p: Node = a.Next
    sum = sum + p.value
    p = p.Next
    sum = sum + p.value
    testcheck.check(sum == 6, "chain sum = 1+2+3 = 6", "expect 6")


def main() -> t.CInt:
    testcheck.begin("G3: GSListNode inheritance (F-bounded polymorphism)")
    test_node_create()
    test_node_next_field()
    test_node_chain()
    return testcheck.end()
