Przejdź do treści

Zgodność test262

test262 to oficjalny zestaw testów zgodności utrzymywany przez TC39 i kanoniczny sposób porównywania silników JavaScript.

Phasis przechodzi cały zestaw testów w 100 % we wszystkich kategoriach — semantykę języka, bibliotekę standardową, Intl, annexB starsze funkcje internetowe, katalog staging zawierający testy na etapie inkubacji oraz autotesty zestawu. Bez omijania przez flagi funkcji, wpisów na liście blokad luk hosta ani wykluczeń według fragmentów.

Zestaw jest przypięty do konkretnej wersji: podmoduł git test262 ustala rewizję, względem której mierzony jest Phasis, a nowe testy z upstreamu są uwzględniane dopiero po zaktualizowaniu podmodułu. Pełny obraz testów zapisany w COMPAT.md jest generowany przez workflow compat-matrix.yml uruchamiany ręcznie, a nie przy każdym pushu; COMPAT.md zapisuje datę wykonania obrazu i użyty commit.

Dla porównania test262.fyi sprawdza ten sam zestaw testów względem każdego silnika JS używanego produkcyjnie:

Silnik Zgodność
V8 (Chrome / Node) 99.8 %
SpiderMonkey (Firefox) 99.6 %
JavaScriptCore (Safari) 99.4 %
QuickJS ~97 %
Hermes (React Native) ~95 %
Phasis 100 %

W każdym z tych silników pozostaje niewielka luka (nowo wdrożone propozycje, rzadkie przypadki brzegowe w trakcie tworzenia). Phasis wypełnia tę lukę, ponieważ jest implementacją przeznaczoną wyłącznie do zapewniania zgodności.

Uruchamianie lokalne

Runner wymaga podmodułu test262 i klas testowych repozytorium, których nie ma w pakiecie Composer, dlatego uruchom go z klonu:

Powłoka
git clone https://github.com/inline0/phasis
cd phasis
git submodule update --init test262
composer install
./bin/test262 --jobs 4

Pełny przebieg na nowszym Macu trwa około 20 minut; zadania w macierzy CI działają równolegle i kończą się w kilka minut.

Aby podczas debugowania uruchomić tylko jedną kategorię:

Powłoka
./bin/test262 --category built-ins/Array
./bin/test262 --category language/expressions/yield --failures

Pełną listę flag znajdziesz w referencji CLI.

Dlaczego to ważne

JavaScript ma subtelną semantykę — NaN !== NaN, -0 === 0, [1] + 1 === "11", dokładną kolejność wyliczania właściwości i moment wykonywania mikrozadań Promise. Biblioteka uruchamiająca kod użytkownika JS musi za każdym razem poprawnie obsługiwać każdy z tych elementów. Miara poprawności to test262; wynik 100 % oznacza, że program JS działający w V8 generuje identyczne bajtowo dane wyjściowe w Phasis (z wyjątkiem interfejsów API dostępnych tylko w przeglądarce).