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) fromconformance/test262.zig. Regenerate both withbun run docs:data.
How a test is run
The harness (conformance/test262.zig) walks the corpus and, for each .js file:
- Reads the frontmatter — the
/*--- … ---*/YAML block declaringflags(raw,onlyStrict,async,module),includes:harness files, andnegative:expectations. - Assembles the source — prepends
"use strict"whenonlyStrict, loads the real upstreamharness/sta.js+assert.jsplus anyincludes:, then appends the test body. - 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. - 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
| Axis | Passing | Total | Rate |
|---|---|---|---|
| VALID (can we run it) | 48506 | 48506 | 100% |
| NEGATIVE (strictness) | 4669 | 4669 | 100% |
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.
| Suite | Passing | Total | Rate |
|---|---|---|---|
| test/language/arguments-object | 262 | 262 | 100% |
| test/language/asi | 67 | 67 | 100% |
| test/language/block-scope | 43 | 43 | 100% |
| test/language/comments | 27 | 27 | 100% |
| test/language/computed-property-names | 48 | 48 | 100% |
| test/language/destructuring | 19 | 19 | 100% |
| test/language/directive-prologue | 51 | 51 | 100% |
| test/language/eval-code | 344 | 344 | 100% |
| test/language/export | 0 | 0 | 0% |
| test/language/expressions/addition | 48 | 48 | 100% |
| test/language/expressions/array | 52 | 52 | 100% |
| test/language/expressions/arrow-function | 250 | 250 | 100% |
| test/language/expressions/assignment | 395 | 395 | 100% |
| test/language/expressions/assignmenttargettype | 8 | 8 | 100% |
| test/language/expressions/async-arrow-function | 31 | 31 | 100% |
| test/language/expressions/async-function | 58 | 58 | 100% |
| test/language/expressions/async-generator | 537 | 537 | 100% |
| test/language/expressions/await | 19 | 19 | 100% |
| test/language/expressions/bitwise-and | 30 | 30 | 100% |
| test/language/expressions/bitwise-not | 16 | 16 | 100% |
| test/language/expressions/bitwise-or | 30 | 30 | 100% |
| test/language/expressions/bitwise-xor | 30 | 30 | 100% |
| test/language/expressions/call | 91 | 91 | 100% |
| test/language/expressions/class | 3448 | 3448 | 100% |
| test/language/expressions/coalesce | 20 | 20 | 100% |
| test/language/expressions/comma | 6 | 6 | 100% |
| test/language/expressions/compound-assignment | 420 | 420 | 100% |
| test/language/expressions/concatenation | 5 | 5 | 100% |
| test/language/expressions/conditional | 20 | 20 | 100% |
| test/language/expressions/delete | 67 | 67 | 100% |
| test/language/expressions/division | 45 | 45 | 100% |
| test/language/expressions/does-not-equals | 38 | 38 | 100% |
| test/language/expressions/dynamic-import | 628 | 628 | 100% |
| test/language/expressions/equals | 47 | 47 | 100% |
| test/language/expressions/exponentiation | 37 | 37 | 100% |
| test/language/expressions/function | 225 | 225 | 100% |
| test/language/expressions/generators | 249 | 249 | 100% |
| test/language/expressions/greater-than | 49 | 49 | 100% |
| test/language/expressions/greater-than-or-equal | 43 | 43 | 100% |
| test/language/expressions/grouping | 9 | 9 | 100% |
| test/language/expressions/import.meta | 10 | 10 | 100% |
| test/language/expressions/in | 27 | 27 | 100% |
| test/language/expressions/instanceof | 43 | 43 | 100% |
| test/language/expressions/left-shift | 45 | 45 | 100% |
| test/language/expressions/less-than | 45 | 45 | 100% |
| test/language/expressions/less-than-or-equal | 47 | 47 | 100% |
| test/language/expressions/logical-and | 18 | 18 | 100% |
| test/language/expressions/logical-assignment | 66 | 66 | 100% |
| test/language/expressions/logical-not | 19 | 19 | 100% |
| test/language/expressions/logical-or | 18 | 18 | 100% |
| test/language/expressions/member-expression | 1 | 1 | 100% |
| test/language/expressions/modulus | 40 | 40 | 100% |
| test/language/expressions/multiplication | 40 | 40 | 100% |
| test/language/expressions/new | 59 | 59 | 100% |
| test/language/expressions/new.target | 12 | 12 | 100% |
| test/language/expressions/object | 1007 | 1007 | 100% |
| test/language/expressions/optional-chaining | 26 | 26 | 100% |
| test/language/expressions/postfix-decrement | 27 | 27 | 100% |
| test/language/expressions/postfix-increment | 27 | 27 | 100% |
| test/language/expressions/prefix-decrement | 27 | 27 | 100% |
| test/language/expressions/prefix-increment | 27 | 27 | 100% |
| test/language/expressions/property-accessors | 20 | 20 | 100% |
| test/language/expressions/relational | 1 | 1 | 100% |
| test/language/expressions/right-shift | 37 | 37 | 100% |
| test/language/expressions/strict-does-not-equals | 30 | 30 | 100% |
| test/language/expressions/strict-equals | 30 | 30 | 100% |
| test/language/expressions/subtraction | 38 | 38 | 100% |
| test/language/expressions/super | 94 | 94 | 100% |
| test/language/expressions/tagged-template | 27 | 27 | 100% |
| test/language/expressions/tco-pos.js | 1 | 1 | 100% |
| test/language/expressions/template-literal | 41 | 41 | 100% |
| test/language/expressions/this | 5 | 5 | 100% |
| test/language/expressions/typeof | 16 | 16 | 100% |
| test/language/expressions/unary-minus | 14 | 14 | 100% |
| test/language/expressions/unary-plus | 17 | 17 | 100% |
| test/language/expressions/unsigned-right-shift | 45 | 45 | 100% |
| test/language/expressions/void | 9 | 9 | 100% |
| test/language/expressions/yield | 60 | 60 | 100% |
| test/language/function-code | 217 | 217 | 100% |
| test/language/future-reserved-words | 29 | 29 | 100% |
| test/language/global-code | 27 | 27 | 100% |
| test/language/identifier-resolution | 12 | 12 | 100% |
| test/language/identifiers | 152 | 152 | 100% |
| test/language/import | 114 | 114 | 100% |
| test/language/keywords | 0 | 0 | 0% |
| test/language/line-terminators | 17 | 17 | 100% |
| test/language/literals | 215 | 215 | 100% |
| test/language/module-code | 394 | 394 | 100% |
| test/language/punctuators | 1 | 1 | 100% |
| test/language/reserved-words | 14 | 14 | 100% |
| test/language/rest-parameters | 10 | 10 | 100% |
| test/language/source-text | 1 | 1 | 100% |
| test/language/statementList | 80 | 80 | 100% |
| test/language/statements/async-function | 47 | 47 | 100% |
| test/language/statements/async-generator | 268 | 268 | 100% |
| test/language/statements/await-using | 68 | 68 | 100% |
| test/language/statements/block | 7 | 7 | 100% |
| test/language/statements/break | 9 | 9 | 100% |
| test/language/statements/class | 3712 | 3712 | 100% |
| test/language/statements/const | 108 | 108 | 100% |
| test/language/statements/continue | 12 | 12 | 100% |
| test/language/statements/debugger | 1 | 1 | 100% |
| test/language/statements/do-while | 19 | 19 | 100% |
| test/language/statements/empty | 2 | 2 | 100% |
| test/language/statements/expression | 2 | 2 | 100% |
| test/language/statements/for | 336 | 336 | 100% |
| test/language/statements/for-await-of | 1142 | 1142 | 100% |
| test/language/statements/for-in | 53 | 53 | 100% |
| test/language/statements/for-of | 657 | 657 | 100% |
| test/language/statements/function | 391 | 391 | 100% |
| test/language/statements/generators | 234 | 234 | 100% |
| test/language/statements/if | 29 | 29 | 100% |
| test/language/statements/labeled | 10 | 10 | 100% |
| test/language/statements/let | 116 | 116 | 100% |
| test/language/statements/return | 6 | 6 | 100% |
| test/language/statements/switch | 36 | 36 | 100% |
| test/language/statements/throw | 14 | 14 | 100% |
| test/language/statements/try | 174 | 174 | 100% |
| test/language/statements/using | 49 | 49 | 100% |
| test/language/statements/variable | 130 | 130 | 100% |
| test/language/statements/while | 22 | 22 | 100% |
| test/language/statements/with | 165 | 165 | 100% |
| test/language/types | 102 | 102 | 100% |
| test/language/white-space | 61 | 61 | 100% |
| test/annexB | 1071 | 1071 | 100% |
| test/intl402/Array | 2 | 2 | 100% |
| test/intl402/BigInt | 11 | 11 | 100% |
| test/intl402/Collator | 65 | 65 | 100% |
| test/intl402/constructors-string-and-single-element-array.js | 1 | 1 | 100% |
| test/intl402/constructors-taint-Object-prototype-2.js | 1 | 1 | 100% |
| test/intl402/constructors-taint-Object-prototype.js | 1 | 1 | 100% |
| test/intl402/Date | 12 | 12 | 100% |
| test/intl402/DateTimeFormat | 244 | 244 | 100% |
| test/intl402/default-locale-is-canonicalized.js | 1 | 1 | 100% |
| test/intl402/default-locale-is-supported.js | 1 | 1 | 100% |
| test/intl402/DisplayNames | 57 | 57 | 100% |
| test/intl402/DurationFormat | 110 | 110 | 100% |
| test/intl402/fallback-locales-are-supported.js | 1 | 1 | 100% |
| test/intl402/FallbackSymbol | 2 | 2 | 100% |
| test/intl402/Intl | 66 | 66 | 100% |
| test/intl402/language-tags-canonicalized.js | 1 | 1 | 100% |
| test/intl402/language-tags-invalid.js | 1 | 1 | 100% |
| test/intl402/language-tags-valid.js | 1 | 1 | 100% |
| test/intl402/language-tags-with-underscore.js | 1 | 1 | 100% |
| test/intl402/ListFormat | 81 | 81 | 100% |
| test/intl402/Locale | 152 | 152 | 100% |
| test/intl402/Number | 7 | 7 | 100% |
| test/intl402/NumberFormat | 249 | 249 | 100% |
| test/intl402/PluralRules | 53 | 53 | 100% |
| test/intl402/RelativeTimeFormat | 80 | 80 | 100% |
| test/intl402/Segmenter | 79 | 79 | 100% |
| test/intl402/String | 19 | 19 | 100% |
| test/intl402/supportedLocalesOf-consistent-with-resolvedOptions.js | 1 | 1 | 100% |
| test/intl402/supportedLocalesOf-default-locale-and-zxx-locale.js | 1 | 1 | 100% |
| test/intl402/supportedLocalesOf-duplicate-elements-removed.js | 1 | 1 | 100% |
| test/intl402/supportedLocalesOf-empty-and-undefined.js | 1 | 1 | 100% |
| test/intl402/supportedLocalesOf-locales-arg-coered-to-object.js | 1 | 1 | 100% |
| test/intl402/supportedLocalesOf-locales-arg-empty-array.js | 1 | 1 | 100% |
| test/intl402/supportedLocalesOf-returned-array-elements-are-not-frozen.js | 1 | 1 | 100% |
| test/intl402/supportedLocalesOf-taint-Array-2.js | 1 | 1 | 100% |
| test/intl402/supportedLocalesOf-taint-Array.js | 1 | 1 | 100% |
| test/intl402/supportedLocalesOf-test-option-localeMatcher.js | 1 | 1 | 100% |
| test/intl402/supportedLocalesOf-throws-if-element-not-string-or-object.js | 1 | 1 | 100% |
| test/intl402/supportedLocalesOf-unicode-extensions-ignored.js | 1 | 1 | 100% |
| test/intl402/Temporal/Duration | 21 | 21 | 100% |
| test/intl402/Temporal/Instant | 17 | 17 | 100% |
| test/intl402/Temporal/Now | 3 | 3 | 100% |
| test/intl402/Temporal/PlainDate | 493 | 493 | 100% |
| test/intl402/Temporal/PlainDateTime | 483 | 483 | 100% |
| test/intl402/Temporal/PlainMonthDay/. | 2 | 2 | 100% |
| test/intl402/Temporal/PlainMonthDay/from | 56 | 56 | 100% |
| test/intl402/Temporal/PlainMonthDay/prototype/calendarId | 1 | 1 | 100% |
| test/intl402/Temporal/PlainMonthDay/prototype/equals | 4 | 4 | 100% |
| test/intl402/Temporal/PlainMonthDay/prototype/monthCode | 2 | 2 | 100% |
| test/intl402/Temporal/PlainMonthDay/prototype/toJSON | 2 | 2 | 100% |
| test/intl402/Temporal/PlainMonthDay/prototype/toLocaleString | 12 | 12 | 100% |
| test/intl402/Temporal/PlainMonthDay/prototype/toPlainDate | 1 | 1 | 100% |
| test/intl402/Temporal/PlainMonthDay/prototype/toString | 8 | 8 | 100% |
| test/intl402/Temporal/PlainMonthDay/prototype/with | 2 | 2 | 100% |
| test/intl402/Temporal/PlainTime | 12 | 12 | 100% |
| test/intl402/Temporal/PlainYearMonth | 327 | 327 | 100% |
| test/intl402/Temporal/ZonedDateTime | 583 | 583 | 100% |
| test/intl402/TypedArray | 1 | 1 | 100% |
| test/staging | 1476 | 1476 | 100% |
| test/built-ins/AbstractModuleSource | 8 | 8 | 100% |
| test/built-ins/AggregateError | 25 | 25 | 100% |
| test/built-ins/Array | 3081 | 3081 | 100% |
| test/built-ins/ArrayBuffer | 221 | 221 | 100% |
| test/built-ins/ArrayIteratorPrototype | 27 | 27 | 100% |
| test/built-ins/AsyncDisposableStack | 104 | 104 | 100% |
| test/built-ins/AsyncFromSyncIteratorPrototype | 38 | 38 | 100% |
| test/built-ins/AsyncFunction | 18 | 18 | 100% |
| test/built-ins/AsyncGeneratorFunction | 23 | 23 | 100% |
| test/built-ins/AsyncGeneratorPrototype | 48 | 48 | 100% |
| test/built-ins/AsyncIteratorPrototype | 13 | 13 | 100% |
| test/built-ins/Atomics | 390 | 390 | 100% |
| test/built-ins/BigInt | 77 | 77 | 100% |
| test/built-ins/Boolean | 51 | 51 | 100% |
| test/built-ins/DataView | 561 | 561 | 100% |
| test/built-ins/Date | 594 | 594 | 100% |
| test/built-ins/decodeURI | 55 | 55 | 100% |
| test/built-ins/decodeURIComponent | 56 | 56 | 100% |
| test/built-ins/DisposableStack | 93 | 93 | 100% |
| test/built-ins/encodeURI | 31 | 31 | 100% |
| test/built-ins/encodeURIComponent | 31 | 31 | 100% |
| test/built-ins/Error | 93 | 93 | 100% |
| test/built-ins/eval | 10 | 10 | 100% |
| test/built-ins/FinalizationRegistry | 47 | 47 | 100% |
| test/built-ins/Function | 509 | 509 | 100% |
| test/built-ins/GeneratorFunction | 23 | 23 | 100% |
| test/built-ins/GeneratorPrototype | 61 | 61 | 100% |
| test/built-ins/global | 29 | 29 | 100% |
| test/built-ins/Infinity | 6 | 6 | 100% |
| test/built-ins/isFinite | 15 | 15 | 100% |
| test/built-ins/isNaN | 15 | 15 | 100% |
| test/built-ins/Iterator | 514 | 514 | 100% |
| test/built-ins/JSON | 165 | 165 | 100% |
| test/built-ins/Map | 204 | 204 | 100% |
| test/built-ins/MapIteratorPrototype | 11 | 11 | 100% |
| test/built-ins/Math | 327 | 327 | 100% |
| test/built-ins/NaN | 6 | 6 | 100% |
| test/built-ins/NativeErrors | 94 | 94 | 100% |
| test/built-ins/Number | 340 | 340 | 100% |
| test/built-ins/Object | 3411 | 3411 | 100% |
| test/built-ins/parseFloat | 54 | 54 | 100% |
| test/built-ins/parseInt | 55 | 55 | 100% |
| test/built-ins/Promise | 677 | 677 | 100% |
| test/built-ins/Proxy | 311 | 311 | 100% |
| test/built-ins/Reflect | 153 | 153 | 100% |
| test/built-ins/RegExp/. | 488 | 488 | 100% |
| test/built-ins/RegExp/CharacterClassEscapes | 12 | 12 | 100% |
| test/built-ins/RegExp/dotall | 4 | 4 | 100% |
| test/built-ins/RegExp/escape | 20 | 20 | 100% |
| test/built-ins/RegExp/lookBehind | 17 | 17 | 100% |
| test/built-ins/RegExp/match-indices | 14 | 14 | 100% |
| test/built-ins/RegExp/named-groups | 36 | 36 | 100% |
| test/built-ins/RegExp/property-escapes/. | 2 | 2 | 100% |
| test/built-ins/RegExp/property-escapes/generated/.#0:20 | 20 | 20 | 100% |
| test/built-ins/RegExp/property-escapes/generated/.#20:20 | 20 | 20 | 100% |
| test/built-ins/RegExp/property-escapes/generated/.#40:20 | 20 | 20 | 100% |
| test/built-ins/RegExp/property-escapes/generated/.#60:20 | 20 | 20 | 100% |
| test/built-ins/RegExp/property-escapes/generated/.#80:20 | 20 | 20 | 100% |
| test/built-ins/RegExp/property-escapes/generated/.#100:20 | 20 | 20 | 100% |
| test/built-ins/RegExp/property-escapes/generated/.#120:20 | 20 | 20 | 100% |
| test/built-ins/RegExp/property-escapes/generated/.#140:20 | 20 | 20 | 100% |
| test/built-ins/RegExp/property-escapes/generated/.#160:20 | 20 | 20 | 100% |
| test/built-ins/RegExp/property-escapes/generated/.#180:20 | 20 | 20 | 100% |
| test/built-ins/RegExp/property-escapes/generated/.#200:20 | 20 | 20 | 100% |
| test/built-ins/RegExp/property-escapes/generated/.#220:20 | 20 | 20 | 100% |
| test/built-ins/RegExp/property-escapes/generated/.#240:20 | 20 | 20 | 100% |
| test/built-ins/RegExp/property-escapes/generated/.#260:20 | 20 | 20 | 100% |
| test/built-ins/RegExp/property-escapes/generated/.#280:20 | 20 | 20 | 100% |
| test/built-ins/RegExp/property-escapes/generated/.#300:20 | 20 | 20 | 100% |
| test/built-ins/RegExp/property-escapes/generated/.#320:20 | 20 | 20 | 100% |
| test/built-ins/RegExp/property-escapes/generated/.#340:20 | 20 | 20 | 100% |
| test/built-ins/RegExp/property-escapes/generated/.#360:20 | 20 | 20 | 100% |
| test/built-ins/RegExp/property-escapes/generated/.#380:20 | 20 | 20 | 100% |
| test/built-ins/RegExp/property-escapes/generated/.#400:20 | 20 | 20 | 100% |
| test/built-ins/RegExp/property-escapes/generated/.#420:25 | 21 | 21 | 100% |
| test/built-ins/RegExp/property-escapes/generated/strings | 7 | 7 | 100% |
| test/built-ins/RegExp/prototype | 458 | 458 | 100% |
| test/built-ins/RegExp/regexp-modifiers | 70 | 70 | 100% |
| test/built-ins/RegExp/Symbol.species | 4 | 4 | 100% |
| test/built-ins/RegExp/unicodeSets | 114 | 114 | 100% |
| test/built-ins/RegExpStringIteratorPrototype | 17 | 17 | 100% |
| test/built-ins/Set | 383 | 383 | 100% |
| test/built-ins/SetIteratorPrototype | 11 | 11 | 100% |
| test/built-ins/ShadowRealm | 64 | 64 | 100% |
| test/built-ins/SharedArrayBuffer | 104 | 104 | 100% |
| test/built-ins/String | 1223 | 1223 | 100% |
| test/built-ins/StringIteratorPrototype | 7 | 7 | 100% |
| test/built-ins/SuppressedError | 22 | 22 | 100% |
| test/built-ins/Symbol | 98 | 98 | 100% |
| test/built-ins/Temporal | 4603 | 4603 | 100% |
| test/built-ins/ThrowTypeError | 14 | 14 | 100% |
| test/built-ins/TypedArray | 1446 | 1446 | 100% |
| test/built-ins/TypedArrayConstructors | 738 | 738 | 100% |
| test/built-ins/Uint8Array | 70 | 70 | 100% |
| test/built-ins/undefined | 8 | 8 | 100% |
| test/built-ins/WeakMap | 141 | 141 | 100% |
| test/built-ins/WeakRef | 29 | 29 | 100% |
| test/built-ins/WeakSet | 85 | 85 | 100% |