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

123 lines
4.4 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 stdio
import stdlib
import string
import testcheck
# 副作用函数:将 buf[0] 置为 1返回 True
def bump_true(buf: bytes) -> bool:
buf[0] = 1
return True
# 副作用函数:将 buf[0] 置为 1返回 False
def bump_false(buf: bytes) -> bool:
buf[0] = 1
return False
def main() -> CInt | CExport:
w32.win32console.SetConsoleCP(65001)
w32.win32console.SetConsoleOutputCP(65001)
testcheck.begin("if 短路机制测试")
buf: bytes = stdlib.malloc(1)
# === Test 1: False and bump_true() - bump 不应被调用 ===
testcheck.section("Test 1: False and bump_true()")
buf[0] = 0
r1: bool = False and bump_true(buf)
testcheck.check(buf[0] == 0, "and short-circuit OK (bump not called)", "and short-circuit FAILED (bump called)")
# === Test 2: True or bump_true() - bump 不应被调用 ===
testcheck.section("Test 2: True or bump_true()")
buf[0] = 0
r2: bool = True or bump_true(buf)
testcheck.check(buf[0] == 0, "or short-circuit OK (bump not called)", "or short-circuit FAILED (bump called)")
# === Test 3: True and bump_true() - bump 应被调用 ===
testcheck.section("Test 3: True and bump_true()")
buf[0] = 0
r3: bool = True and bump_true(buf)
testcheck.check(buf[0] == 1, "and eval OK (bump called)", "and eval FAILED (bump not called)")
# === Test 4: False or bump_true() - bump 应被调用 ===
testcheck.section("Test 4: False or bump_true()")
buf[0] = 0
r4: bool = False or bump_true(buf)
testcheck.check(buf[0] == 1, "or eval OK (bump called)", "or eval FAILED (bump not called)")
# === Test 5: if 语句中的短路 ===
testcheck.section("Test 5: if 语句中的短路")
buf[0] = 0
if False and bump_true(buf):
testcheck.check(False, "should not enter if", "if False and entered")
testcheck.check(buf[0] == 0, "if and short-circuit OK", "if and short-circuit FAILED")
buf[0] = 0
if True or bump_true(buf):
testcheck.check(True, "if True or entered OK", "if True or not entered")
else:
testcheck.check(False, "should enter if", "if True or else")
testcheck.check(buf[0] == 0, "if or short-circuit OK", "if or short-circuit FAILED")
# === Test 6: 嵌套短路 ===
testcheck.section("Test 6: 嵌套短路")
buf[0] = 0
r6: bool = False and (True or bump_true(buf))
testcheck.check(buf[0] == 0, "nested and short-circuit OK", "nested and short-circuit FAILED")
buf[0] = 0
r7: bool = True or (False and bump_true(buf))
testcheck.check(buf[0] == 0, "nested or short-circuit OK", "nested or short-circuit FAILED")
# === Test 7: not 与短路 ===
testcheck.section("Test 7: not 与短路")
buf[0] = 0
r8: bool = not False and bump_true(buf)
testcheck.check(buf[0] == 1, "not and eval OK (bump called)", "not and eval FAILED (bump not called)")
buf[0] = 0
r9: bool = not True or bump_true(buf)
testcheck.check(buf[0] == 1, "not or eval OK (bump called)", "not or eval FAILED (bump not called)")
# === Test 8: and 链中第一个为 False后续不评估 ===
testcheck.section("Test 8: and 链短路")
buf[0] = 0
r10: bool = False and bump_true(buf) and bump_true(buf)
testcheck.check(buf[0] == 0, "and chain short-circuit OK", "and chain short-circuit FAILED")
# === Test 9: or 链中第一个为 True后续不评估 ===
testcheck.section("Test 9: or 链短路")
buf[0] = 0
r11: bool = True or bump_true(buf) or bump_true(buf)
testcheck.check(buf[0] == 0, "or chain short-circuit OK", "or chain short-circuit FAILED")
# === Test 10: and 返回值正确性 ===
testcheck.section("Test 10: and 返回值正确性")
buf[0] = 0
r12: bool = True and bump_true(buf)
testcheck.check(r12, "and return True OK", "and return True FAILED")
buf[0] = 0
r13: bool = True and bump_false(buf)
testcheck.check(not r13, "and return False OK", "and return False FAILED")
# === Test 11: or 返回值正确性 ===
testcheck.section("Test 11: or 返回值正确性")
buf[0] = 0
r14: bool = False or bump_true(buf)
testcheck.check(r14, "or return True OK", "or return True FAILED")
buf[0] = 0
r15: bool = False or bump_false(buf)
testcheck.check(not r15, "or return False OK", "or return False FAILED")
stdlib.free(buf)
return testcheck.end()