Покрытие 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, доступных только в браузере).