v/vlib/semver/semver_test.v

194 lines
4.4 KiB
V

import semver
struct TestVersion {
raw string
major int
minor int
patch int
prerelease string
metadata string
}
struct TestRange {
raw_version string
range_satisfied string
range_unsatisfied string
}
struct TestCoerce {
invalid string
valid string
}
const (
versions_to_test = [
TestVersion{'1.2.4', 1, 2, 4, '', ''},
TestVersion{'1.2.4-prerelease-1', 1, 2, 4, 'prerelease-1', ''},
TestVersion{'1.2.4+20191231', 1, 2, 4, '', '20191231'},
TestVersion{'1.2.4-prerelease-1+20191231', 1, 2, 4, 'prerelease-1', '20191231'},
TestVersion{'1.2.4+20191231-prerelease-1', 1, 2, 4, '', '20191231-prerelease-1'},
]
ranges_to_test = [
TestRange{'1.1.0', '1.1.0', '1.1.1'},
TestRange{'1.1.0', '=1.1.0', '=1.1.1'},
TestRange{'1.1.0', '>=1.0.0', '<1.1.0'},
TestRange{'1.1.0', '>=1.0.0 <=1.1.0', '>=1.0.0 <1.1.0'},
TestRange{'2.3.1', '>=1.0.0 <=1.1.0 || >2.0.0 <2.3.4', '>=1.0.0 <1.1.0'},
TestRange{'2.3.1', '>=1.0.0 <=1.1.0 || >2.0.0 <2.3.4', '>=1.0.0 <1.1.0 || >4.0.0 <5.0.0'},
TestRange{'2.3.1', '~2.3.0', '~2.4.0'},
TestRange{'3.0.0', '~3.0.0', '~4.0.0'},
TestRange{'2.3.1', '^2.0.0', '^2.4.0'},
TestRange{'0.3.1', '^0.3.0', '^2.4.0'},
TestRange{'0.0.4', '^0.0.1', '^0.1.0'},
TestRange{'2.3.4', '^0.0.1 || ^2.3.0', '^3.1.0 || ^4.2.0'},
TestRange{'2.3.4', '>2 || <3', '>3 || >4'},
TestRange{'2.3.4', '2.3.4 - 2.3.5', '2.5.1 - 2.8.3'},
TestRange{'2.3.4', '2.2 - 2.3', '2.4 - 2.8'},
TestRange{'2.3.4', '2.3.x', '2.4.x'},
TestRange{'2.3.4', '2.x', '3.x'},
TestRange{'2.3.4', '*', '3.x'},
]
coerce_to_test = [
TestCoerce{'1.2.0.4', '1.2.0'},
TestCoerce{'1.2.0', '1.2.0'},
TestCoerce{'1.2', '1.2.0'},
TestCoerce{'1', '1.0.0'},
TestCoerce{'1-alpha', '1.0.0-alpha'},
TestCoerce{'1+meta', '1.0.0+meta'},
TestCoerce{'1-alpha+meta', '1.0.0-alpha+meta'},
]
invalid_versions_to_test = [
'a.b.c',
'1.2',
'1.2.x',
'1.2.3.4',
'1.2.3-alpha@',
'1.2.3+meta%',
]
invalid_ranges_to_test = [
'^a',
'~b',
'a - c',
'>a',
'a',
'a.x',
]
)
fn test_from() {
for item in versions_to_test {
ver := semver.from(item.raw) or {
assert false
return
}
assert ver.major == item.major
assert ver.minor == item.minor
assert ver.patch == item.patch
assert ver.metadata == item.metadata
assert ver.prerelease == item.prerelease
assert ver.str() == item.raw
}
for ver in invalid_versions_to_test {
semver.from(ver) or {
assert true
continue
}
assert false
}
}
fn test_increment() {
version1 := semver.build(1, 2, 3)
version1_inc := version1.increment(.major)
assert version1_inc.major == 2
assert version1_inc.minor == 0
assert version1_inc.patch == 0
version2_inc := version1.increment(.minor)
assert version2_inc.major == 1
assert version2_inc.minor == 3
assert version2_inc.patch == 0
version3_inc := version1.increment(.patch)
assert version3_inc.major == 1
assert version3_inc.minor == 2
assert version3_inc.patch == 4
}
fn test_compare() {
first := semver.build(1, 0, 0)
patch := semver.build(1, 0, 1)
minor := semver.build(1, 2, 3)
major := semver.build(2, 0, 0)
assert first.le(first)
assert first.ge(first)
assert !first.lt(first)
assert !first.gt(first)
assert patch.ge(first)
assert first.le(patch)
assert !first.ge(patch)
assert !patch.le(first)
assert patch.gt(first)
assert first.lt(patch)
assert !first.gt(patch)
assert !patch.lt(first)
assert minor.gt(patch)
assert patch.lt(minor)
assert !patch.gt(minor)
assert !minor.lt(patch)
assert major.gt(minor)
assert minor.lt(major)
assert !minor.gt(major)
assert !major.lt(minor)
}
fn test_satisfies() {
for item in ranges_to_test {
ver := semver.from(item.raw_version) or {
assert false
return
}
assert ver.satisfies(item.range_satisfied)
assert !ver.satisfies(item.range_unsatisfied)
}
}
fn test_satisfies_invalid() {
ver := semver.from('1.0.0') or {
assert false
return
}
for item in invalid_ranges_to_test {
assert ver.satisfies(item) == false
}
}
fn test_coerce() {
for item in coerce_to_test {
valid := semver.from(item.valid) or {
assert false
return
}
fixed := semver.coerce(item.invalid) or {
assert false
return
}
assert fixed.eq(valid)
}
}
fn test_coerce_invalid() {
semver.coerce('a') or {
assert true
return
}
assert false
}
fn test_is_valid() {
for item in versions_to_test {
assert semver.is_valid(item.raw)
}
for item in invalid_versions_to_test {
assert semver.is_valid(item) == false
}
}