
# test262 覆盖率

[test262](https://github.com/tc39/test262)是由 TC39 维护的官方一致性测试套件，也是比较 JavaScript 引擎的标准方式。

Phasis在所有类别中都**以 100 % 的成绩通过了完整测试套件** — 涵盖语言语义、标准库、`Intl`、`annexB`旧版 Web 功能、`staging`孵化中测试目录，以及测试框架自测。没有绕过功能标志、没有宿主缺口屏蔽项，也没有按分片排除测试。

测试套件版本已固定：`test262` git 子模块锁定了 Phasis 所依据的版本；只有更新子模块后，新增的上游测试才会纳入统计。[`COMPAT.md`](https://github.com/inline0/phasis/blob/main/COMPAT.md)中的完整测试快照由 `compat-matrix.yml` 工作流重新生成，该工作流由人工启动，而非每次推送时运行；`COMPAT.md`记录了快照的生成时间和所依据的提交。

作为对照，[test262.fyi](https://test262.fyi)会针对每个生产级 JS 引擎跟踪同一测试套件：

| 引擎 | 符合度 |
|---|---:|
| V8（Chrome / Node） | 99.8 % |
| SpiderMonkey（Firefox） | 99.6 % |
| JavaScriptCore（Safari） | 99.4 % |
| QuickJS | ~97 % |
| Hermes（React Native） | ~95 % |
| **Phasis** | **100 %** |

这些引擎各自仍有少量差距（新近落地的提案、仍在开发中的罕见边缘情况）。Phasis凭借专注一致性的单一用途实现填补了这一差距。

## 在本地运行

运行器需要 `test262` 子模块和仓库的测试类，而这两者都不包含在 Composer 软件包中，因此请从克隆仓库运行：

```bash
git clone https://github.com/inline0/phasis
cd phasis
git submodule update --init test262
composer install
./bin/test262 --jobs 4
```

在较新的 Mac 上完整运行大约需要 20 分钟；CI 矩阵会并行分片，几分钟内即可完成。

调试时只运行一个类别：

```bash
./bin/test262 --category built-ins/Array
./bin/test262 --category language/expressions/yield --failures
```

完整标志列表请参阅[the CLI reference](https://phasis.inline0.dev/zh/docs/cli#bin-test262)。

## 这为何重要

JavaScript的语义很微妙 — `NaN !== NaN`、`-0 === 0`、`[1] + 1 === "11"`、属性枚举的精确顺序、Promise 微任务的时序。运行 JS 用户代码的库必须每次都正确处理这些细节。test262是判断“正确”的标准；在 100 % 下通过，意味着一个在 V8 上运行的 JS 程序，也会在 Phasis 上生成字节完全相同的输出（仅浏览器 API 除外）。
