test262 aprėptis
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, 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 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:
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ą:
./bin/test262 --category built-ins/Array
./bin/test262 --category language/expressions/yield --failures
Visą vėliavėlių rinkinį rasite CLI žinyno skyriuje.
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).