Dekking van test262
test262 is de officiële conformiteitstest-suite die door TC39 wordt onderhouden en de standaardmanier om JavaScript-engines te vergelijken.
Phasis slaagt voor de volledige suite met 100 % in elke categorie — taalsemantiek, de standaardbibliotheek, Intl, annexB-verouderde webfuncties, de staging-map met tests in ontwikkeling en de zelftests van de testharness. Geen omwegen via feature flags, geen uitzonderingen voor ontbrekende hostfunctionaliteit en geen uitsluitingen per shard.
De suite is vastgezet: de test262-git-submodule legt de revisie vast waartegen Phasis wordt gemeten, en nieuwe upstream-tests tellen pas mee nadat de submodule is bijgewerkt. De snapshot van de volledige suite in COMPAT.md wordt opnieuw gegenereerd door de compat-matrix.yml-workflow, die handmatig wordt gestart en niet bij elke push; COMPAT.md legt vast wanneer de snapshot is gemaakt en tegen welke commit.
Ter vergelijking: test262.fyi volgt dezelfde suite voor elke productie-JS-engine:
| Engine | Conformiteit |
|---|---|
| V8 (Chrome / Node) | 99.8 % |
| SpiderMonkey (Firefox) | 99.6 % |
| JavaScriptCore (Safari) | 99.4 % |
| QuickJS | ~97 % |
| Hermes (React Native) | ~95 % |
| Phasis | 100 % |
Deze engines hebben elk nog een kleine achterstand (nieuw geïmplementeerde voorstellen en zeldzame randgevallen waaraan nog wordt gewerkt). Phasis dicht het gat doordat het een implementatie is die zich uitsluitend op conformiteit richt.
Lokaal uitvoeren
De runner heeft de test262-submodule en de testklassen van de repository nodig. Geen van beide wordt meegeleverd in het Composer-pakket, dus voer de runner uit vanuit een clone:
git clone https://github.com/inline0/phasis
cd phasis
git submodule update --init test262
composer install
./bin/test262 --jobs 4
Een volledige uitvoering duurt op een recente Mac ongeveer 20 minuten; de CI-matrix verdeelt het werk parallel en is binnen enkele minuten klaar.
Voer tijdens het debuggen één categorie uit:
./bin/test262 --category built-ins/Array
./bin/test262 --category language/expressions/yield --failures
Zie de CLI-referentie voor alle beschikbare flags.
Waarom dit ertoe doet
JavaScript heeft subtiele semantiek — NaN !== NaN, -0 === 0, [1] + 1 === "11", de exacte volgorde waarin eigenschappen worden opgesomd en het tijdstip van Promise-microtaken. Een bibliotheek die JS gebruikerscode uitvoert, moet al die zaken elke keer goed afhandelen. test262 is de norm voor "goed"; als een JS programma er voor 100 % in slaagt, produceert het op V8 byte-identieke uitvoer als op Phasis (met uitzondering van browser-API's).