zig-js

test262 Conformance

On this page 5

zig-js is scored against the real tc39/test262 corpus from the pinned test262/ submodule through the configured runner. Progress is a number, not a vibe, but the number only covers tests the configured runner actually scores.

Sources. Numbers come from docs/.data/test262.json; runner scope (subtrees, skips, exclusions, timeouts) from conformance/test262.zig. Regenerate both with bun run docs:data.

test262 · valid — can we run it? 100%
48506 / 48506 valid tests passing · real (pinned tc39/test262 submodule) · updated 2026-07-28
48506
passing
0
parse-fail
0
runtime-fail
100%
negative (strictness)
0
skipped

How a test is run

The harness (conformance/test262.zig) walks the corpus and, for each .js file:

  1. Reads the frontmatter — the /*--- … ---*/ YAML block declaring flags (raw, onlyStrict, async, module), includes: harness files, and negative: expectations.
  2. Assembles the source — prepends "use strict" when onlyStrict, loads the real upstream harness/sta.js + assert.js plus any includes:, then appends the test body.
  3. Runs it in an isolated subprocess worker under a 30-second backstop timeout (120 s for a few known-slow sweeps), where a timeout is charged as a host failure. Each worker streams one <index>:<outcome> line per test. If a worker crashes or times out, the parent respawns it just past the failure — so a single segfault or hang can never zero out a run. The parent exits non-zero if any aggregate parse, runtime, host, negative, or skip count is non-zero.
  4. Scores the outcome on one of two axes.

Two axes

Valid and negative tests measure different things, so they are scored separately:

  • VALID — "can we run it?" pass + parse-fail + runtime-fail + host-fail. This is the headline metric.
  • NEGATIVE — "do we reject bad input?" pass-negative + fail-negative.

Skipped tests are excluded from both denominators. The configured runner currently has zero unsupported metadata skips; docs/.data/test262-skips.tsv is still generated as the audit file.

The configured runner also has zero excluded files; docs/.data/test262-excluded.tsv is still generated as the audit file. Two non-normative SpiderMonkey staging files (sm/regress/regress-602621.js and sm/lexical-environment/block-scoped-functions-annex-b-arguments.js) are removed from the configured corpus definition before scoring because their pending Annex B block-scoped-function expectations contradict the normative Annex B tests in test/annexB. They are not skip-list or exclusion-list entries. Proper-tail-call coverage, dynamic-import catch-target behavior, import-defer async-module behavior, plain modules, module+async/top-level-await graph-ordering tests, plain async tests, and CanBlockIsFalse tests are part of the runner where supported.

The denominator is the configured subtree list in conformance/test262.zig; directories not enumerated there are outside the measurement entirely — distinct from skipped (unsupported metadata) and excluded/removed (corpus-definition) files. So 100% means 100% of the configured corpus, not of every path under test262/test.

Current numbers

AxisPassingTotalRate
VALID (can we run it)4850648506100%
NEGATIVE (strictness)46694669100%

Failure shape on the VALID axis: 0 parse-fail · 0 runtime-fail · 0 host-fail. Skipped: 0.

Per-suite breakdown

The table below is populated only when docs/.data/test262.json was regenerated from a saved run that includes subtree lines. If the suite list is empty, do not invent rows; rerun or parse a saved transcript with bun run docs:data -- --from run.txt.

