| 'use strict'; |
| |
| const { mustCall } = require('../common'); |
| const { deepStrictEqual, ok, strictEqual } = require('assert'); |
| |
| const { channel } = require('diagnostics_channel'); |
| |
| const { |
| hijackStdout, |
| hijackStderr, |
| restoreStdout, |
| restoreStderr |
| } = require('../common/hijackstdio'); |
| |
| const stdoutMethods = [ |
| 'log', |
| 'info', |
| 'debug', |
| ]; |
| |
| const stderrMethods = [ |
| 'warn', |
| 'error', |
| ]; |
| |
| const methods = [ |
| ...stdoutMethods, |
| ...stderrMethods, |
| ]; |
| |
| const channels = { |
| log: channel('console.log'), |
| info: channel('console.info'), |
| debug: channel('console.debug'), |
| warn: channel('console.warn'), |
| error: channel('console.error') |
| }; |
| |
| process.stdout.isTTY = false; |
| process.stderr.isTTY = false; |
| |
| for (const method of methods) { |
| let intercepted = false; |
| let formatted = false; |
| |
| const isStdout = stdoutMethods.includes(method); |
| const hijack = isStdout ? hijackStdout : hijackStderr; |
| const restore = isStdout ? restoreStdout : restoreStderr; |
| |
| const foo = 'string'; |
| const bar = { key: /value/ }; |
| const baz = [ 1, 2, 3 ]; |
| |
| channels[method].subscribe(mustCall((args) => { |
| // Should not have been formatted yet. |
| intercepted = true; |
| ok(!formatted); |
| |
| // Should receive expected log message args. |
| deepStrictEqual(args, [foo, bar, baz]); |
| |
| // Should be able to mutate message args and have it reflected in output. |
| bar.added = true; |
| })); |
| |
| hijack(mustCall((output) => { |
| // Should have already been intercepted. |
| formatted = true; |
| ok(intercepted); |
| |
| // Should produce expected formatted output with mutated message args. |
| strictEqual(output, 'string { key: /value/, added: true } [ 1, 2, 3 ]\n'); |
| })); |
| |
| console[method](foo, bar, baz); |
| restore(); |
| } |