
# test262 aprėptis

[test262](https://github.com/tc39/test262) yra oficialus TC39 palaikomas atitikties testų rinkinys ir pagrindinis būdas palyginti JavaScript variklius.

Phasis sėkmingai vykdo **visą rinkinį — 100 %** visose kategorijose: kalbos semantiką, standartinę biblioteką, `Intl`, `annexB` senąsias žiniatinklio funkcijas, bandomųjų testų `staging` katalogą ir pačios testavimo aplinkos testus. Nėra funkcijų vėliavėlių apėjimų, pagrindinės aplinkos trūkumų sąrašo įrašų ar atskirų skaidinių išimčių.

Testų rinkinys yra fiksuotas: `test262` git submodulis užfiksuoja peržiūrą, kurios atžvilgiu matuojamas Phasis, o nauji pirminio šaltinio testai įtraukiami tik atnaujinus submodulį. Visos testų rinkinio momentinė kopija, esanti [`COMPAT.md`](https://github.com/inline0/phasis/blob/main/COMPAT.md), sukuriama `compat-matrix.yml` darbo eiga, kuri paleidžiama rankiniu būdu, o ne po kiekvieno pakeitimo; `COMPAT.md` nurodo, kada momentinė kopija buvo sukurta ir su kuriuo pakeitimu.

Palyginimui, [test262.fyi](https://test262.fyi) tikrina tą patį rinkinį visuose gamybinio naudojimo JS varikliuose:

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

Kiekviename iš šių variklių lieka nedidelis skirtumas (naujai įdiegiami pasiūlymai, kuriamos retos kraštinės situacijos). Phasis jį pašalina, nes tai specializuotas įgyvendinimas, kuriame pirmiausia siekiama atitikties.

## Paleidimas vietoje

Paleidimo programai reikia `test262` submodulio ir saugyklos testų klasių, kurių nėra Composer pakete, todėl paleiskite ją klonuotoje saugykloje:

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

Visas paleidimas naujesniame Mac užtrunka apie 20 minučių; CI matrica testus vykdo lygiagrečiai, todėl užtrunka mažiau nei 10 minučių.

Norėdami derinant paleisti tik vieną kategoriją:

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

Visą vėliavėlių rinkinį rasite [CLI žinyno skyriuje](https://phasis.inline0.dev/lt/docs/cli#bin-test262).

## Kodėl tai svarbu

JavaScript semantika subtili: `NaN !== NaN`, `-0 === 0`, `[1] + 1 === "11"`, tiksli savybių išvardijimo tvarka ir Promise mikroužduočių laikas. Biblioteka, vykdanti JS naudotojo kodą, kiekvieną iš šių dalykų turi atlikti teisingai kaskart. test262 yra teisingumo matas; 100 % rezultatas reiškia, kad V8 veikianti JS programa Phasis pateikia identišką baitų išvestį (išskyrus tik naršyklėms skirtus API).
