2023-05-18 15:36:38 +03:00
import * as common from '../common/index.mjs' ;
2023-04-27 09:41:58 +03:00
import * as fixtures from '../common/fixtures.mjs' ;
import * as snapshot from '../common/assertSnapshot.js' ;
2023-05-18 15:36:38 +03:00
import * as os from 'node:os' ;
2023-04-27 09:41:58 +03:00
import { describe , it } from 'node:test' ;
2024-08-16 16:29:22 +02:00
import { basename } from 'node:path' ;
2023-08-03 23:52:30 +02:00
import { pathToFileURL } from 'node:url' ;
2023-04-27 09:41:58 +03:00
2023-05-18 15:36:38 +03:00
const skipForceColors =
( common . isWindows && ( Number ( os . release ( ) . split ( '.' ) [ 0 ] ) !== 10 || Number ( os . release ( ) . split ( '.' ) [ 2 ] ) < 14393 ) ) ; // See https://github.com/nodejs/node/pull/33132
2023-04-27 09:41:58 +03:00
function replaceStackTrace ( str ) {
return snapshot . replaceStackTrace ( str , '$1at *$7\n' ) ;
}
2023-09-17 13:59:41 -07:00
function replaceForceColorsStackTrace ( str ) {
// eslint-disable-next-line no-control-regex
return str . replaceAll ( /( \[90m\W+)at .*node:.*/g , '$1at * [39m' ) ;
}
2024-03-23 22:11:28 +01:00
describe ( 'errors output' , { concurrency : ! process . env . TEST _PARALLEL } , ( ) => {
2023-04-27 09:41:58 +03:00
function normalize ( str ) {
2024-08-16 16:29:22 +02:00
const baseName = basename ( process . argv0 || 'node' , '.exe' ) ;
2023-08-03 23:52:30 +02:00
return str . replaceAll ( snapshot . replaceWindowsPaths ( process . cwd ( ) ) , '' )
. replaceAll ( pathToFileURL ( process . cwd ( ) ) . pathname , '' )
. replaceAll ( '//' , '*' )
. replaceAll ( /\/(\w)/g , '*$1' )
. replaceAll ( '*test*' , '*' )
. replaceAll ( '*fixtures*errors*' , '*' )
2024-08-16 16:29:22 +02:00
. replaceAll ( 'file:**' , 'file:*/' )
. replaceAll ( ` ${ baseName } -- ` , '* --' ) ;
2023-04-27 09:41:58 +03:00
}
function normalizeNoNumbers ( str ) {
return normalize ( str ) . replaceAll ( /\d+:\d+/g , '*:*' ) . replaceAll ( /:\d+/g , ':*' ) . replaceAll ( '*fixtures*message*' , '*' ) ;
}
const common = snapshot
2023-05-05 20:10:31 +03:00
. transform ( snapshot . replaceWindowsLineEndings , snapshot . replaceWindowsPaths ) ;
2023-09-17 13:59:41 -07:00
const defaultTransform = snapshot . transform ( common , normalize , snapshot . replaceNodeVersion ) ;
const errTransform = snapshot . transform ( common , normalizeNoNumbers , snapshot . replaceNodeVersion ) ;
const promiseTransform = snapshot . transform ( common , replaceStackTrace ,
normalizeNoNumbers , snapshot . replaceNodeVersion ) ;
const forceColorsTransform = snapshot . transform ( common , normalize ,
replaceForceColorsStackTrace , snapshot . replaceNodeVersion ) ;
2023-04-27 09:41:58 +03:00
const tests = [
{ name : 'errors/async_error_eval_cjs.js' } ,
{ name : 'errors/async_error_eval_esm.js' } ,
{ name : 'errors/async_error_microtask_main.js' } ,
{ name : 'errors/async_error_nexttick_main.js' } ,
{ name : 'errors/async_error_sync_main.js' } ,
2023-09-21 18:14:34 -04:00
{ name : 'errors/core_line_numbers.js' } ,
2023-04-27 09:41:58 +03:00
{ name : 'errors/async_error_sync_esm.mjs' } ,
2023-09-21 18:14:34 -04:00
{ name : 'errors/test-no-extra-info-on-fatal-exception.js' } ,
2023-04-27 09:41:58 +03:00
{ name : 'errors/error_aggregateTwoErrors.js' , transform : errTransform } ,
{ name : 'errors/error_exit.js' , transform : errTransform } ,
{ name : 'errors/error_with_nul.js' , transform : errTransform } ,
{ name : 'errors/events_unhandled_error_common_trace.js' , transform : errTransform } ,
{ name : 'errors/events_unhandled_error_nexttick.js' , transform : errTransform } ,
{ name : 'errors/events_unhandled_error_sameline.js' , transform : errTransform } ,
{ name : 'errors/events_unhandled_error_subclass.js' , transform : errTransform } ,
2023-09-21 18:14:34 -04:00
{ name : 'errors/if-error-has-good-stack.js' , transform : errTransform } ,
2023-04-27 09:41:58 +03:00
{ name : 'errors/throw_custom_error.js' , transform : errTransform } ,
2023-09-21 18:14:34 -04:00
{ name : 'errors/throw_error_with_getter_throw.js' , transform : errTransform } ,
2023-04-27 09:41:58 +03:00
{ name : 'errors/throw_in_line_with_tabs.js' , transform : errTransform } ,
{ name : 'errors/throw_non_error.js' , transform : errTransform } ,
2023-09-21 18:14:34 -04:00
{ name : 'errors/throw_null.js' , transform : errTransform } ,
{ name : 'errors/throw_undefined.js' , transform : errTransform } ,
{ name : 'errors/timeout_throw.js' , transform : errTransform } ,
{ name : 'errors/undefined_reference_in_new_context.js' , transform : errTransform } ,
2023-04-27 09:41:58 +03:00
{ name : 'errors/promise_always_throw_unhandled.js' , transform : promiseTransform } ,
2023-09-21 18:14:34 -04:00
{ name : 'errors/promise_unhandled_warn_with_error.js' , transform : promiseTransform } ,
{ name : 'errors/unhandled_promise_trace_warnings.js' , transform : promiseTransform } ,
2023-09-17 13:59:41 -07:00
{ skip : skipForceColors , name : 'errors/force_colors.js' ,
transform : forceColorsTransform , env : { FORCE _COLOR : 1 } } ,
2023-08-03 23:52:30 +02:00
] ;
for ( const { name , transform = defaultTransform , env , skip = false } of tests ) {
it ( name , { skip } , async ( ) => {
2024-06-23 19:53:03 +01:00
await snapshot . spawnAndAssert ( fixtures . path ( name ) , transform , { env : { ... env , ... process . env } } ) ;
2023-04-27 09:41:58 +03:00
} ) ;
}
} ) ;