diff --git a/benchmark/_cli.js b/benchmark/_cli.js index 33ba2e0963f2fe..442730ac6e5255 100644 --- a/benchmark/_cli.js +++ b/benchmark/_cli.js @@ -3,6 +3,7 @@ const fs = require('fs'); const path = require('path'); +const kEmptyObject = Object.freeze({ __proto__: null }); // Create an object of all benchmark scripts const benchmarks = {}; fs.readdirSync(__dirname) @@ -15,7 +16,7 @@ fs.readdirSync(__dirname) .filter((filename) => filename[0] !== '.' && filename[0] !== '_'); }); -function CLI(usage, settings) { +function CLI(usage, settings = kEmptyObject) { if (process.argv.length < 3) { this.abort(usage); // Abort will exit the process } @@ -25,8 +26,10 @@ function CLI(usage, settings) { this.items = []; this.test = false; - for (const argName of settings.arrayArgs) { - this.optional[argName] = []; + if (settings.arrayArgs) { + for (const argName of settings.arrayArgs) { + this.optional[argName] = []; + } } let currentOptional = null; @@ -39,13 +42,9 @@ function CLI(usage, settings) { } else if (mode === 'both' && arg[0] === '-') { // Optional arguments declaration - if (arg[1] === '-') { - currentOptional = arg.slice(2); - } else { - currentOptional = arg.slice(1); - } + currentOptional = arg.slice(arg[1] === '-' ? 2 : 1); - if (settings.boolArgs && settings.boolArgs.includes(currentOptional)) { + if (settings.boolArgs?.includes(currentOptional)) { this.optional[currentOptional] = true; mode = 'both'; } else { @@ -55,7 +54,7 @@ function CLI(usage, settings) { } else if (mode === 'option') { // Optional arguments value - if (settings.arrayArgs.includes(currentOptional)) { + if (settings.arrayArgs?.includes(currentOptional)) { this.optional[currentOptional].push(arg); } else { this.optional[currentOptional] = arg; diff --git a/test/parallel/test-benchmark-cli.js b/test/parallel/test-benchmark-cli.js index 49069fecac43ce..91dbe07d87f78f 100644 --- a/test/parallel/test-benchmark-cli.js +++ b/test/parallel/test-benchmark-cli.js @@ -1,6 +1,6 @@ 'use strict'; -require('../common'); +const common = require('../common'); // This tests the CLI parser for our benchmark suite. @@ -11,9 +11,11 @@ const CLI = require('../../benchmark/_cli.js'); const originalArgv = process.argv; function testFilterPattern(filters, excludes, filename, expectedResult) { - process.argv = process.argv.concat(...filters.map((p) => ['--filter', p])); - process.argv = process.argv.concat(...excludes.map((p) => ['--exclude', p])); - process.argv = process.argv.concat(['bench']); + process.argv = process.argv.concat( + filters.flatMap((p) => ['--filter', p]), + excludes.flatMap((p) => ['--exclude', p]), + ['bench'], + ); const cli = new CLI('', { 'arrayArgs': ['filter', 'exclude'] }); assert.deepStrictEqual(cli.shouldSkip(filename), expectedResult); @@ -36,3 +38,46 @@ testFilterPattern([], ['foo', 'bar'], 'bar', true); testFilterPattern(['foo'], ['bar'], 'foo', false); testFilterPattern(['foo'], ['bar'], 'foo-bar', true); + +function testNoSettingsPattern(filters, excludes, filename, expectedResult) { + process.argv = process.argv.concat( + filters.flatMap((p) => ['--filter', p]), + excludes.flatMap((p) => ['--exclude', p]), + ['bench'], + ); + try { + const cli = new CLI(''); + assert.deepStrictEqual(cli.shouldSkip(filename), expectedResult); + } catch { + common.mustNotCall('If settings param is null, shouldn\'t throw an error'); + } + process.argv = originalArgv; +} + +testNoSettingsPattern([], []); +testNoSettingsPattern([], [], 'foo', false); + +testNoSettingsPattern(['foo'], [], 'foo', false); +testNoSettingsPattern(['foo'], [], 'bar', true); +testNoSettingsPattern(['foo', 'bar'], [], 'foo', false); +testNoSettingsPattern(['foo', 'bar'], [], 'bar', false); + +testNoSettingsPattern([], ['foo'], 'foo', true); +testNoSettingsPattern([], ['foo'], 'bar', false); +testNoSettingsPattern([], ['foo', 'bar'], 'foo', true); +testNoSettingsPattern([], ['foo', 'bar'], 'bar', true); + +testNoSettingsPattern(['foo'], ['bar'], 'foo', false); +testNoSettingsPattern(['foo'], ['bar'], 'foo-bar', true); + +function testNormalOption(options = [], expectedResult = []) { + process.argv = process.argv.concat(options); + const cli = new CLI('', { boolArgs: ['foo', 'bar', 'foo-bar'] }); + const optional = Object.keys(cli.optional); + assert.deepStrictEqual(optional, expectedResult); + process.argv = originalArgv; +} + +testNormalOption(['--foo'], ['foo']); +testNormalOption(['--foo', '--bar'], ['foo', 'bar']); +testNormalOption(['--foo-bar'], ['foo-bar']);