Skip to content

Fix Failed Tests summary missing assertion failures#111

Merged
frostney merged 1 commit into
mainfrom
fix/testrunner-silent-failures
Mar 23, 2026
Merged

Fix Failed Tests summary missing assertion failures#111
frostney merged 1 commit into
mainfrom
fix/testrunner-silent-failures

Conversation

@frostney
Copy link
Copy Markdown
Owner

Summary

  • Fix FailedTestDetails list (shown in Failed Tests: summary line and JSON output) to include plain assertion failures
  • Previously only exception-based failures and promise rejections were captured — expect(1).toBe(2) failures set the test's failure flag but were never added to the summary
  • Use a FailureRecorded flag to avoid duplicating entries already added by exception/promise handlers

Before: Failed Tests: line was empty even when tests failed via assertions
After: Failed Tests: Test "this should fail",Test "addition" in suite "math"

Test plan

  • Interpreter: 3501 passed, 0 failed, 41 skipped
  • Bytecode: 3501 passed, 0 failed, 0 skipped
  • Verified assertion failures now appear in Failed Tests: summary
  • Verified exception/promise failures still appear (no duplicates)

🤖 Generated with Claude Code

The FailedTestDetails list (shown in "Failed Tests:" summary and JSON
output) only captured exception-based failures and promise rejections.
Plain assertion failures like expect(1).toBe(2) set the test's failure
flag but were never added to FailedTestDetails, making the summary line
empty even when tests failed.

Add assertion-failed tests to FailedTestDetails after EndTest, guarded
by a FailureRecorded flag to avoid duplicating entries already added by
exception/promise handlers.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Mar 23, 2026

Warning

Rate limit exceeded

@frostney has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 22 minutes and 26 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: bf080866-2806-41c2-8c29-56f1686636ec

📥 Commits

Reviewing files that changed from the base of the PR and between f2e66e5 and ee6fedc.

📒 Files selected for processing (1)
  • units/Goccia.Builtins.TestAssertions.pas
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/testrunner-silent-failures

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link
Copy Markdown
Contributor

Benchmark Results

254 benchmarks

Interpreted: 🟢 2 improved · 252 unchanged · avg +0.2%
Bytecode: 🟢 25 improved · 🔴 1 regressed · 228 unchanged · avg +3.1%

