Pokrytí testovací sady test262
test262 je oficiální testovací sada shody spravovaná TC39 a standardní způsob porovnávání modulů JavaScript.
Phasis prochází celou sadou s úspěšností 100 % ve všech kategoriích — sémantika jazyka, standardní knihovna, Intl, zastaralé webové funkce annexB, adresář rozpracovaných testů staging a samotestování testovacího rámce. Žádné obcházení příznaků funkcí, žádné položky na seznamu výjimek pro nedostatky hostitele ani vyloučení jednotlivých oddílů.
Verze sady je pevně stanovena: git submodul test262 určuje revizi, vůči níž se měří Phasis, a nové upstreamové testy se započítají až po aktualizaci submodulu. Úplný snímek sady v COMPAT.md znovu generuje workflow compat-matrix.yml, které se spouští ručně, nikoli při každém pushnutí; COMPAT.md zaznamenává čas pořízení snímku a odpovídající commit.
Pro srovnání: test262.fyi sleduje stejnou sadu vůči každému produkčnímu enginu JS:
| Engine | Shoda |
|---|---|
| V8 (Chrome / Node) | 99.8 % |
| SpiderMonkey (Firefox) | 99.6 % |
| JavaScriptCore (Safari) | 99.4 % |
| QuickJS | ~97 % |
| Hermes (React Native) | ~95 % |
| Phasis | 100 % |
Každý z těchto enginů má ještě drobné nedostatky (nově zařazené návrhy, rozpracované okrajové případy). Phasis tuto mezeru odstraňuje, protože je od základu navržen s důrazem na shodu se specifikací.
Spuštění lokálně
Spouštěč potřebuje submodul test262 a testovací třídy repozitáře, které nejsou součástí balíčku Composer, proto jej spusťte z klonu:
git clone https://github.com/inline0/phasis
cd phasis
git submodule update --init test262
composer install
./bin/test262 --jobs 4
Úplné spuštění trvá na novějším Macu přibližně 20 minut; CI rozdělí testy mezi paralelní úlohy a dokončí je za méně než 10 minut.
Při ladění můžete spustit jen jednu kategorii:
./bin/test262 --category built-ins/Array
./bin/test262 --category language/expressions/yield --failures
Úplnou sadu příznaků najdete v referenční příručce CLI.
Proč je to důležité
JavaScript má jemné sémantické nuance — NaN !== NaN, -0 === 0, [1] + 1 === "11", přesné pořadí výčtu vlastností i načasování mikrotasků Promise. Knihovna, která spouští uživatelský kód JS, musí pokaždé správně zvládnout vše z toho. test262 představuje měřítko správnosti; při úspěšnosti 100 % program JS spuštěný na V8 vytváří bajtově totožný výstup na Phasis (s výjimkou rozhraní dostupných pouze v prohlížeči).