• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Flags: --expose-internals
2'use strict';
3require('../common');
4const {
5  hijackStdout,
6  restoreStdout,
7} = require('../common/hijackstdio');
8
9const assert = require('assert');
10const errors = require('internal/errors');
11
12// Turn off ANSI color formatting for this test file.
13const { inspect } = require('util');
14inspect.defaultOptions.colors = false;
15
16errors.E('TEST_ERROR_1', 'Error for testing purposes: %s',
17         Error, TypeError, RangeError);
18errors.E('TEST_ERROR_2', (a, b) => `${a} ${b}`, Error);
19
20{
21  const err = new errors.codes.TEST_ERROR_1('test');
22  assert(err instanceof Error);
23  assert.strictEqual(err.name, 'Error');
24  assert.strictEqual(err.message, 'Error for testing purposes: test');
25  assert.strictEqual(err.code, 'TEST_ERROR_1');
26}
27
28{
29  const err = new errors.codes.TEST_ERROR_1.TypeError('test');
30  assert(err instanceof TypeError);
31  assert.strictEqual(err.name, 'TypeError');
32  assert.strictEqual(err.message, 'Error for testing purposes: test');
33  assert.strictEqual(err.code, 'TEST_ERROR_1');
34}
35
36{
37  const err = new errors.codes.TEST_ERROR_1.RangeError('test');
38  assert(err instanceof RangeError);
39  assert.strictEqual(err.name, 'RangeError');
40  assert.strictEqual(err.message, 'Error for testing purposes: test');
41  assert.strictEqual(err.code, 'TEST_ERROR_1');
42}
43
44{
45  const err = new errors.codes.TEST_ERROR_2('abc', 'xyz');
46  assert(err instanceof Error);
47  assert.strictEqual(err.name, 'Error');
48  assert.strictEqual(err.message, 'abc xyz');
49  assert.strictEqual(err.code, 'TEST_ERROR_2');
50}
51
52{
53  assert.throws(
54    () => new errors.codes.TEST_ERROR_1(),
55    {
56      message: /^Code: TEST_ERROR_1; The provided arguments length \(0\) does not match the required ones \(1\)\./,
57      name: 'Error',
58      code: 'ERR_INTERNAL_ASSERTION'
59    }
60  );
61}
62
63// Tests for common.expectsError
64assert.throws(() => {
65  throw new errors.codes.TEST_ERROR_1.TypeError('a');
66}, { code: 'TEST_ERROR_1' });
67assert.throws(() => {
68  throw new errors.codes.TEST_ERROR_1.TypeError('a');
69}, { code: 'TEST_ERROR_1',
70     name: 'TypeError',
71     message: /^Error for testing/ });
72assert.throws(() => {
73  throw new errors.codes.TEST_ERROR_1.TypeError('a');
74}, { code: 'TEST_ERROR_1', name: 'TypeError' });
75assert.throws(() => {
76  throw new errors.codes.TEST_ERROR_1.TypeError('a');
77}, {
78  code: 'TEST_ERROR_1',
79  name: 'TypeError',
80  message: 'Error for testing purposes: a'
81});
82
83// Test that `code` property is mutable and that changing it does not change the
84// name.
85{
86  const myError = new errors.codes.TEST_ERROR_1('foo');
87  assert.strictEqual(myError.code, 'TEST_ERROR_1');
88  assert.strictEqual(Object.hasOwn(myError, 'code'), true);
89  assert.strictEqual(Object.hasOwn(myError, 'name'), false);
90  assert.deepStrictEqual(Object.keys(myError), ['code']);
91  const initialName = myError.name;
92  myError.code = 'FHQWHGADS';
93  assert.strictEqual(myError.code, 'FHQWHGADS');
94  assert.strictEqual(myError.name, initialName);
95  assert.deepStrictEqual(Object.keys(myError), ['code']);
96  assert.ok(!myError.name.includes('TEST_ERROR_1'));
97  assert.ok(!myError.name.includes('FHQWHGADS'));
98}
99
100// Test that `name` is mutable and that changing it alters `toString()` but not
101// `console.log()` results, which is the behavior of `Error` objects in the
102// browser. Note that `name` becomes enumerable after being assigned.
103{
104  const myError = new errors.codes.TEST_ERROR_1('foo');
105  assert.deepStrictEqual(Object.keys(myError), ['code']);
106  const initialToString = myError.toString();
107
108  myError.name = 'Fhqwhgads';
109  assert.deepStrictEqual(Object.keys(myError), ['code', 'name']);
110  assert.notStrictEqual(myError.toString(), initialToString);
111}
112
113// Test that `message` is mutable and that changing it alters `toString()` but
114// not `console.log()` results, which is the behavior of `Error` objects in the
115// browser. Note that `message` remains non-enumerable after being assigned.
116{
117  let initialConsoleLog = '';
118  hijackStdout((data) => { initialConsoleLog += data; });
119  const myError = new errors.codes.TEST_ERROR_1('foo');
120  assert.deepStrictEqual(Object.keys(myError), ['code']);
121  const initialToString = myError.toString();
122  console.log(myError);
123  assert.notStrictEqual(initialConsoleLog, '');
124
125  restoreStdout();
126
127  let subsequentConsoleLog = '';
128  hijackStdout((data) => { subsequentConsoleLog += data; });
129  myError.message = 'Fhqwhgads';
130  assert.deepStrictEqual(Object.keys(myError), ['code']);
131  assert.notStrictEqual(myError.toString(), initialToString);
132  console.log(myError);
133  assert.strictEqual(subsequentConsoleLog, initialConsoleLog);
134
135  restoreStdout();
136}
137