Skip to content

Commit

Permalink
fix: tweak error message when input is wrong type
Browse files Browse the repository at this point in the history
  • Loading branch information
tjenkinson committed May 5, 2023
1 parent 3cfdf1e commit 5019bc5
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 67 deletions.
2 changes: 1 addition & 1 deletion classes/semver.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class SemVer {
version = version.version
}
} else if (typeof version !== 'string') {
throw new TypeError(`Invalid Version: ${version}`)
throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version}".`)
}

if (version.length > MAX_LENGTH) {
Expand Down
144 changes: 79 additions & 65 deletions test/classes/semver.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,52 +5,60 @@ const comparisons = require('../fixtures/comparisons.js')
const equality = require('../fixtures/equality.js')
const invalidVersions = require('../fixtures/invalid-versions')

test('comparisons', t => {
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()
}))
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('equality', t => {
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()
}))
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('toString equals parsed version', t => {
test('toString equals parsed version', (t) => {
t.equal(String(new SemVer('v1.2.3')), '1.2.3')
t.end()
})

test('throws when presented with garbage', t => {
test('throws when presented with garbage', (t) => {
t.plan(invalidVersions.length)
invalidVersions.forEach(([v, msg, opts]) =>
t.throws(() => new SemVer(v, opts), msg))
t.throws(() => new SemVer(v, opts), msg)
)
})

test('return SemVer arg to ctor if options match', t => {
test('return SemVer arg to ctor if options match', (t) => {
const s = new SemVer('1.2.3', { loose: true, includePrerelease: true })
t.equal(new SemVer(s, { loose: true, includePrerelease: true }), s,
'get same object when options match')
t.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()
})
Expand All @@ -62,37 +70,39 @@ test('really big numeric prerelease value', (t) => {
})

test('invalid version numbers', (t) => {
['1.2.3.4',
'NOT VALID',
1.2,
null,
'Infinity.NaN.Infinity',
].forEach((v) => {
t.throws(() => {
new SemVer(v) // eslint-disable-line no-new
}, { name: 'TypeError', message: `Invalid Version: ${v}` })
['1.2.3.4', 'NOT VALID', 1.2, null, 'Infinity.NaN.Infinity'].forEach((v) => {
t.throws(
() => {
new SemVer(v) // eslint-disable-line no-new
},
{
name: 'TypeError',
message:
typeof v === 'string'
? `Invalid Version: ${v}`
: `Invalid version. Must be a string. Got type "${typeof v}".`,
}
)
})

t.end()
})

test('incrementing', t => {
test('incrementing', (t) => {
t.plan(increments.length)
increments.forEach(([
version,
inc,
expect,
options,
id,
base,
]) => t.test(`${version} ${inc} ${id || ''}`.trim(), t => {
t.plan(1)
if (expect === null) {
t.throws(() => new SemVer(version, options).inc(inc, id, base))
} else {
t.equal(new SemVer(version, options).inc(inc, id, base).version, expect)
}
}))
increments.forEach(([version, inc, expect, options, id, base]) =>
t.test(`${version} ${inc} ${id || ''}`.trim(), (t) => {
t.plan(1)
if (expect === null) {
t.throws(() => new SemVer(version, options).inc(inc, id, base))
} else {
t.equal(
new SemVer(version, options).inc(inc, id, base).version,
expect
)
}
})
)
})

test('compare main vs pre', (t) => {
Expand All @@ -113,15 +123,19 @@ test('compare main vs pre', (t) => {
})

test('invalid version numbers', (t) => {
['1.2.3.4',
'NOT VALID',
1.2,
null,
'Infinity.NaN.Infinity',
].forEach((v) => {
t.throws(() => {
new SemVer(v) // eslint-disable-line no-new
}, { name: 'TypeError', message: `Invalid Version: ${v}` })
['1.2.3.4', 'NOT VALID', 1.2, null, 'Infinity.NaN.Infinity'].forEach((v) => {
t.throws(
() => {
new SemVer(v) // eslint-disable-line no-new
},
{
name: 'TypeError',
message:
typeof v === 'string'
? `Invalid Version: ${v}`
: `Invalid version. Must be a string. Got type "${typeof v}".`,
}
)
})

t.end()
Expand Down
2 changes: 1 addition & 1 deletion test/functions/parse.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ t.test('throw errors if asked to', t => {
parse([], null, true)
}, {
name: 'TypeError',
message: 'Invalid Version: ',
message: 'Invalid version. Must be a string. Got type "object".',
})
t.end()
})
Expand Down

0 comments on commit 5019bc5

Please sign in to comment.