SuitePassingTotalRate
test/language/arguments-object262262100%
test/language/asi6767100%
test/language/block-scope4343100%
test/language/comments2727100%
test/language/computed-property-names4848100%
test/language/destructuring1919100%
test/language/directive-prologue5151100%
test/language/eval-code344344100%
test/language/export000%
test/language/expressions/addition4848100%
test/language/expressions/array5252100%
test/language/expressions/arrow-function250250100%
test/language/expressions/assignment395395100%
test/language/expressions/assignmenttargettype88100%
test/language/expressions/async-arrow-function3131100%
test/language/expressions/async-function5858100%
test/language/expressions/async-generator537537100%
test/language/expressions/await1919100%
test/language/expressions/bitwise-and3030100%
test/language/expressions/bitwise-not1616100%
test/language/expressions/bitwise-or3030100%
test/language/expressions/bitwise-xor3030100%
test/language/expressions/call9191100%
test/language/expressions/class34483448100%
test/language/expressions/coalesce2020100%
test/language/expressions/comma66100%
test/language/expressions/compound-assignment420420100%
test/language/expressions/concatenation55100%
test/language/expressions/conditional2020100%
test/language/expressions/delete6767100%
test/language/expressions/division4545100%
test/language/expressions/does-not-equals3838100%
test/language/expressions/dynamic-import628628100%
test/language/expressions/equals4747100%
test/language/expressions/exponentiation3737100%
test/language/expressions/function225225100%
test/language/expressions/generators249249100%
test/language/expressions/greater-than4949100%
test/language/expressions/greater-than-or-equal4343100%
test/language/expressions/grouping99100%
test/language/expressions/import.meta1010100%
test/language/expressions/in2727100%
test/language/expressions/instanceof4343100%
test/language/expressions/left-shift4545100%
test/language/expressions/less-than4545100%
test/language/expressions/less-than-or-equal4747100%
test/language/expressions/logical-and1818100%
test/language/expressions/logical-assignment6666100%
test/language/expressions/logical-not1919100%
test/language/expressions/logical-or1818100%
test/language/expressions/member-expression11100%
test/language/expressions/modulus4040100%
test/language/expressions/multiplication4040100%
test/language/expressions/new5959100%
test/language/expressions/new.target1212100%
test/language/expressions/object10071007100%
test/language/expressions/optional-chaining2626100%
test/language/expressions/postfix-decrement2727100%
test/language/expressions/postfix-increment2727100%
test/language/expressions/prefix-decrement2727100%
test/language/expressions/prefix-increment2727100%
test/language/expressions/property-accessors2020100%
test/language/expressions/relational11100%
test/language/expressions/right-shift3737100%
test/language/expressions/strict-does-not-equals3030100%
test/language/expressions/strict-equals3030100%
test/language/expressions/subtraction3838100%
test/language/expressions/super9494100%
test/language/expressions/tagged-template2727100%
test/language/expressions/tco-pos.js11100%
test/language/expressions/template-literal4141100%
test/language/expressions/this55100%
test/language/expressions/typeof1616100%
test/language/expressions/unary-minus1414100%
test/language/expressions/unary-plus1717100%
test/language/expressions/unsigned-right-shift4545100%
test/language/expressions/void99100%
test/language/expressions/yield6060100%
test/language/function-code217217100%
test/language/future-reserved-words2929100%
test/language/global-code2727100%
test/language/identifier-resolution1212100%
test/language/identifiers152152100%
test/language/import114114100%
test/language/keywords000%
test/language/line-terminators1717100%
test/language/literals215215100%
test/language/module-code394394100%
test/language/punctuators11100%
test/language/reserved-words1414100%
test/language/rest-parameters1010100%
test/language/source-text11100%
test/language/statementList8080100%
test/language/statements/async-function4747100%
test/language/statements/async-generator268268100%
test/language/statements/await-using6868100%
test/language/statements/block77100%
test/language/statements/break99100%
test/language/statements/class37123712100%
test/language/statements/const108108100%
test/language/statements/continue1212100%
test/language/statements/debugger11100%
test/language/statements/do-while1919100%
test/language/statements/empty22100%
test/language/statements/expression22100%
test/language/statements/for336336100%
test/language/statements/for-await-of11421142100%
test/language/statements/for-in5353100%
test/language/statements/for-of657657100%
test/language/statements/function391391100%
test/language/statements/generators234234100%
test/language/statements/if2929100%
test/language/statements/labeled1010100%
test/language/statements/let116116100%
test/language/statements/return66100%
test/language/statements/switch3636100%
test/language/statements/throw1414100%
test/language/statements/try174174100%
test/language/statements/using4949100%
test/language/statements/variable130130100%
test/language/statements/while2222100%
test/language/statements/with165165100%
test/language/types102102100%
test/language/white-space6161100%
test/annexB10711071100%
test/intl402/Array22100%
test/intl402/BigInt1111100%
test/intl402/Collator6565100%
test/intl402/constructors-string-and-single-element-array.js11100%
test/intl402/constructors-taint-Object-prototype-2.js11100%
test/intl402/constructors-taint-Object-prototype.js11100%
test/intl402/Date1212100%
test/intl402/DateTimeFormat244244100%
test/intl402/default-locale-is-canonicalized.js11100%
test/intl402/default-locale-is-supported.js11100%
test/intl402/DisplayNames5757100%
test/intl402/DurationFormat110110100%
test/intl402/fallback-locales-are-supported.js11100%
test/intl402/FallbackSymbol22100%
test/intl402/Intl6666100%
test/intl402/language-tags-canonicalized.js11100%
test/intl402/language-tags-invalid.js11100%
test/intl402/language-tags-valid.js11100%
test/intl402/language-tags-with-underscore.js11100%
test/intl402/ListFormat8181100%
test/intl402/Locale152152100%
test/intl402/Number77100%
test/intl402/NumberFormat249249100%
test/intl402/PluralRules5353100%
test/intl402/RelativeTimeFormat8080100%
test/intl402/Segmenter7979100%
test/intl402/String1919100%
test/intl402/supportedLocalesOf-consistent-with-resolvedOptions.js11100%
test/intl402/supportedLocalesOf-default-locale-and-zxx-locale.js11100%
test/intl402/supportedLocalesOf-duplicate-elements-removed.js11100%
test/intl402/supportedLocalesOf-empty-and-undefined.js11100%
test/intl402/supportedLocalesOf-locales-arg-coered-to-object.js11100%
test/intl402/supportedLocalesOf-locales-arg-empty-array.js11100%
test/intl402/supportedLocalesOf-returned-array-elements-are-not-frozen.js11100%
test/intl402/supportedLocalesOf-taint-Array-2.js11100%
test/intl402/supportedLocalesOf-taint-Array.js11100%
test/intl402/supportedLocalesOf-test-option-localeMatcher.js11100%
test/intl402/supportedLocalesOf-throws-if-element-not-string-or-object.js11100%
test/intl402/supportedLocalesOf-unicode-extensions-ignored.js11100%
test/intl402/Temporal/Duration2121100%
test/intl402/Temporal/Instant1717100%
test/intl402/Temporal/Now33100%
test/intl402/Temporal/PlainDate493493100%
test/intl402/Temporal/PlainDateTime483483100%
test/intl402/Temporal/PlainMonthDay/.22100%
test/intl402/Temporal/PlainMonthDay/from5656100%
test/intl402/Temporal/PlainMonthDay/prototype/calendarId11100%
test/intl402/Temporal/PlainMonthDay/prototype/equals44100%
test/intl402/Temporal/PlainMonthDay/prototype/monthCode22100%
test/intl402/Temporal/PlainMonthDay/prototype/toJSON22100%
test/intl402/Temporal/PlainMonthDay/prototype/toLocaleString1212100%
test/intl402/Temporal/PlainMonthDay/prototype/toPlainDate11100%
test/intl402/Temporal/PlainMonthDay/prototype/toString88100%
test/intl402/Temporal/PlainMonthDay/prototype/with22100%
test/intl402/Temporal/PlainTime1212100%
test/intl402/Temporal/PlainYearMonth327327100%
test/intl402/Temporal/ZonedDateTime583583100%
test/intl402/TypedArray11100%
test/staging14761476100%
test/built-ins/AbstractModuleSource88100%
test/built-ins/AggregateError2525100%
test/built-ins/Array30813081100%
test/built-ins/ArrayBuffer221221100%
test/built-ins/ArrayIteratorPrototype2727100%
test/built-ins/AsyncDisposableStack104104100%
test/built-ins/AsyncFromSyncIteratorPrototype3838100%
test/built-ins/AsyncFunction1818100%
test/built-ins/AsyncGeneratorFunction2323100%
test/built-ins/AsyncGeneratorPrototype4848100%
test/built-ins/AsyncIteratorPrototype1313100%
test/built-ins/Atomics390390100%
test/built-ins/BigInt7777100%
test/built-ins/Boolean5151100%
test/built-ins/DataView561561100%
test/built-ins/Date594594100%
test/built-ins/decodeURI5555100%
test/built-ins/decodeURIComponent5656100%
test/built-ins/DisposableStack9393100%
test/built-ins/encodeURI3131100%
test/built-ins/encodeURIComponent3131100%
test/built-ins/Error9393100%
test/built-ins/eval1010100%
test/built-ins/FinalizationRegistry4747100%
test/built-ins/Function509509100%
test/built-ins/GeneratorFunction2323100%
test/built-ins/GeneratorPrototype6161100%
test/built-ins/global2929100%
test/built-ins/Infinity66100%
test/built-ins/isFinite1515100%
test/built-ins/isNaN1515100%
test/built-ins/Iterator514514100%
test/built-ins/JSON165165100%
test/built-ins/Map204204100%
test/built-ins/MapIteratorPrototype1111100%
test/built-ins/Math327327100%
test/built-ins/NaN66100%
test/built-ins/NativeErrors9494100%
test/built-ins/Number340340100%
test/built-ins/Object34113411100%
test/built-ins/parseFloat5454100%
test/built-ins/parseInt5555100%
test/built-ins/Promise677677100%
test/built-ins/Proxy311311100%
test/built-ins/Reflect153153100%
test/built-ins/RegExp/.488488100%
test/built-ins/RegExp/CharacterClassEscapes1212100%
test/built-ins/RegExp/dotall44100%
test/built-ins/RegExp/escape2020100%
test/built-ins/RegExp/lookBehind1717100%
test/built-ins/RegExp/match-indices1414100%
test/built-ins/RegExp/named-groups3636100%
test/built-ins/RegExp/property-escapes/.22100%
test/built-ins/RegExp/property-escapes/generated/.#0:202020100%
test/built-ins/RegExp/property-escapes/generated/.#20:202020100%
test/built-ins/RegExp/property-escapes/generated/.#40:202020100%
test/built-ins/RegExp/property-escapes/generated/.#60:202020100%
test/built-ins/RegExp/property-escapes/generated/.#80:202020100%
test/built-ins/RegExp/property-escapes/generated/.#100:202020100%
test/built-ins/RegExp/property-escapes/generated/.#120:202020100%
test/built-ins/RegExp/property-escapes/generated/.#140:202020100%
test/built-ins/RegExp/property-escapes/generated/.#160:202020100%
test/built-ins/RegExp/property-escapes/generated/.#180:202020100%
test/built-ins/RegExp/property-escapes/generated/.#200:202020100%
test/built-ins/RegExp/property-escapes/generated/.#220:202020100%
test/built-ins/RegExp/property-escapes/generated/.#240:202020100%
test/built-ins/RegExp/property-escapes/generated/.#260:202020100%
test/built-ins/RegExp/property-escapes/generated/.#280:202020100%
test/built-ins/RegExp/property-escapes/generated/.#300:202020100%
test/built-ins/RegExp/property-escapes/generated/.#320:202020100%
test/built-ins/RegExp/property-escapes/generated/.#340:202020100%
test/built-ins/RegExp/property-escapes/generated/.#360:202020100%
test/built-ins/RegExp/property-escapes/generated/.#380:202020100%
test/built-ins/RegExp/property-escapes/generated/.#400:202020100%
test/built-ins/RegExp/property-escapes/generated/.#420:252121100%
test/built-ins/RegExp/property-escapes/generated/strings77100%
test/built-ins/RegExp/prototype458458100%
test/built-ins/RegExp/regexp-modifiers7070100%
test/built-ins/RegExp/Symbol.species44100%
test/built-ins/RegExp/unicodeSets114114100%
test/built-ins/RegExpStringIteratorPrototype1717100%
test/built-ins/Set383383100%
test/built-ins/SetIteratorPrototype1111100%
test/built-ins/ShadowRealm6464100%
test/built-ins/SharedArrayBuffer104104100%
test/built-ins/String12231223100%
test/built-ins/StringIteratorPrototype77100%
test/built-ins/SuppressedError2222100%
test/built-ins/Symbol9898100%
test/built-ins/Temporal46034603100%
test/built-ins/ThrowTypeError1414100%
test/built-ins/TypedArray14461446100%
test/built-ins/TypedArrayConstructors738738100%
test/built-ins/Uint8Array7070100%
test/built-ins/undefined88100%
test/built-ins/WeakMap141141100%
test/built-ins/WeakRef2929100%
test/built-ins/WeakSet8585100%

Some rows are individual files or worker shards (e.g. …generated/.#0:20) rather than directories, reflecting how the runner sub-divides large subtrees.

These figures are read from docs/.data/test262.json, regenerated by bun run docs:data. Run the suite, regenerate, rebuild — the whole site reflects the new run.

Remaining High-Impact Work

The configured runner has zero skips, zero excluded files, and no VALID failure tail in the checked-in run. Keep that invariant from regressing; separately, audit anything outside the configured denominator:

  • When using a saved transcript, keep docs/.data/test262-run-*.txt and docs/.data/test262.json paired. Otherwise regenerate docs/.data/test262.json directly with bun run docs:data.
  • Keep docs/.data/test262-skips.tsv in sync with zig-out/bin/test262 --list-skips.
  • Keep docs/.data/test262-excluded.tsv in sync with zig-out/bin/test262 --list-excluded.
  • Treat removed corpus inputs as a corpus-definition audit: keep the list tiny, source-specific, and justified against a stronger normative test.
  • Keep README/docs claims tied to either docs/.data/test262.json, conformance/test262.zig, or a committed run transcript.