Перейти к содержимому

Покрытие test262

test262 — официальный набор тестов на соответствие, который поддерживает TC39; это стандартный способ сравнивать движки JavaScript.

Phasis проходит весь набор с результатом 100 % во всех категориях: семантика языка, стандартная библиотека, Intl, устаревшие веб-возможности annexB, каталог с новыми тестами staging и самотесты тестовой среды. Нет обхода с помощью флагов функций, списков исключений из-за ограничений хоста или исключений для отдельных сегментов.

Версия набора зафиксирована: подмодуль test262 git определяет ревизию, относительно которой измеряется Phasis, а новые тесты из основного репозитория учитываются только после обновления подмодуля. Снимок результатов полного набора в COMPAT.md обновляется рабочим процессом compat-matrix.yml, который запускают вручную, а не при каждом push; в COMPAT.md указаны дата создания снимка и соответствующий коммит.

Для сравнения, test262.fyi запускает тот же набор тестов для каждого выпускаемого движка JS:

Движок Соответствие
V8 (Chrome / Node) 99.8 %
SpiderMonkey (Firefox) 99.6 %
JavaScriptCore (Safari) 99.4 %
QuickJS ~97 %
Hermes (React Native) ~95 %
Phasis 100 %

В каждом из этих движков остаётся небольшой пробел (недавно добавленные предложения и редкие крайние случаи, ещё находящиеся в разработке). Phasis устраняет этот пробел, поскольку это специализированная реализация, в которой соответствие спецификации — главный приоритет.

Локальный запуск

Для запуска нужны подмодуль test262 и тестовые классы репозитория; в пакет Composer они не входят, поэтому запускайте тесты из клона репозитория:

Командная оболочка
git clone https://github.com/inline0/phasis
cd phasis
git submodule update --init test262
composer install
./bin/test262 --jobs 4

Полный запуск на современном Mac занимает около 20 минут; CI параллельно разбивает тесты на части и завершает работу за несколько минут.

Чтобы во время отладки запустить только одну категорию:

Командная оболочка
./bin/test262 --category built-ins/Array
./bin/test262 --category language/expressions/yield --failures

Полный список флагов см. в справочнике CLI.

Почему это важно

JavaScript имеет тонкие семантические нюансы — NaN !== NaN, -0 === 0, [1] + 1 === "11", точный порядок перечисления свойств, время выполнения микрозадач Promise. Библиотека, запускающая пользовательский код JS, должна каждый раз правильно обрабатывать все эти случаи. test262 задает планку «правильности»; прохождение на 100 % означает, что программа JS, выполняемая на V8, выдает побайтно идентичный результат на Phasis (за исключением API, доступных только в браузере).