| // Flags: --expose-internals |
| 'use strict'; |
| |
| require('../common'); |
| const assert = require('assert'); |
| const { types } = require('util'); |
| const { isError } = require('internal/util'); |
| const vm = require('vm'); |
| |
| // Special cased errors. Test the internal function which is used in |
| // `util.inspect()`, the `repl` and maybe more. This verifies that errors from |
| // different realms, and non native instances of error are properly detected as |
| // error while definitely false ones are not detected. This is different than |
| // the public `util.isError()` function which falsy detects the fake errors as |
| // actual errors. |
| { |
| const fake = { [Symbol.toStringTag]: 'Error' }; |
| assert(!types.isNativeError(fake)); |
| assert(!(fake instanceof Error)); |
| assert(!isError(fake)); |
| |
| const err = new Error('test'); |
| const newErr = Object.create( |
| Object.getPrototypeOf(err), |
| Object.getOwnPropertyDescriptors(err)); |
| Object.defineProperty(err, 'message', { value: err.message }); |
| assert(types.isNativeError(err)); |
| assert(!types.isNativeError(newErr)); |
| assert(newErr instanceof Error); |
| assert(isError(newErr)); |
| |
| const context = vm.createContext({}); |
| const differentRealmErr = vm.runInContext('new Error()', context); |
| assert(types.isNativeError(differentRealmErr)); |
| assert(!(differentRealmErr instanceof Error)); |
| assert(isError(differentRealmErr)); |
| } |