From c4a13644b14e6b2a0ab9953c87c8c4e613c4a9da Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Thu, 8 Oct 2026 22:26:26 +0800 Subject: [PATCH] =?UTF-8?q?test(lifetime):=20NewLifetimeTest=20=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E6=97=B6=E6=89=93=E5=8D=B0=E5=85=B7=E4=BD=93=20case?= =?UTF-8?q?=20=E5=90=8D=E4=B8=8E=E8=BF=94=E5=9B=9E=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原来只打印失败总数(FAILED, N case(s) wrong),无法定位是哪条挂了;改为逐 case Check() 并在 dtor_hits 不符时打印实际值。 --- NewLifetimeTest/App/main.vp | 42 ++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/NewLifetimeTest/App/main.vp b/NewLifetimeTest/App/main.vp index f1e0f0f..d46625b 100644 --- a/NewLifetimeTest/App/main.vp +++ b/NewLifetimeTest/App/main.vp @@ -171,32 +171,44 @@ def CaseRaiseCaught() -> int: return 0 +# 失败可诊断:每个 case 失败时打印名字与返回码(否则只有一个总数,无法定位是哪条挂了) +def Check(name: str, rc: int, fails: int) -> int: + if rc != 0: + stdio.printf(" FAIL %s: rc=%d\n", name, rc) + return fails + 1 + return fails + + export def main() -> int: w32.win32console.SetConsoleCP(65001) w32.win32console.SetConsoleOutputCP(65001) fails: int = 0 - fails += CaseBasic() - fails += CaseLoop(200) - fails += CaseAlias() - fails += CaseNestedDef() - fails += CaseEarlyReturn(1) - fails += CaseEarlyReturn(0) - fails += CaseBranchOnly(0) - fails += CaseBranchOnly(1) - fails += CaseStack() + fails = Check("CaseBasic", CaseBasic(), fails) + fails = Check("CaseLoop", CaseLoop(200), fails) + fails = Check("CaseAlias", CaseAlias(), fails) + fails = Check("CaseNestedDef", CaseNestedDef(), fails) + fails = Check("CaseEarlyReturn(1)", CaseEarlyReturn(1), fails) + fails = Check("CaseEarlyReturn(0)", CaseEarlyReturn(0), fails) + fails = Check("CaseBranchOnly(0)", CaseBranchOnly(0), fails) + fails = Check("CaseBranchOnly(1)", CaseBranchOnly(1), fails) + fails = Check("CaseStack", CaseStack(), fails) CaseVoidBare(1) CaseVoidBare(0) # §3.6 析构调度:出口释放恰好 1 次;循环 3 轮(2 次覆盖 + 1 次出口)共 3 次 - fails += CaseDtor() - if dtor_hits != 1: fails += 1 - fails += CaseDtorOverwrite() - if dtor_hits != 4: fails += 1 + fails = Check("CaseDtor", CaseDtor(), fails) + if dtor_hits != 1: + stdio.printf(" FAIL dtor_hits after CaseDtor: %d (want 1)\n", dtor_hits) + fails += 1 + fails = Check("CaseDtorOverwrite", CaseDtorOverwrite(), fails) + if dtor_hits != 4: + stdio.printf(" FAIL dtor_hits after CaseDtorOverwrite: %d (want 4)\n", dtor_hits) + fails += 1 # P1 异常出口:传播出去(离开函数)恰好 1 次;被本函数捕获时不得提前释放、出口 1 次 - fails += CaseRaiseExit() - fails += CaseRaiseCaught() + fails = Check("CaseRaiseExit", CaseRaiseExit(), fails) + fails = Check("CaseRaiseCaught", CaseRaiseCaught(), fails) if fails != 0: stdio.printf("NewLifetimeTest FAILED, %d case(s) wrong\n", fails)