
# Охоплення 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`, який запускають вручну, а не під час кожного надсилання змін; `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/uk/docs/cli#bin-test262).

## Чому це важливо

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