test262 coverage
test262 is the official conformance test suite maintained by TC39. It is the canonical way to compare JavaScript engines.
Phasis runs the full suite in a 73-shard GitHub Actions matrix on every push. The current numbers:
| Total | Pass | Fail | Skip | Pass rate |
|---|---|---|---|---|
| 50,506 | 50,506 | 0 | 0 | 100 % |
Every test in the official suite passes. Zero failures. Zero skips. No feature-flag bypasses, no host-gap blocklist entries, no per-shard exclusions.
Comparison with other engines
test262.fyi runs the same suite daily against every production JS engine. The numbers below are from the latest published runs.
| Engine | Compliance |
|---|---|
| V8 (Chrome / Node) | 99.8 % |
| SpiderMonkey (Firefox) | 99.6 % |
| JavaScriptCore (Safari) | 99.4 % |
| QuickJS | ~97 % |
| Hermes (React Native) | ~95 % |
| Phasis | 100 % |
Phasis sits ahead of every production JavaScript engine on raw conformance — including V8, SpiderMonkey, and JavaScriptCore. Those engines each carry a small residual gap (newly-landed proposals, rare edge cases under construction) that Phasis closes by virtue of being a single-purpose conformance-first implementation.
Coverage by category
| Category | Pass | Fail | Skip |
|---|---|---|---|
language/* (syntax, semantics) | 23,384 | 0 | 0 |
built-ins/* (standard library) | 22,729 | 0 | 0 |
intl402/* (Intl spec) | 1,566 | 0 | 0 |
annexB/* (legacy web features) | 1,079 | 0 | 0 |
staging/* (incubating tests) | 1,632 | 0 | 0 |
harness/* (harness self-tests) | 116 | 0 | 0 |
Every category, sub-category, and individual test in the upstream suite at the pinned revision passes.
How the last fixtures landed
The final push to 100 % closed two distinct gaps:
- SM stress fixtures — the dst-offset-caching shards, the Sputnik decodeURI / decodeURIComponent UTF-8 sweep, and the SM typed-array / nullish-coalescing assert loops were previously blocklisted pending a bytecode JIT. They now pass under the bytecode VM with a per-test budget bump for tests promoted to single-file chunks via
test262_isolated_testsinconfig/support.php. - Chinese-calendar uncommon-leap-month — the SM
from-chinese-leap-month-uncommon.jsfixture asserts thatTemporal.PlainMonthDay.from({calendar:"chinese", monthCode:"M09L"..."M12L", day:30})succeeds. Those values resolve to ISO reference years as far back as -6482, outside the range our ICU-derived calendar table covered. A pure-PHP Reingold-Dershowitz extension to the chinese / dangi tables (Calendrical Calculations §19; Meeus algorithms for solar / lunar longitude and new-moon estimation) now covers extended-year -7500 through 3500. No ICU dependency at codegen or runtime.
HOST_GAP_BLOCKLIST and CROSS_REALM_BLOCKLIST in tests/Oracle/Test262Runner.php are now both empty.
How we run it
./vendor/bin/test262 --jobs 4Locally this takes ~20 min on a recent Mac. The CI matrix shards the suite across 73 parallel workers and finishes in ~7 min wall-clock.
The latest compatibility snapshot is committed to COMPAT.md on every successful CI run. See the CI workflow for the full matrix definition.
Regressions are blocked at merge
./bin/verify-all runs the full quality gate locally:
- PHPStan level 6 (zero errors)
- PHP_CodeSniffer (zero warnings)
- PHPUnit (118 / 118 pass)
- Oracle scenarios (12 / 12 pass)
Plus the test262 matrix on every PR. A change that drops the pass count is rejected automatically — and at 100 % the only way it can move is down, so the bar is unambiguous.