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