| '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>/); |
| 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); |
| } |
| } |