-
Notifications
You must be signed in to change notification settings - Fork 0
/
semver_inc.test.ts
73 lines (64 loc) · 2.03 KB
/
semver_inc.test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import semver from "semver"
import { execSync } from "child_process"
const semverCommands = ["major", "minor", "patch", "premajor", "preminor", "prepatch", "prerelease"] as const
type iSemverInc = typeof semverCommands[number]
describe(semver_inc.name, () => {
describe('validation', () => {
const coreNumbers = [0, 1]
for (const command of semverCommands)
for (const major of coreNumbers)
for (const minor of coreNumbers)
for (const patch of coreNumbers)
for (const prerelease of coreNumbers.map(v => v ? `-${v}` : '')) {
const version = [major, minor, patch].join('.') + prerelease
it(`${command} ${version}`, () => expect(semver_inc(
command, [
`${
Math.random() > 0.5 ? 'v' : ''
}${
version
}`
]
)).toBe(
semver.inc(version, command)
))
}
})
describe("scenario 1", () => {
const start = "1.0.0"
, scenario: [iSemverInc, string][] = [
["minor", "v1.1.0"],
["preminor", "1.2.0-0"],
["patch", "v1.1.1"],
["prerelease", "1.2.0-1"],
["patch", "v1.1.2"],
["minor", "1.2.0"]
]
for (let i = 0; i < scenario.length; i++)
it(scenario[i].join(' '), () => expect(semver_inc(
scenario[i][0],
[start, ...scenario.slice(0, i).map(([_,tag]) => tag)]
.sort(semverSort)
)).toBe(
_v(scenario[i][1])
))
})
describe("bad command", () => {
it("release", () => expect(() => semver_inc(
//@ts-ignore,
"release",
["v0.1.0"]
)).toThrow())
})
})
function semver_inc(inc: iSemverInc, tags: string[]) {
return execSync(`echo "${tags.join("\n")}" | xargs -d \\n -n1 echo | ./utils/semver_inc ${inc}`)
.toString()
.replace(/\n$/, '')
}
function semverSort(v1: string, v2: string) {
return v1 === v2 ? 0 : semver.gt(_v(v1), _v(v2)) ? -1 : 1
}
function _v(v: string) {
return v.replace(/^v/, "")
}