diff --git a/packages/vitest/src/runtime/console.ts b/packages/vitest/src/runtime/console.ts index 82be8c24fd71..21794b845b68 100644 --- a/packages/vitest/src/runtime/console.ts +++ b/packages/vitest/src/runtime/console.ts @@ -84,7 +84,7 @@ export function createCustomConsole(defaultState?: WorkerGlobalState) { sendLog(type, taskId, content, buffer.length) } const timer = timers.get(taskId)! - buffers.set(taskId, []) + buffers.delete(taskId) if (type === 'stderr') { timer.stderrTime = 0 } diff --git a/test/reporters/fixtures/console-interleave.test.ts b/test/reporters/fixtures/console-interleave.test.ts new file mode 100644 index 000000000000..6007bb99572c --- /dev/null +++ b/test/reporters/fixtures/console-interleave.test.ts @@ -0,0 +1,9 @@ +import { test } from 'vitest'; + +test('repro', async () => { + console.log(1); + await new Promise((r) => setTimeout(r, 10)); + console.error(2); + await new Promise((r) => setTimeout(r, 10)); + console.log(3); +}); diff --git a/test/reporters/tests/console.test.ts b/test/reporters/tests/console.test.ts index 0c9a3345b2df..fccd8f6833ed 100644 --- a/test/reporters/tests/console.test.ts +++ b/test/reporters/tests/console.test.ts @@ -1,5 +1,6 @@ import { resolve } from 'pathe' -import { expect, test } from 'vitest' +import { type UserConsoleLog, expect, test } from 'vitest' +import type { Reporter } from 'vitest/reporters' import { DefaultReporter } from 'vitest/reporters' import { runVitest } from '../../test-utils' @@ -66,3 +67,33 @@ stderr | console.test.ts global stderr afterAll`, ) }) + +test.for(['forks', 'threads'])('interleave (pool = %s)', async (pool) => { + const logs: UserConsoleLog[] = [] + const { stderr } = await runVitest({ + root: './fixtures', + pool, + reporters: [ + { + onUserConsoleLog(log) { + logs.push(log) + }, + } satisfies Reporter, + ], + }, [resolve('./fixtures/console-interleave.test.ts')]) + expect(stderr).toBe('') + expect(logs).toMatchObject([ + { + type: 'stdout', + content: expect.stringContaining('1'), + }, + { + type: 'stderr', + content: expect.stringContaining('2'), + }, + { + type: 'stdout', + content: expect.stringContaining('3'), + }, + ]) +})