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

309 lines
12 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.
from stdint import *
import w32.win32console
import t, c
from t import CInt, CExport
import _fakeduck
import stdio
import stdlib
import string
import memhub
import testcheck
import _withcontent
def main() -> CInt | CExport:
w32.win32console.SetConsoleCP(65001)
w32.win32console.SetConsoleOutputCP(65001)
# FakeDuck 测试: str 类型调用扩展方法 b()
a: str = "Hello"
# Type 通用基类测试: str 变量调用 Type 的方法 type_id()
tid: CInt = a.type_id()
if tid == 99:
stdio.printf("Type OK: a.type_id() = %d\n", tid)
else:
stdio.printf("Type FAIL: a.type_id() = %d\n", tid)
# 直接字段访问测试: 读取 a.__data__ (应等于 a 本身)
data_ptr: str = a.__data__
stdio.printf("a.__data__ = %s\n", data_ptr)
# upper() 测试: 通过 mbuddy 分配内存,返回大写字符串
arena: bytes = stdlib.malloc(65536)
bd: memhub.MemBuddy | t.CPtr = memhub.MemBuddy(arena, 65536)
# 直接字段赋值: a.__mbuddy__ = bd (语法糖, 等价于 a.set_mbuddy(bd))
a.__mbuddy__ = bd
upper_str: str = a.upper()
stdio.printf("upper('Hello') = %s\n", upper_str)
# 验证 per-instance 不污染: b 没有设置 __mbuddy__ (初始为 NULL)
b: str = "World"
# 直接字段读取: b.__mbuddy__ (应返回 NULL)
b_buddy: memhub.MemBuddy | t.CPtr = b.__mbuddy__
if t.CInt(b_buddy) == 0:
stdio.printf("mbuddy OK: b.__mbuddy__ is NULL (no pollution)\n")
else:
stdio.printf("mbuddy FAIL: b.__mbuddy__ polluted!\n")
# b 也设置 mbuddy 并 upper
b.__mbuddy__ = bd
upper_b: str = b.upper()
stdio.printf("upper('World') = %s\n", upper_b)
# lower() 测试
lower_str: str = a.lower()
stdio.printf("lower('Hello') = %s\n", lower_str)
# capitalize() 测试
cap_str: str = a.capitalize()
stdio.printf("capitalize('Hello') = %s\n", cap_str)
# swapcase() 测试
swap_str: str = a.swapcase()
stdio.printf("swapcase('Hello') = %s\n", swap_str)
# casefold() 测试
cf_str: str = a.casefold()
stdio.printf("casefold('Hello') = %s\n", cf_str)
# title() 测试
t_str: str = "hello world"
t_str.__mbuddy__ = bd
title_result: str = t_str.title()
stdio.printf("title('hello world') = %s\n", title_result)
# 布尔判断函数测试 (不需要 __mbuddy__)
u: str = "HELLO"
lo: str = "hello"
dig: str = "12345"
alnum_s: str = "Hello123"
space_s: str = " "
title_s: str = "Hello World"
punct_s: str = "Hello!"
stdio.printf("isupper('HELLO') = %d\n", u.isupper())
stdio.printf("isupper('Hello') = %d\n", a.isupper())
stdio.printf("islower('hello') = %d\n", lo.islower())
stdio.printf("islower('Hello') = %d\n", a.islower())
stdio.printf("isalpha('Hello') = %d\n", a.isalpha())
stdio.printf("isalpha('Hello123') = %d\n", alnum_s.isalpha())
stdio.printf("isdigit('12345') = %d\n", dig.isdigit())
stdio.printf("isdigit('Hello') = %d\n", a.isdigit())
stdio.printf("isalnum('Hello123') = %d\n", alnum_s.isalnum())
stdio.printf("isalnum('Hello!') = %d\n", punct_s.isalnum())
stdio.printf("isspace(' ') = %d\n", space_s.isspace())
stdio.printf("isspace('Hello') = %d\n", a.isspace())
stdio.printf("isascii('Hello') = %d\n", a.isascii())
stdio.printf("istitle('Hello World') = %d\n", title_s.istitle())
stdio.printf("istitle('hello world') = %d\n", t_str.istitle())
# === split() 测试 ===
testcheck.begin("FakeDuck split() 测试")
# Test 1: 基本分割
testcheck.section("Test 1: 基本分割 'a,b,c'")
s1: str = "a,b,c"
s1.__mbuddy__ = bd
parts = s1.split(',')
n1: t.CSizeT = parts.__len__()
stdio.printf("split('a,b,c', ',') len=%lu\n", n1)
testcheck.check(n1 == 3, "split len OK (3)", "split len FAILED expect 3")
p0: str = parts[0]
p1: str = parts[1]
p2: str = parts[2]
stdio.printf("parts[0]='%s' [1]='%s' [2]='%s'\n", p0, p1, p2)
testcheck.check(p0 == "a", "split[0]=='a' OK", "split[0] FAILED")
testcheck.check(p1 == "b", "split[1]=='b' OK", "split[1] FAILED")
testcheck.check(p2 == "c", "split[2]=='c' OK", "split[2] FAILED")
# Test 2: 空字符串分割
testcheck.section("Test 2: 无分隔符 'hello'")
s2: str = "hello"
s2.__mbuddy__ = bd
parts2 = s2.split(',')
n2: t.CSizeT = parts2.__len__()
stdio.printf("split('hello', ',') len=%lu\n", n2)
testcheck.check(n2 == 1, "no-delim len OK (1)", "no-delim len FAILED expect 1")
h0: str = parts2.get(0)
testcheck.check(h0 == "hello", "no-delim[0]=='hello' OK", "no-delim[0] FAILED")
# Test 3: 连续分隔符
testcheck.section("Test 3: 连续分隔符 'a,,b'")
s3: str = "a,,b"
s3.__mbuddy__ = bd
parts3 = s3.split(',')
n3: t.CSizeT = parts3.__len__()
stdio.printf("split('a,,b', ',') len=%lu\n", n3)
testcheck.check(n3 == 3, "consecutive len OK (3)", "consecutive len FAILED expect 3")
e0: str = parts3.get(0)
e1: str = parts3.get(1)
e2: str = parts3.get(2)
stdio.printf("parts[0]='%s' [1]='%s' [2]='%s'\n", e0, e1, e2)
testcheck.check(e0 == "a", "consec[0]=='a' OK", "consec[0] FAILED")
testcheck.check(e1 == "", "consec[1]=='' OK", "consec[1] FAILED")
testcheck.check(e2 == "b", "consec[2]=='b' OK", "consec[2] FAILED")
# Test 4: 空字符串
testcheck.section("Test 4: 空字符串 ''")
s4: str = ""
s4.__mbuddy__ = bd
parts4 = s4.split(',')
n4: t.CSizeT = parts4.__len__()
stdio.printf("split('', ',') len=%lu\n", n4)
testcheck.check(n4 == 1, "empty len OK (1)", "empty len FAILED expect 1")
# Test 5: 空格分割句子
testcheck.section("Test 5: 空格分割 'hello world foo'")
s5: str = "hello world foo"
s5.__mbuddy__ = bd
parts5 = s5.split(' ')
n5: t.CSizeT = parts5.__len__()
stdio.printf("split('hello world foo', ' ') len=%lu\n", n5)
testcheck.check(n5 == 3, "space len OK (3)", "space len FAILED expect 3")
w0: str = parts5[0]
w1: str = parts5[1]
w2: str = parts5[2]
stdio.printf("words[0]='%s' [1]='%s' [2]='%s'\n", w0, w1, w2)
testcheck.check(w0 == "hello", "space[0]=='hello' OK", "space[0] FAILED")
testcheck.check(w1 == "world", "space[1]=='world' OK", "space[1] FAILED")
testcheck.check(w2 == "foo", "space[2]=='foo' OK", "space[2] FAILED")
# Test 6: 多字符分隔符 '::'
testcheck.section("Test 6: 多字符分隔符 '::' on 'a::b::c'")
s6: str = "a::b::c"
s6.__mbuddy__ = bd
parts6 = s6.split("::")
n6: t.CSizeT = parts6.__len__()
stdio.printf("split('a::b::c', '::') len=%lu\n", n6)
testcheck.check(n6 == 3, "multi-colon len OK (3)", "multi-colon len FAILED expect 3")
m0: str = parts6[0]
m1: str = parts6[1]
m2: str = parts6[2]
stdio.printf("parts[0]='%s' [1]='%s' [2]='%s'\n", m0, m1, m2)
testcheck.check(m0 == "a", "multi-colon[0]=='a' OK", "multi-colon[0] FAILED")
testcheck.check(m1 == "b", "multi-colon[1]=='b' OK", "multi-colon[1] FAILED")
testcheck.check(m2 == "c", "multi-colon[2]=='c' OK", "multi-colon[2] FAILED")
# Test 7: 多字符分隔符 ', ' (逗号+空格)
testcheck.section("Test 7: 多字符分隔符 ', ' on 'hello, world, foo'")
s7: str = "hello, world, foo"
s7.__mbuddy__ = bd
parts7 = s7.split(", ")
n7: t.CSizeT = parts7.__len__()
stdio.printf("split('hello, world, foo', ', ') len=%lu\n", n7)
testcheck.check(n7 == 3, "comma-space len OK (3)", "comma-space len FAILED expect 3")
cs0: str = parts7[0]
cs1: str = parts7[1]
cs2: str = parts7[2]
stdio.printf("parts[0]='%s' [1]='%s' [2]='%s'\n", cs0, cs1, cs2)
testcheck.check(cs0 == "hello", "comma-space[0]=='hello' OK", "comma-space[0] FAILED")
testcheck.check(cs1 == "world", "comma-space[1]=='world' OK", "comma-space[1] FAILED")
testcheck.check(cs2 == "foo", "comma-space[2]=='foo' OK", "comma-space[2] FAILED")
# Test 8: 多字符分隔符在首尾
testcheck.section("Test 8: 多字符分隔符首尾 '::a::b::'")
s8: str = "::a::b::"
s8.__mbuddy__ = bd
parts8 = s8.split("::")
n8: t.CSizeT = parts8.__len__()
stdio.printf("split('::a::b::', '::') len=%lu\n", n8)
testcheck.check(n8 == 4, "edge len OK (4)", "edge len FAILED expect 4")
ed0: str = parts8[0]
ed1: str = parts8[1]
ed2: str = parts8[2]
ed3: str = parts8[3]
stdio.printf("parts[0]='%s' [1]='%s' [2]='%s' [3]='%s'\n", ed0, ed1, ed2, ed3)
testcheck.check(ed0 == "", "edge[0]=='' OK", "edge[0] FAILED")
testcheck.check(ed1 == "a", "edge[1]=='a' OK", "edge[1] FAILED")
testcheck.check(ed2 == "b", "edge[2]=='b' OK", "edge[2] FAILED")
testcheck.check(ed3 == "", "edge[3]=='' OK", "edge[3] FAILED")
# === with 上下文自动注入测试 ===
testcheck.section("Test 9: with 上下文自动注入 __mbuddy__")
arena2: bytes = stdlib.malloc(65536)
with memhub.MemBuddy(arena2, 65536) as bd2:
# str 变量在 with 上下文内创建__mbuddy__ 应自动注入(无需手动赋值)
w_str: str = "WithTest"
# 验证 __mbuddy__ 已自动注入(非 NULL
w_buddy: memhub.MemBuddy | t.CPtr = w_str.__mbuddy__
testcheck.check(t.CInt(w_buddy) != 0, "with inject OK: __mbuddy__ auto-injected", "with inject FAIL: __mbuddy__ is NULL")
# upper() 不需要手动设置 __mbuddy__
w_upper: str = w_str.upper()
stdio.printf("with upper('WithTest') = %s\n", w_upper)
testcheck.check(w_upper == "WITHTEST", "with upper OK", "with upper FAILED")
# lower() 不需要手动设置 __mbuddy__
w_lower: str = w_str.lower()
stdio.printf("with lower('WithTest') = %s\n", w_lower)
testcheck.check(w_lower == "withtest", "with lower OK", "with lower FAILED")
# split() 不需要手动设置 __mbuddy__
w_split_str: str = "x,y,z"
w_parts = w_split_str.split(',')
w_n: t.CSizeT = len(w_parts)
stdio.printf("with split('x,y,z') len=%lu\n", w_n)
testcheck.check(w_n == 3, "with split len OK (3)", "with split len FAILED")
# 验证多个 str 变量都获得注入
w_str2: str = "Multiple"
w_buddy2: memhub.MemBuddy | t.CPtr = w_str2.__mbuddy__
testcheck.check(t.CInt(w_buddy2) != 0, "with multi inject OK", "with multi inject FAIL")
test_s: str = "www.gvsds.com"
list_s: list[str] = test_s.split('.')
# 迭代器测试: for idx, i in zip(range(len(list_s)), list_s)
iter_count: int = 0
for iter_idx, i in zip(range(len(list_s)), list_s):
stdio.printf("list_s[%d]='%s'\n", iter_idx, i)
iter_count += 1
testcheck.check(iter_count == 3, "zip(range(len), list) iter OK (3)", "zip(range(len), list) iter FAILED")
#for i in range(3):
# stdio.printf("list_s[%d]='%s'\n", i, list_s[i])
# === zip() 内置测试 ===
testcheck.section("Test 10: zip(list, list) 元组解包")
za: str = "a,b,c"
zb: str = "1,2,3"
list_a: list[str] = za.split(',')
list_b: list[str] = zb.split(',')
zip_idx: int = 0
for ca, cb in zip(list_a, list_b):
stdio.printf("zip[%d]: '%s'='%s'\n", zip_idx, ca, cb)
zip_idx += 1
testcheck.check(zip_idx == 3, "zip list+list OK (3)", "zip list+list FAILED")
testcheck.section("Test 11: zip(range, list) 混合迭代")
zip_idx2: int = 0
for n, s in zip(range(3), list_a):
stdio.printf("zip range+list[%d]: %d='%s'\n", zip_idx2, n, s)
zip_idx2 += 1
testcheck.check(zip_idx2 == 3, "zip range+list OK (3)", "zip range+list FAILED")
testcheck.section("Test 12: zip(str, str) 字符级并行")
sa: str = "abc"
sb: str = "123"
zip_idx3: int = 0
for ch_a, ch_b in zip(sa, sb):
stdio.printf("zip str+str[%d]: '%c'%c\n", zip_idx3, ch_a, ch_b)
zip_idx3 += 1
testcheck.check(zip_idx3 == 3, "zip str+str OK (3)", "zip str+str FAILED")
stdio.printf("%d\n", " ".isspace())
stdlib.free(arena2)
stdlib.free(arena)
return testcheck.end()