
# Покритие на test262

[test262](https://github.com/tc39/test262) е официалният набор от тестове за съответствие, поддържан от TC39, и утвърденият начин за сравнение на машини JavaScript.

Phasis преминава **пълния набор с резултат 100 %** във всяка категория — семантика на езика, стандартната библиотека, `Intl`, наследени функции на уеб платформата на `annexB`, директорията `staging` с тестове в процес на разработка и самопроверките на тестовата среда. Няма заобикаляне чрез флагове за функции, записи в списък с пропуски поради ограничения на хоста или изключения за отделни фрагменти.

Наборът от тестове е фиксиран: подмодулът `test262` на Git фиксира ревизията, спрямо която се измерва Phasis, а новите тестове в upstream се зачитат едва след актуализиране на подмодула. Снимката на пълния набор в [`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/bg/docs/cli#bin-test262) за пълния набор от флагове.

## Защо това е важно

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