diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 76922b00..944a18e7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -68,14 +68,8 @@ jobs: os: windows-latest shell: cmd node-version: - - 10.0.0 - - 10.x - - 12.x - - 14.x - - 16.x - - 18.x - - 20.x - 22.x + - 24.x exclude: - platform: { name: macOS, os: macos-latest, shell: bash } node-version: 10.0.0 diff --git a/internal/constants.js b/internal/constants.js index 6d1db915..5fb8766a 100644 --- a/internal/constants.js +++ b/internal/constants.js @@ -5,8 +5,10 @@ const SEMVER_SPEC_VERSION = '2.0.0' const MAX_LENGTH = 256 +/* node:coverage disable */ const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || -/* istanbul ignore next */ 9007199254740991 + 9007199254740991 +/* node:coverage enable */ // Max safe segment length for coercion. const MAX_SAFE_COMPONENT_LENGTH = 16 diff --git a/package.json b/package.json index 2b8cadaa..b68d49d8 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,8 @@ "description": "The semantic version parser used by npm.", "main": "index.js", "scripts": { - "test": "tap", - "snap": "tap", + "test": "node --test --experimental-test-coverage --test-timeout=3000 --test-coverage-lines=99 --test-coverage-functions=99 --test-coverage-branches=99", + "snap": "node --test --test-update-snapshots", "lint": "npm run eslint", "postlint": "template-oss-check", "lintfix": "npm run eslint -- --fix", @@ -16,8 +16,7 @@ "devDependencies": { "@npmcli/eslint-config": "^5.0.0", "@npmcli/template-oss": "4.25.1", - "benchmark": "^2.1.4", - "tap": "^16.0.0" + "benchmark": "^2.1.4" }, "license": "ISC", "repository": { @@ -35,17 +34,10 @@ "internal/", "ranges/", "index.js", + "map.js", "preload.js", "range.bnf" ], - "tap": { - "timeout": 30, - "coverage-map": "map.js", - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - }, "engines": { "node": ">=10" }, diff --git a/ranges/min-version.js b/ranges/min-version.js index 09a65aa3..9afa3421 100644 --- a/ranges/min-version.js +++ b/ranges/min-version.js @@ -44,7 +44,7 @@ const minVersion = (range, loose) => { case '<=': /* Ignore maximum versions */ break - /* istanbul ignore next */ + /* node:coverage ignore next 2 */ default: throw new Error(`Unexpected operation: ${comparator.operator}`) } diff --git a/tap-snapshots/test/bin/semver.js.test.cjs b/tap-snapshots/test/bin/semver.js.test.cjs deleted file mode 100644 index 4938f10d..00000000 --- a/tap-snapshots/test/bin/semver.js.test.cjs +++ /dev/null @@ -1,486 +0,0 @@ -/* IMPORTANT - * This snapshot file is auto-generated, but designed for humans. - * It should be checked into source control and tracked carefully. - * Re-generate by setting TAP_SNAPSHOT=1 and running tests. - * Make sure to inspect the output below. Do not ignore changes! - */ -'use strict' -exports[`test/bin/semver.js TAP coercing > 1.2.3.4.5.6 -c --rtl --ltr 1`] = ` -Object { - "code": 0, - "err": "", - "out": "1.2.3\\n", - "signal": null, -} -` - -exports[`test/bin/semver.js TAP coercing > 1.2.3.4.5.6 -c --rtl 1`] = ` -Object { - "code": 0, - "err": "", - "out": "4.5.6\\n", - "signal": null, -} -` - -exports[`test/bin/semver.js TAP coercing > 1.2.3.4.5.6 -c 1`] = ` -Object { - "code": 0, - "err": "", - "out": "1.2.3\\n", - "signal": null, -} -` - -exports[`test/bin/semver.js TAP coercing > not a version -c 1`] = ` -Object { - "code": 1, - "err": "", - "out": "", - "signal": null, -} -` - -exports[`test/bin/semver.js TAP coercing > not a version 1.2.3 -c 1`] = ` -Object { - "code": 0, - "err": "", - "out": "1.2.3\\n", - "signal": null, -} -` - -exports[`test/bin/semver.js TAP help output > (no args) 1`] = ` -Object { - "code": 0, - "err": "", - "out": String( - SemVer @@VERSION@@ - - A JavaScript implementation of the https://semver.org/ specification - Copyright Isaac Z. Schlueter - - Usage: semver [options] [ [...]] - Prints valid versions sorted by SemVer precedence - - Options: - -r --range - Print versions that match the specified range. - - -i --increment [] - Increment a version by the specified level. Level can - be one of: major, minor, patch, premajor, preminor, - prepatch, prerelease, or release. Default level is 'patch'. - Only one version may be specified. - - --preid - Identifier to be used to prefix premajor, preminor, - prepatch or prerelease version increments. - - -l --loose - Interpret versions and ranges loosely - - -p --include-prerelease - Always include prerelease versions in range matching - - -c --coerce - Coerce a string into SemVer if possible - (does not imply --loose) - - --rtl - Coerce version strings right to left - - --ltr - Coerce version strings left to right (default) - - -n - Base number to be used for the prerelease identifier. - Can be either 0 or 1, or false to omit the number altogether. - Defaults to 0. - - Program exits successfully if any valid version satisfies - all supplied ranges, and prints all satisfying versions. - - If no satisfying versions are found, then exits failure. - - Versions are printed in ascending order, so supplying - multiple versions to the utility will just sort them. - - ), - "signal": null, -} -` - -exports[`test/bin/semver.js TAP help output > --help 1`] = ` -Object { - "code": 0, - "err": "", - "out": String( - SemVer @@VERSION@@ - - A JavaScript implementation of the https://semver.org/ specification - Copyright Isaac Z. Schlueter - - Usage: semver [options] [ [...]] - Prints valid versions sorted by SemVer precedence - - Options: - -r --range - Print versions that match the specified range. - - -i --increment [] - Increment a version by the specified level. Level can - be one of: major, minor, patch, premajor, preminor, - prepatch, prerelease, or release. Default level is 'patch'. - Only one version may be specified. - - --preid - Identifier to be used to prefix premajor, preminor, - prepatch or prerelease version increments. - - -l --loose - Interpret versions and ranges loosely - - -p --include-prerelease - Always include prerelease versions in range matching - - -c --coerce - Coerce a string into SemVer if possible - (does not imply --loose) - - --rtl - Coerce version strings right to left - - --ltr - Coerce version strings left to right (default) - - -n - Base number to be used for the prerelease identifier. - Can be either 0 or 1, or false to omit the number altogether. - Defaults to 0. - - Program exits successfully if any valid version satisfies - all supplied ranges, and prints all satisfying versions. - - If no satisfying versions are found, then exits failure. - - Versions are printed in ascending order, so supplying - multiple versions to the utility will just sort them. - - ), - "signal": null, -} -` - -exports[`test/bin/semver.js TAP help output > -? 1`] = ` -Object { - "code": 0, - "err": "", - "out": String( - SemVer @@VERSION@@ - - A JavaScript implementation of the https://semver.org/ specification - Copyright Isaac Z. Schlueter - - Usage: semver [options] [ [...]] - Prints valid versions sorted by SemVer precedence - - Options: - -r --range - Print versions that match the specified range. - - -i --increment [] - Increment a version by the specified level. Level can - be one of: major, minor, patch, premajor, preminor, - prepatch, prerelease, or release. Default level is 'patch'. - Only one version may be specified. - - --preid - Identifier to be used to prefix premajor, preminor, - prepatch or prerelease version increments. - - -l --loose - Interpret versions and ranges loosely - - -p --include-prerelease - Always include prerelease versions in range matching - - -c --coerce - Coerce a string into SemVer if possible - (does not imply --loose) - - --rtl - Coerce version strings right to left - - --ltr - Coerce version strings left to right (default) - - -n - Base number to be used for the prerelease identifier. - Can be either 0 or 1, or false to omit the number altogether. - Defaults to 0. - - Program exits successfully if any valid version satisfies - all supplied ranges, and prints all satisfying versions. - - If no satisfying versions are found, then exits failure. - - Versions are printed in ascending order, so supplying - multiple versions to the utility will just sort them. - - ), - "signal": null, -} -` - -exports[`test/bin/semver.js TAP help output > -h 1`] = ` -Object { - "code": 0, - "err": "", - "out": String( - SemVer @@VERSION@@ - - A JavaScript implementation of the https://semver.org/ specification - Copyright Isaac Z. Schlueter - - Usage: semver [options] [ [...]] - Prints valid versions sorted by SemVer precedence - - Options: - -r --range - Print versions that match the specified range. - - -i --increment [] - Increment a version by the specified level. Level can - be one of: major, minor, patch, premajor, preminor, - prepatch, prerelease, or release. Default level is 'patch'. - Only one version may be specified. - - --preid - Identifier to be used to prefix premajor, preminor, - prepatch or prerelease version increments. - - -l --loose - Interpret versions and ranges loosely - - -p --include-prerelease - Always include prerelease versions in range matching - - -c --coerce - Coerce a string into SemVer if possible - (does not imply --loose) - - --rtl - Coerce version strings right to left - - --ltr - Coerce version strings left to right (default) - - -n - Base number to be used for the prerelease identifier. - Can be either 0 or 1, or false to omit the number altogether. - Defaults to 0. - - Program exits successfully if any valid version satisfies - all supplied ranges, and prints all satisfying versions. - - If no satisfying versions are found, then exits failure. - - Versions are printed in ascending order, so supplying - multiple versions to the utility will just sort them. - - ), - "signal": null, -} -` - -exports[`test/bin/semver.js TAP inc tests > -i 1.2.3 1`] = ` -Object { - "code": 0, - "err": "", - "out": "1.2.4\\n", - "signal": null, -} -` - -exports[`test/bin/semver.js TAP inc tests > -i major 1.0.0 1`] = ` -Object { - "code": 0, - "err": "", - "out": "2.0.0\\n", - "signal": null, -} -` - -exports[`test/bin/semver.js TAP inc tests > -i major 1.0.0 1.0.1 1`] = ` -Object { - "code": 1, - "err": "--inc can only be used on a single version with no range\\n", - "out": "", - "signal": null, -} -` - -exports[`test/bin/semver.js TAP inc tests > -i premajor 1.0.0 --preid=beta -n 1 1`] = ` -Object { - "code": 0, - "err": "", - "out": "2.0.0-beta.1\\n", - "signal": null, -} -` - -exports[`test/bin/semver.js TAP inc tests > -i premajor 1.0.0 --preid=beta -n false 1`] = ` -Object { - "code": 0, - "err": "", - "out": "2.0.0-beta\\n", - "signal": null, -} -` - -exports[`test/bin/semver.js TAP inc tests > -i premajor 1.0.0 --preid=beta 1`] = ` -Object { - "code": 0, - "err": "", - "out": "2.0.0-beta.0\\n", - "signal": null, -} -` - -exports[`test/bin/semver.js TAP inc tests > -i release 1.0.0-pre`] = ` -Object { - "code": 0, - "err": "", - "out": "1.0.0\\n", - "signal": null, -} -` - -exports[`test/bin/semver.js TAP sorting and filtering > 1.2.3 -v 3.2.1 --version 2.3.4 -rv 1`] = ` -Object { - "code": 0, - "err": "", - "out": String( - 3.2.1 - 2.3.4 - 1.2.3 - - ), - "signal": null, -} -` - -exports[`test/bin/semver.js TAP sorting and filtering > 1.2.3 -v 3.2.1 --version 2.3.4 1`] = ` -Object { - "code": 0, - "err": "", - "out": String( - 1.2.3 - 2.3.4 - 3.2.1 - - ), - "signal": null, -} -` - -exports[`test/bin/semver.js TAP sorting and filtering > 1.2.3 3.2.1 -r 2.x 1`] = ` -Object { - "code": 1, - "err": "", - "out": "", - "signal": null, -} -` - -exports[`test/bin/semver.js TAP sorting and filtering > 1.2.3 3.2.1 -r 2.x 2.3.4 1`] = ` -Object { - "code": 0, - "err": "", - "out": "2.3.4\\n", - "signal": null, -} -` - -exports[`test/bin/semver.js TAP sorting and filtering > 1.2.3 3.2.1 2.3.4 1`] = ` -Object { - "code": 0, - "err": "", - "out": String( - 1.2.3 - 2.3.4 - 3.2.1 - - ), - "signal": null, -} -` - -exports[`test/bin/semver.js TAP sorting and filtering > 1.2.3 3.2.1 2.3.4 2.3.4-beta 1`] = ` -Object { - "code": 0, - "err": "", - "out": String( - 1.2.3 - 2.3.4-beta - 2.3.4 - 3.2.1 - - ), - "signal": null, -} -` - -exports[`test/bin/semver.js TAP sorting and filtering > 1.2.3 3.2.1 2.3.4 2.3.4-beta 2.0.0asdf -r 2.x -p 1`] = ` -Object { - "code": 0, - "err": "", - "out": String( - 2.3.4-beta - 2.3.4 - - ), - "signal": null, -} -` - -exports[`test/bin/semver.js TAP sorting and filtering > 1.2.3 3.2.1 2.3.4 2.3.4-beta 2.0.0asdf -r 2.x 1`] = ` -Object { - "code": 0, - "err": "", - "out": "2.3.4\\n", - "signal": null, -} -` - -exports[`test/bin/semver.js TAP sorting and filtering > 1.2.3foo 1.2.3-bar -l 1`] = ` -Object { - "code": 0, - "err": "", - "out": "1.2.3-bar\\n", - "signal": null, -} -` - -exports[`test/bin/semver.js TAP sorting and filtering > 1.2.3foo 1.2.3-bar 1`] = ` -Object { - "code": 0, - "err": "", - "out": "1.2.3-bar\\n", - "signal": null, -} -` - -exports[`test/bin/semver.js TAP sorting and filtering > 3.2.1 2.3.4 2.3.4-beta 2.0.0asdf -r 2.x -p -l 1`] = ` -Object { - "code": 0, - "err": "", - "out": String( - 2.3.4-beta - 2.3.4 - - ), - "signal": null, -} -` diff --git a/test/bin/semver.js b/test/bin/semver.js index 0514103b..0eb664a7 100644 --- a/test/bin/semver.js +++ b/test/bin/semver.js @@ -1,9 +1,10 @@ 'use strict' -const t = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const thisVersion = require('../../package.json').version -t.cleanSnapshot = str => str.split(thisVersion).join('@@VERSION@@') +const cleanSnapshot = str => str.split(thisVersion).join('@@VERSION@@') const spawn = require('child_process').spawn const bin = require.resolve('../../bin/semver') @@ -26,58 +27,94 @@ const run = args => new Promise((resolve, reject) => { }) }) -t.test('inc tests', t => Promise.all([ - ['-i', 'major', '1.0.0'], - ['-i', 'major', '1.0.0', '1.0.1'], - ['-i', 'premajor', '1.0.0', '--preid=beta'], - ['-i', 'premajor', '1.0.0', '--preid=beta', '-n', '1'], - ['-i', 'premajor', '1.0.0', '--preid=beta', '-n', 'false'], - ['-i', '1.2.3'], -].map(args => t.resolveMatchSnapshot(run(args), args.join(' '))))) +test('inc tests', async (t) => { + for (const args of [ + ['-i', 'major', '1.0.0'], + ['-i', 'major', '1.0.0', '1.0.1'], + ['-i', 'premajor', '1.0.0', '--preid=beta'], + ['-i', 'premajor', '1.0.0', '--preid=beta', '-n', '1'], + ['-i', 'premajor', '1.0.0', '--preid=beta', '-n', 'false'], + ['-i', '1.2.3'], + ]) { + const result = await run(args) + const cleaned = cleanSnapshot(JSON.stringify(result, null, 2)) + await t.test(args.join(' '), () => { + t.assert.snapshot(cleaned) + }) + } +}) + +test('help output', async (t) => { + for (const h of [ + ['-h'], + ['-?'], + ['--help'], + [], + ]) { + const result = await run(h) + const cleaned = cleanSnapshot(JSON.stringify(result, null, 2)) + await t.test(h[0] || '(no args)', () => { + t.assert.snapshot(cleaned) + }) + } +}) -t.test('help output', t => Promise.all([ - ['-h'], - ['-?'], - ['--help'], - [], -].map(h => t.resolveMatchSnapshot(run(h), h[0] || '(no args)')))) +test('sorting and filtering', async (t) => { + for (const args of [ + ['1.2.3', '3.2.1', '2.3.4'], + ['1.2.3', '3.2.1', '2.3.4', '2.3.4-beta'], + ['1.2.3', '-v', '3.2.1', '--version', '2.3.4'], + ['1.2.3', '-v', '3.2.1', '--version', '2.3.4', '-rv'], + ['1.2.3foo', '1.2.3-bar'], + ['1.2.3foo', '1.2.3-bar', '-l'], + ['1.2.3', '3.2.1', '-r', '2.x', '2.3.4'], + ['1.2.3', '3.2.1', '2.3.4', '2.3.4-beta', '2.0.0asdf', '-r', '2.x'], + ['1.2.3', '3.2.1', '2.3.4', '2.3.4-beta', '2.0.0asdf', '-r', '2.x', '-p'], + ['3.2.1', '2.3.4', '2.3.4-beta', '2.0.0asdf', '-r', '2.x', '-p', '-l'], + ['1.2.3', '3.2.1', '-r', '2.x'], + ]) { + const result = await run(args) + const cleaned = cleanSnapshot(JSON.stringify(result, null, 2)) + await t.test(args.join(' '), () => { + t.assert.snapshot(cleaned) + }) + } +}) -t.test('sorting and filtering', t => Promise.all([ - ['1.2.3', '3.2.1', '2.3.4'], - ['1.2.3', '3.2.1', '2.3.4', '2.3.4-beta'], - ['1.2.3', '-v', '3.2.1', '--version', '2.3.4'], - ['1.2.3', '-v', '3.2.1', '--version', '2.3.4', '-rv'], - ['1.2.3foo', '1.2.3-bar'], - ['1.2.3foo', '1.2.3-bar', '-l'], - ['1.2.3', '3.2.1', '-r', '2.x', '2.3.4'], - ['1.2.3', '3.2.1', '2.3.4', '2.3.4-beta', '2.0.0asdf', '-r', '2.x'], - ['1.2.3', '3.2.1', '2.3.4', '2.3.4-beta', '2.0.0asdf', '-r', '2.x', '-p'], - ['3.2.1', '2.3.4', '2.3.4-beta', '2.0.0asdf', '-r', '2.x', '-p', '-l'], - ['1.2.3', '3.2.1', '-r', '2.x'], -].map(args => t.resolveMatchSnapshot(run(args), args.join(' '))))) +test('coercing', async (t) => { + for (const args of [ + ['1.2.3.4.5.6', '-c'], + ['1.2.3.4.5.6', '-c', '--rtl'], + ['1.2.3.4.5.6', '-c', '--rtl', '--ltr'], + ['not a version', '1.2.3', '-c'], + ['not a version', '-c'], + ]) { + const result = await run(args) + const cleaned = cleanSnapshot(JSON.stringify(result, null, 2)) + await t.test(args.join(' '), () => { + t.assert.snapshot(cleaned) + }) + } +}) -t.test('coercing', t => Promise.all([ - ['1.2.3.4.5.6', '-c'], - ['1.2.3.4.5.6', '-c', '--rtl'], - ['1.2.3.4.5.6', '-c', '--rtl', '--ltr'], - ['not a version', '1.2.3', '-c'], - ['not a version', '-c'], -].map(args => t.resolveMatchSnapshot(run(args), args.join(' '))))) +test('args with equals', async () => { + const cases = [ + [['--version', '1.2.3'], '1.2.3'], + [['--range', '1'], ['1.2.3'], ['2.3.4'], '1.2.3'], + [['--increment', 'major'], ['1.0.0'], '2.0.0'], + [['--increment', 'premajor'], ['--preid', 'beta'], ['1.0.0'], '2.0.0-beta.0'], + ] -t.test('args with equals', t => Promise.all([ - [['--version', '1.2.3'], '1.2.3'], - [['--range', '1'], ['1.2.3'], ['2.3.4'], '1.2.3'], - [['--increment', 'major'], ['1.0.0'], '2.0.0'], - [['--increment', 'premajor'], ['--preid', 'beta'], ['1.0.0'], '2.0.0-beta.0'], -].map(async (args) => { - const expected = args.pop() - const equals = args.map((a) => a.join('=')) - const spaces = args.reduce((acc, a) => acc.concat(a), []) - const res1 = await run(equals) - const res2 = await run(spaces) - t.equal(res1.signal, null) - t.equal(res1.code, 0) - t.equal(res1.err, '') - t.equal(res1.out.trim(), expected) - t.strictSame(res1, res2, args.join(' ')) -}))) + for (const args of cases) { + const expected = args.pop() + const equals = args.map((arg) => arg.join('=')) + const spaces = args.reduce((acc, arg) => acc.concat(arg), []) + const res1 = await run(equals) + const res2 = await run(spaces) + a.equal(res1.signal, null) + a.equal(res1.code, 0) + a.equal(res1.err, '') + a.equal(res1.out.trim(), expected) + a.deepEqual(res1, res2, args.join(' ')) + } +}) diff --git a/test/bin/semver.js.snapshot b/test/bin/semver.js.snapshot new file mode 100644 index 00000000..f5165972 --- /dev/null +++ b/test/bin/semver.js.snapshot @@ -0,0 +1,103 @@ +exports[`coercing 1`] = ` +"{\\n \\"out\\": \\"1.2.3\\\\n\\",\\n \\"err\\": \\"\\",\\n \\"code\\": 0,\\n \\"signal\\": null\\n}" +`; + +exports[`coercing 2`] = ` +"{\\n \\"out\\": \\"4.5.6\\\\n\\",\\n \\"err\\": \\"\\",\\n \\"code\\": 0,\\n \\"signal\\": null\\n}" +`; + +exports[`coercing 3`] = ` +"{\\n \\"out\\": \\"1.2.3\\\\n\\",\\n \\"err\\": \\"\\",\\n \\"code\\": 0,\\n \\"signal\\": null\\n}" +`; + +exports[`coercing 4`] = ` +"{\\n \\"out\\": \\"1.2.3\\\\n\\",\\n \\"err\\": \\"\\",\\n \\"code\\": 0,\\n \\"signal\\": null\\n}" +`; + +exports[`coercing 5`] = ` +"{\\n \\"out\\": \\"\\",\\n \\"err\\": \\"\\",\\n \\"code\\": 1,\\n \\"signal\\": null\\n}" +`; + +exports[`help output 1`] = ` +"{\\n \\"out\\": \\"SemVer @@VERSION@@\\\\n\\\\nA JavaScript implementation of the https://semver.org/ specification\\\\nCopyright Isaac Z. Schlueter\\\\n\\\\nUsage: semver [options] [ [...]]\\\\nPrints valid versions sorted by SemVer precedence\\\\n\\\\nOptions:\\\\n-r --range \\\\n Print versions that match the specified range.\\\\n\\\\n-i --increment []\\\\n Increment a version by the specified level. Level can\\\\n be one of: major, minor, patch, premajor, preminor,\\\\n prepatch, prerelease, or release. Default level is 'patch'.\\\\n Only one version may be specified.\\\\n\\\\n--preid \\\\n Identifier to be used to prefix premajor, preminor,\\\\n prepatch or prerelease version increments.\\\\n\\\\n-l --loose\\\\n Interpret versions and ranges loosely\\\\n\\\\n-p --include-prerelease\\\\n Always include prerelease versions in range matching\\\\n\\\\n-c --coerce\\\\n Coerce a string into SemVer if possible\\\\n (does not imply --loose)\\\\n\\\\n--rtl\\\\n Coerce version strings right to left\\\\n\\\\n--ltr\\\\n Coerce version strings left to right (default)\\\\n\\\\n-n \\\\n Base number to be used for the prerelease identifier.\\\\n Can be either 0 or 1, or false to omit the number altogether.\\\\n Defaults to 0.\\\\n\\\\nProgram exits successfully if any valid version satisfies\\\\nall supplied ranges, and prints all satisfying versions.\\\\n\\\\nIf no satisfying versions are found, then exits failure.\\\\n\\\\nVersions are printed in ascending order, so supplying\\\\nmultiple versions to the utility will just sort them.\\\\n\\",\\n \\"err\\": \\"\\",\\n \\"code\\": 0,\\n \\"signal\\": null\\n}" +`; + +exports[`help output 2`] = ` +"{\\n \\"out\\": \\"SemVer @@VERSION@@\\\\n\\\\nA JavaScript implementation of the https://semver.org/ specification\\\\nCopyright Isaac Z. Schlueter\\\\n\\\\nUsage: semver [options] [ [...]]\\\\nPrints valid versions sorted by SemVer precedence\\\\n\\\\nOptions:\\\\n-r --range \\\\n Print versions that match the specified range.\\\\n\\\\n-i --increment []\\\\n Increment a version by the specified level. Level can\\\\n be one of: major, minor, patch, premajor, preminor,\\\\n prepatch, prerelease, or release. Default level is 'patch'.\\\\n Only one version may be specified.\\\\n\\\\n--preid \\\\n Identifier to be used to prefix premajor, preminor,\\\\n prepatch or prerelease version increments.\\\\n\\\\n-l --loose\\\\n Interpret versions and ranges loosely\\\\n\\\\n-p --include-prerelease\\\\n Always include prerelease versions in range matching\\\\n\\\\n-c --coerce\\\\n Coerce a string into SemVer if possible\\\\n (does not imply --loose)\\\\n\\\\n--rtl\\\\n Coerce version strings right to left\\\\n\\\\n--ltr\\\\n Coerce version strings left to right (default)\\\\n\\\\n-n \\\\n Base number to be used for the prerelease identifier.\\\\n Can be either 0 or 1, or false to omit the number altogether.\\\\n Defaults to 0.\\\\n\\\\nProgram exits successfully if any valid version satisfies\\\\nall supplied ranges, and prints all satisfying versions.\\\\n\\\\nIf no satisfying versions are found, then exits failure.\\\\n\\\\nVersions are printed in ascending order, so supplying\\\\nmultiple versions to the utility will just sort them.\\\\n\\",\\n \\"err\\": \\"\\",\\n \\"code\\": 0,\\n \\"signal\\": null\\n}" +`; + +exports[`help output 3`] = ` +"{\\n \\"out\\": \\"SemVer @@VERSION@@\\\\n\\\\nA JavaScript implementation of the https://semver.org/ specification\\\\nCopyright Isaac Z. Schlueter\\\\n\\\\nUsage: semver [options] [ [...]]\\\\nPrints valid versions sorted by SemVer precedence\\\\n\\\\nOptions:\\\\n-r --range \\\\n Print versions that match the specified range.\\\\n\\\\n-i --increment []\\\\n Increment a version by the specified level. Level can\\\\n be one of: major, minor, patch, premajor, preminor,\\\\n prepatch, prerelease, or release. Default level is 'patch'.\\\\n Only one version may be specified.\\\\n\\\\n--preid \\\\n Identifier to be used to prefix premajor, preminor,\\\\n prepatch or prerelease version increments.\\\\n\\\\n-l --loose\\\\n Interpret versions and ranges loosely\\\\n\\\\n-p --include-prerelease\\\\n Always include prerelease versions in range matching\\\\n\\\\n-c --coerce\\\\n Coerce a string into SemVer if possible\\\\n (does not imply --loose)\\\\n\\\\n--rtl\\\\n Coerce version strings right to left\\\\n\\\\n--ltr\\\\n Coerce version strings left to right (default)\\\\n\\\\n-n \\\\n Base number to be used for the prerelease identifier.\\\\n Can be either 0 or 1, or false to omit the number altogether.\\\\n Defaults to 0.\\\\n\\\\nProgram exits successfully if any valid version satisfies\\\\nall supplied ranges, and prints all satisfying versions.\\\\n\\\\nIf no satisfying versions are found, then exits failure.\\\\n\\\\nVersions are printed in ascending order, so supplying\\\\nmultiple versions to the utility will just sort them.\\\\n\\",\\n \\"err\\": \\"\\",\\n \\"code\\": 0,\\n \\"signal\\": null\\n}" +`; + +exports[`help output 4`] = ` +"{\\n \\"out\\": \\"SemVer @@VERSION@@\\\\n\\\\nA JavaScript implementation of the https://semver.org/ specification\\\\nCopyright Isaac Z. Schlueter\\\\n\\\\nUsage: semver [options] [ [...]]\\\\nPrints valid versions sorted by SemVer precedence\\\\n\\\\nOptions:\\\\n-r --range \\\\n Print versions that match the specified range.\\\\n\\\\n-i --increment []\\\\n Increment a version by the specified level. Level can\\\\n be one of: major, minor, patch, premajor, preminor,\\\\n prepatch, prerelease, or release. Default level is 'patch'.\\\\n Only one version may be specified.\\\\n\\\\n--preid \\\\n Identifier to be used to prefix premajor, preminor,\\\\n prepatch or prerelease version increments.\\\\n\\\\n-l --loose\\\\n Interpret versions and ranges loosely\\\\n\\\\n-p --include-prerelease\\\\n Always include prerelease versions in range matching\\\\n\\\\n-c --coerce\\\\n Coerce a string into SemVer if possible\\\\n (does not imply --loose)\\\\n\\\\n--rtl\\\\n Coerce version strings right to left\\\\n\\\\n--ltr\\\\n Coerce version strings left to right (default)\\\\n\\\\n-n \\\\n Base number to be used for the prerelease identifier.\\\\n Can be either 0 or 1, or false to omit the number altogether.\\\\n Defaults to 0.\\\\n\\\\nProgram exits successfully if any valid version satisfies\\\\nall supplied ranges, and prints all satisfying versions.\\\\n\\\\nIf no satisfying versions are found, then exits failure.\\\\n\\\\nVersions are printed in ascending order, so supplying\\\\nmultiple versions to the utility will just sort them.\\\\n\\",\\n \\"err\\": \\"\\",\\n \\"code\\": 0,\\n \\"signal\\": null\\n}" +`; + +exports[`inc tests 1`] = ` +"{\\n \\"out\\": \\"2.0.0\\\\n\\",\\n \\"err\\": \\"\\",\\n \\"code\\": 0,\\n \\"signal\\": null\\n}" +`; + +exports[`inc tests 2`] = ` +"{\\n \\"out\\": \\"\\",\\n \\"err\\": \\"--inc can only be used on a single version with no range\\\\n\\",\\n \\"code\\": 1,\\n \\"signal\\": null\\n}" +`; + +exports[`inc tests 3`] = ` +"{\\n \\"out\\": \\"2.0.0-beta.0\\\\n\\",\\n \\"err\\": \\"\\",\\n \\"code\\": 0,\\n \\"signal\\": null\\n}" +`; + +exports[`inc tests 4`] = ` +"{\\n \\"out\\": \\"2.0.0-beta.1\\\\n\\",\\n \\"err\\": \\"\\",\\n \\"code\\": 0,\\n \\"signal\\": null\\n}" +`; + +exports[`inc tests 5`] = ` +"{\\n \\"out\\": \\"2.0.0-beta\\\\n\\",\\n \\"err\\": \\"\\",\\n \\"code\\": 0,\\n \\"signal\\": null\\n}" +`; + +exports[`inc tests 6`] = ` +"{\\n \\"out\\": \\"1.2.4\\\\n\\",\\n \\"err\\": \\"\\",\\n \\"code\\": 0,\\n \\"signal\\": null\\n}" +`; + +exports[`sorting and filtering 1`] = ` +"{\\n \\"out\\": \\"1.2.3\\\\n2.3.4\\\\n3.2.1\\\\n\\",\\n \\"err\\": \\"\\",\\n \\"code\\": 0,\\n \\"signal\\": null\\n}" +`; + +exports[`sorting and filtering 10`] = ` +"{\\n \\"out\\": \\"2.3.4-beta\\\\n2.3.4\\\\n\\",\\n \\"err\\": \\"\\",\\n \\"code\\": 0,\\n \\"signal\\": null\\n}" +`; + +exports[`sorting and filtering 11`] = ` +"{\\n \\"out\\": \\"\\",\\n \\"err\\": \\"\\",\\n \\"code\\": 1,\\n \\"signal\\": null\\n}" +`; + +exports[`sorting and filtering 2`] = ` +"{\\n \\"out\\": \\"1.2.3\\\\n2.3.4-beta\\\\n2.3.4\\\\n3.2.1\\\\n\\",\\n \\"err\\": \\"\\",\\n \\"code\\": 0,\\n \\"signal\\": null\\n}" +`; + +exports[`sorting and filtering 3`] = ` +"{\\n \\"out\\": \\"1.2.3\\\\n2.3.4\\\\n3.2.1\\\\n\\",\\n \\"err\\": \\"\\",\\n \\"code\\": 0,\\n \\"signal\\": null\\n}" +`; + +exports[`sorting and filtering 4`] = ` +"{\\n \\"out\\": \\"3.2.1\\\\n2.3.4\\\\n1.2.3\\\\n\\",\\n \\"err\\": \\"\\",\\n \\"code\\": 0,\\n \\"signal\\": null\\n}" +`; + +exports[`sorting and filtering 5`] = ` +"{\\n \\"out\\": \\"1.2.3-bar\\\\n\\",\\n \\"err\\": \\"\\",\\n \\"code\\": 0,\\n \\"signal\\": null\\n}" +`; + +exports[`sorting and filtering 6`] = ` +"{\\n \\"out\\": \\"1.2.3-bar\\\\n\\",\\n \\"err\\": \\"\\",\\n \\"code\\": 0,\\n \\"signal\\": null\\n}" +`; + +exports[`sorting and filtering 7`] = ` +"{\\n \\"out\\": \\"2.3.4\\\\n\\",\\n \\"err\\": \\"\\",\\n \\"code\\": 0,\\n \\"signal\\": null\\n}" +`; + +exports[`sorting and filtering 8`] = ` +"{\\n \\"out\\": \\"2.3.4\\\\n\\",\\n \\"err\\": \\"\\",\\n \\"code\\": 0,\\n \\"signal\\": null\\n}" +`; + +exports[`sorting and filtering 9`] = ` +"{\\n \\"out\\": \\"2.3.4-beta\\\\n2.3.4\\\\n\\",\\n \\"err\\": \\"\\",\\n \\"code\\": 0,\\n \\"signal\\": null\\n}" +`; diff --git a/test/classes/comparator.js b/test/classes/comparator.js index 477b2ab6..51912a60 100644 --- a/test/classes/comparator.js +++ b/test/classes/comparator.js @@ -1,65 +1,59 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const Comparator = require('../../classes/comparator') const comparatorIntersection = require('../fixtures/comparator-intersection.js') -test('comparator testing', t => { +test('comparator testing', () => { const c = new Comparator('>=1.2.3') - t.ok(c.test('1.2.4')) + a.ok(c.test('1.2.4')) const c2 = new Comparator(c) - t.ok(c2.test('1.2.4')) + a.ok(c2.test('1.2.4')) const c3 = new Comparator(c, true) - t.ok(c3.test('1.2.4')) + a.ok(c3.test('1.2.4')) // test an invalid version, should not throw const c4 = new Comparator(c) - t.notOk(c4.test('not a version string')) - t.end() + a.ok(!c4.test('not a version string')) }) -test('tostrings', (t) => { - t.equal(new Comparator('>= v1.2.3').toString(), '>=1.2.3') - t.end() +test('tostrings', () => { + a.equal(new Comparator('>= v1.2.3').toString(), '>=1.2.3') }) -test('intersect comparators', (t) => { - t.plan(comparatorIntersection.length) - comparatorIntersection.forEach(([c0, c1, expect, includePrerelease]) => - t.test(`${c0} ${c1} ${expect}`, t => { +test('intersect comparators', async (t) => { + for (const [c0, c1, expect, includePrerelease] of comparatorIntersection) { + await t.test(`${c0} ${c1} ${expect}`, () => { const comp0 = new Comparator(c0) const comp1 = new Comparator(c1) - t.equal(comp0.intersects(comp1, { includePrerelease }), expect, + a.equal(comp0.intersects(comp1, { includePrerelease }), expect, `${c0} intersects ${c1}`) - t.equal(comp1.intersects(comp0, { includePrerelease }), expect, + a.equal(comp1.intersects(comp0, { includePrerelease }), expect, `${c1} intersects ${c0}`) - t.end() - })) + }) + } }) -test('intersect demands another comparator', t => { +test('intersect demands another comparator', () => { const c = new Comparator('>=1.2.3') - t.throws(() => c.intersects(), new TypeError('a Comparator is required')) - t.end() + a.throws(() => c.intersects(), new TypeError('a Comparator is required')) }) -test('ANY matches anything', t => { +test('ANY matches anything', () => { const c = new Comparator('') - t.ok(c.test('1.2.3'), 'ANY matches anything') + a.ok(c.test('1.2.3'), 'ANY matches anything') const c1 = new Comparator('>=1.2.3') const ANY = Comparator.ANY - t.ok(c1.test(ANY), 'anything matches ANY') - t.end() + a.ok(c1.test(ANY), 'anything matches ANY') }) -test('invalid comparator parse throws', t => { - t.throws(() => new Comparator('foo bar baz'), +test('invalid comparator parse throws', () => { + a.throws(() => new Comparator('foo bar baz'), new TypeError('Invalid comparator: foo bar baz')) - t.end() }) -test('= is ignored', t => { - t.match(new Comparator('=1.2.3'), new Comparator('1.2.3')) - t.end() +test('= is ignored', () => { + a.deepEqual(new Comparator('=1.2.3'), new Comparator('1.2.3')) }) diff --git a/test/classes/index.js b/test/classes/index.js index 71d21bba..927bedee 100644 --- a/test/classes/index.js +++ b/test/classes/index.js @@ -1,7 +1,7 @@ 'use strict' -const t = require('tap') -t.same(require('../../classes'), { +const a = require('node:assert') +a.deepEqual(require('../../classes'), { SemVer: require('../../classes/semver'), Range: require('../../classes/range'), Comparator: require('../../classes/comparator'), diff --git a/test/classes/range.js b/test/classes/range.js index d012e50c..a11b6fb6 100644 --- a/test/classes/range.js +++ b/test/classes/range.js @@ -1,6 +1,7 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const Range = require('../../classes/range') const Comparator = require('../../classes/comparator') const rangeIntersection = require('../fixtures/range-intersection.js') @@ -9,120 +10,106 @@ const rangeInclude = require('../fixtures/range-include.js') const rangeExclude = require('../fixtures/range-exclude.js') const rangeParse = require('../fixtures/range-parse.js') -test('range tests', t => { - t.plan(rangeInclude.length) - rangeInclude.forEach(([range, ver, options]) => { +test('range tests', () => { + for (const [range, ver, options] of rangeInclude) { const r = new Range(range, options) - t.ok(r.test(ver), `${range} satisfied by ${ver}`) - }) + a.ok(r.test(ver), `${range} satisfied by ${ver}`) + } }) -test('range parsing', t => { - t.plan(rangeParse.length) - rangeParse.forEach(([range, expect, options]) => - t.test(`${range} ${expect} ${JSON.stringify(options)}`, t => { +test('range parsing', async (t) => { + for (const [range, expect, options] of rangeParse) { + await t.test(`${range} ${expect} ${JSON.stringify(options)}`, () => { if (expect === null) { - t.throws(() => new Range(range, options), TypeError, `invalid range: ${range}`) + a.throws(() => new Range(range, options), TypeError, `invalid range: ${range}`) } else { - t.equal(new Range(range, options).range || '*', expect, `${range} => ${expect}`) - t.equal(new Range(range, options).range, new Range(expect).range, + a.equal(new Range(range, options).range || '*', expect, `${range} => ${expect}`) + a.equal(new Range(range, options).range, new Range(expect).range, 'parsing both yields same result') } - t.end() - })) + }) + } }) -test('throw for empty comparator set, even in loose mode', t => { - t.throws(() => new Range('sadf||asdf', { loose: true }), +test('throw for empty comparator set, even in loose mode', () => { + a.throws(() => new Range('sadf||asdf', { loose: true }), TypeError('Invalid SemVer Range: sadf||asdf')) - t.end() }) -test('convert comparator to range', t => { +test('convert comparator to range', () => { const c = new Comparator('>=1.2.3') const r = new Range(c) - t.equal(r.raw, c.value, 'created range from comparator') - t.end() + a.equal(r.raw, c.value, 'created range from comparator') }) -test('range as argument to range ctor', t => { +test('range as argument to range ctor', () => { const loose = new Range('1.2.3', { loose: true }) - t.equal(new Range(loose, { loose: true }), loose, 'loose option') - t.equal(new Range(loose, true), loose, 'loose boolean') - t.not(new Range(loose), loose, 'created new range if not matched') + a.equal(new Range(loose, { loose: true }), loose, 'loose option') + a.equal(new Range(loose, true), loose, 'loose boolean') + a.notEqual(new Range(loose), loose, 'created new range if not matched') const incPre = new Range('1.2.3', { includePrerelease: true }) - t.equal(new Range(incPre, { includePrerelease: true }), incPre, + a.equal(new Range(incPre, { includePrerelease: true }), incPre, 'include prerelease, option match returns argument') - t.not(new Range(incPre), incPre, + a.notEqual(new Range(incPre), incPre, 'include prerelease, option mismatch does not return argument') - - t.end() }) -test('negative range tests', t => { - t.plan(rangeExclude.length) - rangeExclude.forEach(([range, ver, options]) => { +test('negative range tests', () => { + for (const [range, ver, options] of rangeExclude) { const r = new Range(range, options) - t.notOk(r.test(ver), `${range} not satisfied by ${ver}`) - }) + a.ok(!r.test(ver), `${range} not satisfied by ${ver}`) + } }) -test('strict vs loose ranges', (t) => { +test('strict vs loose ranges', () => { [ ['>=01.02.03', '>=1.2.3'], ['~1.02.03beta', '>=1.2.3-beta <1.3.0-0'], ].forEach(([loose, comps]) => { - t.throws(() => new Range(loose)) - t.equal(new Range(loose, true).range, comps) + a.throws(() => new Range(loose)) + a.equal(new Range(loose, true).range, comps) }) - t.end() }) -test('tostrings', (t) => { - t.equal(new Range('>= v1.2.3').toString(), '>=1.2.3') - t.end() +test('tostrings', () => { + a.equal(new Range('>= v1.2.3').toString(), '>=1.2.3') }) -test('formatted value is calculated lazily and cached', (t) => { +test('formatted value is calculated lazily and cached', () => { const r = new Range('>= v1.2.3') - t.equal(r.formatted, undefined) - t.equal(r.format(), '>=1.2.3') - t.equal(r.formatted, '>=1.2.3') - t.equal(r.format(), '>=1.2.3') - t.end() + a.equal(r.formatted, undefined) + a.equal(r.format(), '>=1.2.3') + a.equal(r.formatted, '>=1.2.3') + a.equal(r.format(), '>=1.2.3') }) -test('ranges intersect', (t) => { - rangeIntersection.forEach(([r0, r1, expect]) => { - t.test(`${r0} <~> ${r1}`, t => { +test('ranges intersect', async (t) => { + for (const [r0, r1, expect] of rangeIntersection) { + await t.test(`${r0} <~> ${r1}`, () => { const range0 = new Range(r0) const range1 = new Range(r1) - t.equal(range0.intersects(range1), expect, + a.equal(range0.intersects(range1), expect, `${r0} <~> ${r1} objects`) - t.equal(range1.intersects(range0), expect, + a.equal(range1.intersects(range0), expect, `${r1} <~> ${r0} objects`) - t.end() }) - }) - t.end() + } }) -test('missing range parameter in range intersect', (t) => { - t.throws(() => { +test('missing range parameter in range intersect', () => { + a.throws(() => { new Range('1.0.0').intersects() }, new TypeError('a Range is required'), 'throws type error') - t.end() }) -test('cache', (t) => { +test('cache', () => { const cached = Symbol('cached') const r1 = new Range('1.0.0') r1.set[0][cached] = true const r2 = new Range('1.0.0') - t.equal(r1.set[0][cached], true) - t.equal(r2.set[0][cached], true) // Will be true, showing it's cached. - t.end() + a.equal(r1.set[0][cached], true) + a.equal(r2.set[0][cached], true) // Will be true, showing it's cached. }) diff --git a/test/classes/semver.js b/test/classes/semver.js index 61119745..a6933d0b 100644 --- a/test/classes/semver.js +++ b/test/classes/semver.js @@ -1,6 +1,7 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const SemVer = require('../../classes/semver') const increments = require('../fixtures/increments.js') const comparisons = require('../fixtures/comparisons.js') @@ -8,79 +9,76 @@ const equality = require('../fixtures/equality.js') const invalidVersions = require('../fixtures/invalid-versions.js') const validVersions = require('../fixtures/valid-versions.js') -test('valid versions', t => { - t.plan(validVersions.length) - validVersions.forEach(([v, major, minor, patch, prerelease, build]) => t.test(v, t => { - const s = new SemVer(v) - t.strictSame(s.major, major) - t.strictSame(s.minor, minor) - t.strictSame(s.patch, patch) - t.strictSame(s.prerelease, prerelease) - t.strictSame(s.build, build) - t.strictSame(s.raw, v) - t.end() - })) +test('valid versions', async (t) => { + for (const [v, major, minor, patch, prerelease, build] of validVersions) { + await t.test(v, () => { + const s = new SemVer(v) + a.deepEqual(s.major, major) + a.deepEqual(s.minor, minor) + a.deepEqual(s.patch, patch) + a.deepEqual(s.prerelease, prerelease) + a.deepEqual(s.build, build) + a.deepEqual(s.raw, v) + }) + } }) -test('comparisons', t => { - t.plan(comparisons.length) - comparisons.forEach(([v0, v1, opt]) => t.test(`${v0} ${v1}`, t => { - const s0 = new SemVer(v0, opt) - const s1 = new SemVer(v1, opt) - t.equal(s0.compare(s1), 1) - t.equal(s0.compare(v1), 1) - t.equal(s1.compare(s0), -1) - t.equal(s1.compare(v0), -1) - t.equal(s0.compare(v0), 0) - t.equal(s1.compare(v1), 0) - t.end() - })) +test('comparisons', async (t) => { + for (const [v0, v1, opt] of comparisons) { + await t.test(`${v0} ${v1}`, () => { + const s0 = new SemVer(v0, opt) + const s1 = new SemVer(v1, opt) + a.equal(s0.compare(s1), 1) + a.equal(s0.compare(v1), 1) + a.equal(s1.compare(s0), -1) + a.equal(s1.compare(v0), -1) + a.equal(s0.compare(v0), 0) + a.equal(s1.compare(v1), 0) + }) + } }) -test('equality', t => { - t.plan(equality.length) - equality.forEach(([v0, v1, loose]) => t.test(`${v0} ${v1} ${loose}`, t => { - const s0 = new SemVer(v0, loose) - const s1 = new SemVer(v1, loose) - t.equal(s0.compare(s1), 0) - t.equal(s1.compare(s0), 0) - t.equal(s0.compare(v1), 0) - t.equal(s1.compare(v0), 0) - t.equal(s0.compare(s0), 0) - t.equal(s1.compare(s1), 0) - t.equal(s0.comparePre(s1), 0, 'comparePre just to hit that code path') - t.end() - })) +test('equality', async (t) => { + for (const [v0, v1, loose] of equality) { + await t.test(`${v0} ${v1} ${loose}`, () => { + const s0 = new SemVer(v0, loose) + const s1 = new SemVer(v1, loose) + a.equal(s0.compare(s1), 0) + a.equal(s1.compare(s0), 0) + a.equal(s0.compare(v1), 0) + a.equal(s1.compare(v0), 0) + a.equal(s0.compare(s0), 0) + a.equal(s1.compare(s1), 0) + a.equal(s0.comparePre(s1), 0, 'comparePre just to hit that code path') + }) + } }) -test('toString equals parsed version', t => { - t.equal(String(new SemVer('v1.2.3')), '1.2.3') - t.end() +test('toString equals parsed version', () => { + a.equal(String(new SemVer('v1.2.3')), '1.2.3') }) -test('throws when presented with garbage', t => { - t.plan(invalidVersions.length) - invalidVersions.forEach(([v, msg, opts]) => - t.throws(() => new SemVer(v, opts), msg)) +test('throws when presented with garbage', () => { + for (const [v, , opts] of invalidVersions) { + a.throws(() => new SemVer(v, opts)) + } }) -test('return SemVer arg to ctor if options match', t => { +test('return SemVer arg to ctor if options match', () => { const s = new SemVer('1.2.3', { loose: true, includePrerelease: true }) - t.equal(new SemVer(s, { loose: true, includePrerelease: true }), s, + a.equal(new SemVer(s, { loose: true, includePrerelease: true }), s, 'get same object when options match') - t.not(new SemVer(s), s, 'get new object when options match') - t.end() + a.notEqual(new SemVer(s), s, 'get new object when options match') }) -test('really big numeric prerelease value', (t) => { +test('really big numeric prerelease value', () => { const r = new SemVer(`1.2.3-beta.${Number.MAX_SAFE_INTEGER}0`) - t.strictSame(r.prerelease, ['beta', '90071992547409910']) - t.end() + a.deepEqual(r.prerelease, ['beta', '90071992547409910']) }) -test('invalid version numbers', (t) => { +test('invalid version numbers', () => { ['1.2.3.4', 'NOT VALID', 1.2, null, 'Infinity.NaN.Infinity'].forEach((v) => { - t.throws( + a.throws( () => { new SemVer(v) // eslint-disable-line no-new }, @@ -93,94 +91,84 @@ test('invalid version numbers', (t) => { } ) }) - - t.end() }) -test('incrementing', t => { - t.plan(increments.length) - increments.forEach(([ +test('incrementing', async (t) => { + for (const [ version, inc, expect, options, id, base, - ]) => t.test(`${version} ${inc} ${id || ''}`.trim(), t => { - if (expect === null) { - t.plan(1) - t.throws(() => new SemVer(version, options).inc(inc, id, base)) - } else { - t.plan(2) - const incremented = new SemVer(version, options).inc(inc, id, base) - t.equal(incremented.version, expect) - if (incremented.build.length) { - t.equal(incremented.raw, `${expect}+${incremented.build.join('.')}`) + ] of increments) { + await t.test(`${version} ${inc} ${id || ''}`.trim(), () => { + if (expect === null) { + a.throws(() => new SemVer(version, options).inc(inc, id, base)) } else { - t.equal(incremented.raw, expect) + const incremented = new SemVer(version, options).inc(inc, id, base) + a.equal(incremented.version, expect) + if (incremented.build.length) { + a.equal(incremented.raw, `${expect}+${incremented.build.join('.')}`) + } else { + a.equal(incremented.raw, expect) + } } - } - })) + }) + } }) -test('invalid increments', (t) => { - t.throws( +test('invalid increments', () => { + a.throws( () => new SemVer('1.2.3').inc('prerelease', '', false), Error('invalid increment argument: identifier is empty') ) - t.throws( + a.throws( () => new SemVer('1.2.3-dev').inc('prerelease', 'dev', false), Error('invalid increment argument: identifier already exists') ) - t.throws( + a.throws( () => new SemVer('1.2.3').inc('prerelease', 'invalid/preid'), Error('invalid identifier: invalid/preid') ) - - t.end() }) -test('increment side-effects', (t) => { +test('increment side-effects', () => { const v = new SemVer('1.0.0') try { v.inc('prerelease', 'hot/mess') } catch (er) { // ignore but check that the version has not changed } - t.equal(v.toString(), '1.0.0') - t.end() + a.equal(v.toString(), '1.0.0') }) -test('compare main vs pre', (t) => { +test('compare main vs pre', () => { const s = new SemVer('1.2.3') - t.equal(s.compareMain('2.3.4'), -1) - t.equal(s.compareMain('1.2.4'), -1) - t.equal(s.compareMain('0.1.2'), 1) - t.equal(s.compareMain('1.2.2'), 1) - t.equal(s.compareMain('1.2.3-pre'), 0) + a.equal(s.compareMain('2.3.4'), -1) + a.equal(s.compareMain('1.2.4'), -1) + a.equal(s.compareMain('0.1.2'), 1) + a.equal(s.compareMain('1.2.2'), 1) + a.equal(s.compareMain('1.2.3-pre'), 0) const p = new SemVer('1.2.3-alpha.0.pr.1') - t.equal(p.comparePre('9.9.9-alpha.0.pr.1'), 0) - t.equal(p.comparePre('1.2.3'), -1) - t.equal(p.comparePre('1.2.3-alpha.0.pr.2'), -1) - t.equal(p.comparePre('1.2.3-alpha.0.2'), 1) - - t.end() + a.equal(p.comparePre('9.9.9-alpha.0.pr.1'), 0) + a.equal(p.comparePre('1.2.3'), -1) + a.equal(p.comparePre('1.2.3-alpha.0.pr.2'), -1) + a.equal(p.comparePre('1.2.3-alpha.0.2'), 1) }) -test('compareBuild', (t) => { +test('compareBuild', () => { const noBuild = new SemVer('1.0.0') const build0 = new SemVer('1.0.0+0') const build1 = new SemVer('1.0.0+1') const build10 = new SemVer('1.0.0+1.0') - t.equal(noBuild.compareBuild(build0), -1) - t.equal(build0.compareBuild(build0), 0) - t.equal(build0.compareBuild(noBuild), 1) - - t.equal(build0.compareBuild('1.0.0+0.0'), -1) - t.equal(build0.compareBuild(build1), -1) - t.equal(build1.compareBuild(build0), 1) - t.equal(build10.compareBuild(build1), 1) - - t.end() + a.equal(noBuild.compareBuild(build0), -1) + a.equal(build0.compareBuild(build0), 0) + a.equal(build0.compareBuild(noBuild), 1) + + a.equal(build0.compareBuild('1.0.0+0.0'), -1) + a.equal(build0.compareBuild(build1), -1) + a.equal(build1.compareBuild(build0), 1) + a.equal(build10.compareBuild(build1), 1) }) diff --git a/test/functions/clean.js b/test/functions/clean.js index d32c0e09..c08a778d 100644 --- a/test/functions/clean.js +++ b/test/functions/clean.js @@ -1,9 +1,10 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const clean = require('../../functions/clean') -test('clean tests', (t) => { +test('clean tests', () => { // [range, version] // Version should be detectable despite extra characters [ @@ -22,7 +23,6 @@ test('clean tests', (t) => { ['0.12.0-dev.1150+3c22cecee', '0.12.0-dev.1150'], ].forEach(([range, version]) => { const msg = `clean(${range}) = ${version}` - t.equal(clean(range), version, msg) + a.equal(clean(range), version, msg) }) - t.end() }) diff --git a/test/functions/cmp.js b/test/functions/cmp.js index be58ad50..691148ab 100644 --- a/test/functions/cmp.js +++ b/test/functions/cmp.js @@ -1,51 +1,51 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const cmp = require('../../functions/cmp') const comparisons = require('../fixtures/comparisons.js') const equality = require('../fixtures/equality.js') const SemVer = require('../../classes/semver') -test('invalid cmp usage', (t) => { - t.throws(() => { +test('invalid cmp usage', () => { + a.throws(() => { cmp('1.2.3', 'a frog', '4.5.6') }, new TypeError('Invalid operator: a frog')) - t.end() }) -test('comparison tests', t => { - t.plan(comparisons.length) - comparisons.forEach(([v0, v1, loose]) => t.test(`${v0} ${v1} ${loose}`, t => { - t.plan(8) - t.ok(cmp(v0, '>', v1, loose), `cmp('${v0}' > '${v1}')`) - t.ok(cmp(v1, '<', v0, loose), `cmp('${v1}' < '${v0}')`) - t.ok(!cmp(v1, '>', v0, loose), `!cmp('${v1}' > '${v0}')`) - t.ok(!cmp(v0, '<', v1, loose), `!cmp('${v0}' < '${v1}')`) - t.ok(cmp(v1, '==', v1, loose), `cmp('${v1}' == '${v1}')`) - t.ok(cmp(v0, '>=', v1, loose), `cmp('${v0}' >= '${v1}')`) - t.ok(cmp(v1, '<=', v0, loose), `cmp('${v1}' <= '${v0}')`) - t.ok(cmp(v0, '!=', v1, loose), `cmp('${v0}' != '${v1}')`) - })) +test('comparison tests', async (t) => { + for (const [v0, v1, loose] of comparisons) { + await t.test(`${v0} ${v1} ${loose}`, () => { + a.ok(cmp(v0, '>', v1, loose), `cmp('${v0}' > '${v1}')`) + a.ok(cmp(v1, '<', v0, loose), `cmp('${v1}' < '${v0}')`) + a.ok(!cmp(v1, '>', v0, loose), `!cmp('${v1}' > '${v0}')`) + a.ok(!cmp(v0, '<', v1, loose), `!cmp('${v0}' < '${v1}')`) + a.ok(cmp(v1, '==', v1, loose), `cmp('${v1}' == '${v1}')`) + a.ok(cmp(v0, '>=', v1, loose), `cmp('${v0}' >= '${v1}')`) + a.ok(cmp(v1, '<=', v0, loose), `cmp('${v1}' <= '${v0}')`) + a.ok(cmp(v0, '!=', v1, loose), `cmp('${v0}' != '${v1}')`) + }) + } }) -test('equality tests', t => { - t.plan(equality.length) - equality.forEach(([v0, v1, loose]) => t.test(`${v0} ${v1} ${loose}`, t => { - t.plan(8) - t.ok(cmp(v0, '', v1, loose), `cmp(${v0} "" ${v1})`) - t.ok(cmp(v0, '=', v1, loose), `cmp(${v0}=${v1})`) - t.ok(cmp(v0, '==', v1, loose), `cmp(${v0}==${v1})`) - t.ok(!cmp(v0, '!=', v1, loose), `!cmp(${v0}!=${v1})`) - t.ok(!cmp(v0, '===', v1, loose), `!cmp(${v0}===${v1})`) +test('equality tests', async (t) => { + for (const [v0, v1, loose] of equality) { + await t.test(`${v0} ${v1} ${loose}`, () => { + a.ok(cmp(v0, '', v1, loose), `cmp(${v0} "" ${v1})`) + a.ok(cmp(v0, '=', v1, loose), `cmp(${v0}=${v1})`) + a.ok(cmp(v0, '==', v1, loose), `cmp(${v0}==${v1})`) + a.ok(!cmp(v0, '!=', v1, loose), `!cmp(${v0}!=${v1})`) + a.ok(!cmp(v0, '===', v1, loose), `!cmp(${v0}===${v1})`) - // also test with an object. they are === because obj.version matches - t.ok(cmp(new SemVer(v0, { loose: loose }), '===', - new SemVer(v1, { loose: loose })), - `!cmp(${v0}===${v1}) object`) + // also test with an object. they are === because obj.version matches + a.ok(cmp(new SemVer(v0, { loose: loose }), '===', + new SemVer(v1, { loose: loose })), + `!cmp(${v0}===${v1}) object`) - t.ok(cmp(v0, '!==', v1, loose), `cmp(${v0}!==${v1})`) + a.ok(cmp(v0, '!==', v1, loose), `cmp(${v0}!==${v1})`) - t.ok(!cmp(new SemVer(v0, loose), '!==', new SemVer(v1, loose)), - `cmp(${v0}!==${v1}) object`) - })) + a.ok(!cmp(new SemVer(v0, loose), '!==', new SemVer(v1, loose)), + `cmp(${v0}!==${v1}) object`) + }) + } }) diff --git a/test/functions/coerce.js b/test/functions/coerce.js index 04792919..934132b7 100644 --- a/test/functions/coerce.js +++ b/test/functions/coerce.js @@ -1,11 +1,12 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const coerce = require('../../functions/coerce') const parse = require('../../functions/parse') const valid = require('../../functions/valid') -test('coerce tests', (t) => { +test('coerce tests', () => { // Expected to be null (cannot be coerced). const coerceToNull = [ null, @@ -29,7 +30,7 @@ test('coerce tests', (t) => { ] coerceToNull.forEach((input) => { const msg = `coerce(${input}) should be null` - t.same(coerce(input), null, msg) + a.deepEqual(coerce(input), null, msg) }) // Expected to be valid. @@ -152,15 +153,13 @@ test('coerce tests', (t) => { const coerceExpression = `coerce(${input}, ${JSON.stringify(options)})` const coercedVersion = coerce(input, options) || {} const expectedVersion = parse(expected) - t.equal(expectedVersion.compare(coercedVersion), 0, + a.equal(expectedVersion.compare(coercedVersion), 0, `${coerceExpression} should be equal to ${expectedVersion}`) - t.equal(expectedVersion.compareBuild(coercedVersion), 0, + a.equal(expectedVersion.compareBuild(coercedVersion), 0, `${coerceExpression} build should be equal to ${expectedVersion}`) }) - t.same(valid(coerce('42.6.7.9.3-alpha')), '42.6.7') - t.same(valid(coerce('42.6.7-alpha+rev.1', { includePrerelease: true })), '42.6.7-alpha') - t.same(valid(coerce('v2')), '2.0.0') - - t.end() + a.deepEqual(valid(coerce('42.6.7.9.3-alpha')), '42.6.7') + a.deepEqual(valid(coerce('42.6.7-alpha+rev.1', { includePrerelease: true })), '42.6.7-alpha') + a.deepEqual(valid(coerce('v2')), '2.0.0') }) diff --git a/test/functions/compare-build.js b/test/functions/compare-build.js index 1aca375c..16bea61d 100644 --- a/test/functions/compare-build.js +++ b/test/functions/compare-build.js @@ -1,21 +1,20 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const compareBuild = require('../../functions/compare-build') -test('compareBuild', (t) => { +test('compareBuild', () => { const noBuild = '1.0.0' const build0 = '1.0.0+0' const build1 = '1.0.0+1' const build10 = '1.0.0+1.0' - t.equal(compareBuild(noBuild, build0), -1) - t.equal(compareBuild(build0, build0), 0) - t.equal(compareBuild(build0, noBuild), 1) + a.equal(compareBuild(noBuild, build0), -1) + a.equal(compareBuild(build0, build0), 0) + a.equal(compareBuild(build0, noBuild), 1) - t.equal(compareBuild(build0, '1.0.0+0.0'), -1) - t.equal(compareBuild(build0, build1), -1) - t.equal(compareBuild(build1, build0), 1) - t.equal(compareBuild(build10, build1), 1) - - t.end() + a.equal(compareBuild(build0, '1.0.0+0.0'), -1) + a.equal(compareBuild(build0, build1), -1) + a.equal(compareBuild(build1, build0), 1) + a.equal(compareBuild(build10, build1), 1) }) diff --git a/test/functions/compare-loose.js b/test/functions/compare-loose.js index 0e12c75b..75c4cc57 100644 --- a/test/functions/compare-loose.js +++ b/test/functions/compare-loose.js @@ -1,11 +1,12 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const compareLoose = require('../../functions/compare-loose') const SemVer = require('../../classes/semver') const eq = require('../../functions/eq') -test('strict vs loose version numbers', (t) => { +test('strict vs loose version numbers', () => { [['=1.2.3', '1.2.3'], ['01.02.03', '1.2.3'], ['1.2.3-beta.01', '1.2.3-beta.1'], @@ -14,19 +15,18 @@ test('strict vs loose version numbers', (t) => { ].forEach((v) => { const loose = v[0] const strict = v[1] - t.throws(() => { + a.throws(() => { SemVer(loose) // eslint-disable-line no-new }) const lv = new SemVer(loose, true) - t.equal(lv.version, strict) - t.ok(eq(loose, strict, true)) - t.throws(() => { + a.equal(lv.version, strict) + a.ok(eq(loose, strict, true)) + a.throws(() => { eq(loose, strict) }) - t.throws(() => { + a.throws(() => { new SemVer(strict).compare(loose) }) - t.equal(compareLoose(v[0], v[1]), 0) + a.equal(compareLoose(v[0], v[1]), 0) }) - t.end() }) diff --git a/test/functions/compare.js b/test/functions/compare.js index 6be1252b..9fab8ffa 100644 --- a/test/functions/compare.js +++ b/test/functions/compare.js @@ -1,37 +1,37 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const compare = require('../../functions/compare.js') const comparisons = require('../fixtures/comparisons.js') const equality = require('../fixtures/equality.js') const SemVer = require('../../classes/semver.js') -test('comparison tests', t => { - t.plan(comparisons.length) - comparisons.forEach(([v0, v1, loose]) => t.test(`${v0} ${v1} ${loose}`, t => { - t.plan(4) - t.equal(compare(v0, v1, loose), 1, `compare('${v0}', '${v1}')`) - t.equal(compare(v1, v0, loose), -1, `compare('${v1}', '${v0}')`) - t.equal(compare(v0, v0, loose), 0, `compare('${v0}', '${v0}')`) - t.equal(compare(v1, v1, loose), 0, `compare('${v1}', '${v1}')`) - })) +test('comparison tests', async (t) => { + for (const [v0, v1, loose] of comparisons) { + await t.test(`${v0} ${v1} ${loose}`, () => { + a.equal(compare(v0, v1, loose), 1, `compare('${v0}', '${v1}')`) + a.equal(compare(v1, v0, loose), -1, `compare('${v1}', '${v0}')`) + a.equal(compare(v0, v0, loose), 0, `compare('${v0}', '${v0}')`) + a.equal(compare(v1, v1, loose), 0, `compare('${v1}', '${v1}')`) + }) + } }) -test('equality tests', (t) => { +test('equality tests', async (t) => { // [version1, version2] // version1 should be equivalent to version2 - t.plan(equality.length) - equality.forEach(([v0, v1, loose]) => t.test(`${v0} ${v1} ${loose}`, t => { - t.plan(5) - t.equal(compare(v0, v1, loose), 0, `${v0} ${v1}`) - t.equal(compare(v1, v0, loose), 0, `${v1} ${v0}`) - t.equal(compare(v0, v0, loose), 0, `${v0} ${v0}`) - t.equal(compare(v1, v1, loose), 0, `${v1} ${v1}`) + for (const [v0, v1, loose] of equality) { + await t.test(`${v0} ${v1} ${loose}`, () => { + a.equal(compare(v0, v1, loose), 0, `${v0} ${v1}`) + a.equal(compare(v1, v0, loose), 0, `${v1} ${v0}`) + a.equal(compare(v0, v0, loose), 0, `${v0} ${v0}`) + a.equal(compare(v1, v1, loose), 0, `${v1} ${v1}`) - // also test with an object. they are === because obj.version matches - t.equal(compare(new SemVer(v0, { loose: loose }), - new SemVer(v1, { loose: loose })), 0, - `compare(${v0}, ${v1}) object`) - })) - t.end() + // also test with an object. they are === because obj.version matches + a.equal(compare(new SemVer(v0, { loose: loose }), + new SemVer(v1, { loose: loose })), 0, + `compare(${v0}, ${v1}) object`) + }) + } }) diff --git a/test/functions/diff.js b/test/functions/diff.js index e7a4ee9d..0306a73b 100644 --- a/test/functions/diff.js +++ b/test/functions/diff.js @@ -1,9 +1,10 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const diff = require('../../functions/diff') -test('diff versions test', (t) => { +test('diff versions test', () => { // [version1, version2, result] // diff(version1, version2) -> result [ @@ -49,18 +50,15 @@ test('diff versions test', (t) => { const wanted = v[2] const found = diff(version1, version2) const cmd = `diff(${version1}, ${version2})` - t.equal(found, wanted, `${cmd} === ${wanted}`) + a.equal(found, wanted, `${cmd} === ${wanted}`) }) - - t.end() }) -test('throws on bad version', (t) => { - t.throws(() => { +test('throws on bad version', () => { + a.throws(() => { diff('bad', '1.2.3') }, { message: 'Invalid Version: bad', name: 'TypeError', }) - t.end() }) diff --git a/test/functions/eq.js b/test/functions/eq.js index 71602ed9..74348ef3 100644 --- a/test/functions/eq.js +++ b/test/functions/eq.js @@ -1,28 +1,29 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const eq = require('../../functions/eq') const comparisons = require('../fixtures/comparisons.js') const equality = require('../fixtures/equality.js') -test('comparison tests', t => { - t.plan(comparisons.length) - comparisons.forEach(([v0, v1, loose]) => t.test(`${v0} ${v1} ${loose}`, t => { - t.plan(4) - t.notOk(eq(v0, v1, loose), `!eq(${v0}, ${v1})`) - t.notOk(eq(v1, v0, loose), `!eq(${v1}, ${v0})`) - t.ok(eq(v1, v1, loose), `eq('${v1}', '${v1}')`) - t.ok(eq(v0, v0, loose), `eq('${v0}', '${v0}')`) - })) +test('comparison tests', async (t) => { + for (const [v0, v1, loose] of comparisons) { + await t.test(`${v0} ${v1} ${loose}`, () => { + a.ok(!eq(v0, v1, loose), `!eq(${v0}, ${v1})`) + a.ok(!eq(v1, v0, loose), `!eq(${v1}, ${v0})`) + a.ok(eq(v1, v1, loose), `eq('${v1}', '${v1}')`) + a.ok(eq(v0, v0, loose), `eq('${v0}', '${v0}')`) + }) + } }) -test('equality tests', t => { - t.plan(equality.length) - equality.forEach(([v0, v1, loose]) => t.test(`${v0} ${v1} ${loose}`, t => { - t.plan(4) - t.ok(eq(v0, v1, loose), `eq(${v0}, ${v1})`) - t.ok(eq(v1, v0, loose), `eq(${v1}, ${v0})`) - t.ok(eq(v0, v0, loose), `eq(${v0}, ${v0})`) - t.ok(eq(v1, v1, loose), `eq(${v1}, ${v1})`) - })) +test('equality tests', async (t) => { + for (const [v0, v1, loose] of equality) { + await t.test(`${v0} ${v1} ${loose}`, () => { + a.ok(eq(v0, v1, loose), `eq(${v0}, ${v1})`) + a.ok(eq(v1, v0, loose), `eq(${v1}, ${v0})`) + a.ok(eq(v0, v0, loose), `eq(${v0}, ${v0})`) + a.ok(eq(v1, v1, loose), `eq(${v1}, ${v1})`) + }) + } }) diff --git a/test/functions/gt.js b/test/functions/gt.js index fff1ab41..12ab9fa4 100644 --- a/test/functions/gt.js +++ b/test/functions/gt.js @@ -1,26 +1,27 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const gt = require('../../functions/gt') const comparisons = require('../fixtures/comparisons.js') const equality = require('../fixtures/equality.js') -test('comparison tests', t => { - t.plan(comparisons.length) - comparisons.forEach(([v0, v1, loose]) => t.test(`${v0} ${v1} ${loose}`, t => { - t.plan(4) - t.ok(gt(v0, v1, loose), `gt('${v0}', '${v1}')`) - t.ok(!gt(v1, v0, loose), `!gt('${v1}', '${v0}')`) - t.ok(!gt(v1, v1, loose), `!gt('${v1}', '${v1}')`) - t.ok(!gt(v0, v0, loose), `!gt('${v0}', '${v0}')`) - })) +test('comparison tests', async (t) => { + for (const [v0, v1, loose] of comparisons) { + await t.test(`${v0} ${v1} ${loose}`, () => { + a.ok(gt(v0, v1, loose), `gt('${v0}', '${v1}')`) + a.ok(!gt(v1, v0, loose), `!gt('${v1}', '${v0}')`) + a.ok(!gt(v1, v1, loose), `!gt('${v1}', '${v1}')`) + a.ok(!gt(v0, v0, loose), `!gt('${v0}', '${v0}')`) + }) + } }) -test('equality tests', t => { - t.plan(equality.length) - equality.forEach(([v0, v1, loose]) => t.test(`${v0} ${v1} ${loose}`, t => { - t.plan(2) - t.ok(!gt(v0, v1, loose), `!gt(${v0}, ${v1})`) - t.ok(!gt(v1, v0, loose), `!gt(${v1}, ${v0})`) - })) +test('equality tests', async (t) => { + for (const [v0, v1, loose] of equality) { + await t.test(`${v0} ${v1} ${loose}`, () => { + a.ok(!gt(v0, v1, loose), `!gt(${v0}, ${v1})`) + a.ok(!gt(v1, v0, loose), `!gt(${v1}, ${v0})`) + }) + } }) diff --git a/test/functions/gte.js b/test/functions/gte.js index 83c98cce..12765211 100644 --- a/test/functions/gte.js +++ b/test/functions/gte.js @@ -1,26 +1,27 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const gte = require('../../functions/gte') const comparisons = require('../fixtures/comparisons.js') const equality = require('../fixtures/equality.js') -test('comparison tests', t => { - t.plan(comparisons.length) - comparisons.forEach(([v0, v1, loose]) => t.test(`${v0} ${v1} ${loose}`, t => { - t.plan(4) - t.ok(gte(v0, v1, loose), `gte('${v0}', '${v1}')`) - t.ok(!gte(v1, v0, loose), `!gte('${v1}', '${v0}')`) - t.ok(gte(v1, v1, loose), `gte('${v1}', '${v1}')`) - t.ok(gte(v0, v0, loose), `gte('${v0}', '${v0}')`) - })) +test('comparison tests', async (t) => { + for (const [v0, v1, loose] of comparisons) { + await t.test(`${v0} ${v1} ${loose}`, () => { + a.ok(gte(v0, v1, loose), `gte('${v0}', '${v1}')`) + a.ok(!gte(v1, v0, loose), `!gte('${v1}', '${v0}')`) + a.ok(gte(v1, v1, loose), `gte('${v1}', '${v1}')`) + a.ok(gte(v0, v0, loose), `gte('${v0}', '${v0}')`) + }) + } }) -test('equality tests', t => { - t.plan(equality.length) - equality.forEach(([v0, v1, loose]) => t.test(`${v0} ${v1} ${loose}`, t => { - t.plan(2) - t.ok(gte(v0, v1, loose), `gte(${v0}, ${v1})`) - t.ok(gte(v1, v0, loose), `gte(${v1}, ${v0})`) - })) +test('equality tests', async (t) => { + for (const [v0, v1, loose] of equality) { + await t.test(`${v0} ${v1} ${loose}`, () => { + a.ok(gte(v0, v1, loose), `gte(${v0}, ${v1})`) + a.ok(gte(v1, v0, loose), `gte(${v1}, ${v0})`) + }) + } }) diff --git a/test/functions/inc.js b/test/functions/inc.js index 8c5f9ead..79f698ca 100644 --- a/test/functions/inc.js +++ b/test/functions/inc.js @@ -1,47 +1,46 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const inc = require('../../functions/inc') const parse = require('../../functions/parse') const increments = require('../fixtures/increments.js') -test('increment versions test', (t) => { +test('increment versions test', () => { increments.forEach(([pre, what, wanted, options, id, base]) => { const found = inc(pre, what, options, id, base) const cmd = `inc(${pre}, ${what}, ${id}, ${base})` - t.equal(found, wanted, `${cmd} === ${wanted}`) + a.equal(found, wanted, `${cmd} === ${wanted}`) const parsed = parse(pre, options) const parsedAsInput = parse(pre, options) if (wanted) { parsed.inc(what, id, base) - t.equal(parsed.version, wanted, `${cmd} object version updated`) + a.equal(parsed.version, wanted, `${cmd} object version updated`) if (parsed.build.length) { - t.equal( + a.equal( parsed.raw, `${wanted}+${parsed.build.join('.')}`, `${cmd} object raw field updated with build` ) } else { - t.equal(parsed.raw, wanted, `${cmd} object raw field updated`) + a.equal(parsed.raw, wanted, `${cmd} object raw field updated`) } const preIncObject = JSON.stringify(parsedAsInput) inc(parsedAsInput, what, options, id, base) const postIncObject = JSON.stringify(parsedAsInput) - t.equal( + a.equal( postIncObject, preIncObject, `${cmd} didn't modify its input` ) } else if (parsed) { - t.throws(() => { + a.throws(() => { parsed.inc(what, id, base) }) } else { - t.equal(parsed, null) + a.equal(parsed, null) } }) - - t.end() }) diff --git a/test/functions/lt.js b/test/functions/lt.js index 9b4c8d46..51714ef3 100644 --- a/test/functions/lt.js +++ b/test/functions/lt.js @@ -1,26 +1,27 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const lt = require('../../functions/lt') const comparisons = require('../fixtures/comparisons.js') const equality = require('../fixtures/equality.js') -test('comparison tests', t => { - t.plan(comparisons.length) - comparisons.forEach(([v0, v1, loose]) => t.test(`${v0} ${v1} ${loose}`, t => { - t.plan(4) - t.ok(!lt(v0, v1, loose), `!lt('${v0}', '${v1}')`) - t.ok(lt(v1, v0, loose), `lt('${v1}', '${v0}')`) - t.ok(!lt(v1, v1, loose), `!lt('${v1}', '${v1}')`) - t.ok(!lt(v0, v0, loose), `!lt('${v0}', '${v0}')`) - })) +test('comparison tests', async (t) => { + for (const [v0, v1, loose] of comparisons) { + await t.test(`${v0} ${v1} ${loose}`, () => { + a.ok(!lt(v0, v1, loose), `!lt('${v0}', '${v1}')`) + a.ok(lt(v1, v0, loose), `lt('${v1}', '${v0}')`) + a.ok(!lt(v1, v1, loose), `!lt('${v1}', '${v1}')`) + a.ok(!lt(v0, v0, loose), `!lt('${v0}', '${v0}')`) + }) + } }) -test('equality tests', t => { - t.plan(equality.length) - equality.forEach(([v0, v1, loose]) => t.test(`${v0} ${v1} ${loose}`, t => { - t.plan(2) - t.ok(!lt(v0, v1, loose), `!lt(${v0}, ${v1})`) - t.ok(!lt(v1, v0, loose), `!lt(${v1}, ${v0})`) - })) +test('equality tests', async (t) => { + for (const [v0, v1, loose] of equality) { + await t.test(`${v0} ${v1} ${loose}`, () => { + a.ok(!lt(v0, v1, loose), `!lt(${v0}, ${v1})`) + a.ok(!lt(v1, v0, loose), `!lt(${v1}, ${v0})`) + }) + } }) diff --git a/test/functions/lte.js b/test/functions/lte.js index 182b5017..11ff1436 100644 --- a/test/functions/lte.js +++ b/test/functions/lte.js @@ -1,26 +1,27 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const lte = require('../../functions/lte') const comparisons = require('../fixtures/comparisons.js') const equality = require('../fixtures/equality.js') -test('comparison tests', t => { - t.plan(comparisons.length) - comparisons.forEach(([v0, v1, loose]) => t.test(`${v0} ${v1} ${loose}`, t => { - t.plan(4) - t.ok(!lte(v0, v1, loose), `!lte('${v0}', '${v1}')`) - t.ok(lte(v1, v0, loose), `lte('${v1}', '${v0}')`) - t.ok(lte(v1, v1, loose), `lte('${v1}', '${v1}')`) - t.ok(lte(v0, v0, loose), `lte('${v0}', '${v0}')`) - })) +test('comparison tests', async (t) => { + for (const [v0, v1, loose] of comparisons) { + await t.test(`${v0} ${v1} ${loose}`, () => { + a.ok(!lte(v0, v1, loose), `!lte('${v0}', '${v1}')`) + a.ok(lte(v1, v0, loose), `lte('${v1}', '${v0}')`) + a.ok(lte(v1, v1, loose), `lte('${v1}', '${v1}')`) + a.ok(lte(v0, v0, loose), `lte('${v0}', '${v0}')`) + }) + } }) -test('equality tests', t => { - t.plan(equality.length) - equality.forEach(([v0, v1, loose]) => t.test(`${v0} ${v1} ${loose}`, t => { - t.plan(2) - t.ok(lte(v0, v1, loose), `lte(${v0}, ${v1})`) - t.ok(lte(v1, v0, loose), `lte(${v1}, ${v0})`) - })) +test('equality tests', async (t) => { + for (const [v0, v1, loose] of equality) { + await t.test(`${v0} ${v1} ${loose}`, () => { + a.ok(lte(v0, v1, loose), `lte(${v0}, ${v1})`) + a.ok(lte(v1, v0, loose), `lte(${v1}, ${v0})`) + }) + } }) diff --git a/test/functions/major.js b/test/functions/major.js index 12ceae60..8e0e3eeb 100644 --- a/test/functions/major.js +++ b/test/functions/major.js @@ -1,9 +1,10 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const major = require('../../functions/major') -test('major tests', (t) => { +test('major tests', () => { // [range, version] // Version should be detectable despite extra characters [ @@ -21,7 +22,6 @@ test('major tests', (t) => { const version = tuple[1] const loose = tuple[2] || false const msg = `major(${range}) = ${version}` - t.equal(major(range, loose), version, msg) + a.equal(major(range, loose), version, msg) }) - t.end() }) diff --git a/test/functions/minor.js b/test/functions/minor.js index 87fadc12..a1d10ab6 100644 --- a/test/functions/minor.js +++ b/test/functions/minor.js @@ -1,9 +1,10 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const minor = require('../../functions/minor') -test('minor tests', (t) => { +test('minor tests', () => { // [range, version] // Version should be detectable despite extra characters [ @@ -21,7 +22,6 @@ test('minor tests', (t) => { const version = tuple[1] const loose = tuple[2] || false const msg = `minor(${range}) = ${version}` - t.equal(minor(range, loose), version, msg) + a.equal(minor(range, loose), version, msg) }) - t.end() }) diff --git a/test/functions/neq.js b/test/functions/neq.js index 66bd5856..3f95bfc4 100644 --- a/test/functions/neq.js +++ b/test/functions/neq.js @@ -1,28 +1,29 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const neq = require('../../functions/neq') const comparisons = require('../fixtures/comparisons.js') const equality = require('../fixtures/equality.js') -test('comparison tests', t => { - t.plan(comparisons.length) - comparisons.forEach(([v0, v1, loose]) => t.test(`${v0} ${v1} ${loose}`, t => { - t.plan(4) - t.ok(neq(v0, v1, loose), `neq(${v0}, ${v1})`) - t.ok(neq(v1, v0, loose), `neq(${v1}, ${v0})`) - t.notOk(neq(v1, v1, loose), `!neq('${v1}', '${v1}')`) - t.notOk(neq(v0, v0, loose), `!neq('${v0}', '${v0}')`) - })) +test('comparison tests', async (t) => { + for (const [v0, v1, loose] of comparisons) { + await t.test(`${v0} ${v1} ${loose}`, () => { + a.ok(neq(v0, v1, loose), `neq(${v0}, ${v1})`) + a.ok(neq(v1, v0, loose), `neq(${v1}, ${v0})`) + a.ok(!neq(v1, v1, loose), `!neq('${v1}', '${v1}')`) + a.ok(!neq(v0, v0, loose), `!neq('${v0}', '${v0}')`) + }) + } }) -test('equality tests', t => { - t.plan(equality.length) - equality.forEach(([v0, v1, loose]) => t.test(`${v0} ${v1} ${loose}`, t => { - t.plan(4) - t.notOk(neq(v0, v1, loose), `!neq(${v0}, ${v1})`) - t.notOk(neq(v1, v0, loose), `!neq(${v1}, ${v0})`) - t.notOk(neq(v0, v0, loose), `!neq(${v0}, ${v0})`) - t.notOk(neq(v1, v1, loose), `!neq(${v1}, ${v1})`) - })) +test('equality tests', async (t) => { + for (const [v0, v1, loose] of equality) { + await t.test(`${v0} ${v1} ${loose}`, () => { + a.ok(!neq(v0, v1, loose), `!neq(${v0}, ${v1})`) + a.ok(!neq(v1, v0, loose), `!neq(${v1}, ${v0})`) + a.ok(!neq(v0, v0, loose), `!neq(${v0}, ${v0})`) + a.ok(!neq(v1, v1, loose), `!neq(${v1}, ${v1})`) + }) + } }) diff --git a/test/functions/parse.js b/test/functions/parse.js index c3f82daf..df2a7557 100644 --- a/test/functions/parse.js +++ b/test/functions/parse.js @@ -1,38 +1,37 @@ 'use strict' -const t = require('tap') +const t = require('node:test') +const a = require('node:assert') const parse = require('../../functions/parse') const SemVer = require('../../classes/semver') const invalidVersions = require('../fixtures/invalid-versions') -t.test('returns null instead of throwing when presented with garbage', t => { - t.plan(invalidVersions.length) - invalidVersions.forEach(([v, msg, opts]) => - t.equal(parse(v, opts), null, msg)) +t.test('returns null instead of throwing when presented with garbage', () => { + for (const [v, msg, opts] of invalidVersions) { + a.equal(parse(v, opts), null, msg) + } }) -t.test('throw errors if asked to', t => { - t.throws(() => { +t.test('throw errors if asked to', () => { + a.throws(() => { parse('bad', null, true) }, { name: 'TypeError', message: 'Invalid Version: bad', }) - t.throws(() => { + a.throws(() => { parse([], null, true) }, { name: 'TypeError', message: 'Invalid version. Must be a string. Got type "object".', }) - t.end() }) -t.test('parse a version into a SemVer object', t => { - t.match(parse('1.2.3'), new SemVer('1.2.3')) +t.test('parse a version into a SemVer object', () => { + a.deepEqual(parse('1.2.3'), new SemVer('1.2.3')) const s = new SemVer('4.5.6') - t.equal(parse(s), s, 'just return it if its a SemVer obj') + a.equal(parse(s), s, 'just return it if its a SemVer obj') const loose = new SemVer('4.2.0', { loose: true }) - t.match(parse('4.2.0', true), loose, 'looseness as a boolean') - t.match(parse('4.2.0', { loose: true }), loose, 'looseness as an option') - t.end() + a.deepEqual(parse('4.2.0', true), loose, 'looseness as a boolean') + a.deepEqual(parse('4.2.0', { loose: true }), loose, 'looseness as an option') }) diff --git a/test/functions/patch.js b/test/functions/patch.js index 1b4b186a..0f0219ad 100644 --- a/test/functions/patch.js +++ b/test/functions/patch.js @@ -1,9 +1,10 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const patch = require('../../functions/patch') -test('patch tests', (t) => { +test('patch tests', () => { // [range, version] // Version should be detectable despite extra characters [ @@ -21,7 +22,6 @@ test('patch tests', (t) => { const version = tuple[1] const loose = tuple[2] || false const msg = `patch(${range}) = ${version}` - t.equal(patch(range, loose), version, msg) + a.equal(patch(range, loose), version, msg) }) - t.end() }) diff --git a/test/functions/prerelease.js b/test/functions/prerelease.js index 0165ed99..12d2d6fd 100644 --- a/test/functions/prerelease.js +++ b/test/functions/prerelease.js @@ -1,9 +1,10 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const prerelease = require('../../functions/prerelease') -test('prerelease', (t) => { +test('prerelease', () => { // [prereleaseParts, version, loose] [ [['alpha', 1], '1.2.2-alpha.1'], @@ -20,7 +21,6 @@ test('prerelease', (t) => { const version = tuple[1] const loose = tuple[2] const msg = `prerelease(${version})` - t.same(prerelease(version, loose), expected, msg) + a.deepEqual(prerelease(version, loose), expected, msg) }) - t.end() }) diff --git a/test/functions/rcompare.js b/test/functions/rcompare.js index 33e47708..dd8ff929 100644 --- a/test/functions/rcompare.js +++ b/test/functions/rcompare.js @@ -1,13 +1,12 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const rcompare = require('../../functions/rcompare') -test('rcompare', (t) => { - t.equal(rcompare('1.0.0', '1.0.1'), 1) - t.equal(rcompare('1.0.0', '1.0.0'), 0) - t.equal(rcompare('1.0.0+0', '1.0.0'), 0) - t.equal(rcompare('1.0.1', '1.0.0'), -1) - - t.end() +test('rcompare', () => { + a.equal(rcompare('1.0.0', '1.0.1'), 1) + a.equal(rcompare('1.0.0', '1.0.0'), 0) + a.equal(rcompare('1.0.0+0', '1.0.0'), 0) + a.equal(rcompare('1.0.1', '1.0.0'), -1) }) diff --git a/test/functions/rsort.js b/test/functions/rsort.js index 02ad5d7a..6bffa172 100644 --- a/test/functions/rsort.js +++ b/test/functions/rsort.js @@ -1,9 +1,10 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const rsort = require('../../functions/rsort') -test('sorting', (t) => { +test('sorting', () => { const list = [ '1.2.3+1', '1.2.3+0', @@ -18,6 +19,5 @@ test('sorting', (t) => { '1.2.3', '0.1.2', ] - t.same(rsort(list), rsorted) - t.end() + a.deepEqual(rsort(list), rsorted) }) diff --git a/test/functions/satisfies.js b/test/functions/satisfies.js index c8ed5651..c350e3ae 100644 --- a/test/functions/satisfies.js +++ b/test/functions/satisfies.js @@ -1,22 +1,23 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const satisfies = require('../../functions/satisfies') const rangeInclude = require('../fixtures/range-include.js') const rangeExclude = require('../fixtures/range-exclude.js') -test('range tests', t => { - t.plan(rangeInclude.length) - rangeInclude.forEach(([range, ver, options]) => - t.ok(satisfies(ver, range, options), `${range} satisfied by ${ver}`)) +test('range tests', () => { + for (const [range, ver, options] of rangeInclude) { + a.ok(satisfies(ver, range, options), `${range} satisfied by ${ver}`) + } }) -test('negative range tests', t => { - t.plan(rangeExclude.length) - rangeExclude.forEach(([range, ver, options]) => - t.notOk(satisfies(ver, range, options), `${range} not satisfied by ${ver}`)) +test('negative range tests', () => { + for (const [range, ver, options] of rangeExclude) { + a.ok(!satisfies(ver, range, options), `${range} not satisfied by ${ver}`) + } }) -test('invalid ranges never satisfied (but do not throw)', t => { +test('invalid ranges never satisfied (but do not throw)', () => { const cases = [ ['blerg', '1.2.3'], ['git+https://user:password0123@github.com/foo', '123.0.0', true], @@ -24,7 +25,7 @@ test('invalid ranges never satisfied (but do not throw)', t => { ['0.x', undefined], ['*', undefined], ] - t.plan(cases.length) - cases.forEach(([range, ver]) => - t.notOk(satisfies(ver, range), `${range} not satisfied because invalid`)) + for (const [range, ver] of cases) { + a.ok(!satisfies(ver, range), `${range} not satisfied because invalid`) + } }) diff --git a/test/functions/sort.js b/test/functions/sort.js index 0c9771a4..54ba26be 100644 --- a/test/functions/sort.js +++ b/test/functions/sort.js @@ -1,9 +1,10 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const sort = require('../../functions/sort') -test('sorting', (t) => { +test('sorting', () => { const list = [ '1.2.3+1', '1.2.3+0', @@ -19,6 +20,5 @@ test('sorting', (t) => { '5.9.6', ] - t.same(sort(list), sorted) - t.end() + a.deepEqual(sort(list), sorted) }) diff --git a/test/functions/valid.js b/test/functions/valid.js index 1913008c..68d205be 100644 --- a/test/functions/valid.js +++ b/test/functions/valid.js @@ -1,31 +1,30 @@ 'use strict' -const t = require('tap') +const t = require('node:test') +const a = require('node:assert') const valid = require('../../functions/valid') const SemVer = require('../../classes/semver') const invalidVersions = require('../fixtures/invalid-versions') const { MAX_SAFE_INTEGER } = require('../../internal/constants') -t.test('returns null instead of throwing when presented with garbage', t => { - t.plan(invalidVersions.length) - invalidVersions.forEach(([v, msg, opts]) => - t.equal(valid(v, opts), null, msg)) +t.test('returns null instead of throwing when presented with garbage', () => { + for (const [v, msg, opts] of invalidVersions) { + a.equal(valid(v, opts), null, msg) + } }) -t.test('validate a version into a SemVer object', t => { - t.equal(valid('1.2.3'), '1.2.3') +t.test('validate a version into a SemVer object', () => { + a.equal(valid('1.2.3'), '1.2.3') const s = new SemVer('4.5.6') - t.equal(valid(s), '4.5.6', 'return the version if a SemVer obj') - t.equal(valid('4.2.0foo', true), '4.2.0-foo', 'looseness as a boolean') - t.equal(valid('4.2.0foo', { loose: true }), '4.2.0-foo', 'looseness as an option') - t.end() + a.equal(valid(s), '4.5.6', 'return the version if a SemVer obj') + a.equal(valid('4.2.0foo', true), '4.2.0-foo', 'looseness as a boolean') + a.equal(valid('4.2.0foo', { loose: true }), '4.2.0-foo', 'looseness as an option') }) -t.test('long build id', t => { +t.test('long build id', () => { const longBuild = '-928490632884417731e7af463c92b034d6a78268fc993bcb88a57944' const shortVersion = '1.1.1' const longVersion = `${MAX_SAFE_INTEGER}.${MAX_SAFE_INTEGER}.${MAX_SAFE_INTEGER}` - t.equal(valid(shortVersion + longBuild), shortVersion + longBuild) - t.equal(valid(longVersion + longBuild), longVersion + longBuild) - t.end() + a.equal(valid(shortVersion + longBuild), shortVersion + longBuild) + a.equal(valid(longVersion + longBuild), longVersion + longBuild) }) diff --git a/test/index.js b/test/index.js index 681f2668..b7e5bba9 100644 --- a/test/index.js +++ b/test/index.js @@ -1,13 +1,13 @@ 'use strict' -const t = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const semver = require('../') const { SEMVER_SPEC_VERSION } = require('../internal/constants') -t.match(Object.getOwnPropertyDescriptor(semver, 'SEMVER_SPEC_VERSION'), { - get: undefined, - set: undefined, - value: SEMVER_SPEC_VERSION, - configurable: true, - enumerable: true, -}, 'just a normal value property') +test('SEMVER_SPEC_VERSION property', () => { + const descriptor = Object.getOwnPropertyDescriptor(semver, 'SEMVER_SPEC_VERSION') + a.equal(descriptor.value, SEMVER_SPEC_VERSION, 'should have correct value') + a.equal(descriptor.configurable, true, 'should be configurable') + a.equal(descriptor.enumerable, true, 'should be enumerable') +}) diff --git a/test/integration/whitespace.js b/test/integration/whitespace.js index 881edffe..1da401e9 100644 --- a/test/integration/whitespace.js +++ b/test/integration/whitespace.js @@ -1,6 +1,7 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const Range = require('../../classes/range') const SemVer = require('../../classes/semver') const Comparator = require('../../classes/comparator') @@ -13,39 +14,35 @@ const wsMedium = ' '.repeat(125) const wsLarge = ' '.repeat(500000) const zeroLarge = '0'.repeat(500000) -test('range with whitespace', (t) => { +test('range with whitespace', () => { // a range with these extra characters would take a few minutes to process if // any redos susceptible regexes were used. there is a global tap timeout per // file set in the package.json that will error if this test takes too long. const r = `1.2.3 ${wsLarge} <1.3.0` - t.equal(new Range(r).range, '1.2.3 <1.3.0') - t.equal(validRange(r), '1.2.3 <1.3.0') - t.equal(minVersion(r).version, '1.2.3') - t.equal(minSatisfying(['1.2.3'], r), '1.2.3') - t.equal(maxSatisfying(['1.2.3'], r), '1.2.3') - t.end() + a.equal(new Range(r).range, '1.2.3 <1.3.0') + a.equal(validRange(r), '1.2.3 <1.3.0') + a.equal(minVersion(r).version, '1.2.3') + a.equal(minSatisfying(['1.2.3'], r), '1.2.3') + a.equal(maxSatisfying(['1.2.3'], r), '1.2.3') }) -test('range with 0', (t) => { +test('range with 0', () => { const r = `1.2.3 ${zeroLarge} <1.3.0` - t.throws(() => new Range(r).range) - t.equal(validRange(r), null) - t.throws(() => minVersion(r).version) - t.equal(minSatisfying(['1.2.3'], r), null) - t.equal(maxSatisfying(['1.2.3'], r), null) - t.end() + a.throws(() => new Range(r).range) + a.equal(validRange(r), null) + a.throws(() => minVersion(r).version) + a.equal(minSatisfying(['1.2.3'], r), null) + a.equal(maxSatisfying(['1.2.3'], r), null) }) -test('semver version', (t) => { +test('semver version', () => { const v = `${wsMedium}1.2.3${wsMedium}` const tooLong = `${wsLarge}1.2.3${wsLarge}` - t.equal(new SemVer(v).version, '1.2.3') - t.throws(() => new SemVer(tooLong)) - t.end() + a.equal(new SemVer(v).version, '1.2.3') + a.throws(() => new SemVer(tooLong)) }) -test('comparator', (t) => { +test('comparator', () => { const comparator = `${wsLarge}<${wsLarge}1.2.3${wsLarge}` - t.equal(new Comparator(comparator).value, '<1.2.3') - t.end() + a.equal(new Comparator(comparator).value, '<1.2.3') }) diff --git a/test/internal/constants.js b/test/internal/constants.js index 99cc4494..2bf9432e 100644 --- a/test/internal/constants.js +++ b/test/internal/constants.js @@ -1,12 +1,13 @@ 'use strict' -const t = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const constants = require('../../internal/constants') -t.match(constants, { - MAX_LENGTH: Number, - MAX_SAFE_COMPONENT_LENGTH: Number, - MAX_SAFE_INTEGER: Number, - RELEASE_TYPES: Array, - SEMVER_SPEC_VERSION: String, -}, 'got appropriate data types exported') +test('exports appropriate data types', () => { + a.equal(typeof constants.MAX_LENGTH, 'number') + a.equal(typeof constants.MAX_SAFE_COMPONENT_LENGTH, 'number') + a.equal(typeof constants.MAX_SAFE_INTEGER, 'number') + a.ok(Array.isArray(constants.RELEASE_TYPES)) + a.equal(typeof constants.SEMVER_SPEC_VERSION, 'string') +}) diff --git a/test/internal/debug.js b/test/internal/debug.js index 99d6085c..28b00686 100644 --- a/test/internal/debug.js +++ b/test/internal/debug.js @@ -1,38 +1,41 @@ 'use strict' -const main = () => { - const t = require('tap') +const main = async () => { + const t = require('node:test') + const a = require('node:assert') const { spawn } = require('child_process') - t.plan(2) - t.test('without env set', t => { - const c = spawn(process.execPath, [__filename, 'child'], { env: { - ...process.env, - NODE_DEBUG: '', - } }) - const err = [] - c.stderr.on('data', chunk => err.push(chunk)) - c.on('close', (code, signal) => { - t.equal(code, 0, 'success exit status') - t.equal(signal, null, 'no signal') - t.equal(Buffer.concat(err).toString('utf8'), '', 'got no output') - t.end() + await t.test('without env set', () => { + return new Promise((resolve) => { + const c = spawn(process.execPath, [__filename, 'child'], { env: { + ...process.env, + NODE_DEBUG: '', + } }) + const err = [] + c.stderr.on('data', chunk => err.push(chunk)) + c.on('close', (code, signal) => { + a.equal(code, 0, 'success exit status') + a.equal(signal, null, 'no signal') + a.equal(Buffer.concat(err).toString('utf8'), '', 'got no output') + resolve() + }) }) }) - t.test('with env set', t => { - const c = spawn(process.execPath, [__filename, 'child'], { env: { - ...process.env, - NODE_DEBUG: 'semver', - } }) - const err = [] - c.stderr.on('data', chunk => err.push(chunk)) - c.on('close', (code, signal) => { - t.equal(code, 0, 'success exit status') - t.equal(signal, null, 'no signal') - t.equal(Buffer.concat(err).toString('utf8'), 'SEMVER hello, world\n', 'got expected output') - t.end() + await t.test('with env set', () => { + return new Promise((resolve) => { + const c = spawn(process.execPath, [__filename, 'child'], { env: { + ...process.env, + NODE_DEBUG: 'semver', + } }) + const err = [] + c.stderr.on('data', chunk => err.push(chunk)) + c.on('close', (code, signal) => { + a.equal(code, 0, 'success exit status') + a.equal(signal, null, 'no signal') + a.equal(Buffer.concat(err).toString('utf8'), 'SEMVER hello, world\n', 'got expected output') + resolve() + }) }) }) - t.end() } if (process.argv[2] === 'child') { diff --git a/test/internal/identifiers.js b/test/internal/identifiers.js index cb217eda..90389963 100644 --- a/test/internal/identifiers.js +++ b/test/internal/identifiers.js @@ -1,9 +1,10 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const { compareIdentifiers, rcompareIdentifiers } = require('../../internal/identifiers') -test('rcompareIdentifiers and compareIdentifiers', (t) => { +test('rcompareIdentifiers and compareIdentifiers', () => { const set = [ ['1', '2'], ['alpha', 'beta'], @@ -11,14 +12,13 @@ test('rcompareIdentifiers and compareIdentifiers', (t) => { [1, 2], ] set.forEach((ab) => { - const a = ab[0] + const a1 = ab[0] const b = ab[1] - t.equal(compareIdentifiers(a, b), -1) - t.equal(rcompareIdentifiers(a, b), 1) + a.equal(compareIdentifiers(a1, b), -1) + a.equal(rcompareIdentifiers(a1, b), 1) }) - t.equal(compareIdentifiers('0', '0'), 0) - t.equal(rcompareIdentifiers('0', '0'), 0) - t.equal(compareIdentifiers(1, 1), 0) - t.equal(rcompareIdentifiers(1, 1), 0) - t.end() + a.equal(compareIdentifiers('0', '0'), 0) + a.equal(rcompareIdentifiers('0', '0'), 0) + a.equal(compareIdentifiers(1, 1), 0) + a.equal(rcompareIdentifiers(1, 1), 0) }) diff --git a/test/internal/lrucache.js b/test/internal/lrucache.js index 7eb225d6..028124e2 100644 --- a/test/internal/lrucache.js +++ b/test/internal/lrucache.js @@ -1,21 +1,21 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const LRUCache = require('../../internal/lrucache') -test('basic cache operation', t => { +test('basic cache operation', () => { const c = new LRUCache() const max = 1000 for (let i = 0; i < max; i++) { - t.equal(c.set(i, i), c) + a.equal(c.set(i, i), c) } for (let i = 0; i < max; i++) { - t.equal(c.get(i), i) + a.equal(c.get(i), i) } c.set(1001, 1001) // lru item should be gone - t.equal(c.get(0), undefined) + a.equal(c.get(0), undefined) c.set(42, undefined) - t.end() }) diff --git a/test/internal/parse-options.js b/test/internal/parse-options.js index d1650153..e6c824ec 100644 --- a/test/internal/parse-options.js +++ b/test/internal/parse-options.js @@ -1,45 +1,43 @@ 'use strict' -const t = require('tap') +const t = require('node:test') +const a = require('node:assert') const parseOptions = require('../../internal/parse-options.js') -t.test('falsey values always empty options object', t => { - t.strictSame(parseOptions(null), {}) - t.strictSame(parseOptions(false), {}) - t.strictSame(parseOptions(undefined), {}) - t.strictSame(parseOptions(), {}) - t.strictSame(parseOptions(0), {}) - t.strictSame(parseOptions(''), {}) - t.end() +t.test('falsey values always empty options object', () => { + a.deepEqual(parseOptions(null), {}) + a.deepEqual(parseOptions(false), {}) + a.deepEqual(parseOptions(undefined), {}) + a.deepEqual(parseOptions(), {}) + a.deepEqual(parseOptions(0), {}) + a.deepEqual(parseOptions(''), {}) }) -t.test('truthy non-objects always loose mode, for backwards comp', t => { - t.strictSame(parseOptions('hello'), { loose: true }) - t.strictSame(parseOptions(true), { loose: true }) - t.strictSame(parseOptions(1), { loose: true }) - t.end() +t.test('truthy non-objects always loose mode, for backwards comp', () => { + a.deepEqual(parseOptions('hello'), { loose: true }) + a.deepEqual(parseOptions(true), { loose: true }) + a.deepEqual(parseOptions(1), { loose: true }) }) -t.test('any object passed is returned', t => { - t.strictSame(parseOptions(/asdf/), /asdf/) - t.strictSame(parseOptions(new Error('hello')), new Error('hello')) - t.strictSame(parseOptions({ loose: true, a: 1, rtl: false }), { loose: true, a: 1, rtl: false }) - t.strictSame(parseOptions({ loose: 1, rtl: 2, includePrerelease: 10 }), { +t.test('any object passed is returned', () => { + a.deepEqual(parseOptions(/asdf/), /asdf/) + a.deepEqual(parseOptions(new Error('hello')), new Error('hello')) + a.deepEqual(parseOptions({ loose: true, a: 1, rtl: false }), { loose: true, a: 1, rtl: false }) + a.deepEqual(parseOptions({ loose: 1, rtl: 2, includePrerelease: 10 }), { loose: 1, rtl: 2, includePrerelease: 10, }) - t.strictSame(parseOptions({ loose: true }), { loose: true }) - t.strictSame(parseOptions({ rtl: true }), { rtl: true }) - t.strictSame(parseOptions({ includePrerelease: true }), { includePrerelease: true }) - t.strictSame(parseOptions({ loose: true, rtl: true }), { loose: true, rtl: true }) - t.strictSame(parseOptions({ loose: true, includePrerelease: true }), { + a.deepEqual(parseOptions({ loose: true }), { loose: true }) + a.deepEqual(parseOptions({ rtl: true }), { rtl: true }) + a.deepEqual(parseOptions({ includePrerelease: true }), { includePrerelease: true }) + a.deepEqual(parseOptions({ loose: true, rtl: true }), { loose: true, rtl: true }) + a.deepEqual(parseOptions({ loose: true, includePrerelease: true }), { loose: true, includePrerelease: true, }) - t.strictSame(parseOptions({ rtl: true, includePrerelease: true }), { + a.deepEqual(parseOptions({ rtl: true, includePrerelease: true }), { rtl: true, includePrerelease: true, }) - t.end() }) diff --git a/test/internal/re.js b/test/internal/re.js index 292b8b79..eec101b3 100644 --- a/test/internal/re.js +++ b/test/internal/re.js @@ -1,28 +1,26 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const { src, re, safeRe, safeSrc } = require('../../internal/re') const semver = require('../../') -test('Semver itself has a list of src, re, and tokens', (t) => { - t.match(Object.assign({}, semver), { - re: Array, - src: Array, - tokens: Object, - }) - re.forEach(r => t.match(r, RegExp, 'regexps are regexps')) - safeRe.forEach(r => t.match(r, RegExp, 'safe regexps are regexps')) - src.forEach(s => t.match(s, String, 'src are strings')) - safeSrc.forEach(s => t.match(s, String, 'safe srcare strings')) - t.ok(Object.keys(semver.tokens).length, 'there are tokens') +test('Semver itself has a list of src, re, and tokens', () => { + a.ok(Array.isArray(semver.re)) + a.ok(Array.isArray(semver.src)) + a.equal(typeof semver.tokens, 'object') + + re.forEach(r => a.ok(r instanceof RegExp, 'regexps are regexps')) + safeRe.forEach(r => a.ok(r instanceof RegExp, 'safe regexps are regexps')) + src.forEach(s => a.equal(typeof s, 'string', 'src are strings')) + safeSrc.forEach(s => a.equal(typeof s, 'string', 'safe src are strings')) + a.ok(Object.keys(semver.tokens).length, 'there are tokens') for (const i in semver.tokens) { - t.match(semver.tokens[i], Number, 'tokens are numbers') + a.equal(typeof semver.tokens[i], 'number', 'tokens are numbers') } safeRe.forEach(r => { - t.notMatch(r.source, '\\s+', 'safe regex do not contain greedy whitespace') - t.notMatch(r.source, '\\s*', 'safe regex do not contain greedy whitespace') + a.doesNotMatch(r.source, /\s\+/, 'safe regex do not contain greedy whitespace') + a.doesNotMatch(r.source, /\s\*/, 'safe regex do not contain greedy whitespace') }) - - t.end() }) diff --git a/test/map.js b/test/map.js index c3106d9a..5e9332a3 100644 --- a/test/map.js +++ b/test/map.js @@ -1,6 +1,7 @@ 'use strict' -const t = require('tap') +const t = require('node:test') +const a = require('node:assert') const { resolve, join, relative, extname, dirname, basename } = require('path') const { statSync, readdirSync } = require('fs') const map = require('../map.js') @@ -30,19 +31,16 @@ const walkAll = (items, relativeTo) => items .map((f) => relative(relativeTo, f)) .sort() -t.test('tests match system', t => { - const sut = walkAll([pkg.tap['coverage-map'], ...pkg.files], ROOT) +t.test('tests match system', async (t) => { + const sut = walkAll(pkg.files, ROOT) const tests = walkAll([basename(TEST)], TEST) .filter(f => !IGNORE_DIRS.includes(dirname(f))) - t.strictSame(sut, tests, 'test files should match system files') + a.deepEqual(sut, tests, 'test files should match system files') for (const f of tests) { - t.test(f, t => { - t.plan(1) - t.ok(sut.includes(map(f)), 'test covers a file') + await t.test(f, () => { + a.ok(sut.includes(map(f)), 'test covers a file') }) } - - t.end() }) diff --git a/test/preload.js b/test/preload.js index 1257ce13..55111dfc 100644 --- a/test/preload.js +++ b/test/preload.js @@ -1,6 +1,6 @@ 'use strict' -const t = require('tap') +const a = require('node:assert') const preload = require('../preload.js') const index = require('../index.js') -t.equal(preload, index, 'preload and index match') +a.equal(preload, index, 'preload and index match') diff --git a/test/ranges/gtr.js b/test/ranges/gtr.js index 88a1fdb2..1365490c 100644 --- a/test/ranges/gtr.js +++ b/test/ranges/gtr.js @@ -1,11 +1,12 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const gtr = require('../../ranges/gtr') const versionGtr = require('../fixtures/version-gt-range') const versionNotGtr = require('../fixtures/version-not-gt-range') -test('gtr tests', (t) => { +test('gtr tests', () => { // [range, version, options] // Version should be greater than range versionGtr.forEach((tuple) => { @@ -13,12 +14,11 @@ test('gtr tests', (t) => { const version = tuple[1] const options = tuple[2] || false const msg = `gtr(${version}, ${range}, ${options})` - t.ok(gtr(version, range, options), msg) + a.ok(gtr(version, range, options), msg) }) - t.end() }) -test('negative gtr tests', (t) => { +test('negative gtr tests', () => { // [range, version, options] // Version should NOT be greater than range versionNotGtr.forEach((tuple) => { @@ -26,7 +26,6 @@ test('negative gtr tests', (t) => { const version = tuple[1] const options = tuple[2] || false const msg = `!gtr(${version}, ${range}, ${options})` - t.notOk(gtr(version, range, options), msg) + a.ok(!gtr(version, range, options), msg) }) - t.end() }) diff --git a/test/ranges/intersects.js b/test/ranges/intersects.js index e3d9c88c..bb516c07 100644 --- a/test/ranges/intersects.js +++ b/test/ranges/intersects.js @@ -1,60 +1,57 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const intersects = require('../../ranges/intersects') const Range = require('../../classes/range') const Comparator = require('../../classes/comparator') const comparatorIntersection = require('../fixtures/comparator-intersection.js') const rangeIntersection = require('../fixtures/range-intersection.js') -test('intersect comparators', t => { - t.plan(comparatorIntersection.length) - comparatorIntersection.forEach(([c0, c1, expect, includePrerelease]) => - t.test(`${c0} ${c1} ${expect}`, t => { +test('intersect comparators', async (t) => { + for (const [c0, c1, expect, includePrerelease] of comparatorIntersection) { + await t.test(`${c0} ${c1} ${expect}`, () => { const opts = { loose: false, includePrerelease } const comp0 = new Comparator(c0) const comp1 = new Comparator(c1) - t.equal(intersects(comp0, comp1, opts), expect, `${c0} intersects ${c1} objects`) - t.equal(intersects(comp1, comp0, opts), expect, `${c1} intersects ${c0} objects`) - t.equal(intersects(c0, c1, opts), expect, `${c0} intersects ${c1}`) - t.equal(intersects(c1, c0, opts), expect, `${c1} intersects ${c0}`) + a.equal(intersects(comp0, comp1, opts), expect, `${c0} intersects ${c1} objects`) + a.equal(intersects(comp1, comp0, opts), expect, `${c1} intersects ${c0} objects`) + a.equal(intersects(c0, c1, opts), expect, `${c0} intersects ${c1}`) + a.equal(intersects(c1, c0, opts), expect, `${c1} intersects ${c0}`) opts.loose = true - t.equal(intersects(comp0, comp1, opts), expect, `${c0} intersects ${c1} loose, objects`) - t.equal(intersects(comp1, comp0, opts), expect, `${c1} intersects ${c0} loose, objects`) - t.equal(intersects(c0, c1, opts), expect, `${c0} intersects ${c1} loose`) - t.equal(intersects(c1, c0, opts), expect, `${c1} intersects ${c0} loose`) - t.end() - })) + a.equal(intersects(comp0, comp1, opts), expect, `${c0} intersects ${c1} loose, objects`) + a.equal(intersects(comp1, comp0, opts), expect, `${c1} intersects ${c0} loose, objects`) + a.equal(intersects(c0, c1, opts), expect, `${c0} intersects ${c1} loose`) + a.equal(intersects(c1, c0, opts), expect, `${c1} intersects ${c0} loose`) + }) + } }) -test('ranges intersect', (t) => { - rangeIntersection.forEach(([r0, r1, expect]) => { - t.test(`${r0} <~> ${r1}`, t => { +test('ranges intersect', async (t) => { + for (const [r0, r1, expect] of rangeIntersection) { + await t.test(`${r0} <~> ${r1}`, () => { const range0 = new Range(r0) const range1 = new Range(r1) - t.equal(intersects(r1, r0), expect, `${r0} <~> ${r1}`) - t.equal(intersects(r0, r1), expect, `${r1} <~> ${r0}`) - t.equal(intersects(r1, r0, true), expect, `${r0} <~> ${r1} loose`) - t.equal(intersects(r0, r1, true), expect, `${r1} <~> ${r0} loose`) - t.equal(intersects(range0, range1), expect, `${r0} <~> ${r1} objects`) - t.equal(intersects(range1, range0), expect, `${r1} <~> ${r0} objects`) - t.equal(intersects(range0, range1, true), expect, + a.equal(intersects(r1, r0), expect, `${r0} <~> ${r1}`) + a.equal(intersects(r0, r1), expect, `${r1} <~> ${r0}`) + a.equal(intersects(r1, r0, true), expect, `${r0} <~> ${r1} loose`) + a.equal(intersects(r0, r1, true), expect, `${r1} <~> ${r0} loose`) + a.equal(intersects(range0, range1), expect, `${r0} <~> ${r1} objects`) + a.equal(intersects(range1, range0), expect, `${r1} <~> ${r0} objects`) + a.equal(intersects(range0, range1, true), expect, `${r0} <~> ${r1} objects loose`) - t.equal(intersects(range1, range0, true), expect, + a.equal(intersects(range1, range0, true), expect, `${r1} <~> ${r0} objects loose`) - t.end() }) - }) - t.end() + } }) -test('missing comparator parameter in intersect comparators', (t) => { - t.throws(() => { +test('missing comparator parameter in intersect comparators', () => { + a.throws(() => { new Comparator('>1.0.0').intersects() }, new TypeError('a Comparator is required'), 'throws type error') - t.end() }) diff --git a/test/ranges/ltr.js b/test/ranges/ltr.js index 9b6d6398..68acd201 100644 --- a/test/ranges/ltr.js +++ b/test/ranges/ltr.js @@ -1,26 +1,25 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const ltr = require('../../ranges/ltr') const versionLtr = require('../fixtures/version-lt-range') const versionNotLtr = require('../fixtures/version-not-lt-range') -test('ltr tests', (t) => { +test('ltr tests', () => { // [range, version, options] // Version should be less than range versionLtr.forEach(([range, version, options = false]) => { const msg = `ltr(${version}, ${range}, ${options})` - t.ok(ltr(version, range, options), msg) + a.ok(ltr(version, range, options), msg) }) - t.end() }) -test('negative ltr tests', (t) => { +test('negative ltr tests', () => { // [range, version, options] // Version should NOT be less than range versionNotLtr.forEach(([range, version, options = false]) => { const msg = `!ltr(${version}, ${range}, ${options})` - t.notOk(ltr(version, range, options), msg) + a.ok(!ltr(version, range, options), msg) }) - t.end() }) diff --git a/test/ranges/max-satisfying.js b/test/ranges/max-satisfying.js index 2e60b506..696dca4d 100644 --- a/test/ranges/max-satisfying.js +++ b/test/ranges/max-satisfying.js @@ -1,9 +1,10 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const maxSatisfying = require('../../ranges/max-satisfying') -test('max satisfying', (t) => { +test('max satisfying', () => { [[['1.2.3', '1.2.4'], '1.2', '1.2.4'], [['1.2.4', '1.2.3'], '1.2', '1.2.4'], [['1.2.3', '1.2.4', '1.2.5', '1.2.6'], '~1.2.3', '1.2.6'], @@ -15,13 +16,11 @@ test('max satisfying', (t) => { const expect = v[2] const loose = v[3] const actual = maxSatisfying(versions, range, loose) - t.equal(actual, expect) + a.equal(actual, expect) }) - t.end() }) -test('bad ranges in max satisfying', (t) => { +test('bad ranges in max satisfying', () => { const r = 'some frogs and sneks-v2.5.6' - t.equal(maxSatisfying([], r), null) - t.end() + a.equal(maxSatisfying([], r), null) }) diff --git a/test/ranges/min-satisfying.js b/test/ranges/min-satisfying.js index c0a18fda..921d84ea 100644 --- a/test/ranges/min-satisfying.js +++ b/test/ranges/min-satisfying.js @@ -1,9 +1,10 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const minSatisfying = require('../../ranges/min-satisfying') -test('min satisfying', (t) => { +test('min satisfying', () => { [[['1.2.3', '1.2.4'], '1.2', '1.2.3'], [['1.2.4', '1.2.3'], '1.2', '1.2.3'], [['1.2.3', '1.2.4', '1.2.5', '1.2.6'], '~1.2.3', '1.2.3'], @@ -15,13 +16,11 @@ test('min satisfying', (t) => { const expect = v[2] const loose = v[3] const actual = minSatisfying(versions, range, loose) - t.equal(actual, expect) + a.equal(actual, expect) }) - t.end() }) -test('bad ranges in min satisfying', (t) => { +test('bad ranges in min satisfying', () => { const r = 'some frogs and sneks-v2.5.6' - t.equal(minSatisfying([], r), null) - t.end() + a.equal(minSatisfying([], r), null) }) diff --git a/test/ranges/min-version.js b/test/ranges/min-version.js index 44d95191..aead54ec 100644 --- a/test/ranges/min-version.js +++ b/test/ranges/min-version.js @@ -1,9 +1,10 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const minVersion = require('../../ranges/min-version') -test('minimum version in range tests', (t) => { +test('minimum version in range tests', () => { // [range, minimum, loose] [ // Stars @@ -72,10 +73,9 @@ test('minimum version in range tests', (t) => { const loose = tuple[2] || false const msg = `minVersion(${range}, ${loose}) = ${version}` const min = minVersion(range, loose) - t.ok(min === version || (min && min.version === version), msg, { + a.ok(min === version || (min && min.version === version), msg, { found: min, wanted: version, }) }) - t.end() }) diff --git a/test/ranges/outside.js b/test/ranges/outside.js index aabd04a2..a3eaef52 100644 --- a/test/ranges/outside.js +++ b/test/ranges/outside.js @@ -1,55 +1,51 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const outside = require('../../ranges/outside') const versionGtr = require('../fixtures/version-gt-range') const versionNotGtr = require('../fixtures/version-not-gt-range') const versionLtr = require('../fixtures/version-lt-range') const versionNotLtr = require('../fixtures/version-not-lt-range') -test('gtr tests', (t) => { +test('gtr tests', () => { // [range, version, options] // Version should be greater than range versionGtr.forEach(([range, version, options = false]) => { const msg = `outside(${version}, ${range}, > ${options})` - t.ok(outside(version, range, '>', options), msg) + a.ok(outside(version, range, '>', options), msg) }) - t.end() }) -test('ltr tests', (t) => { +test('ltr tests', () => { // [range, version, options] // Version should be less than range versionLtr.forEach(([range, version, options = false]) => { const msg = `outside(${version}, ${range}, <, ${options})` - t.ok(outside(version, range, '<', options), msg) + a.ok(outside(version, range, '<', options), msg) }) - t.end() }) -test('negative gtr tests', (t) => { +test('negative gtr tests', () => { // [range, version, options] // Version should NOT be greater than range versionNotGtr.forEach(([range, version, options = false]) => { const msg = `!outside(${version}, ${range}, > ${options})` - t.notOk(outside(version, range, '>', options), msg) + a.ok(!outside(version, range, '>', options), msg) }) - t.end() }) -test('negative ltr tests', (t) => { +test('negative ltr tests', () => { // [range, version, options] // Version should NOT be less than range versionNotLtr.forEach(([range, version, options = false]) => { const msg = `!outside(${version}, ${range}, < ${options})` - t.notOk(outside(version, range, '<', options), msg) + a.ok(!outside(version, range, '<', options), msg) }) - t.end() }) -test('outside with bad hilo throws', (t) => { - t.throws(() => { +test('outside with bad hilo throws', () => { + a.throws(() => { outside('1.2.3', '>1.5.0', 'blerg', true) }, new TypeError('Must provide a hilo val of "<" or ">"')) - t.end() }) diff --git a/test/ranges/simplify.js b/test/ranges/simplify.js index eac6624a..dc46a755 100644 --- a/test/ranges/simplify.js +++ b/test/ranges/simplify.js @@ -2,7 +2,7 @@ const simplify = require('../../ranges/simplify.js') const Range = require('../../classes/range.js') -const t = require('tap') +const a = require('node:assert') const versions = [ '1.0.0', '1.0.1', @@ -35,10 +35,10 @@ const versions = [ '3.3.0', ] -t.equal(simplify(versions, '1.x'), '1.x') -t.equal(simplify(versions, '1.0.0 || 1.0.1 || 1.0.2 || 1.0.3 || 1.0.4'), '<=1.0.4') -t.equal(simplify(versions, new Range('1.0.0 || 1.0.1 || 1.0.2 || 1.0.3 || 1.0.4')), '<=1.0.4') -t.equal(simplify(versions, '>=3.0.0 <3.1.0'), '3.0.0') -t.equal(simplify(versions, '3.0.0 || 3.1 || 3.2 || 3.3'), '>=3.0.0') -t.equal(simplify(versions, '1 || 2 || 3'), '*') -t.equal(simplify(versions, '2.1 || 2.2 || 2.3'), '2.1.0 - 2.3.1') +a.equal(simplify(versions, '1.x'), '1.x') +a.equal(simplify(versions, '1.0.0 || 1.0.1 || 1.0.2 || 1.0.3 || 1.0.4'), '<=1.0.4') +a.equal(simplify(versions, new Range('1.0.0 || 1.0.1 || 1.0.2 || 1.0.3 || 1.0.4')), '<=1.0.4') +a.equal(simplify(versions, '>=3.0.0 <3.1.0'), '3.0.0') +a.equal(simplify(versions, '3.0.0 || 3.1 || 3.2 || 3.3'), '>=3.0.0') +a.equal(simplify(versions, '1 || 2 || 3'), '*') +a.equal(simplify(versions, '2.1 || 2.2 || 2.3'), '2.1.0 - 2.3.1') diff --git a/test/ranges/subset.js b/test/ranges/subset.js index 21d3d421..307db097 100644 --- a/test/ranges/subset.js +++ b/test/ranges/subset.js @@ -1,6 +1,7 @@ 'use strict' -const t = require('tap') +const t = require('node:test') +const a = require('node:assert') const subset = require('../../ranges/subset.js') const Range = require('../../classes/range') @@ -105,40 +106,40 @@ const cases = [ ['>2.0.0', '>=2.0.0', true], ] -t.plan(cases.length + 1) -cases.forEach(([sub, dom, expect, options]) => { - const msg = `${sub || "''"} ⊂ ${dom || "''"} = ${expect}` + - (options ? ' ' + Object.keys(options).join(',') : '') - t.equal(subset(sub, dom, options), expect, msg) +t.test('subset test cases', () => { + for (const [sub, dom, expect, options] of cases) { + const msg = `${sub || "''"} ⊂ ${dom || "''"} = ${expect}` + + (options ? ' ' + Object.keys(options).join(',') : '') + a.equal(subset(sub, dom, options), expect, msg) + } }) -t.test('range should be subset of itself in obj or string mode', t => { +t.test('range should be subset of itself in obj or string mode', () => { const range = '^1' - t.equal(subset(range, range), true) - t.equal(subset(range, new Range(range)), true) - t.equal(subset(new Range(range), range), true) - t.equal(subset(new Range(range), new Range(range)), true) + a.equal(subset(range, range), true) + a.equal(subset(range, new Range(range)), true) + a.equal(subset(new Range(range), range), true) + a.equal(subset(new Range(range), new Range(range)), true) // test with using the same actual object const r = new Range(range) - t.equal(subset(r, r), true) + a.equal(subset(r, r), true) // different range object with same set array const r2 = new Range(range) r2.set = r.set - t.equal(subset(r2, r), true) - t.equal(subset(r, r2), true) + a.equal(subset(r2, r), true) + a.equal(subset(r, r2), true) // different range with set with same simple set arrays const r3 = new Range(range) r3.set = [...r.set] - t.equal(subset(r3, r), true) - t.equal(subset(r, r3), true) + a.equal(subset(r3, r), true) + a.equal(subset(r, r3), true) // different range with set with simple sets with same comp objects const r4 = new Range(range) r4.set = r.set.map(s => [...s]) - t.equal(subset(r4, r), true) - t.equal(subset(r, r4), true) - t.end() + a.equal(subset(r4, r), true) + a.equal(subset(r, r4), true) }) diff --git a/test/ranges/to-comparators.js b/test/ranges/to-comparators.js index d61a0e9e..59e514c7 100644 --- a/test/ranges/to-comparators.js +++ b/test/ranges/to-comparators.js @@ -1,9 +1,10 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const toComparators = require('../../ranges/to-comparators') -test('comparators test', (t) => { +test('comparators test', () => { // [range, comparators] // turn range into a set of individual comparators [['1.0.0 - 2.0.0', [['>=1.0.0', '<=2.0.0']]], @@ -82,8 +83,6 @@ test('comparators test', (t) => { ].forEach(([pre, wanted]) => { const found = toComparators(pre) const jw = JSON.stringify(wanted) - t.same(found, wanted, `toComparators(${pre}) === ${jw}`) + a.deepEqual(found, wanted, `toComparators(${pre}) === ${jw}`) }) - - t.end() }) diff --git a/test/ranges/valid.js b/test/ranges/valid.js index 67d9a369..3a0a987f 100644 --- a/test/ranges/valid.js +++ b/test/ranges/valid.js @@ -1,14 +1,15 @@ 'use strict' -const { test } = require('tap') +const { test } = require('node:test') +const a = require('node:assert') const validRange = require('../../ranges/valid') const rangeParse = require('../fixtures/range-parse.js') -test('valid range test', (t) => { +test('valid range test', () => { // validRange(range) -> result // translate ranges into their canonical form - t.plan(rangeParse.length) - rangeParse.forEach(([pre, wanted, options]) => - t.equal(validRange(pre, options), wanted, - `validRange(${pre}) === ${wanted} ${JSON.stringify(options)}`)) + for (const [pre, wanted, options] of rangeParse) { + a.equal(validRange(pre, options), wanted, + `validRange(${pre}) === ${wanted} ${JSON.stringify(options)}`) + } })