test262pokritost
test262 je uradni nabor testov skladnosti, ki ga vzdržuje TC39, in kanonični način za primerjavo mehanizmov JavaScript.
Phasis opravi celoten nabor pri 100 % v vseh kategorijah — semantika jezika, standardna knjižnica, Intl, annexB zastarele spletne funkcije, imenik staging z nastajajočimi testi in samopreizkusi testnega ogrodja. Brez obvozov z zastavicami funkcij, seznamov blokiranih vrzeli gostitelja ali izključitev posameznih razdelkov.
Nabor testov ima določeno revizijo: podmodul test262 git določa revizijo, glede na katero se meri Phasis, novi nadaljnji testi pa štejejo šele po posodobitvi podmodula. Posnetek celotnega nabora v COMPAT.md znova ustvari potek dela compat-matrix.yml, ki se zažene ročno, ne ob vsakem potisku; COMPAT.md beleži, kdaj je bil posnetek narejen in glede na kateri commit.
Za primerjavo: test262.fyi spremlja isti nabor testov za vsak produkcijski mehanizem JS:
| Mehanizem | Skladnost |
|---|---|
| V8 (Chrome / Node) | 99.8 % |
| SpiderMonkey (Firefox) | 99.6 % |
| JavaScriptCore (Safari) | 99.4 % |
| QuickJS | ~97 % |
| Hermes (React Native) | ~95 % |
| Phasis | 100 % |
Vsak od teh mehanizmov ima še manjšo vrzel (novejši predlogi, redki robni primeri v razvoju). Phasis jo odpravi, ker je implementacija namensko zasnovana z mislijo na skladnost.
Lokalni zagon
Zaganjalnik potrebuje podmodul test262 in testne razrede iz repozitorija, ki niso vključeni v paket Composer, zato ga zaženite iz klona:
git clone https://github.com/inline0/phasis
cd phasis
git submodule update --init test262
composer install
./bin/test262 --jobs 4
Celoten zagon na novejšem Macu traja približno 20 minut; matrika CI razdeli delo na dele, ki se izvajajo vzporedno, in ga dokonča v nekaj minutah.
Med razhroščevanjem zaženite samo eno kategorijo:
./bin/test262 --category built-ins/Array
./bin/test262 --category language/expressions/yield --failures
Celoten nabor zastavic najdete v referenci CLI.
Zakaj je to pomembno
JavaScript ima subtilno semantiko — NaN !== NaN, -0 === 0, [1] + 1 === "11", natančno zaporedje naštevanja lastnosti in čas izvajanja mikroopravil Promise. Knjižnica, ki izvaja uporabniško kodo JS, mora vse to vsakič pravilno obravnavati. Merilo pravilnosti je test262; pri 100 % uspešnosti program JS, ki teče v V8, ustvari bajtno enak izhod v Phasis (razen API-jev, ki so na voljo samo v brskalnikih).