• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Flags: --expose-internals
2'use strict';
3const common = require('../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  common.expectsInternalAssertion(
54    () => new errors.codes.TEST_ERROR_1(),
55    'Code: TEST_ERROR_1; The provided arguments ' +
56    'length (0) does not match the required ones (1).'
57  );
58}
59
60// Tests for common.expectsError
61assert.throws(() => {
62  throw new errors.codes.TEST_ERROR_1.TypeError('a');
63}, { code: 'TEST_ERROR_1' });
64assert.throws(() => {
65  throw new errors.codes.TEST_ERROR_1.TypeError('a');
66}, { code: 'TEST_ERROR_1',
67     name: 'TypeError',
68     message: /^Error for testing/ });
69assert.throws(() => {
70  throw new errors.codes.TEST_ERROR_1.TypeError('a');
71}, { code: 'TEST_ERROR_1', name: 'TypeError' });
72assert.throws(() => {
73  throw new errors.codes.TEST_ERROR_1.TypeError('a');
74}, {
75  code: 'TEST_ERROR_1',
76  name: 'TypeError',
77  message: 'Error for testing purposes: a'
78});
79
80// Test that `code` property is mutable and that changing it does not change the
81// name.
82{
83  const myError = new errors.codes.TEST_ERROR_1('foo');
84  assert.strictEqual(myError.code, 'TEST_ERROR_1');
85  assert.strictEqual(myError.hasOwnProperty('code'), true);
86  assert.strictEqual(myError.hasOwnProperty('name'), false);
87  assert.deepStrictEqual(Object.keys(myError), ['code']);
88  const initialName = myError.name;
89  myError.code = 'FHQWHGADS';
90  assert.strictEqual(myError.code, 'FHQWHGADS');
91  assert.strictEqual(myError.name, initialName);
92  assert.deepStrictEqual(Object.keys(myError), ['code']);
93  assert.ok(!myError.name.includes('TEST_ERROR_1'));
94  assert.ok(!myError.name.includes('FHQWHGADS'));
95}
96
97// Test that `name` is mutable and that changing it alters `toString()` but not
98// `console.log()` results, which is the behavior of `Error` objects in the
99// browser. Note that `name` becomes enumerable after being assigned.
100{
101  const myError = new errors.codes.TEST_ERROR_1('foo');
102  assert.deepStrictEqual(Object.keys(myError), ['code']);
103  const initialToString = myError.toString();
104
105  myError.name = 'Fhqwhgads';
106  assert.deepStrictEqual(Object.keys(myError), ['code', 'name']);
107  assert.notStrictEqual(myError.toString(), initialToString);
108}
109
110// Test that `message` is mutable and that changing it alters `toString()` but
111// not `console.log()` results, which is the behavior of `Error` objects in the
112// browser. Note that `message` remains non-enumerable after being assigned.
113{
114  let initialConsoleLog = '';
115  hijackStdout((data) => { initialConsoleLog += data; });
116  const myError = new errors.codes.TEST_ERROR_1('foo');
117  assert.deepStrictEqual(Object.keys(myError), ['code']);
118  const initialToString = myError.toString();
119  console.log(myError);
120  assert.notStrictEqual(initialConsoleLog, '');
121
122  restoreStdout();
123
124  let subsequentConsoleLog = '';
125  hijackStdout((data) => { subsequentConsoleLog += data; });
126  myError.message = 'Fhqwhgads';
127  assert.deepStrictEqual(Object.keys(myError), ['code']);
128  assert.notStrictEqual(myError.toString(), initialToString);
129  console.log(myError);
130  assert.strictEqual(subsequentConsoleLog, initialConsoleLog);
131
132  restoreStdout();
133}
134