diff --git a/packages/playwright-test/src/dispatcher.ts b/packages/playwright-test/src/dispatcher.ts index c7edbc7738..831af5b864 100644 --- a/packages/playwright-test/src/dispatcher.ts +++ b/packages/playwright-test/src/dispatcher.ts @@ -529,6 +529,14 @@ class Worker extends EventEmitter { repeatEachIndex: testGroup.repeatEachIndex, projectIndex: testGroup.projectIndex, loader: loaderData, + stdoutDimension: { + rows: process.stdout.rows, + columns: process.stdout.columns + }, + stderrDimension: { + rows: process.stderr.rows, + columns: process.stderr.columns + }, }; this.send({ method: 'init', params }); } diff --git a/packages/playwright-test/src/ipc.ts b/packages/playwright-test/src/ipc.ts index de10417e8d..64806f92e2 100644 --- a/packages/playwright-test/src/ipc.ts +++ b/packages/playwright-test/src/ipc.ts @@ -24,12 +24,19 @@ export type SerializedLoaderData = { configCLIOverrides: ConfigCLIOverrides; }; +export type TtyDimension = { + rows: number | undefined; + columns: number | undefined; +}; + export type WorkerInitParams = { workerIndex: number; parallelIndex: number; repeatEachIndex: number; projectIndex: number; loader: SerializedLoaderData; + stdoutDimension: TtyDimension; + stderrDimension: TtyDimension; }; export type TestBeginPayload = { diff --git a/packages/playwright-test/src/worker.ts b/packages/playwright-test/src/worker.ts index 89d8af800e..7a4b067b3e 100644 --- a/packages/playwright-test/src/worker.ts +++ b/packages/playwright-test/src/worker.ts @@ -65,6 +65,7 @@ process.on('message', async message => { if (message.method === 'init') { const initParams = message.params as WorkerInitParams; workerIndex = initParams.workerIndex; + initConsoleParameters(initParams); startProfiling(); workerRunner = new WorkerRunner(initParams); for (const event of ['testBegin', 'testEnd', 'stepBegin', 'stepEnd', 'done', 'teardownErrors']) @@ -120,3 +121,17 @@ function chunkToParams(chunk: Buffer | string): { text?: string, buffer?: strin return { text: util.inspect(chunk) }; return { text: chunk }; } + +function initConsoleParameters(initParams: WorkerInitParams) { + // Make sure the output supports colors. + process.stdout.isTTY = true; + process.stderr.isTTY = true; + if (initParams.stdoutDimension.rows) + process.stdout.rows = initParams.stdoutDimension.rows; + if (initParams.stdoutDimension.columns) + process.stdout.columns = initParams.stdoutDimension.columns; + if (initParams.stderrDimension.rows) + process.stderr.rows = initParams.stderrDimension.rows; + if (initParams.stderrDimension.columns) + process.stderr.columns = initParams.stderrDimension.columns; +} diff --git a/tests/playwright-test/stdio.spec.ts b/tests/playwright-test/stdio.spec.ts index 51bfbf36cb..14af8015d3 100644 --- a/tests/playwright-test/stdio.spec.ts +++ b/tests/playwright-test/stdio.spec.ts @@ -76,3 +76,22 @@ test('should ignore stdio when quiet', async ({ runInlineTest }) => { }, { reporter: 'list' }); expect(result.output).not.toContain('%%'); }); + +test('should support console colors', async ({ runInlineTest }) => { + const result = await runInlineTest({ + 'a.spec.js': ` + const { test } = pwt; + test('console log', () => { + console.log('process.stdout.isTTY = ' + process.stdout.isTTY); + console.log('process.stderr.isTTY = ' + process.stderr.isTTY); + console.log({ b: true, n: 123, s: 'abc' }); + console.error({ b: false, n: 123, s: 'abc' }); + }); + ` + }); + expect(result.output).toContain(`process.stdout.isTTY = true`); + expect(result.output).toContain(`process.stderr.isTTY = true`); + // The output should have colors. + expect(result.output).toContain(`{ b: \x1b[33mtrue\x1b[39m, n: \x1b[33m123\x1b[39m, s: \x1b[32m'abc'\x1b[39m }`); + expect(result.output).toContain(`{ b: \x1b[33mfalse\x1b[39m, n: \x1b[33m123\x1b[39m, s: \x1b[32m'abc'\x1b[39m }`); +});