'use strict'; require('../common'); const invalids = [ { code: '', expected: 1, pattern: "Received type string \\(''\\)$", }, { code: '1 one', expected: 1, pattern: "Received type string \\('1 one'\\)$", }, { code: 'two', expected: 1, pattern: "Received type string \\('two'\\)$", }, { code: {}, expected: 1, pattern: 'Received an instance of Object$', }, { code: [], expected: 1, pattern: 'Received an instance of Array$', }, { code: true, expected: 1, pattern: 'Received type boolean \\(true\\)$', }, { code: false, expected: 1, pattern: 'Received type boolean \\(false\\)$', }, { code: 2n, expected: 1, pattern: 'Received type bigint \\(2n\\)$', }, { code: 2.1, expected: 1, pattern: 'Received 2.1$', }, { code: Infinity, expected: 1, pattern: 'Received Infinity$', }, { code: NaN, expected: 1, pattern: 'Received NaN$', }, ]; const valids = [ { code: 1, expected: 1, }, { code: '2', expected: 2, }, { code: undefined, expected: 0, }, { code: null, expected: 0, }, { code: 0, expected: 0, }, { code: '0', expected: 0, }, ]; const args = [...invalids, ...valids]; if (process.argv[2] === undefined) { const { spawnSync } = require('node:child_process'); const { inspect, debuglog } = require('node:util'); const { throws, strictEqual } = require('node:assert'); const debug = debuglog('test'); const node = process.execPath; const test = (index, useProcessExitCode) => { const { status: code } = spawnSync(node, [ __filename, index, useProcessExitCode, ]); debug(`actual: ${code}, ${inspect(args[index])} ${!!useProcessExitCode}`); strictEqual( code, args[index].expected, `actual: ${code}, ${inspect(args[index])}` ); }; // Check process.exitCode for (const arg of invalids) { debug(`invaild code: ${inspect(arg.code)}`); throws(() => (process.exitCode = arg.code), new RegExp(arg.pattern)); } for (const arg of valids) { debug(`vaild code: ${inspect(arg.code)}`); process.exitCode = arg.code; } throws(() => { delete process.exitCode; }, /Cannot delete property 'exitCode' of #/); process.exitCode = 0; // Check process.exit([code]) for (const index of args.keys()) { test(index); test(index, true); } } else { const index = parseInt(process.argv[2]); const useProcessExitCode = process.argv[3] !== 'undefined'; if (Number.isNaN(index)) { return process.exit(100); } if (useProcessExitCode) { process.exitCode = args[index].code; } else { process.exit(args[index].code); } }