test262-kattavuus
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 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 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:
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:
./bin/test262 --category built-ins/Array
./bin/test262 --category language/expressions/yield --failures
Katso CLI-viitteestä 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).