Files
TransPyC/TransPyV/Test/App/opovl_test.py
2026-07-18 19:25:40 +08:00

254 lines
8.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import stdio
import stdlib
import t, c
import testcheck
# ============================================================
# 运算符重载测试
#
# 验证: 当 lhs 是结构体指针时,二元/比较运算触发 dunder 方法调用
# 支持: __add__/__sub__/__mul__/__div__/__mod__/__and__/__or__/__xor__
# __lshift__/__rshift__/__floordiv__ (BinOp)
# __eq__/__ne__/__lt__/__le__/__gt__/__ge__ (Compare)
#
# 三种测试场景:
# 1. Counter/BitBox: dunder 返回 t.CInt值类型变量触发重载
# 2. Vec2: dunder 返回 Vec2|t.CPtr堆分配结构体指针类型变量触发重载
# 3. 原生整数运算回退
# ============================================================
# ============================================================
# Counter: 演示 __add__/__mul__/__sub__ + 比较重载
# dunder 返回 t.CInt
# ============================================================
class Counter:
val: t.CInt
def __init__(self, v: t.CInt):
self.val = v
def __add__(self, n: t.CInt) -> t.CInt:
return self.val + n
def __sub__(self, n: t.CInt) -> t.CInt:
return self.val - n
def __mul__(self, n: t.CInt) -> t.CInt:
return self.val * n
def __div__(self, n: t.CInt) -> t.CInt:
return self.val / n
def __mod__(self, n: t.CInt) -> t.CInt:
return self.val % n
def __eq__(self, n: t.CInt) -> t.CInt:
if self.val == n:
return 1
return 0
def __ne__(self, n: t.CInt) -> t.CInt:
if self.val != n:
return 1
return 0
def __lt__(self, n: t.CInt) -> t.CInt:
if self.val < n:
return 1
return 0
def __le__(self, n: t.CInt) -> t.CInt:
if self.val <= n:
return 1
return 0
def __gt__(self, n: t.CInt) -> t.CInt:
if self.val > n:
return 1
return 0
def __ge__(self, n: t.CInt) -> t.CInt:
if self.val >= n:
return 1
return 0
# ============================================================
# BitBox: 演示位运算重载
# dunder 返回 t.CInt
# ============================================================
class BitBox:
flags: t.CInt
def __init__(self, v: t.CInt):
self.flags = v
def __and__(self, mask: t.CInt) -> t.CInt:
return self.flags & mask
def __or__(self, mask: t.CInt) -> t.CInt:
return self.flags | mask
def __xor__(self, mask: t.CInt) -> t.CInt:
return self.flags ^ mask
def __lshift__(self, n: t.CInt) -> t.CInt:
return self.flags << n
def __rshift__(self, n: t.CInt) -> t.CInt:
return self.flags >> n
# ============================================================
# Vec2: 演示结构体运算重载
#
# __new__ + stdlib.malloc 在堆上分配内存,使 Vec2|t.CPtr 变量
# 能正确工作dunder 方法返回堆上新对象)。
#
# __new__ 返回 malloc 的堆指针作为结构体存储空间,
# 后续 __init__ 在堆指针上初始化字段。
# ============================================================
class Vec2:
x: t.CInt
y: t.CInt
def __new__(self, x0: t.CInt, y0: t.CInt):
r: Vec2 | t.CPtr = stdlib.malloc(Vec2.__sizeof__())
return r
def __init__(self, x0: t.CInt, y0: t.CInt):
self.x = x0
self.y = y0
def __add__(self, other: Vec2 | t.CPtr) -> Vec2 | t.CPtr:
r: Vec2 | t.CPtr = Vec2(0, 0)
r.x = self.x + other.x
r.y = self.y + other.y
return r
def __sub__(self, other: Vec2 | t.CPtr) -> Vec2 | t.CPtr:
r: Vec2 | t.CPtr = Vec2(0, 0)
r.x = self.x - other.x
r.y = self.y - other.y
return r
def __eq__(self, other: Vec2 | t.CPtr) -> t.CInt:
if self.x == other.x:
if self.y == other.y:
return 1
return 0
def __ne__(self, other: Vec2 | t.CPtr) -> t.CInt:
if self.x != other.x:
return 1
if self.y != other.y:
return 1
return 0
# ============================================================
# 主测试入口
# ============================================================
def opovl_test() -> int:
testcheck.begin("Operator Overload Tests")
# ============================================================
# 测试 1: Counter + int 触发 __add__
# ============================================================
testcheck.section("Counter __add__")
cnt: Counter = Counter(10)
sum_val: int = cnt + 5
testcheck.check(sum_val == 15, "cnt(10)+5=15", "cnt+5 expected 15 got ??")
# ============================================================
# 测试 2: Counter - int / * int / / int / % int
# ============================================================
testcheck.section("Counter __sub__/__mul__/__div__/__mod__")
sub_val: int = cnt - 3
mul_val: int = cnt * 3
div_val: int = cnt / 3
mod_val: int = cnt % 3
testcheck.check(sub_val == 7, "cnt-3=7", "cnt-3 expected 7")
testcheck.check(mul_val == 30, "cnt*3=30", "cnt*3 expected 30")
testcheck.check(div_val == 3, "cnt/3=3", "cnt/3 expected 3")
testcheck.check(mod_val == 1, "cnt%3=1", "cnt%3 expected 1")
# ============================================================
# 测试 3: Counter 比较重载 (==, !=, <, <=, >, >=)
# ============================================================
testcheck.section("Counter compare overloads")
eq_10: int = cnt == 10
ne_10: int = cnt != 10
lt_20: int = cnt < 20
le_10: int = cnt <= 10
gt_5: int = cnt > 5
ge_10: int = cnt >= 10
testcheck.check(eq_10 == 1, "cnt==10:1", "cnt==10 expected 1")
testcheck.check(ne_10 == 0, "cnt!=10:0", "cnt!=10 expected 0")
testcheck.check(lt_20 == 1, "cnt<20:1", "cnt<20 expected 1")
testcheck.check(le_10 == 1, "cnt<=10:1", "cnt<=10 expected 1")
testcheck.check(gt_5 == 1, "cnt>5:1", "cnt>5 expected 1")
testcheck.check(ge_10 == 1, "cnt>=10:1", "cnt>=10 expected 1")
# ============================================================
# 测试 4: BitBox 位运算重载
# ============================================================
testcheck.section("BitBox bitwise overloads")
bb: BitBox = BitBox(0xFF)
and_val: int = bb & 0x0F
or_val: int = bb | 0x100
xor_val: int = bb ^ 0x55
lsh_val: int = bb << 4
rsh_val: int = bb >> 4
testcheck.check(and_val == 0x0F, "bb&0x0F=15", "bb&0x0F expected 15")
testcheck.check(or_val == 0x1FF, "bb|0x100=511", "bb|0x100 expected 511")
testcheck.check(xor_val == 0xAA, "bb^0x55=170", "bb^0x55 expected 170")
testcheck.check(lsh_val == 0xFF0, "bb<<4=4080", "bb<<4 expected 4080")
testcheck.check(rsh_val == 0x0F, "bb>>4=15", "bb>>4 expected 15")
# ============================================================
# 测试 5: 原生整数运算不受影响(回退路径)
# ============================================================
testcheck.section("Native int binop")
x: int = 7 + 8
y: int = 10 - 3
z: int = 4 * 5
testcheck.check(x == 15, "7+8=15", "7+8 expected 15")
testcheck.check(y == 7, "10-3=7", "10-3 expected 7")
testcheck.check(z == 20, "4*5=20", "4*5 expected 20")
# ============================================================
# 测试 6: 原生整数比较不受影响
# ============================================================
testcheck.section("Native int compare")
testcheck.check(3 < 5, "3<5", "3<5 broken")
testcheck.check(10 == 10, "10==10", "10==10 broken")
# ============================================================
# 测试 7: Vec2 结构体运算重载
# ============================================================
testcheck.section("Vec2 struct overloads")
a: Vec2 | t.CPtr = Vec2(3, 4)
b: Vec2 | t.CPtr = Vec2(1, 2)
c: Vec2 | t.CPtr = a + b
d: Vec2 | t.CPtr = a - b
testcheck.check(c.x == 4, "a+b x=4", "a+b x expected 4")
testcheck.check(c.y == 6, "a+b y=6", "a+b y expected 6")
testcheck.check(d.x == 2, "a-b x=2", "a-b x expected 2")
testcheck.check(d.y == 2, "a-b y=2", "a-b y expected 2")
# ============================================================
# 测试 8: Vec2 比较重载
# ============================================================
testcheck.section("Vec2 compare overloads")
p: Vec2 | t.CPtr = Vec2(5, 5)
q: Vec2 | t.CPtr = Vec2(5, 5)
eq_v: int = p == q
ne_v: int = p != q
testcheck.check(eq_v == 1, "(5,5)==(5,5):1", "p==q expected 1")
testcheck.check(ne_v == 0, "(5,5)!=(5,5):0", "p!=q expected 0")
return testcheck.end()