summaryrefslogtreecommitdiff
path: root/tests/node_compat/test/parallel/test-console-instance.js
diff options
context:
space:
mode:
Diffstat (limited to 'tests/node_compat/test/parallel/test-console-instance.js')
-rw-r--r--tests/node_compat/test/parallel/test-console-instance.js156
1 files changed, 156 insertions, 0 deletions
diff --git a/tests/node_compat/test/parallel/test-console-instance.js b/tests/node_compat/test/parallel/test-console-instance.js
new file mode 100644
index 000000000..ee561564f
--- /dev/null
+++ b/tests/node_compat/test/parallel/test-console-instance.js
@@ -0,0 +1,156 @@
+// deno-fmt-ignore-file
+// deno-lint-ignore-file
+
+// Copyright Joyent and Node contributors. All rights reserved. MIT license.
+// Taken from Node 16.13.0
+// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually
+
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+'use strict';
+const common = require('../common');
+const assert = require('assert');
+const Stream = require('stream');
+const requiredConsole = require('console');
+const Console = requiredConsole.Console;
+
+const out = new Stream();
+const err = new Stream();
+
+// Ensure the Console instance doesn't write to the
+// process' "stdout" or "stderr" streams.
+process.stdout.write = process.stderr.write = common.mustNotCall();
+
+// Make sure that the "Console" function exists.
+assert.strictEqual(typeof Console, 'function');
+
+// Note: We don't replace global console with node.js console
+// assert.strictEqual(requiredConsole, global.console);
+// Make sure the custom instanceof of Console works
+assert.ok(global.console instanceof Console);
+assert.ok(!({} instanceof Console));
+
+// Make sure that the Console constructor throws
+// when not given a writable stream instance.
+assert.throws(
+ () => { new Console(); },
+ {
+ code: 'ERR_CONSOLE_WRITABLE_STREAM',
+ name: 'TypeError',
+ message: /stdout/
+ }
+);
+
+// Console constructor should throw if stderr exists but is not writable.
+assert.throws(
+ () => {
+ out.write = () => {};
+ err.write = undefined;
+ new Console(out, err);
+ },
+ {
+ code: 'ERR_CONSOLE_WRITABLE_STREAM',
+ name: 'TypeError',
+ message: /stderr/
+ }
+);
+
+out.write = err.write = (d) => {};
+
+{
+ const c = new Console(out, err);
+ assert.ok(c instanceof Console);
+
+ out.write = err.write = common.mustCall((d) => {
+ assert.strictEqual(d, 'test\n');
+ }, 2);
+
+ c.log('test');
+ c.error('test');
+
+ out.write = common.mustCall((d) => {
+ assert.strictEqual(d, '{ foo: 1 }\n');
+ });
+
+ c.dir({ foo: 1 });
+
+ // Ensure that the console functions are bound to the console instance.
+ let called = 0;
+ out.write = common.mustCall((d) => {
+ called++;
+ assert.strictEqual(d, `${called} ${called - 1} [ 1, 2, 3 ]\n`);
+ }, 3);
+
+ [1, 2, 3].forEach(c.log);
+}
+
+// Test calling Console without the `new` keyword.
+{
+ const withoutNew = Console(out, err);
+ assert.ok(withoutNew instanceof Console);
+}
+
+// Test extending Console
+{
+ class MyConsole extends Console {
+ hello() {}
+ // See if the methods on Console.prototype are overridable.
+ log() { return 'overridden'; }
+ }
+ const myConsole = new MyConsole(process.stdout);
+ assert.strictEqual(typeof myConsole.hello, 'function');
+ assert.ok(myConsole instanceof Console);
+ assert.strictEqual(myConsole.log(), 'overridden');
+
+ const log = myConsole.log;
+ assert.strictEqual(log(), 'overridden');
+}
+
+// Instance that does not ignore the stream errors.
+{
+ const c2 = new Console(out, err, false);
+
+ out.write = () => { throw new Error('out'); };
+ err.write = () => { throw new Error('err'); };
+
+ assert.throws(() => c2.log('foo'), /^Error: out$/);
+ assert.throws(() => c2.warn('foo'), /^Error: err$/);
+ assert.throws(() => c2.dir('foo'), /^Error: out$/);
+}
+
+// Console constructor throws if inspectOptions is not an object.
+[null, true, false, 'foo', 5, Symbol()].forEach((inspectOptions) => {
+ assert.throws(
+ () => {
+ new Console({
+ stdout: out,
+ stderr: err,
+ inspectOptions
+ });
+ },
+ {
+ message: 'The "options.inspectOptions" property must be of type object.' +
+ common.invalidArgTypeHelper(inspectOptions),
+ code: 'ERR_INVALID_ARG_TYPE'
+ }
+ );
+});