Перейти до вмісту

Охоплення test262

Набір тестів test262 офіційно підтримується TC39 і є стандартним способом порівняння рушіїв JavaScript.

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

Версію набору зафіксовано: підмодуль test262 git закріплює ревізію, за якою вимірюють Phasis; нові тести з основного репозиторію враховуються лише після оновлення підмодуля. Знімок повного набору в COMPAT.md генерує робочий процес compat-matrix.yml, який запускають вручну, а не під час кожного надсилання змін; 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, доступних лише в браузері).