| 'use strict'; |
| require('../common'); |
| const { |
| hijackStdout, |
| hijackStderr, |
| restoreStdout, |
| restoreStderr |
| } = require('../common/hijackstdio'); |
| |
| const assert = require('assert'); |
| const Console = require('console').Console; |
| |
| let c, stdout, stderr; |
| |
| function setup() { |
| stdout = ''; |
| hijackStdout(function(data) { |
| stdout += data; |
| }); |
| |
| stderr = ''; |
| hijackStderr(function(data) { |
| stderr += data; |
| }); |
| |
| c = new Console({ stdout: process.stdout, |
| stderr: process.stderr, |
| colorMode: false }); |
| } |
| |
| function teardown() { |
| restoreStdout(); |
| restoreStderr(); |
| } |
| |
| // Basic group() functionality |
| { |
| setup(); |
| const expectedOut = 'This is the outer level\n' + |
| ' Level 2\n' + |
| ' Level 3\n' + |
| ' Back to level 2\n' + |
| 'Back to the outer level\n' + |
| 'Still at the outer level\n'; |
| |
| |
| const expectedErr = ' More of level 3\n'; |
| |
| c.log('This is the outer level'); |
| c.group(); |
| c.log('Level 2'); |
| c.group(); |
| c.log('Level 3'); |
| c.warn('More of level 3'); |
| c.groupEnd(); |
| c.log('Back to level 2'); |
| c.groupEnd(); |
| c.log('Back to the outer level'); |
| c.groupEnd(); |
| c.log('Still at the outer level'); |
| |
| assert.strictEqual(stdout, expectedOut); |
| assert.strictEqual(stderr, expectedErr); |
| teardown(); |
| } |
| |
| // Group indentation is tracked per Console instance. |
| { |
| setup(); |
| const expectedOut = 'No indentation\n' + |
| 'None here either\n' + |
| ' Now the first console is indenting\n' + |
| 'But the second one does not\n'; |
| const expectedErr = ''; |
| |
| const c2 = new Console(process.stdout, process.stderr); |
| c.log('No indentation'); |
| c2.log('None here either'); |
| c.group(); |
| c.log('Now the first console is indenting'); |
| c2.log('But the second one does not'); |
| |
| assert.strictEqual(stdout, expectedOut); |
| assert.strictEqual(stderr, expectedErr); |
| teardown(); |
| } |
| |
| // Make sure labels work. |
| { |
| setup(); |
| const expectedOut = 'This is a label\n' + |
| ' And this is the data for that label\n'; |
| const expectedErr = ''; |
| |
| c.group('This is a label'); |
| c.log('And this is the data for that label'); |
| |
| assert.strictEqual(stdout, expectedOut); |
| assert.strictEqual(stderr, expectedErr); |
| teardown(); |
| } |
| |
| // Check that console.groupCollapsed() is an alias of console.group() |
| { |
| setup(); |
| const expectedOut = 'Label\n' + |
| ' Level 2\n' + |
| ' Level 3\n'; |
| const expectedErr = ''; |
| |
| c.groupCollapsed('Label'); |
| c.log('Level 2'); |
| c.groupCollapsed(); |
| c.log('Level 3'); |
| |
| assert.strictEqual(stdout, expectedOut); |
| assert.strictEqual(stderr, expectedErr); |
| teardown(); |
| } |
| |
| // Check that multiline strings and object output are indented properly. |
| { |
| setup(); |
| const expectedOut = 'not indented\n' + |
| ' indented\n' + |
| ' also indented\n' + |
| ' {\n' + |
| " also: 'a',\n" + |
| " multiline: 'object',\n" + |
| " should: 'be',\n" + |
| " indented: 'properly',\n" + |
| " kthx: 'bai'\n" + |
| ' }\n'; |
| const expectedErr = ''; |
| |
| c.log('not indented'); |
| c.group(); |
| c.log('indented\nalso indented'); |
| c.log({ also: 'a', |
| multiline: 'object', |
| should: 'be', |
| indented: 'properly', |
| kthx: 'bai' }); |
| |
| assert.strictEqual(stdout, expectedOut); |
| assert.strictEqual(stderr, expectedErr); |
| teardown(); |
| } |
| |
| // Check that the kGroupIndent symbol property is not enumerable |
| { |
| const keys = Reflect.ownKeys(console) |
| .filter((val) => console.propertyIsEnumerable(val)) |
| .map((val) => val.toString()); |
| assert(!keys.includes('Symbol(groupIndent)'), |
| 'groupIndent should not be enumerable'); |
| } |