From 29956daa94aeee9c01d57b6a80f509e96515e3e2 Mon Sep 17 00:00:00 2001 From: robobun <117481402+robobun@users.noreply.github.com> Date: Tue, 16 Jun 2026 22:08:12 +0000 Subject: [PATCH 1/5] cli(test): --coverage-reporter and --coverage-dir imply --coverage Passing --coverage-reporter=lcov without --coverage silently produced no coverage output. Same for --coverage-dir. Both flags now enable coverage when passed on the CLI. bunfig.toml keys (coverageReporter, coverageDir) are intentionally left alone so a preconfigured reporter doesn't force coverage on every test run; the explicit coverage = true key already exists for that. Fixes #17502 --- src/runtime/cli/Arguments.rs | 2 + test/cli/test/coverage.test.ts | 73 +++++++++++++++++++++++++++++++++- 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/src/runtime/cli/Arguments.rs b/src/runtime/cli/Arguments.rs index 7e8e01ffc65b..7fe1f33895fc 100644 --- a/src/runtime/cli/Arguments.rs +++ b/src/runtime/cli/Arguments.rs @@ -1563,6 +1563,7 @@ fn parse_test_command_options(args: &clap::Args, ctx: Context<'_>) { } if !args.options(b"--coverage-reporter").is_empty() { + ctx.test_options.coverage.enabled = true; ctx.test_options.coverage.reporters = CoverageReporters { text: false, lcov: false, @@ -1618,6 +1619,7 @@ fn parse_test_command_options(args: &clap::Args, ctx: Context<'_>) { } if let Some(dir) = args.option(b"--coverage-dir") { + ctx.test_options.coverage.enabled = true; ctx.test_options.coverage.reports_directory = Box::<[u8]>::from(dir); } diff --git a/test/cli/test/coverage.test.ts b/test/cli/test/coverage.test.ts index 26a1ed10b320..77950ddd0483 100644 --- a/test/cli/test/coverage.test.ts +++ b/test/cli/test/coverage.test.ts @@ -1,6 +1,6 @@ import { expect, test } from "bun:test"; import { bunEnv, bunExe, normalizeBunSnapshot, tempDirWithFiles } from "harness"; -import { readFileSync } from "node:fs"; +import { existsSync, readFileSync } from "node:fs"; import path from "path"; test("coverage crash", () => { @@ -57,6 +57,77 @@ export class Y { ); }); +// https://github.com/oven-sh/bun/issues/17502 +test.each([ + ["--coverage-reporter=lcov"], + ["--coverage-reporter", "lcov"], +])("%s implies --coverage", (...flags) => { + const dir = tempDirWithFiles("cov", { + "add.ts": `export function add(a: number, b: number) { return a + b; }`, + "add.test.ts": ` +import { test, expect } from "bun:test"; +import { add } from "./add"; +test("add", () => { expect(add(1, 2)).toBe(3); }); +`, + }); + const result = Bun.spawnSync([bunExe(), "test", ...flags], { + cwd: dir, + env: bunEnv, + stdio: [null, "pipe", "pipe"], + }); + const lcovPath = path.join(dir, "coverage", "lcov.info"); + expect({ + "coverage/lcov.info exists": existsSync(lcovPath), + exitCode: result.exitCode, + }).toEqual({ + "coverage/lcov.info exists": true, + exitCode: 0, + }); + expect(readFileSync(lcovPath, "utf-8")).toContain("SF:add.ts"); +}); + +test("--coverage-reporter=text implies --coverage", () => { + const dir = tempDirWithFiles("cov", { + "add.ts": `export function add(a: number, b: number) { return a + b; }`, + "add.test.ts": ` +import { test, expect } from "bun:test"; +import { add } from "./add"; +test("add", () => { expect(add(1, 2)).toBe(3); }); +`, + }); + const result = Bun.spawnSync([bunExe(), "test", "--coverage-reporter=text"], { + cwd: dir, + env: bunEnv, + stdio: [null, "pipe", "pipe"], + }); + const stderr = result.stderr.toString("utf-8"); + expect(stderr).toContain("% Funcs"); + expect(stderr).toContain("% Lines"); + expect(stderr).toContain("add.ts"); + expect(result.exitCode).toBe(0); +}); + +test("--coverage-dir implies --coverage", () => { + const dir = tempDirWithFiles("cov", { + "add.ts": `export function add(a: number, b: number) { return a + b; }`, + "add.test.ts": ` +import { test, expect } from "bun:test"; +import { add } from "./add"; +test("add", () => { expect(add(1, 2)).toBe(3); }); +`, + }); + const result = Bun.spawnSync([bunExe(), "test", "--coverage-dir=out"], { + cwd: dir, + env: bunEnv, + stdio: [null, "pipe", "pipe"], + }); + const stderr = result.stderr.toString("utf-8"); + expect(stderr).toContain("% Funcs"); + expect(stderr).toContain("% Lines"); + expect(stderr).toContain("add.ts"); + expect(result.exitCode).toBe(0); +}); + test("coverage excludes node_modules directory", () => { const dir = tempDirWithFiles("cov", { "node_modules/pi/index.js": ` From 4f5f1cb9e846bb64f4a70abb9c6aba669fd1844c Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Tue, 16 Jun 2026 22:10:26 +0000 Subject: [PATCH 2/5] [autofix.ci] apply automated fixes --- test/cli/test/coverage.test.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/test/cli/test/coverage.test.ts b/test/cli/test/coverage.test.ts index 77950ddd0483..ea5d931d6cb3 100644 --- a/test/cli/test/coverage.test.ts +++ b/test/cli/test/coverage.test.ts @@ -58,10 +58,7 @@ export class Y { }); // https://github.com/oven-sh/bun/issues/17502 -test.each([ - ["--coverage-reporter=lcov"], - ["--coverage-reporter", "lcov"], -])("%s implies --coverage", (...flags) => { +test.each([["--coverage-reporter=lcov"], ["--coverage-reporter", "lcov"]])("%s implies --coverage", (...flags) => { const dir = tempDirWithFiles("cov", { "add.ts": `export function add(a: number, b: number) { return a + b; }`, "add.test.ts": ` From 1ca0db549d406f417fdc96ab7328213f0501eb91 Mon Sep 17 00:00:00 2001 From: robobun <117481402+robobun@users.noreply.github.com> Date: Tue, 16 Jun 2026 22:13:09 +0000 Subject: [PATCH 3/5] ci: retrigger From c67cec289fd3aa902587a5ccf28480e3382ff425 Mon Sep 17 00:00:00 2001 From: robobun <117481402+robobun@users.noreply.github.com> Date: Tue, 16 Jun 2026 22:37:28 +0000 Subject: [PATCH 4/5] docs: note --coverage-reporter/--coverage-dir imply --coverage in help text --- docs/snippets/cli/test.mdx | 4 ++-- src/runtime/cli/Arguments.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/snippets/cli/test.mdx b/docs/snippets/cli/test.mdx index 9242389ddc0d..47699cc79824 100644 --- a/docs/snippets/cli/test.mdx +++ b/docs/snippets/cli/test.mdx @@ -71,11 +71,11 @@ bun test - Report coverage in text and/or lcov. Defaults to text + Report coverage in text and/or lcov. Defaults to text. Implies --coverage - Directory for coverage files. Defaults to coverage + Directory for coverage files. Defaults to coverage. Implies --coverage ### Snapshots diff --git a/src/runtime/cli/Arguments.rs b/src/runtime/cli/Arguments.rs index 7fe1f33895fc..1346efb12bce 100644 --- a/src/runtime/cli/Arguments.rs +++ b/src/runtime/cli/Arguments.rs @@ -556,10 +556,10 @@ pub(crate) const TEST_ONLY_PARAMS: &[ParamType] = &[ parse_param!("--seed Set the random seed for test randomization"), parse_param!("--coverage Generate a coverage profile"), parse_param!( - "--coverage-reporter ... Report coverage in 'text' and/or 'lcov'. Defaults to 'text'." + "--coverage-reporter ... Report coverage in 'text' and/or 'lcov'. Defaults to 'text'. Implies --coverage." ), parse_param!( - "--coverage-dir Directory for coverage files. Defaults to 'coverage'." + "--coverage-dir Directory for coverage files. Defaults to 'coverage'. Implies --coverage." ), parse_param!( "--bail ? Exit the test suite after failures. If you do not specify a number, it defaults to 1." From 4f2c2f0ca87b607d9eba5879654e5ed516875ff7 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Tue, 16 Jun 2026 22:39:29 +0000 Subject: [PATCH 5/5] [autofix.ci] apply automated fixes --- docs/snippets/cli/test.mdx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/snippets/cli/test.mdx b/docs/snippets/cli/test.mdx index 47699cc79824..9be5ddd9e315 100644 --- a/docs/snippets/cli/test.mdx +++ b/docs/snippets/cli/test.mdx @@ -71,7 +71,8 @@ bun test - Report coverage in text and/or lcov. Defaults to text. Implies --coverage + Report coverage in text and/or lcov. Defaults to text. Implies{" "} + --coverage