
# test262 testu pārklājums

[test262](https://github.com/tc39/test262) ir oficiālā TC39 uzturētā atbilstības testu kopa un standarta veids, kā salīdzināt JavaScript dziņus.

Phasis iztur **visu testu kopu ar rezultātu 100 %** visās kategorijās — valodas semantika, standarta bibliotēka, `Intl`, `annexB` mantotās tīmekļa funkcijas, `staging` direktorija ar vēl izstrādē esošiem testiem un testu ietvara paštesti. Nav apiešanas ar funkciju karogiem, nav bloķēšanas saraksta nepilnībām resursdatorā un nav izņēmumu atsevišķām daļām.

Testu kopa ir piesaistīta konkrētai versijai: `test262` git apakšmodulis fiksē revīziju, ar kuru tiek mērīts Phasis, un jauni augšupstraumes testi tiek ieskaitīti tikai pēc apakšmoduļa atjaunināšanas. Pilnas testu kopas momentuzņēmumu vietnē [`COMPAT.md`](https://github.com/inline0/phasis/blob/main/COMPAT.md) atjauno darbplūsma `compat-matrix.yml`, ko palaiž manuāli, nevis pie katras izmaiņu nosūtīšanas; `COMPAT.md` reģistrē momentuzņēmuma izveides laiku un izmantoto komitu.

Salīdzinājumam, [test262.fyi](https://test262.fyi) izseko tās pašas testu kopas rezultātiem katrā ražošanā izmantotajā JS dzinī:

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

Katrā no šiem dziņiem saglabājas nelielas neatbilstības (nesen pieņemtie priekšlikumi, reti, izstrādes stadijā esoši robežgadījumi). Phasis novērš šo atšķirību, jo tā ir vienam mērķim paredzēta, atbilstībai prioritāti piešķiroša realizācija.

## Palaišana lokāli

Testu palaidējam ir vajadzīgs `test262` apakšmodulis un repozitorija testu klases; neviena no šīm lietām nav iekļauta Composer pakotnē, tāpēc palaidiet to no repozitorija klona:

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

Pilna palaišana nesenā Mac datorā aizņem aptuveni 20 minūtes; CI matrica testus sadala vairākās daļās un pabeidz dažās minūtēs.

Lai atkļūdojot palaistu tikai vienu kategoriju:

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

Pilnu karogu sarakstu skatiet [CLI atsaucē](https://phasis.inline0.dev/lv/docs/cli#bin-test262).

## Kāpēc tas ir svarīgi

JavaScript semantika ir smalka — `NaN !== NaN`, `-0 === 0`, `[1] + 1 === "11"`, precīza rekvizītu uzskaitīšanas secība un Promise mikrouzdevumu laiks. Bibliotēkai, kas izpilda lietotāja kodu JS, katru no šīm lietām ikreiz jānodrošina pareizi. test262 nosaka, ko nozīmē “pareizi”; ja rezultāts ir 100 %, programma JS, kas darbojas V8, rada baitu pa baitam identisku izvadi Phasis (izņemot tikai pārlūkprogrammām paredzētos API).
