
# test262-kattavuus

[test262](https://github.com/tc39/test262) on TC39:n ylläpitämä virallinen vaatimustenmukaisuustestisarja ja kanoninen tapa vertailla JavaScript-moottoreita.

Phasis läpäisee **koko testisarjan tuloksella 100 %** kaikissa luokissa — kielen semantiikka, standardikirjasto, `Intl`, `annexB` vanhat verkko-ominaisuudet, keskeneräisten testien `staging`-hakemisto ja testiharnessin itsetestit. Ei ohituksia ominaisuuslipuilla, ei isäntäympäristön puutteiden estolistamerkintöjä eikä shard-kohtaisia poissulkuja.

Testisarjan versio on lukittu: `test262`-git-alimoduuli määrittää version, jota vasten Phasis mitataan. Uudet upstream-testit lasketaan mukaan vasta alimoduulin päivityksen jälkeen. Koko testisarjan tilannekuva tiedostossa [`COMPAT.md`](https://github.com/inline0/phasis/blob/main/COMPAT.md) luodaan uudelleen `compat-matrix.yml`-työnkululla, joka käynnistetään käsin eikä jokaisen pushin yhteydessä; `COMPAT.md` kertoo, milloin tilannekuva otettiin ja mitä committia vasten.

Vertailun vuoksi [test262.fyi](https://test262.fyi) seuraa saman testisarjan tuloksia jokaisessa tuotantokäytössä olevassa JS-moottorissa:

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

Jokaisessa näistä moottoreista on pieni jäljellä oleva puute (juuri hyväksytyt ehdotukset, kehitteillä olevat harvinaiset reunatapaukset). Phasis kuroo eron umpeen, koska se on yksinomaan vaatimustenmukaisuuteen keskittyvä toteutus.

## Suorittaminen paikallisesti

Suoritusohjelma tarvitsee `test262`-alimoduulin ja repositorion testiluokat. Kumpikaan ei sisälly Composer-pakettiin, joten suorita se kloonista:

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

Täysi suoritus kestää uudehkolla Macilla noin 20 minuuttia; CI-matriisi jakaa testit rinnakkaisiin osiin ja valmistuu muutamassa minuutissa.

Suorita virheenjäljityksen aikana vain yksi luokka:

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

Katso [CLI-viitteestä](https://phasis.inline0.dev/fi/docs/cli#bin-test262) kaikki liput.

## Miksi tällä on merkitystä

JavaScript-kielellä on hienovarainen semantiikka — `NaN !== NaN`, `-0 === 0`, `[1] + 1 === "11"`, ominaisuuksien luetteloinnin tarkka järjestys ja Promise-mikrotehtävien ajoitus. Kirjaston, joka suorittaa JS-käyttäjäkoodia, on käsiteltävä nämä kaikki oikein joka kerta. test262 määrittää, mitä ”oikein” tarkoittaa; tulos 100 % tarkoittaa, että JS-ohjelma tuottaa V8-ympäristössä tavu tavulta saman tulosteen kuin Phasis-ympäristössä (vain selaimille tarkoitettuja rajapintoja lukuun ottamatta).
