miaoda-game-devkit 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -10
- package/dist/react/testing.d.mts +50 -65
- package/dist/react/testing.d.ts +50 -65
- package/dist/react/testing.js +276 -188
- package/dist/react/testing.mjs +276 -188
- package/dist/react/vitest-config.js +328 -210
- package/dist/react/vitest-config.mjs +328 -210
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -7,20 +7,31 @@
|
|
|
7
7
|
- React 游戏的生产/手动时钟、Strict Mode 安全 Controller ownership、JSDOM
|
|
8
8
|
Vitest 配置和自动收集运行错误的 Testing Library setup,分别从 `miaoda-game-devkit/react`、
|
|
9
9
|
`miaoda-game-devkit/react/testing` 和 `miaoda-game-devkit/react/vitest-config` 导入;
|
|
10
|
-
- React 的 `playthroughTest` 与项目级 reporter
|
|
11
|
-
|
|
10
|
+
- React 的 `playthroughTest` 与项目级 reporter 自动验证连续的 enter/milestone/finish
|
|
11
|
+
玩法阶段、真实 DOM 输入或确定性推进、有界结果、结果断言和阶段状态变化;聚焦运行只提示未检查,
|
|
12
12
|
完整运行缺少有效流程时失败;
|
|
13
13
|
|
|
14
|
-
`playthroughTest`
|
|
15
|
-
`
|
|
16
|
-
|
|
17
|
-
`
|
|
18
|
-
|
|
19
|
-
|
|
14
|
+
`playthroughTest` 的主流程回调只需要编排 `enter`、至少三个唯一命名的 `milestone` 和
|
|
15
|
+
`finish`。`enter` 必须声明真实输入 `act`;后续阶段声明 `act` 或确定性 `step`。每个阶段还要
|
|
16
|
+
提供初始为 false 的有界 `until`,以及使用 test-bound `expect` 的 `assert`。DevKit 在验证阶段
|
|
17
|
+
前后 DOM 或权威 `observe` 状态确实变化后自动提交阶段证据。每个 `milestone` 使用非空且
|
|
18
|
+
唯一的领域名称,表示一段独立的玩法进展。`finish.kind` 对有限结果使用 `terminal`,对无尽或
|
|
19
|
+
沙盒游戏的有意义进展使用 `progress`。大型游戏保留一条最短关键流程;分支、关卡规则和恢复
|
|
20
|
+
清理由专门测试覆盖。不要再次调用 `userEvent.setup()`。
|
|
21
|
+
Playthrough 测试始终以非并发任务运行,且只统计当前阶段 `act` 执行窗口内的输入事件,避免
|
|
22
|
+
同一 JSDOM 中其他测试或后台事件污染玩法证据。
|
|
20
23
|
时间、帧或自定义 scheduler 流程必须显式传入确定性 `step`;精确物理时间、暂停恢复
|
|
21
24
|
或调度清理测试可使用 `ManualGameClock`。Canvas/Controller 流程在 `playthroughTest` 上声明一次
|
|
22
25
|
`observe`,返回 JSON 可序列化的权威 Telemetry 状态;框架自动比较流程状态并复用为超时诊断。
|
|
23
26
|
|
|
27
|
+
失败的 production playthrough 会额外输出一条有界 `TRACE:`:记录已完成 milestone、当前阶段、
|
|
28
|
+
阶段前后可观测状态与推进步数。通过流程不输出 TRACE,避免增加
|
|
29
|
+
常规 CI 噪声。显式启用 Vitest retry 时,每次尝试会重置证据,最终报告只展示最后一次尝试的
|
|
30
|
+
CAUSE 与 TRACE;repeat 同样为每轮建立新证据。测试超时或取消会中止后续有界推进,并通过
|
|
31
|
+
Vitest 的 test-local failure hook 在 worker 最终同步前保留活动阶段;若测试主体已完成、随后由
|
|
32
|
+
`afterEach` 或运行时错误判失败,reporter 仍会从 task metadata 恢复这条流程证据。状态优先来自 `observe`,没有 Telemetry 时才使用有界 DOM
|
|
33
|
+
摘要;不要把 TRACE 当作新的断言或第二份业务状态。
|
|
34
|
+
|
|
24
35
|
Vitest 的 fake timers(包括 `vi.advanceTimersToNextFrame()`)适合在 devkit 自身的
|
|
25
36
|
专门 scheduler 合约中使用,但不在所有 production playthrough 中全局启用;React
|
|
26
37
|
Testing Library 的 `asyncWrapper` 和 user-event 内部 timer 会因此互相影响。使用自定义
|
|
@@ -85,8 +96,9 @@ Phaser 4 模板对应使用 `miaoda-phaser-game-lint`。命令类型不通过依
|
|
|
85
96
|
开发工具包自行维护并精确固定 Vitest 等工具版本,从自身依赖中解析可执行文件,使用方不需要重复声明
|
|
86
97
|
Biome、Oxlint 或 tsgo。仓库中保留稳定的命令入口,因此 `dist/` 尚未生成时,pnpm
|
|
87
98
|
也能正确建立命令链接;工作区开发状态下由 Nx 在模板检查前构建开发工具包,发布包则
|
|
88
|
-
直接携带运行时 `dist/`。打包消费者契约会验证固定 Vitest 版本以及 reporter
|
|
89
|
-
|
|
99
|
+
直接携带运行时 `dist/`。打包消费者契约会验证固定 Vitest 版本以及 reporter 的通过、聚焦、
|
|
100
|
+
缺失流程、retry 失败诊断和 hook 失败诊断行为。开发工具包内部的 `*.test.*` 与构建后的
|
|
101
|
+
`*.contract.mjs` 都不会
|
|
90
102
|
进入 npm 包;这些契约只由 devkit 自己的测试目标执行。
|
|
91
103
|
|
|
92
104
|
monorepo 中的模板可以放置只包含 `extends: ["miaoda-game-devkit/biome"]` 的薄配置,
|
package/dist/react/testing.d.mts
CHANGED
|
@@ -33,112 +33,97 @@ interface StepUntilOptions {
|
|
|
33
33
|
* The value is sampled only when the bound is exhausted.
|
|
34
34
|
*/
|
|
35
35
|
diagnostics?: () => unknown;
|
|
36
|
+
/** 测试超时或运行取消时停止继续推进,通常由 playthroughTest 自动传入。 */
|
|
37
|
+
signal?: AbortSignal;
|
|
36
38
|
}
|
|
37
39
|
|
|
40
|
+
type ReactPlaythroughStageKind = "entered" | "milestone" | "progress" | "terminal";
|
|
41
|
+
/** 一段已完成玩法留下的可序列化证据。 */
|
|
42
|
+
interface ReactPlaythroughStageEvidence {
|
|
43
|
+
name: string;
|
|
44
|
+
kind: ReactPlaythroughStageKind;
|
|
45
|
+
domInputEvents: number;
|
|
46
|
+
advancedSteps: number;
|
|
47
|
+
assertions: number;
|
|
48
|
+
stateChanged: boolean;
|
|
49
|
+
before: string;
|
|
50
|
+
after: string;
|
|
51
|
+
}
|
|
38
52
|
/** 单条 React 主流程测试留下的可序列化运行期证据。 */
|
|
39
53
|
interface ReactPlaythroughEvidence {
|
|
40
|
-
/** 捕获阶段观察到的键盘、指针或触摸类 DOM 输入总数。 */
|
|
41
54
|
domInputEvents: number;
|
|
42
|
-
|
|
43
|
-
entryInputs: number;
|
|
44
|
-
/** 由 performInput 明确标记的核心玩法输入次数。 */
|
|
45
|
-
primaryInputs: number;
|
|
46
|
-
/** 在步数上限内成功满足条件的 stepUntil 次数。 */
|
|
47
|
-
boundedRuns: number;
|
|
48
|
-
/** 最后一次 stepUntil 成功后新增的 Vitest 断言数。 */
|
|
49
|
-
assertionsAfterOutcome: number;
|
|
50
|
-
/** 已记录的 checkpoint 类型,供 reporter 给出精确提示。 */
|
|
51
|
-
checkpoints: ReactPlaythroughCheckpointKind[];
|
|
52
|
-
/** helper 是否已经完成全部证据校验。 */
|
|
55
|
+
stages: ReactPlaythroughStageEvidence[];
|
|
53
56
|
verified: boolean;
|
|
54
57
|
}
|
|
55
58
|
/** 通过 Vitest task metadata 从 worker 传递给主线程 reporter 的数据。 */
|
|
56
59
|
interface ReactPlaythroughMetadata {
|
|
57
|
-
|
|
58
|
-
version: 3;
|
|
59
|
-
/** 静态、非交互项目跳过主流程验证时必须提供的理由。 */
|
|
60
|
+
version: 4;
|
|
60
61
|
waiverReason?: string;
|
|
61
|
-
|
|
62
|
+
trace?: string;
|
|
62
63
|
evidence: ReactPlaythroughEvidence;
|
|
63
64
|
}
|
|
64
|
-
|
|
65
|
-
/** 玩家输入在最低可玩流程中的语义阶段。 */
|
|
66
|
-
type ReactPlaythroughInputKind = "entry" | "primary";
|
|
67
|
-
/** 可审计流程签到;entered 是入口,progress/terminal 是有效结果。 */
|
|
68
|
-
type ReactPlaythroughCheckpointKind = "entered" | "progress" | "terminal";
|
|
69
|
-
/** Canvas/Controller flows declare one authoritative read; simple DOM flows omit it. */
|
|
70
65
|
interface ReactPlaythroughOptions {
|
|
71
|
-
/**
|
|
66
|
+
/** Canvas/Controller flows expose one stable authoritative production read. */
|
|
72
67
|
observe: () => unknown;
|
|
73
68
|
}
|
|
74
|
-
|
|
69
|
+
interface ReactPlaythroughAssertContext {
|
|
70
|
+
expect: ExpectStatic;
|
|
71
|
+
user: UserEvent;
|
|
72
|
+
view: RenderResult;
|
|
73
|
+
}
|
|
74
|
+
interface ReactPlaythroughStageShared {
|
|
75
|
+
until: () => boolean;
|
|
76
|
+
assert: (context: ReactPlaythroughAssertContext) => void | Promise<void>;
|
|
77
|
+
maxSteps?: number;
|
|
78
|
+
diagnostics?: () => unknown;
|
|
79
|
+
}
|
|
80
|
+
type ReactPlaythroughInteractiveStage = ReactPlaythroughStageShared & {
|
|
81
|
+
act: () => void | Promise<void>;
|
|
82
|
+
step?: StepUntilOptions["step"];
|
|
83
|
+
};
|
|
84
|
+
type ReactPlaythroughAutonomousStage = ReactPlaythroughStageShared & {
|
|
85
|
+
act?: never;
|
|
86
|
+
step: NonNullable<StepUntilOptions["step"]>;
|
|
87
|
+
};
|
|
88
|
+
type ReactPlaythroughStage = ReactPlaythroughInteractiveStage | ReactPlaythroughAutonomousStage;
|
|
89
|
+
/** 合法入口必须由真实生产 DOM 输入驱动,不能用自动 step 代替。 */
|
|
90
|
+
type ReactPlaythroughEnterStage = ReactPlaythroughInteractiveStage;
|
|
91
|
+
type ReactPlaythroughFinishStage = ReactPlaythroughStage & {
|
|
92
|
+
kind: "progress" | "terminal";
|
|
93
|
+
};
|
|
94
|
+
/** 游戏作者只编排进入、领域里程碑和最终结果。 */
|
|
75
95
|
interface ReactPlaythroughArguments {
|
|
76
|
-
/** Testing Library 对生产游戏入口的渲染结果。 */
|
|
77
96
|
view: RenderResult;
|
|
78
|
-
/** 已由 playthroughTest 创建的真实 DOM 用户输入驱动。 */
|
|
79
97
|
user: UserEvent;
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
* 包裹一段真实 DOM 输入并声明用途。
|
|
84
|
-
* entry 用于进入合法游戏状态,primary 用于移动、挥拍、拖拽、落子等核心操作。
|
|
85
|
-
*/
|
|
86
|
-
performInput(kind: ReactPlaythroughInputKind, input: () => void | Promise<void>): Promise<void>;
|
|
87
|
-
/**
|
|
88
|
-
* 记录流程签到。先在 entry 后记录 entered,再在 primary、stepUntil 和
|
|
89
|
-
* 结果断言后记录 progress 或 terminal。
|
|
90
|
-
*/
|
|
91
|
-
checkpoint(kind: ReactPlaythroughCheckpointKind): void;
|
|
92
|
-
/**
|
|
93
|
-
* 在硬性步数上限内等待权威结果。
|
|
94
|
-
* 返回后必须再断言该结果,进入中间 active/running 状态不算完成。
|
|
95
|
-
* 即时结果不需要 step;时间、帧或自定义 scheduler 流程必须传入确定性 step。
|
|
96
|
-
*/
|
|
97
|
-
stepUntil(condition: () => boolean, options?: StepUntilOptions): Promise<number>;
|
|
98
|
+
enter(stage: ReactPlaythroughEnterStage): Promise<void>;
|
|
99
|
+
milestone(name: string, stage: ReactPlaythroughStage): Promise<void>;
|
|
100
|
+
finish(name: string, stage: ReactPlaythroughFinishStage): Promise<void>;
|
|
98
101
|
}
|
|
99
|
-
/** 使用方编写的生产玩法步骤;既支持同步游戏,也支持异步 DOM 输入。 */
|
|
100
102
|
type ReactPlaythroughRun = (arguments_: ReactPlaythroughArguments) => void | Promise<void>;
|
|
101
|
-
/** 低配置主流程测试函数及其结构化豁免入口。 */
|
|
102
103
|
interface ReactPlaythroughTest {
|
|
103
|
-
/** 渲染生产入口并声明一条最低可玩主流程。 */
|
|
104
104
|
(element: ReactNode, run: ReactPlaythroughRun): void;
|
|
105
|
-
/** Use one authoritative observer when gameplay results live outside the DOM. */
|
|
106
105
|
(element: ReactNode, options: ReactPlaythroughOptions, run: ReactPlaythroughRun): void;
|
|
107
|
-
|
|
108
|
-
skip(reason: string, element: ReactNode, run: ReactPlaythroughRun): void;
|
|
106
|
+
skip(reason: string, element: ReactNode): void;
|
|
109
107
|
}
|
|
110
108
|
/** reporter 从单个 Vitest TestCase 提取出的稳定审计输入。 */
|
|
111
109
|
interface ReactPlaythroughAuditInput {
|
|
112
|
-
/** 包含 describe 层级的完整测试名,仅用于诊断输出。 */
|
|
113
110
|
name: string;
|
|
114
|
-
/** Vitest 报告的最终执行状态。 */
|
|
115
111
|
state: "passed" | "failed" | "skipped" | "pending";
|
|
116
|
-
/** 只有 playthroughTest 声明的测试才具备该字段。 */
|
|
117
112
|
metadata?: ReactPlaythroughMetadata;
|
|
118
113
|
}
|
|
119
|
-
/** 整次 Vitest 运行的最低可玩性审计结果。 */
|
|
120
114
|
interface ReactPlaythroughAuditResult {
|
|
121
|
-
/** 是否满足有效主流程或有效豁免。 */
|
|
122
115
|
passed: boolean;
|
|
123
|
-
/** 是否依靠显式非交互理由通过,而非执行了主流程。 */
|
|
124
116
|
waived: boolean;
|
|
125
|
-
/** 可直接指导模型补测的稳定问题列表。 */
|
|
126
117
|
issues: string[];
|
|
127
118
|
}
|
|
128
119
|
/** React 游戏测试的最低可玩主流程入口。 */
|
|
129
120
|
declare const playthroughTest: ReactPlaythroughTest;
|
|
130
|
-
/**
|
|
131
|
-
* 供 Vitest reporter 与确定性契约测试共用的纯审计函数。
|
|
132
|
-
*
|
|
133
|
-
* 它只验证客观流程证据,不能理解任意游戏的胜负语义;具体结果仍由
|
|
134
|
-
* 使用方在 stepUntil 返回后通过权威状态或玩家可见结果断言。
|
|
135
|
-
*/
|
|
121
|
+
/** 供 Vitest reporter 与确定性契约测试共用的纯审计函数。 */
|
|
136
122
|
declare function auditReactPlaythroughRun(tests: ReactPlaythroughAuditInput[]): ReactPlaythroughAuditResult;
|
|
137
123
|
declare module "vitest" {
|
|
138
124
|
interface TaskMeta {
|
|
139
|
-
/** 供 ReactPlaythroughReporter 汇总的可序列化主流程证据。 */
|
|
140
125
|
reactPlaythrough?: ReactPlaythroughMetadata;
|
|
141
126
|
}
|
|
142
127
|
}
|
|
143
128
|
|
|
144
|
-
export { ManualGameClock, type ReactPlaythroughArguments, type ReactPlaythroughAuditInput, type ReactPlaythroughAuditResult, type
|
|
129
|
+
export { ManualGameClock, type ReactPlaythroughArguments, type ReactPlaythroughAssertContext, type ReactPlaythroughAuditInput, type ReactPlaythroughAuditResult, type ReactPlaythroughAutonomousStage, type ReactPlaythroughEnterStage, type ReactPlaythroughEvidence, type ReactPlaythroughFinishStage, type ReactPlaythroughInteractiveStage, type ReactPlaythroughMetadata, type ReactPlaythroughOptions, type ReactPlaythroughStage, type ReactPlaythroughStageEvidence, type ReactPlaythroughStageKind, type ReactPlaythroughTest, type StepUntilOptions, auditReactPlaythroughRun, playthroughTest };
|
package/dist/react/testing.d.ts
CHANGED
|
@@ -33,112 +33,97 @@ interface StepUntilOptions {
|
|
|
33
33
|
* The value is sampled only when the bound is exhausted.
|
|
34
34
|
*/
|
|
35
35
|
diagnostics?: () => unknown;
|
|
36
|
+
/** 测试超时或运行取消时停止继续推进,通常由 playthroughTest 自动传入。 */
|
|
37
|
+
signal?: AbortSignal;
|
|
36
38
|
}
|
|
37
39
|
|
|
40
|
+
type ReactPlaythroughStageKind = "entered" | "milestone" | "progress" | "terminal";
|
|
41
|
+
/** 一段已完成玩法留下的可序列化证据。 */
|
|
42
|
+
interface ReactPlaythroughStageEvidence {
|
|
43
|
+
name: string;
|
|
44
|
+
kind: ReactPlaythroughStageKind;
|
|
45
|
+
domInputEvents: number;
|
|
46
|
+
advancedSteps: number;
|
|
47
|
+
assertions: number;
|
|
48
|
+
stateChanged: boolean;
|
|
49
|
+
before: string;
|
|
50
|
+
after: string;
|
|
51
|
+
}
|
|
38
52
|
/** 单条 React 主流程测试留下的可序列化运行期证据。 */
|
|
39
53
|
interface ReactPlaythroughEvidence {
|
|
40
|
-
/** 捕获阶段观察到的键盘、指针或触摸类 DOM 输入总数。 */
|
|
41
54
|
domInputEvents: number;
|
|
42
|
-
|
|
43
|
-
entryInputs: number;
|
|
44
|
-
/** 由 performInput 明确标记的核心玩法输入次数。 */
|
|
45
|
-
primaryInputs: number;
|
|
46
|
-
/** 在步数上限内成功满足条件的 stepUntil 次数。 */
|
|
47
|
-
boundedRuns: number;
|
|
48
|
-
/** 最后一次 stepUntil 成功后新增的 Vitest 断言数。 */
|
|
49
|
-
assertionsAfterOutcome: number;
|
|
50
|
-
/** 已记录的 checkpoint 类型,供 reporter 给出精确提示。 */
|
|
51
|
-
checkpoints: ReactPlaythroughCheckpointKind[];
|
|
52
|
-
/** helper 是否已经完成全部证据校验。 */
|
|
55
|
+
stages: ReactPlaythroughStageEvidence[];
|
|
53
56
|
verified: boolean;
|
|
54
57
|
}
|
|
55
58
|
/** 通过 Vitest task metadata 从 worker 传递给主线程 reporter 的数据。 */
|
|
56
59
|
interface ReactPlaythroughMetadata {
|
|
57
|
-
|
|
58
|
-
version: 3;
|
|
59
|
-
/** 静态、非交互项目跳过主流程验证时必须提供的理由。 */
|
|
60
|
+
version: 4;
|
|
60
61
|
waiverReason?: string;
|
|
61
|
-
|
|
62
|
+
trace?: string;
|
|
62
63
|
evidence: ReactPlaythroughEvidence;
|
|
63
64
|
}
|
|
64
|
-
|
|
65
|
-
/** 玩家输入在最低可玩流程中的语义阶段。 */
|
|
66
|
-
type ReactPlaythroughInputKind = "entry" | "primary";
|
|
67
|
-
/** 可审计流程签到;entered 是入口,progress/terminal 是有效结果。 */
|
|
68
|
-
type ReactPlaythroughCheckpointKind = "entered" | "progress" | "terminal";
|
|
69
|
-
/** Canvas/Controller flows declare one authoritative read; simple DOM flows omit it. */
|
|
70
65
|
interface ReactPlaythroughOptions {
|
|
71
|
-
/**
|
|
66
|
+
/** Canvas/Controller flows expose one stable authoritative production read. */
|
|
72
67
|
observe: () => unknown;
|
|
73
68
|
}
|
|
74
|
-
|
|
69
|
+
interface ReactPlaythroughAssertContext {
|
|
70
|
+
expect: ExpectStatic;
|
|
71
|
+
user: UserEvent;
|
|
72
|
+
view: RenderResult;
|
|
73
|
+
}
|
|
74
|
+
interface ReactPlaythroughStageShared {
|
|
75
|
+
until: () => boolean;
|
|
76
|
+
assert: (context: ReactPlaythroughAssertContext) => void | Promise<void>;
|
|
77
|
+
maxSteps?: number;
|
|
78
|
+
diagnostics?: () => unknown;
|
|
79
|
+
}
|
|
80
|
+
type ReactPlaythroughInteractiveStage = ReactPlaythroughStageShared & {
|
|
81
|
+
act: () => void | Promise<void>;
|
|
82
|
+
step?: StepUntilOptions["step"];
|
|
83
|
+
};
|
|
84
|
+
type ReactPlaythroughAutonomousStage = ReactPlaythroughStageShared & {
|
|
85
|
+
act?: never;
|
|
86
|
+
step: NonNullable<StepUntilOptions["step"]>;
|
|
87
|
+
};
|
|
88
|
+
type ReactPlaythroughStage = ReactPlaythroughInteractiveStage | ReactPlaythroughAutonomousStage;
|
|
89
|
+
/** 合法入口必须由真实生产 DOM 输入驱动,不能用自动 step 代替。 */
|
|
90
|
+
type ReactPlaythroughEnterStage = ReactPlaythroughInteractiveStage;
|
|
91
|
+
type ReactPlaythroughFinishStage = ReactPlaythroughStage & {
|
|
92
|
+
kind: "progress" | "terminal";
|
|
93
|
+
};
|
|
94
|
+
/** 游戏作者只编排进入、领域里程碑和最终结果。 */
|
|
75
95
|
interface ReactPlaythroughArguments {
|
|
76
|
-
/** Testing Library 对生产游戏入口的渲染结果。 */
|
|
77
96
|
view: RenderResult;
|
|
78
|
-
/** 已由 playthroughTest 创建的真实 DOM 用户输入驱动。 */
|
|
79
97
|
user: UserEvent;
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
* 包裹一段真实 DOM 输入并声明用途。
|
|
84
|
-
* entry 用于进入合法游戏状态,primary 用于移动、挥拍、拖拽、落子等核心操作。
|
|
85
|
-
*/
|
|
86
|
-
performInput(kind: ReactPlaythroughInputKind, input: () => void | Promise<void>): Promise<void>;
|
|
87
|
-
/**
|
|
88
|
-
* 记录流程签到。先在 entry 后记录 entered,再在 primary、stepUntil 和
|
|
89
|
-
* 结果断言后记录 progress 或 terminal。
|
|
90
|
-
*/
|
|
91
|
-
checkpoint(kind: ReactPlaythroughCheckpointKind): void;
|
|
92
|
-
/**
|
|
93
|
-
* 在硬性步数上限内等待权威结果。
|
|
94
|
-
* 返回后必须再断言该结果,进入中间 active/running 状态不算完成。
|
|
95
|
-
* 即时结果不需要 step;时间、帧或自定义 scheduler 流程必须传入确定性 step。
|
|
96
|
-
*/
|
|
97
|
-
stepUntil(condition: () => boolean, options?: StepUntilOptions): Promise<number>;
|
|
98
|
+
enter(stage: ReactPlaythroughEnterStage): Promise<void>;
|
|
99
|
+
milestone(name: string, stage: ReactPlaythroughStage): Promise<void>;
|
|
100
|
+
finish(name: string, stage: ReactPlaythroughFinishStage): Promise<void>;
|
|
98
101
|
}
|
|
99
|
-
/** 使用方编写的生产玩法步骤;既支持同步游戏,也支持异步 DOM 输入。 */
|
|
100
102
|
type ReactPlaythroughRun = (arguments_: ReactPlaythroughArguments) => void | Promise<void>;
|
|
101
|
-
/** 低配置主流程测试函数及其结构化豁免入口。 */
|
|
102
103
|
interface ReactPlaythroughTest {
|
|
103
|
-
/** 渲染生产入口并声明一条最低可玩主流程。 */
|
|
104
104
|
(element: ReactNode, run: ReactPlaythroughRun): void;
|
|
105
|
-
/** Use one authoritative observer when gameplay results live outside the DOM. */
|
|
106
105
|
(element: ReactNode, options: ReactPlaythroughOptions, run: ReactPlaythroughRun): void;
|
|
107
|
-
|
|
108
|
-
skip(reason: string, element: ReactNode, run: ReactPlaythroughRun): void;
|
|
106
|
+
skip(reason: string, element: ReactNode): void;
|
|
109
107
|
}
|
|
110
108
|
/** reporter 从单个 Vitest TestCase 提取出的稳定审计输入。 */
|
|
111
109
|
interface ReactPlaythroughAuditInput {
|
|
112
|
-
/** 包含 describe 层级的完整测试名,仅用于诊断输出。 */
|
|
113
110
|
name: string;
|
|
114
|
-
/** Vitest 报告的最终执行状态。 */
|
|
115
111
|
state: "passed" | "failed" | "skipped" | "pending";
|
|
116
|
-
/** 只有 playthroughTest 声明的测试才具备该字段。 */
|
|
117
112
|
metadata?: ReactPlaythroughMetadata;
|
|
118
113
|
}
|
|
119
|
-
/** 整次 Vitest 运行的最低可玩性审计结果。 */
|
|
120
114
|
interface ReactPlaythroughAuditResult {
|
|
121
|
-
/** 是否满足有效主流程或有效豁免。 */
|
|
122
115
|
passed: boolean;
|
|
123
|
-
/** 是否依靠显式非交互理由通过,而非执行了主流程。 */
|
|
124
116
|
waived: boolean;
|
|
125
|
-
/** 可直接指导模型补测的稳定问题列表。 */
|
|
126
117
|
issues: string[];
|
|
127
118
|
}
|
|
128
119
|
/** React 游戏测试的最低可玩主流程入口。 */
|
|
129
120
|
declare const playthroughTest: ReactPlaythroughTest;
|
|
130
|
-
/**
|
|
131
|
-
* 供 Vitest reporter 与确定性契约测试共用的纯审计函数。
|
|
132
|
-
*
|
|
133
|
-
* 它只验证客观流程证据,不能理解任意游戏的胜负语义;具体结果仍由
|
|
134
|
-
* 使用方在 stepUntil 返回后通过权威状态或玩家可见结果断言。
|
|
135
|
-
*/
|
|
121
|
+
/** 供 Vitest reporter 与确定性契约测试共用的纯审计函数。 */
|
|
136
122
|
declare function auditReactPlaythroughRun(tests: ReactPlaythroughAuditInput[]): ReactPlaythroughAuditResult;
|
|
137
123
|
declare module "vitest" {
|
|
138
124
|
interface TaskMeta {
|
|
139
|
-
/** 供 ReactPlaythroughReporter 汇总的可序列化主流程证据。 */
|
|
140
125
|
reactPlaythrough?: ReactPlaythroughMetadata;
|
|
141
126
|
}
|
|
142
127
|
}
|
|
143
128
|
|
|
144
|
-
export { ManualGameClock, type ReactPlaythroughArguments, type ReactPlaythroughAuditInput, type ReactPlaythroughAuditResult, type
|
|
129
|
+
export { ManualGameClock, type ReactPlaythroughArguments, type ReactPlaythroughAssertContext, type ReactPlaythroughAuditInput, type ReactPlaythroughAuditResult, type ReactPlaythroughAutonomousStage, type ReactPlaythroughEnterStage, type ReactPlaythroughEvidence, type ReactPlaythroughFinishStage, type ReactPlaythroughInteractiveStage, type ReactPlaythroughMetadata, type ReactPlaythroughOptions, type ReactPlaythroughStage, type ReactPlaythroughStageEvidence, type ReactPlaythroughStageKind, type ReactPlaythroughTest, type StepUntilOptions, auditReactPlaythroughRun, playthroughTest };
|