Preskoči na vsebino

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:

Lupina
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:

Lupina
./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).