
# Pokrytie test262

[test262](https://github.com/tc39/test262) je oficiálna testovacia sada zhody, ktorú spravuje TC39, a štandardný spôsob porovnávania enginov JavaScript.

Phasis prechádza **celú sadu na úrovni 100 %** vo všetkých kategóriách — sémantika jazyka, štandardná knižnica, `Intl`, `annexB`, zastarané webové funkcie, priečinok `staging` s pripravovanými testami a vlastné testy testovacieho prostredia. Bez obchádzania pomocou príznakov funkcií, bez zoznamu nevyriešených medzier hostiteľa a bez vylúčení jednotlivých častí testov.

Testovacia sada je pevne určená: podmodul `test262` git určuje revíziu, voči ktorej sa meria Phasis, a nové testy z nadradeného projektu sa započítajú až po aktualizácii podmodulu. Snímka celej testovacej sady v [`COMPAT.md`](https://github.com/inline0/phasis/blob/main/COMPAT.md) sa obnovuje pracovným postupom `compat-matrix.yml`, ktorý sa spúšťa ručne, nie pri každom odoslaní zmien; `COMPAT.md` zaznamenáva, kedy bola snímka vytvorená a voči ktorému commitu.

Na porovnanie, [test262.fyi](https://test262.fyi) sleduje tú istú testovaciu sadu voči každému produkčnému enginu JS:

| Engine | Zhoda |
|---|---:|
| V8 (Chrome / Node) | 99.8 % |
| SpiderMonkey (Firefox) | 99.6 % |
| JavaScriptCore (Safari) | 99.4 % |
| QuickJS | ~97 % |
| Hermes (React Native) | ~95 % |
| **Phasis** | **100 %** |

V každom z týchto enginov zostáva malá medzera (nedávno pridané návrhy, zriedkavé hraničné prípady, ktoré sa ešte pripravujú). Phasis túto medzeru vypĺňa tým, že ide o implementáciu zameranú výhradne na zhodu.

## Lokálne spustenie

Runner potrebuje podmodul `test262` a testovacie triedy repozitára, ktoré nie sú súčasťou balíka Composer, preto ho spustite z klonu repozitára:

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

Úplné spustenie na novšom Macu trvá približne 20 minút; v CI sa testy rozdelia do súbežných častí a dokončia za niekoľko minút.

Ak chcete pri ladení spustiť iba jednu kategóriu:

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

Úplnú sadu príznakov nájdete v [referenčnej príručke CLI](https://phasis.inline0.dev/sk/docs/cli#bin-test262).

## Prečo je to dôležité

JavaScript má jemné sémantické nuansy — `NaN !== NaN`, `-0 === 0`, `[1] + 1 === "11"`, presné poradie enumerácie vlastností a načasovanie mikrotaskov Promise. Knižnica, ktorá spúšťa používateľský kód JS, musí vždy správne zvládnuť každú z nich. Hranicu toho, čo znamená „správne“, určuje test262; pri úspešnosti 100 % program JS, ktorý beží na V8, vytvára na Phasis bajtovo identický výstup (s výnimkou API dostupných iba v prehliadači).
