
# Покрытие test262

[test262](https://github.com/tc39/test262) — официальный набор тестов на соответствие, который поддерживает TC39; это стандартный способ сравнивать движки JavaScript.

Phasis проходит **весь набор с результатом 100 %** во всех категориях: семантика языка, стандартная библиотека, `Intl`, устаревшие веб-возможности `annexB`, каталог с новыми тестами `staging` и самотесты тестовой среды. Нет обхода с помощью флагов функций, списков исключений из-за ограничений хоста или исключений для отдельных сегментов.

Версия набора зафиксирована: подмодуль `test262` git определяет ревизию, относительно которой измеряется Phasis, а новые тесты из основного репозитория учитываются только после обновления подмодуля. Снимок результатов полного набора в [`COMPAT.md`](https://github.com/inline0/phasis/blob/main/COMPAT.md) обновляется рабочим процессом `compat-matrix.yml`, который запускают вручную, а не при каждом push; в `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/ru/docs/cli#bin-test262).

## Почему это важно

JavaScript имеет тонкие семантические нюансы — `NaN !== NaN`, `-0 === 0`, `[1] + 1 === "11"`, точный порядок перечисления свойств, время выполнения микрозадач Promise. Библиотека, запускающая пользовательский код JS, должна каждый раз правильно обрабатывать все эти случаи. test262 задает планку «правильности»; прохождение на 100 % означает, что программа JS, выполняемая на V8, выдает побайтно идентичный результат на Phasis (за исключением API, доступных только в браузере).
