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