
# test262の適合状況

[test262](https://github.com/tc39/test262)はTC39が管理する公式適合性テストスイートで、JavaScriptエンジンを比較する標準的な方法です。

Phasisは、言語の意味論、標準ライブラリ、`Intl`、`annexB`、レガシーWeb機能、`staging`の実験的テストディレクトリ、ハーネスのセルフテストなど、すべてのカテゴリで**スイート全体に100 %合格**します。機能フラグによる回避も、ホスト環境の不足を理由とする除外リストも、シャードごとの除外もありません。

このスイートは固定されています。`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
```

すべてのフラグについては[CLIリファレンス](https://phasis.inline0.dev/ja/docs/cli#bin-test262)を参照してください。

## 重要な理由

JavaScriptには細かな意味論があります。`NaN !== NaN`、`-0 === 0`、`[1] + 1 === "11"`、プロパティ列挙の厳密な順序、Promiseマイクロタスクの実行タイミングなどです。JSのユーザーコードを実行するライブラリは、そのすべてを常に正しく扱う必要があります。test262は「正しさ」の基準です。100 %合格するということは、V8で動作するJSプログラムがPhasisでも（ブラウザー専用APIを除き）バイト単位で同じ出力を生成することを意味します。