arraybuffer.js — Interp: 14 unch. · avg -1.3% · Bytecode: 14 unch. · avg +2.6%
Benchmark Interpreted Δ Bytecode Δ
create ArrayBuffer(0) 453,800 → 446,111 -1.7% 163,367 → 165,935 +1.6%
create ArrayBuffer(64) 445,029 → 432,729 -2.8% 160,504 → 165,436 +3.1%
create ArrayBuffer(1024) 339,293 → 330,906 -2.5% 141,282 → 146,264 +3.5%
create ArrayBuffer(8192) 143,296 → 143,227 -0.0% 82,386 → 86,455 +4.9%
slice full buffer (64 bytes) 524,596 → 516,264 -1.6% 406,110 → 413,271 +1.8%
slice half buffer (512 of 1024 bytes) 443,269 → 441,961 -0.3% 351,750 → 360,793 +2.6%
slice with negative indices 450,637 → 435,272 -3.4% 380,892 → 388,573 +2.0%
slice empty range 510,465 → 499,852 -2.1% 392,618 → 404,970 +3.1%
byteLength access 1,551,580 → 1,609,135 +3.7% 1,215,168 → 1,251,077 +3.0%
Symbol.toStringTag access 1,153,012 → 1,173,927 +1.8% 692,855 → 692,871 +0.0%
ArrayBuffer.isView 780,718 → 774,205 -0.8% 574,323 → 594,831 +3.6%
clone ArrayBuffer(64) 440,657 → 423,816 -3.8% 397,994 → 400,569 +0.6%
clone ArrayBuffer(1024) 332,821 → 322,324 -3.2% 279,660 → 293,329 +4.9%
clone ArrayBuffer inside object 272,734 → 267,131 -2.1% 195,667 → 197,781 +1.1%
arrays.js — Interp: 19 unch. · avg +0.0% · Bytecode: 19 unch. · avg +0.9%
Benchmark Interpreted Δ Bytecode Δ
Array.from length 100 13,630 → 13,690 +0.4% 14,992 → 14,522 -3.1%
Array.from 10 elements 236,331 → 235,931 -0.2% 176,488 → 186,951 +5.9%
Array.of 10 elements 323,848 → 321,657 -0.7% 245,426 → 257,387 +4.9%
spread into new array 336,389 → 331,481 -1.5% 876,417 → 864,034 -1.4%
map over 50 elements 27,674 → 27,704 +0.1% 25,272 → 25,337 +0.3%
filter over 50 elements 23,364 → 23,761 +1.7% 23,978 → 24,206 +1.0%
reduce sum 50 elements 26,928 → 27,105 +0.7% 21,961 → 21,356 -2.8%
forEach over 50 elements 23,409 → 23,200 -0.9% 28,342 → 27,273 -3.8%
find in 50 elements 35,464 → 35,218 -0.7% 31,465 → 31,825 +1.1%
sort 20 elements 11,899 → 12,348 +3.8% 12,758 → 12,730 -0.2%
flat nested array 115,877 → 116,845 +0.8% 478,628 → 482,629 +0.8%
flatMap 72,944 → 71,823 -1.5% 326,775 → 317,535 -2.8%
map inside map (5x5) 21,745 → 21,697 -0.2% 106,647 → 104,975 -1.6%
filter inside map (5x10) 15,975 → 16,123 +0.9% 14,560 → 15,380 +5.6%
reduce inside map (5x10) 19,694 → 19,744 +0.3% 15,204 → 15,616 +2.7%
forEach inside forEach (5x10) 17,177 → 17,128 -0.3% 17,195 → 17,721 +3.1%
find inside some (10x10) 14,117 → 14,026 -0.6% 12,007 → 12,315 +2.6%
map+filter chain nested (5x20) 5,442 → 5,483 +0.8% 4,890 → 5,081 +3.9%
reduce flatten (10x5) 39,148 → 38,172 -2.5% 6,696 → 6,770 +1.1%
async-await.js — Interp: 6 unch. · avg -0.5% · Bytecode: 6 unch. · avg +1.0%
Benchmark Interpreted Δ Bytecode Δ
single await 377,873 → 376,436 -0.4% 300,449 → 306,663 +2.1%
multiple awaits 169,229 → 168,360 -0.5% 131,841 → 130,374 -1.1%
await non-Promise value 853,572 → 857,384 +0.4% 1,032,512 → 1,038,124 +0.5%
await with try/catch 369,242 → 363,901 -1.4% 298,465 → 298,673 +0.1%
await Promise.all 50,759 → 50,160 -1.2% 46,181 → 47,098 +2.0%
nested async function call 189,633 → 189,624 -0.0% 224,605 → 229,576 +2.2%
classes.js — Interp: 31 unch. · avg +0.6% · Bytecode: 🟢 1, 30 unch. · avg +3.4%
Benchmark Interpreted Δ Bytecode Δ
simple class new 135,637 → 136,277 +0.5% 388,623 → 404,844 +4.2%
class with defaults 105,938 → 108,002 +1.9% 279,125 → 288,767 +3.5%
50 instances via Array.from 5,507 → 5,503 -0.1% 7,334 → 7,439 +1.4%
instance method call 66,703 → 66,521 -0.3% 179,523 → 183,876 +2.4%
static method call 110,714 → 110,583 -0.1% 402,940 → 402,296 -0.2%
single-level inheritance 53,895 → 53,938 +0.1% 168,265 → 171,205 +1.7%
two-level inheritance 45,996 → 46,789 +1.7% 136,993 → 141,256 +3.1%
private field access 70,717 → 70,734 +0.0% 188,691 → 192,887 +2.2%
private methods 77,680 → 76,867 -1.0% 239,141 → 248,534 +3.9%
getter/setter access 74,917 → 75,041 +0.2% 181,705 → 189,251 +4.2%
class decorator (identity) 91,545 → 91,197 -0.4% 59,588 → 64,166 🟢 +7.7%
class decorator (wrapping) 53,302 → 53,795 +0.9% 42,769 → 45,054 +5.3%
identity method decorator 63,682 → 63,714 +0.1% 46,940 → 46,002 -2.0%
wrapping method decorator 51,294 → 51,803 +1.0% 42,580 → 45,139 +6.0%
stacked method decorators (x3) 34,579 → 34,638 +0.2% 29,062 → 30,517 +5.0%
identity field decorator 69,833 → 70,320 +0.7% 48,930 → 51,883 +6.0%
field initializer decorator 59,025 → 59,058 +0.1% 44,458 → 46,421 +4.4%
getter decorator (identity) 64,226 → 64,565 +0.5% 44,395 → 46,706 +5.2%
setter decorator (identity) 54,204 → 54,610 +0.7% 38,730 → 40,575 +4.8%
static method decorator 69,253 → 69,932 +1.0% 70,707 → 73,276 +3.6%
static field decorator 80,575 → 80,478 -0.1% 72,683 → 76,346 +5.0%
private method decorator 52,727 → 52,830 +0.2% 41,189 → 42,701 +3.7%
private field decorator 58,098 → 58,750 +1.1% 41,991 → 43,751 +4.2%
plain auto-accessor (no decorator) 100,741 → 103,237 +2.5% 59,616 → 62,160 +4.3%
auto-accessor with decorator 53,677 → 53,904 +0.4% 39,575 → 41,440 +4.7%
decorator writing metadata 44,071 → 44,041 -0.1% 44,404 → 46,647 +5.1%
static getter read 126,442 → 129,130 +2.1% 418,230 → 426,280 +1.9%
static getter/setter pair 100,312 → 100,374 +0.1% 228,186 → 228,983 +0.3%
inherited static getter 76,577 → 78,015 +1.9% 288,541 → 292,902 +1.5%
inherited static setter 82,714 → 82,978 +0.3% 223,314 → 226,493 +1.4%
inherited static getter with this binding 70,718 → 71,610 +1.3% 173,857 → 177,306 +2.0%
closures.js — Interp: 11 unch. · avg -0.9% · Bytecode: 11 unch. · avg +2.2%
Benchmark Interpreted Δ Bytecode Δ
closure over single variable 132,937 → 130,369 -1.9% 773,567 → 786,421 +1.7%
closure over multiple variables 121,568 → 119,657 -1.6% 469,528 → 486,360 +3.6%
nested closures 127,269 → 125,891 -1.1% 671,294 → 666,731 -0.7%
function as argument 95,861 → 93,943 -2.0% 687,656 → 712,970 +3.7%
function returning function 118,615 → 118,505 -0.1% 761,131 → 758,894 -0.3%
compose two functions 71,190 → 70,572 -0.9% 466,594 → 466,863 +0.1%
fn.call 143,880 → 147,821 +2.7% 142,289 → 150,768 +6.0%
fn.apply 112,457 → 112,516 +0.1% 97,231 → 99,952 +2.8%
fn.bind 135,603 → 134,155 -1.1% 143,540 → 148,615 +3.5%
recursive sum to 50 11,507 → 11,258 -2.2% 52,396 → 52,781 +0.7%
recursive tree traversal 19,630 → 19,179 -2.3% 75,719 → 78,072 +3.1%
collections.js — Interp: 12 unch. · avg -0.6% · Bytecode: 12 unch. · avg +2.0%
Benchmark Interpreted Δ Bytecode Δ
add 50 elements 7,099 → 7,106 +0.1% 5,959 → 6,080 +2.0%
has lookup (50 elements) 89,141 → 88,815 -0.4% 90,342 → 89,931 -0.5%
delete elements 47,944 → 48,325 +0.8% 38,208 → 38,884 +1.8%
forEach iteration 15,618 → 15,271 -2.2% 17,608 → 18,067 +2.6%
spread to array 27,530 → 27,928 +1.4% 153,332 → 155,863 +1.7%
deduplicate array 39,171 → 39,282 +0.3% 50,173 → 51,815 +3.3%
set 50 entries 5,186 → 5,075 -2.1% 6,180 → 6,212 +0.5%
get lookup (50 entries) 86,124 → 85,430 -0.8% 97,365 → 97,893 +0.5%
has check 127,510 → 127,134 -0.3% 154,443 → 157,280 +1.8%
delete entries 45,181 → 44,867 -0.7% 36,197 → 36,799 +1.7%
forEach iteration 15,890 → 15,325 -3.6% 17,363 → 17,995 +3.6%
keys/values/entries 7,606 → 7,644 +0.5% 21,778 → 22,773 +4.6%
destructuring.js — Interp: 22 unch. · avg +0.8% · Bytecode: 🟢 1, 21 unch. · avg +2.7%
Benchmark Interpreted Δ Bytecode Δ
simple array destructuring 402,677 → 399,692 -0.7% 1,012,878 → 1,047,202 +3.4%
with rest element 270,384 → 278,909 +3.2% 741,992 → 746,565 +0.6%
with defaults 411,945 → 432,429 +5.0% 945,945 → 1,004,049 +6.1%
skip elements 421,640 → 422,851 +0.3% 1,180,572 → 1,141,000 -3.4%
nested array destructuring 172,354 → 173,486 +0.7% 490,668 → 531,646 🟢 +8.4%
swap variables 511,179 → 505,153 -1.2% 1,285,518 → 1,349,397 +5.0%
simple object destructuring 309,885 → 307,783 -0.7% 628,387 → 632,360 +0.6%
with defaults 349,913 → 359,694 +2.8% 333,424 → 349,862 +4.9%
with renaming 309,033 → 322,159 +4.2% 733,990 → 740,360 +0.9%
nested object destructuring 142,463 → 143,496 +0.7% 283,721 → 293,615 +3.5%
rest properties 187,034 → 185,193 -1.0% 228,690 → 236,913 +3.6%
object parameter 92,570 → 92,582 +0.0% 203,798 → 211,117 +3.6%
array parameter 124,431 → 122,463 -1.6% 415,332 → 424,411 +2.2%
mixed destructuring in map 35,129 → 35,334 +0.6% 37,818 → 38,755 +2.5%
forEach with array destructuring 65,438 → 65,980 +0.8% 199,116 → 204,819 +2.9%
map with array destructuring 66,188 → 67,097 +1.4% 246,211 → 258,054 +4.8%
filter with array destructuring 69,376 → 69,494 +0.2% 290,644 → 300,758 +3.5%
reduce with array destructuring 74,206 → 75,421 +1.6% 274,502 → 278,941 +1.6%
map with object destructuring 79,119 → 80,523 +1.8% 79,323 → 81,259 +2.4%
map with nested destructuring 64,826 → 65,512 +1.1% 66,917 → 68,505 +2.4%
map with rest in destructuring 38,352 → 37,586 -2.0% 24,116 → 23,832 -1.2%
map with defaults in destructuring 59,097 → 59,182 +0.1% 40,275 → 41,049 +1.9%
fibonacci.js — Interp: 8 unch. · avg -2.4% · Bytecode: 8 unch. · avg +1.8%
Benchmark Interpreted Δ Bytecode Δ
recursive fib(15) 314 → 304 -3.3% 1,448 → 1,424 -1.7%
recursive fib(20) 29 → 27 -4.1% 131 → 133 +1.6%
recursive fib(15) typed 320 → 308 -3.7% 1,937 → 1,977 +2.0%
recursive fib(20) typed 29 → 27 -4.0% 178 → 177 -0.3%
iterative fib(20) via reduce 12,227 → 12,244 +0.1% 9,338 → 9,795 +4.9%
iterator fib(20) 9,338 → 9,439 +1.1% 16,603 → 16,812 +1.3%
iterator fib(20) via Iterator.from + take 15,074 → 14,744 -2.2% 17,710 → 18,490 +4.4%
iterator fib(20) last value via reduce 11,590 → 11,206 -3.3% 13,541 → 13,866 +2.4%
for-of.js — Interp: 7 unch. · avg +0.5% · Bytecode: 🟢 1, 6 unch. · avg +3.4%
Benchmark Interpreted Δ Bytecode Δ
for...of with 10-element array 44,312 → 44,727 +0.9% 160,104 → 167,704 +4.7%
for...of with 100-element array 5,069 → 5,110 +0.8% 24,555 → 24,706 +0.6%
for...of with string (10 chars) 32,712 → 33,303 +1.8% 127,963 → 132,295 +3.4%
for...of with Set (10 elements) 44,750 → 44,807 +0.1% 167,588 → 174,850 +4.3%
for...of with Map entries (10 entries) 28,964 → 28,754 -0.7% 45,285 → 49,340 🟢 +9.0%
for...of with destructuring 38,134 → 38,299 +0.4% 76,465 → 80,279 +5.0%
for-await-of with sync array 43,018 → 43,130 +0.3% 144,615 → 139,909 -3.3%
iterators.js — Interp: 20 unch. · avg -0.9% · Bytecode: 🟢 1, 19 unch. · avg +1.3%
Benchmark Interpreted Δ Bytecode Δ
Iterator.from({next}).toArray() — 20 elements 15,249 → 15,101 -1.0% 19,052 → 18,837 -1.1%
Iterator.from({next}).toArray() — 50 elements 6,710 → 6,617 -1.4% 8,119 → 8,270 +1.9%
spread pre-wrapped iterator — 20 elements 11,230 → 11,331 +0.9% 16,935 → 18,062 +6.7%
Iterator.from({next}).forEach — 50 elements 4,706 → 4,586 -2.6% 5,766 → 5,924 +2.7%
Iterator.from({next}).reduce — 50 elements 4,764 → 4,612 -3.2% 5,413 → 5,533 +2.2%
wrap array iterator 171,900 → 175,729 +2.2% 109,901 → 118,538 🟢 +7.9%
wrap plain {next()} object 10,731 → 10,651 -0.7% 13,752 → 13,199 -4.0%
map + toArray (50 elements) 4,837 → 4,694 -3.0% 5,966 → 6,119 +2.6%
filter + toArray (50 elements) 4,666 → 4,546 -2.6% 5,774 → 6,013 +4.1%
take(10) + toArray (50 element source) 27,890 → 27,502 -1.4% 31,539 → 31,067 -1.5%
drop(40) + toArray (50 element source) 6,716 → 6,710 -0.1% 9,080 → 8,721 -4.0%
chained map + filter + take (100 element source) 8,664 → 8,364 -3.5% 10,519 → 10,219 -2.8%
some + every (50 elements) 2,757 → 2,651 -3.8% 3,837 → 3,694 -3.7%
find (50 elements) 5,962 → 5,935 -0.5% 7,781 → 7,978 +2.5%
array.values().map().filter().toArray() 8,923 → 8,844 -0.9% 10,478 → 10,552 +0.7%
array.values().take(5).toArray() 210,795 → 211,578 +0.4% 151,020 → 153,446 +1.6%
array.values().drop(45).toArray() 197,462 → 202,105 +2.4% 141,531 → 146,685 +3.6%
map.entries() chained helpers 10,729 → 10,573 -1.5% 5,679 → 5,723 +0.8%
set.values() chained helpers 18,765 → 18,420 -1.8% 22,007 → 22,722 +3.3%
string iterator map + toArray 13,250 → 13,731 +3.6% 22,586 → 22,984 +1.8%
json.js — Interp: 20 unch. · avg +0.3% · Bytecode: 🟢 3, 🔴 1, 16 unch. · avg +4.6%
Benchmark Interpreted Δ Bytecode Δ
parse simple object 167,193 → 166,831 -0.2% 143,673 → 147,952 +3.0%
parse nested object 100,536 → 100,419 -0.1% 93,511 → 97,353 +4.1%
parse array of objects 53,478 → 54,222 +1.4% 50,230 → 51,192 +1.9%
parse large flat object 48,179 → 48,875 +1.4% 42,856 → 45,698 +6.6%
parse mixed types 69,432 → 69,614 +0.3% 59,652 → 62,279 +4.4%
stringify simple object 198,405 → 196,148 -1.1% 159,327 → 170,992 🟢 +7.3%
stringify nested object 104,818 → 109,194 +4.2% 86,785 → 91,279 +5.2%
stringify array of objects 59,636 → 62,577 +4.9% 50,835 → 54,154 +6.5%
stringify mixed types 86,992 → 88,380 +1.6% 72,470 → 77,477 +6.9%
reviver doubles numbers 43,918 → 42,918 -2.3% 42,137 → 44,009 +4.4%
reviver filters properties 37,363 → 37,326 -0.1% 48,494 → 50,670 +4.5%
reviver on nested object 49,905 → 48,811 -2.2% 54,099 → 50,298 🔴 -7.0%
reviver on array 28,957 → 28,618 -1.2% 30,490 → 31,044 +1.8%
replacer function doubles numbers 47,827 → 47,140 -1.4% 45,697 → 52,565 🟢 +15.0%
replacer function excludes properties 60,303 → 59,629 -1.1% 61,433 → 64,457 +4.9%
array replacer (allowlist) 114,230 → 115,773 +1.4% 93,832 → 97,734 +4.2%
stringify with 2-space indent 96,566 → 97,104 +0.6% 80,517 → 84,010 +4.3%
stringify with tab indent 96,230 → 95,737 -0.5% 80,632 → 84,595 +4.9%
parse then stringify 52,543 → 52,326 -0.4% 48,386 → 52,224 🟢 +7.9%
stringify then parse 31,097 → 31,395 +1.0% 31,069 → 31,669 +1.9%
jsx.jsx — Interp: 21 unch. · avg -1.1% · Bytecode: 🟢 4, 17 unch. · avg +4.5%
Benchmark Interpreted Δ Bytecode Δ
simple element 206,169 → 208,533 +1.1% 748,773 → 772,346 +3.1%
self-closing element 216,026 → 210,572 -2.5% 785,419 → 790,473 +0.6%
element with string attribute 176,470 → 170,606 -3.3% 557,036 → 553,718 -0.6%
element with multiple attributes 153,916 → 153,135 -0.5% 462,065 → 478,796 +3.6%
element with expression attribute 165,049 → 161,389 -2.2% 545,359 → 541,832 -0.6%
text child 209,262 → 205,207 -1.9% 730,388 → 780,258 +6.8%
expression child 204,757 → 207,080 +1.1% 749,336 → 780,519 +4.2%
mixed text and expression 193,949 → 189,702 -2.2% 676,955 → 719,063 +6.2%
nested elements (3 levels) 77,505 → 76,224 -1.7% 293,206 → 301,151 +2.7%
sibling children 58,011 → 57,214 -1.4% 217,101 → 223,968 +3.2%
component element 147,324 → 145,559 -1.2% 505,597 → 519,488 +2.7%
component with children 91,327 → 88,594 -3.0% 322,339 → 325,750 +1.1%
dotted component 123,587 → 124,549 +0.8% 383,572 → 401,902 +4.8%
empty fragment 223,074 → 211,650 -5.1% 772,687 → 804,374 +4.1%
fragment with children 58,085 → 57,229 -1.5% 205,496 → 232,032 🟢 +12.9%
spread attributes 107,629 → 107,605 -0.0% 122,006 → 132,125 🟢 +8.3%
spread with overrides 92,768 → 94,045 +1.4% 92,616 → 103,173 🟢 +11.4%
shorthand props 159,631 → 159,411 -0.1% 491,765 → 508,364 +3.4%
nav bar structure 26,959 → 27,083 +0.5% 88,186 → 95,401 🟢 +8.2%
card component tree 31,459 → 31,545 +0.3% 100,554 → 106,432 +5.8%
10 list items via Array.from 14,805 → 14,435 -2.5% 24,426 → 25,029 +2.5%
numbers.js — Interp: 11 unch. · avg -1.6% · Bytecode: 11 unch. · avg +2.1%
Benchmark Interpreted Δ Bytecode Δ
integer arithmetic 532,878 → 525,420 -1.4% 2,040,491 → 2,037,558 -0.1%
floating point arithmetic 537,865 → 563,356 +4.7% 2,298,467 → 2,298,590 +0.0%
number coercion 180,752 → 172,763 -4.4% 161,902 → 170,043 +5.0%
toFixed 102,861 → 99,919 -2.9% 228,390 → 227,368 -0.4%
toString 158,335 → 154,437 -2.5% 877,986 → 866,300 -1.3%
valueOf 228,666 → 216,111 -5.5% 1,335,013 → 1,316,366 -1.4%
toPrecision 145,654 → 140,062 -3.8% 453,767 → 459,075 +1.2%
Number.isNaN 307,168 → 308,087 +0.3% 212,386 → 219,592 +3.4%
Number.isFinite 307,491 → 302,401 -1.7% 217,908 → 231,589 +6.3%
Number.isInteger 304,218 → 303,934 -0.1% 227,483 → 239,290 +5.2%
Number.parseInt and parseFloat 250,094 → 248,624 -0.6% 171,219 → 180,380 +5.4%
objects.js — Interp: 7 unch. · avg -1.2% · Bytecode: 🟢 1, 6 unch. · avg +3.5%
Benchmark Interpreted Δ Bytecode Δ
create simple object 499,054 → 468,080 -6.2% 954,198 → 985,306 +3.3%
create nested object 220,417 → 221,975 +0.7% 416,636 → 424,707 +1.9%
create 50 objects via Array.from 9,486 → 9,272 -2.3% 8,770 → 8,653 -1.3%
property read 588,402 → 597,379 +1.5% 806,152 → 831,483 +3.1%
Object.keys 284,472 → 279,875 -1.6% 190,146 → 203,121 +6.8%
Object.entries 101,298 → 101,641 +0.3% 62,738 → 63,495 +1.2%
spread operator 180,936 → 179,252 -0.9% 178,251 → 194,942 🟢 +9.4%
promises.js — Interp: 12 unch. · avg -0.1% · Bytecode: 🟢 7, 5 unch. · avg +8.2%
Benchmark Interpreted Δ Bytecode Δ
Promise.resolve(value) 557,606 → 554,403 -0.6% 368,401 → 361,714 -1.8%
new Promise(resolve => resolve(value)) 194,498 → 190,639 -2.0% 144,366 → 161,674 🟢 +12.0%
Promise.reject(reason) 552,745 → 552,029 -0.1% 352,715 → 373,000 +5.8%
resolve + then (1 handler) 176,070 → 174,398 -0.9% 149,743 → 159,968 +6.8%
resolve + then chain (3 deep) 69,040 → 67,995 -1.5% 60,985 → 68,216 🟢 +11.9%
resolve + then chain (10 deep) 21,842 → 22,326 +2.2% 20,638 → 23,205 🟢 +12.4%
reject + catch + then 99,970 → 100,907 +0.9% 93,820 → 98,587 +5.1%
resolve + finally + then 84,900 → 84,435 -0.5% 78,869 → 81,759 +3.7%
Promise.all (5 resolved) 31,450 → 32,034 +1.9% 26,098 → 28,197 🟢 +8.0%
Promise.race (5 resolved) 33,395 → 33,387 -0.0% 27,924 → 30,733 🟢 +10.1%
Promise.allSettled (5 mixed) 26,097 → 26,202 +0.4% 21,519 → 24,216 🟢 +12.5%
Promise.any (5 mixed) 31,338 → 31,152 -0.6% 26,417 → 29,616 🟢 +12.1%
strings.js — Interp: 11 unch. · avg -0.3% · Bytecode: 🟢 5, 6 unch. · avg +6.3%
Benchmark Interpreted Δ Bytecode Δ
string concatenation 394,723 → 405,414 +2.7% 372,479 → 426,153 🟢 +14.4%
template literal 679,277 → 648,702 -4.5% 684,030 → 787,306 🟢 +15.1%
string repeat 399,807 → 401,100 +0.3% 1,110,930 → 1,120,892 +0.9%
split and join 133,513 → 133,633 +0.1% 320,964 → 335,706 +4.6%
indexOf and includes 161,653 → 163,527 +1.2% 766,481 → 766,758 +0.0%
toUpperCase and toLowerCase 248,888 → 252,354 +1.4% 715,118 → 786,793 🟢 +10.0%
slice and substring 156,012 → 156,306 +0.2% 892,919 → 882,100 -1.2%
trim operations 183,917 → 191,828 +4.3% 645,388 → 738,249 🟢 +14.4%
replace and replaceAll 203,890 → 203,914 +0.0% 597,582 → 667,808 🟢 +11.8%
startsWith and endsWith 129,141 → 124,841 -3.3% 670,440 → 641,055 -4.4%
padStart and padEnd 193,028 → 182,523 -5.4% 672,578 → 694,467 +3.3%
typed-arrays.js — Interp: 🟢 2, 20 unch. · avg +5.7% · Bytecode: 🟢 1, 21 unch. · avg +2.1%
Benchmark Interpreted Δ Bytecode Δ
new Int32Array(0) 328,095 → 317,945 -3.1% 138,110 → 140,218 +1.5%
new Int32Array(100) 302,493 → 299,171 -1.1% 134,723 → 135,297 +0.4%
new Int32Array(1000) 172,088 → 171,161 -0.5% 76,800 → 81,268 +5.8%
new Float64Array(100) 271,040 → 270,085 -0.4% 116,517 → 118,762 +1.9%
Int32Array.from([...]) 179,600 → 184,398 +2.7% 150,495 → 167,882 🟢 +11.6%
Int32Array.of(1, 2, 3, 4, 5) 317,998 → 322,195 +1.3% 268,915 → 272,635 +1.4%
sequential write 100 elements 3,507 → 3,546 +1.1% 15,323 → 15,482 +1.0%
sequential read 100 elements 3,601 → 3,587 -0.4% 11,096 → 11,335 +2.2%
Float64Array write 100 elements 3,234 → 3,261 +0.8% 14,613 → 14,794 +1.2%
fill(42) 46,458 → 45,742 -1.5% 44,710 → 44,551 -0.4%
slice() 205,989 → 205,297 -0.3% 189,157 → 186,572 -1.4%
map(x => x * 2) 8,005 → 8,050 +0.6% 8,286 → 8,499 +2.6%
filter(x => x > 50) 8,293 → 8,361 +0.8% 8,551 → 8,798 +2.9%
reduce (sum) 7,689 → 7,858 +2.2% 7,197 → 7,409 +2.9%
sort() 133,502 → 170,141 🟢 +27.4% 152,206 → 152,732 +0.3%
indexOf() 448,236 → 453,549 +1.2% 375,610 → 386,244 +2.8%
reverse() 180,987 → 337,640 🟢 +86.6% 281,532 → 284,452 +1.0%
create view over existing buffer 413,703 → 417,827 +1.0% 155,937 → 155,131 -0.5%
subarray() 458,546 → 464,971 +1.4% 362,102 → 374,484 +3.4%
set() from array 578,565 → 580,197 +0.3% 277,090 → 281,009 +1.4%
for-of loop 4,839 → 4,916 +1.6% 20,898 → 21,349 +2.2%
spread into array 16,095 → 16,559 +2.9% 56,287 → 57,420 +2.0%

Measured on ubuntu-latest x64. Changes within ±7% are considered insignificant.

@github-actions
Copy link
Copy Markdown
Contributor

Suite Timing

Suite Metric Interpreted Bytecode
Tests Total 3501 3501
Tests Passed 3460 ✅ 3501 ✅
Tests Skipped 41 0
Tests Execution 143.8ms 146.9ms
Tests Engine 283.2ms 537.7ms
Benchmarks Total 254 254
Benchmarks Duration 6.93min 12.39min

Measured on ubuntu-latest x64.

@frostney frostney merged commit 5dfaebd into main Mar 23, 2026
9 checks passed
@frostney frostney deleted the fix/testrunner-silent-failures branch March 23, 2026 11:18
@frostney frostney added the bug Something isn't working label Apr 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant