跨端: feat(设备闸): DeviceProbe.ts —— "读到别人的界面"是假绿来源,读之前先判"是谁的",拿不到就记未验
pi 邮件 `971c58fa` §4 / `bf583b0f` §2。别的 agent 在同模拟器上 `aa start` 会抢前台, 之后读到的控件树是**它的窗口** ⇒ 断言可能通过也可能红,**两者都不是在讲我们的界面**(前者=假绿)。 - `foregroundVerdict` 判决只有三种:`ours` / `other` / `unverified`;**只按 bundle 判,不许看标题/文案/控件名** (别人的合法 dump 里完全可能有同名控件与同文案,"邮件"这种通用词尤其容易撞); - `parseForeground` 取不到就 **undefined**(空 dump / 截断 / 格式变了都不猜); - `mayAssertOn === false` ⇒ 调用侧必须记 **`未验`**(欠账继续开着),**不许**记通过、**不许**静默跳过 —— 跳过会在下一轮被读成"验过了"; - `unverifiedReason` 统一状态词,并写明"**缺证据 ≠ 没有那个现象**"。 判据喂 4 类样本(pi 指定的最易漏输入):① 我们的 dump ② **别人的合法 dump(含同名控件 + 同文案)** ③ 截断/畸形 ④ **空 dump**(窗口没起来时最常见,最容易被当成"坏现象不存在")。 另加一条只按 bundle 判的反证(把标题改成"像我们"也不许变 ours)。 **顺手抓到自己一个坑**:`firstMatch` 第一版的否定类既接受非 ASCII 也接受**换行** ⇒ 对 `windowTitle: 邮件\n abilityName: …` 会吞掉中文标题并**捕获下一行的键名**, "标题"读到 `abilityName`(看起来有值、其实指错地方)。判据当场抓到 ⇒ 改成按行取、值允许中文、空值不回退。
This commit is contained in:
@ -79,6 +79,7 @@ const SUITE = [
|
||||
['test/build-stamp.test.mjs', [], 7],
|
||||
['test/packaging.test.mjs', [], 5],
|
||||
['test/align-refs.test.mjs', [], 3],
|
||||
['test/harmony-deviceprobe.test.mjs', ['--experimental-strip-types', '--no-warnings'], 5],
|
||||
['test/harmony-push.test.mjs', ['--experimental-strip-types', '--no-warnings'], 13],
|
||||
['test/harmony-calendar.test.mjs', ['--experimental-strip-types', '--no-warnings'], 10],
|
||||
['test/debt-visibility.test.mjs', [], 1],
|
||||
@ -272,6 +273,27 @@ for (const [file, flags, expected] of SUITE) {
|
||||
const CRASH_SIGNS = /(SyntaxError|ReferenceError|TypeError|Cannot find module|ERR_MODULE_NOT_FOUND|is not defined|is not a function|CompileError|build failed|Unexpected identifier|missing ',' in argument list)/;
|
||||
const crashed = r.status !== 0 && (onlyFileLevel || (notOkNames.length === 0 && CRASH_SIGNS.test(out)));
|
||||
const empty = out.trim().length === 0;
|
||||
/*
|
||||
* ── 条数累计:**必须在红/绿分支之外** ──
|
||||
*
|
||||
* 原来它写在下面 `else { … }`(只在**绿**时进入)里,于是**红文件一条都不计入**,
|
||||
* `checks` **静默少算**。实测:`checks=379` 而逐文件手算 387 —— 差的那些正是红文件里的。
|
||||
* **"红"只说明判据说"不成立",不说明它没跑**;跑过的条数一样要算进来。
|
||||
*
|
||||
* 单位是自报的条数本身(`RESULT pass=N fail=M` 的 N+M,或 `# tests N`),
|
||||
* 两种文件的"条"不是同一种条,所以汇总里那一格叫 `checks` 而不叫 `tests`。
|
||||
*/
|
||||
const marker = /RESULT pass=(\d+) fail=(\d+)/.exec(out);
|
||||
const nodeTest = /^# pass (\d+)/m.exec(out);
|
||||
const nodeFail = /^# fail (\d+)/m.exec(out);
|
||||
const ran = marker ? Number(marker[1]) : (nodeTest ? Number(nodeTest[1]) : null);
|
||||
if (ran !== null) {
|
||||
totalTests += ran;
|
||||
ranFilesCount += 1;
|
||||
totalFail += marker ? Number(marker[2]) : (nodeFail ? Number(nodeFail[1]) : 0);
|
||||
} else {
|
||||
unreportedFiles += 1;
|
||||
}
|
||||
// 不 break:后面每条都要跑出来,否则"红了几条"这个信息本身是假的
|
||||
if (crashed || empty) {
|
||||
const firstErr = (out.match(/^.*(Error|error:).*$/m) || [''])[0].trim().slice(0, 160);
|
||||
|
||||
Reference in New Issue
Block a user