remove unused packages
This commit is contained in:
parent
048c975c7d
commit
e24ccad485
@ -1,274 +0,0 @@
|
|||||||
package semver
|
|
||||||
|
|
||||||
import (
|
|
||||||
"cmp"
|
|
||||||
"fmt"
|
|
||||||
"regexp"
|
|
||||||
"slices"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// https://semver.org/#spec-item-2
|
|
||||||
// > A normal version number MUST take the form X.Y.Z where X, Y, and Z are non-negative
|
|
||||||
// > integers, and MUST NOT contain leading zeroes. X is the major version, Y is the minor
|
|
||||||
// > version, and Z is the patch version. Each element MUST increase numerically.
|
|
||||||
//
|
|
||||||
// NOTE: We differ here in that we allow X and X.Y, with missing parts having the default
|
|
||||||
// value of `0`.
|
|
||||||
var versionRegexp = regexp.MustCompile(`(?i)^(0|[1-9]\d*)(?:\.(0|[1-9]\d*)(?:\.(0|[1-9]\d*)(?:-([a-z0-9-.]+))?(?:\+([a-z0-9-.]+))?)?)?$`)
|
|
||||||
|
|
||||||
// https://semver.org/#spec-item-9
|
|
||||||
// > A pre-release version MAY be denoted by appending a hyphen and a series of dot separated
|
|
||||||
// > identifiers immediately following the patch version. Identifiers MUST comprise only ASCII
|
|
||||||
// > alphanumerics and hyphen [0-9A-Za-z-]. Identifiers MUST NOT be empty. Numeric identifiers
|
|
||||||
// > MUST NOT include leading zeroes.
|
|
||||||
var (
|
|
||||||
prereleaseRegexp = regexp.MustCompile(`(?i)^(?:0|[1-9]\d*|[a-z-][a-z0-9-]*)(?:\.(?:0|[1-9]\d*|[a-zA-Z-][a-zA-Z0-9-]*))*$`)
|
|
||||||
prereleasePartRegexp = regexp.MustCompile(`(?i)^(?:0|[1-9]\d*|[a-z-][a-z0-9-]*)$`)
|
|
||||||
)
|
|
||||||
|
|
||||||
// https://semver.org/#spec-item-10
|
|
||||||
// > Build metadata MAY be denoted by appending a plus sign and a series of dot separated
|
|
||||||
// > identifiers immediately following the patch or pre-release version. Identifiers MUST
|
|
||||||
// > comprise only ASCII alphanumerics and hyphen [0-9A-Za-z-]. Identifiers MUST NOT be empty.
|
|
||||||
var (
|
|
||||||
buildRegExp = regexp.MustCompile(`(?i)^[a-z0-9-]+(?:\.[a-z0-9-]+)*$`)
|
|
||||||
buildPartRegExp = regexp.MustCompile(`(?i)^[a-z0-9-]+$`)
|
|
||||||
)
|
|
||||||
|
|
||||||
// https://semver.org/#spec-item-9
|
|
||||||
// > Numeric identifiers MUST NOT include leading zeroes.
|
|
||||||
var numericIdentifierRegExp = regexp.MustCompile(`^(?:0|[1-9]\d*)$`)
|
|
||||||
|
|
||||||
type Version struct {
|
|
||||||
major uint32
|
|
||||||
minor uint32
|
|
||||||
patch uint32
|
|
||||||
prerelease []string
|
|
||||||
build []string
|
|
||||||
}
|
|
||||||
|
|
||||||
var versionZero = Version{
|
|
||||||
prerelease: []string{"0"},
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *Version) incrementMajor() Version {
|
|
||||||
return Version{
|
|
||||||
major: v.major + 1,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *Version) incrementMinor() Version {
|
|
||||||
return Version{
|
|
||||||
major: v.major,
|
|
||||||
minor: v.minor + 1,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *Version) incrementPatch() Version {
|
|
||||||
return Version{
|
|
||||||
major: v.major,
|
|
||||||
minor: v.minor,
|
|
||||||
patch: v.patch + 1,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const (
|
|
||||||
comparisonLessThan = -1
|
|
||||||
comparisonEqualTo = 0
|
|
||||||
comparisonGreaterThan = 1
|
|
||||||
)
|
|
||||||
|
|
||||||
func (a *Version) Compare(b *Version) int {
|
|
||||||
// https://semver.org/#spec-item-11
|
|
||||||
// > Precedence is determined by the first difference when comparing each of these
|
|
||||||
// > identifiers from left to right as follows: Major, minor, and patch versions are
|
|
||||||
// > always compared numerically.
|
|
||||||
//
|
|
||||||
// https://semver.org/#spec-item-11
|
|
||||||
// > Precedence for two pre-release versions with the same major, minor, and patch version
|
|
||||||
// > MUST be determined by comparing each dot separated identifier from left to right until
|
|
||||||
// > a difference is found [...]
|
|
||||||
//
|
|
||||||
// https://semver.org/#spec-item-11
|
|
||||||
// > Build metadata does not figure into precedence
|
|
||||||
switch {
|
|
||||||
case a == b:
|
|
||||||
return comparisonEqualTo
|
|
||||||
case a == nil:
|
|
||||||
return comparisonLessThan
|
|
||||||
case b == nil:
|
|
||||||
return comparisonGreaterThan
|
|
||||||
}
|
|
||||||
|
|
||||||
r := cmp.Compare(a.major, b.major)
|
|
||||||
if r != 0 {
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
r = cmp.Compare(a.minor, b.minor)
|
|
||||||
if r != 0 {
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
r = cmp.Compare(a.patch, b.patch)
|
|
||||||
if r != 0 {
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
return comparePreReleaseIdentifiers(a.prerelease, b.prerelease)
|
|
||||||
}
|
|
||||||
|
|
||||||
func comparePreReleaseIdentifiers(left, right []string) int {
|
|
||||||
// https://semver.org/#spec-item-11
|
|
||||||
// > When major, minor, and patch are equal, a pre-release version has lower precedence
|
|
||||||
// > than a normal version.
|
|
||||||
if len(left) == 0 {
|
|
||||||
if len(right) == 0 {
|
|
||||||
return comparisonEqualTo
|
|
||||||
}
|
|
||||||
return comparisonGreaterThan
|
|
||||||
} else if len(right) == 0 {
|
|
||||||
return comparisonLessThan
|
|
||||||
}
|
|
||||||
|
|
||||||
// https://semver.org/#spec-item-11
|
|
||||||
// > Precedence for two pre-release versions with the same major, minor, and patch version
|
|
||||||
// > MUST be determined by comparing each dot separated identifier from left to right until
|
|
||||||
// > a difference is found [...]
|
|
||||||
return slices.CompareFunc(left, right, comparePreReleaseIdentifier)
|
|
||||||
}
|
|
||||||
|
|
||||||
func comparePreReleaseIdentifier(left, right string) int {
|
|
||||||
// https://semver.org/#spec-item-11
|
|
||||||
// > Precedence for two pre-release versions with the same major, minor, and patch version
|
|
||||||
// > MUST be determined by comparing each dot separated identifier from left to right until
|
|
||||||
// > a difference is found [...]
|
|
||||||
compareResult := strings.Compare(left, right)
|
|
||||||
if compareResult == 0 {
|
|
||||||
return compareResult
|
|
||||||
}
|
|
||||||
|
|
||||||
leftIsNumeric := numericIdentifierRegExp.MatchString(left)
|
|
||||||
rightIsNumeric := numericIdentifierRegExp.MatchString(right)
|
|
||||||
|
|
||||||
if leftIsNumeric || rightIsNumeric {
|
|
||||||
// https://semver.org/#spec-item-11
|
|
||||||
// > Numeric identifiers always have lower precedence than non-numeric identifiers.
|
|
||||||
if !rightIsNumeric {
|
|
||||||
return comparisonLessThan
|
|
||||||
}
|
|
||||||
if !leftIsNumeric {
|
|
||||||
return comparisonGreaterThan
|
|
||||||
}
|
|
||||||
|
|
||||||
// https://semver.org/#spec-item-11
|
|
||||||
// > identifiers consisting of only digits are compared numerically
|
|
||||||
leftAsNumber, leftErr := getUintComponent(left)
|
|
||||||
rightAsNumber, rightErr := getUintComponent(right)
|
|
||||||
if leftErr != nil || rightErr != nil {
|
|
||||||
// This should only happen in the event of an overflow.
|
|
||||||
// If so, use the lengths or fall back to string comparison.
|
|
||||||
leftLen := len(left)
|
|
||||||
rightLen := len(right)
|
|
||||||
lenCompare := cmp.Compare(leftLen, rightLen)
|
|
||||||
if lenCompare == 0 {
|
|
||||||
return compareResult
|
|
||||||
} else {
|
|
||||||
return lenCompare
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return cmp.Compare(leftAsNumber, rightAsNumber)
|
|
||||||
}
|
|
||||||
|
|
||||||
// https://semver.org/#spec-item-11
|
|
||||||
// > identifiers with letters or hyphens are compared lexically in ASCII sort order.
|
|
||||||
return compareResult
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *Version) String() string {
|
|
||||||
var sb strings.Builder
|
|
||||||
fmt.Fprintf(&sb, "%d.%d.%d", v.major, v.minor, v.patch)
|
|
||||||
if len(v.prerelease) > 0 {
|
|
||||||
fmt.Fprintf(&sb, "-%s", strings.Join(v.prerelease, "."))
|
|
||||||
}
|
|
||||||
if len(v.build) > 0 {
|
|
||||||
fmt.Fprintf(&sb, "+%s", strings.Join(v.build, "."))
|
|
||||||
}
|
|
||||||
return sb.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
type SemverParseError struct {
|
|
||||||
origInput string
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *SemverParseError) Error() string {
|
|
||||||
return fmt.Sprintf("Could not parse version string from %q", e.origInput)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TryParseVersion(text string) (Version, error) {
|
|
||||||
var result Version
|
|
||||||
|
|
||||||
match := versionRegexp.FindStringSubmatch(text)
|
|
||||||
if match == nil {
|
|
||||||
return result, &SemverParseError{origInput: text}
|
|
||||||
}
|
|
||||||
|
|
||||||
majorStr := match[1]
|
|
||||||
minorStr := match[2]
|
|
||||||
patchStr := match[3]
|
|
||||||
prereleaseStr := match[4]
|
|
||||||
buildStr := match[5]
|
|
||||||
|
|
||||||
var err error
|
|
||||||
|
|
||||||
result.major, err = getUintComponent(majorStr)
|
|
||||||
if err != nil {
|
|
||||||
return result, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if minorStr != "" {
|
|
||||||
result.minor, err = getUintComponent(minorStr)
|
|
||||||
if err != nil {
|
|
||||||
return result, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if patchStr != "" {
|
|
||||||
result.patch, err = getUintComponent(patchStr)
|
|
||||||
if err != nil {
|
|
||||||
return result, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if prereleaseStr != "" {
|
|
||||||
if !prereleaseRegexp.MatchString(prereleaseStr) {
|
|
||||||
return result, &SemverParseError{origInput: text}
|
|
||||||
}
|
|
||||||
|
|
||||||
result.prerelease = strings.Split(prereleaseStr, ".")
|
|
||||||
}
|
|
||||||
if buildStr != "" {
|
|
||||||
if !buildRegExp.MatchString(buildStr) {
|
|
||||||
return result, &SemverParseError{origInput: text}
|
|
||||||
}
|
|
||||||
|
|
||||||
result.build = strings.Split(buildStr, ".")
|
|
||||||
}
|
|
||||||
|
|
||||||
return result, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func MustParse(text string) Version {
|
|
||||||
v, err := TryParseVersion(text)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
return v
|
|
||||||
}
|
|
||||||
|
|
||||||
func getUintComponent(text string) (uint32, error) {
|
|
||||||
r, err := strconv.ParseUint(text, 10, 32)
|
|
||||||
return uint32(r), err
|
|
||||||
}
|
|
||||||
@ -1,438 +0,0 @@
|
|||||||
package semver
|
|
||||||
|
|
||||||
import (
|
|
||||||
"regexp"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// https://github.com/npm/node-semver#range-grammar
|
|
||||||
//
|
|
||||||
// range-set ::= range ( logical-or range ) *
|
|
||||||
// range ::= hyphen | simple ( ' ' simple ) * | ”
|
|
||||||
// logical-or ::= ( ' ' ) * '||' ( ' ' ) *
|
|
||||||
var (
|
|
||||||
logicalOrRegExp = regexp.MustCompile(`\|\|`)
|
|
||||||
whitespaceRegExp = regexp.MustCompile(`\s+`)
|
|
||||||
)
|
|
||||||
|
|
||||||
// https://github.com/npm/node-semver#range-grammar
|
|
||||||
//
|
|
||||||
// partial ::= xr ( '.' xr ( '.' xr qualifier ? )? )?
|
|
||||||
// xr ::= 'x' | 'X' | '*' | nr
|
|
||||||
// nr ::= '0' | ['1'-'9'] ( ['0'-'9'] ) *
|
|
||||||
// qualifier ::= ( '-' pre )? ( '+' build )?
|
|
||||||
// pre ::= parts
|
|
||||||
// build ::= parts
|
|
||||||
// parts ::= part ( '.' part ) *
|
|
||||||
// part ::= nr | [-0-9A-Za-z]+
|
|
||||||
var partialRegExp = regexp.MustCompile(`(?i)^([x*0]|[1-9]\d*)(?:\.([x*0]|[1-9]\d*)(?:\.([x*0]|[1-9]\d*)(?:-([a-z0-9-.]+))?(?:\+([a-z0-9-.]+))?)?)?$`)
|
|
||||||
|
|
||||||
// https://github.com/npm/node-semver#range-grammar
|
|
||||||
//
|
|
||||||
// hyphen ::= partial ' - ' partial
|
|
||||||
var hyphenRegExp = regexp.MustCompile(`(?i)^\s*([a-z0-9-+.*]+)\s+-\s+([a-z0-9-+.*]+)\s*$`)
|
|
||||||
|
|
||||||
// https://github.com/npm/node-semver#range-grammar
|
|
||||||
//
|
|
||||||
// simple ::= primitive | partial | tilde | caret
|
|
||||||
// primitive ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial
|
|
||||||
// tilde ::= '~' partial
|
|
||||||
// caret ::= '^' partial
|
|
||||||
var rangeRegExp = regexp.MustCompile(`(?i)^([~^<>=]|<=|>=)?\s*([a-z0-9-+.*]+)$`)
|
|
||||||
|
|
||||||
type VersionRange struct {
|
|
||||||
alternatives [][]versionComparator
|
|
||||||
}
|
|
||||||
|
|
||||||
type versionComparator struct {
|
|
||||||
operator comparatorOperator
|
|
||||||
operand Version
|
|
||||||
}
|
|
||||||
|
|
||||||
type comparatorOperator string
|
|
||||||
|
|
||||||
const (
|
|
||||||
rangeLessThan comparatorOperator = "<"
|
|
||||||
rangeLessThanEqual comparatorOperator = "<="
|
|
||||||
rangeEqual comparatorOperator = "="
|
|
||||||
rangeGreaterThanEqual comparatorOperator = ">="
|
|
||||||
rangeGreaterThan comparatorOperator = ">"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (v *VersionRange) String() string {
|
|
||||||
var sb strings.Builder
|
|
||||||
formatDisjunction(&sb, v.alternatives)
|
|
||||||
return sb.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
func formatDisjunction(sb *strings.Builder, alternatives [][]versionComparator) {
|
|
||||||
origLen := sb.Len()
|
|
||||||
|
|
||||||
for i, alternative := range alternatives {
|
|
||||||
if i > 0 {
|
|
||||||
sb.WriteString(" || ")
|
|
||||||
}
|
|
||||||
formatAlternative(sb, alternative)
|
|
||||||
}
|
|
||||||
|
|
||||||
if sb.Len() == origLen {
|
|
||||||
sb.WriteString("*")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func formatAlternative(sb *strings.Builder, comparators []versionComparator) {
|
|
||||||
for i, comparator := range comparators {
|
|
||||||
if i > 0 {
|
|
||||||
sb.WriteByte(' ')
|
|
||||||
}
|
|
||||||
formatComparator(sb, comparator)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func formatComparator(sb *strings.Builder, comparator versionComparator) {
|
|
||||||
sb.WriteString(string(comparator.operator))
|
|
||||||
sb.WriteString(comparator.operand.String())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *VersionRange) Test(version *Version) bool {
|
|
||||||
return testDisjunction(v.alternatives, version)
|
|
||||||
}
|
|
||||||
|
|
||||||
func testDisjunction(alternatives [][]versionComparator, version *Version) bool {
|
|
||||||
// an empty disjunction is treated as "*" (all versions)
|
|
||||||
if len(alternatives) == 0 {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, alternative := range alternatives {
|
|
||||||
if testAlternative(alternative, version) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func testAlternative(alternative []versionComparator, version *Version) bool {
|
|
||||||
for _, comparator := range alternative {
|
|
||||||
if !testComparator(comparator, version) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func testComparator(comparator versionComparator, version *Version) bool {
|
|
||||||
cmp := version.Compare(&comparator.operand)
|
|
||||||
switch comparator.operator {
|
|
||||||
case rangeLessThan:
|
|
||||||
return cmp < 0
|
|
||||||
case rangeLessThanEqual:
|
|
||||||
return cmp <= 0
|
|
||||||
case rangeEqual:
|
|
||||||
return cmp == 0
|
|
||||||
case rangeGreaterThanEqual:
|
|
||||||
return cmp >= 0
|
|
||||||
case rangeGreaterThan:
|
|
||||||
return cmp > 0
|
|
||||||
default:
|
|
||||||
panic("Unexpected operator: " + comparator.operator)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TryParseVersionRange(text string) (VersionRange, bool) {
|
|
||||||
alternatives, ok := parseAlternatives(text)
|
|
||||||
return VersionRange{alternatives: alternatives}, ok
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseAlternatives(text string) ([][]versionComparator, bool) {
|
|
||||||
var alternatives [][]versionComparator
|
|
||||||
|
|
||||||
text = strings.TrimSpace(text)
|
|
||||||
ranges := logicalOrRegExp.Split(text, -1)
|
|
||||||
for _, r := range ranges {
|
|
||||||
r = strings.TrimSpace(r)
|
|
||||||
if r == "" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
var comparators []versionComparator
|
|
||||||
|
|
||||||
if hyphenMatch := hyphenRegExp.FindStringSubmatch(r); hyphenMatch != nil {
|
|
||||||
if parsedComparators, ok := parseHyphen(hyphenMatch[1], hyphenMatch[2]); ok {
|
|
||||||
comparators = append(comparators, parsedComparators...)
|
|
||||||
} else {
|
|
||||||
return nil, false
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for _, simple := range whitespaceRegExp.Split(r, -1) {
|
|
||||||
match := rangeRegExp.FindStringSubmatch(strings.TrimSpace(simple))
|
|
||||||
if match == nil {
|
|
||||||
return nil, false
|
|
||||||
}
|
|
||||||
|
|
||||||
if parsedComparators, ok := parseComparator(match[1], match[2]); ok {
|
|
||||||
comparators = append(comparators, parsedComparators...)
|
|
||||||
} else {
|
|
||||||
return nil, false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
alternatives = append(alternatives, comparators)
|
|
||||||
}
|
|
||||||
|
|
||||||
return alternatives, true
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseHyphen(left, right string) ([]versionComparator, bool) {
|
|
||||||
leftResult, leftOk := parsePartial(left)
|
|
||||||
if !leftOk {
|
|
||||||
return nil, false
|
|
||||||
}
|
|
||||||
|
|
||||||
rightResult, rightOk := parsePartial(right)
|
|
||||||
if !rightOk {
|
|
||||||
return nil, false
|
|
||||||
}
|
|
||||||
|
|
||||||
var comparators []versionComparator
|
|
||||||
if !isWildcard(leftResult.majorStr) {
|
|
||||||
// `MAJOR.*.*-...` gives us `>=MAJOR.0.0 ...`
|
|
||||||
comparators = append(comparators, versionComparator{
|
|
||||||
operator: rangeGreaterThanEqual,
|
|
||||||
operand: leftResult.version,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if !isWildcard(rightResult.majorStr) {
|
|
||||||
var operator comparatorOperator
|
|
||||||
operand := rightResult.version
|
|
||||||
|
|
||||||
switch {
|
|
||||||
case isWildcard(rightResult.minorStr):
|
|
||||||
// `...-MAJOR.*.*` gives us `... <(MAJOR+1).0.0`
|
|
||||||
operand = operand.incrementMajor()
|
|
||||||
operator = rangeLessThan
|
|
||||||
case isWildcard(rightResult.patchStr):
|
|
||||||
// `...-MAJOR.MINOR.*` gives us `... <MAJOR.(MINOR+1).0`
|
|
||||||
operand = operand.incrementMinor()
|
|
||||||
operator = rangeLessThan
|
|
||||||
default:
|
|
||||||
// `...-MAJOR.MINOR.PATCH` gives us `... <=MAJOR.MINOR.PATCH`
|
|
||||||
operator = rangeLessThanEqual
|
|
||||||
}
|
|
||||||
|
|
||||||
comparators = append(comparators, versionComparator{
|
|
||||||
operator: operator,
|
|
||||||
operand: operand,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return comparators, true
|
|
||||||
}
|
|
||||||
|
|
||||||
type partialVersion struct {
|
|
||||||
version Version
|
|
||||||
majorStr string
|
|
||||||
minorStr string
|
|
||||||
patchStr string
|
|
||||||
}
|
|
||||||
|
|
||||||
// Produces a "partial" version
|
|
||||||
func parsePartial(text string) (partialVersion, bool) {
|
|
||||||
match := partialRegExp.FindStringSubmatch(text)
|
|
||||||
if match == nil {
|
|
||||||
return partialVersion{}, false
|
|
||||||
}
|
|
||||||
|
|
||||||
majorStr := match[1]
|
|
||||||
minorStr := match[2]
|
|
||||||
patchStr := match[3]
|
|
||||||
prereleaseStr := match[4]
|
|
||||||
buildStr := match[5]
|
|
||||||
|
|
||||||
if minorStr == "" {
|
|
||||||
minorStr = "*"
|
|
||||||
}
|
|
||||||
if patchStr == "" {
|
|
||||||
patchStr = "*"
|
|
||||||
}
|
|
||||||
|
|
||||||
var majorNumeric, minorNumeric, patchNumeric uint32
|
|
||||||
var err error
|
|
||||||
|
|
||||||
if isWildcard(majorStr) {
|
|
||||||
majorNumeric = 0
|
|
||||||
minorNumeric = 0
|
|
||||||
patchNumeric = 0
|
|
||||||
} else {
|
|
||||||
majorNumeric, err = getUintComponent(majorStr)
|
|
||||||
if err != nil {
|
|
||||||
return partialVersion{}, false
|
|
||||||
}
|
|
||||||
|
|
||||||
if isWildcard(minorStr) {
|
|
||||||
minorNumeric = 0
|
|
||||||
patchNumeric = 0
|
|
||||||
} else {
|
|
||||||
minorNumeric, err = getUintComponent(minorStr)
|
|
||||||
if err != nil {
|
|
||||||
return partialVersion{}, false
|
|
||||||
}
|
|
||||||
|
|
||||||
if isWildcard(patchStr) {
|
|
||||||
patchNumeric = 0
|
|
||||||
} else {
|
|
||||||
patchNumeric, err = getUintComponent(patchStr)
|
|
||||||
if err != nil {
|
|
||||||
return partialVersion{}, false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var prerelease []string
|
|
||||||
if prereleaseStr != "" {
|
|
||||||
prerelease = strings.Split(prereleaseStr, ".")
|
|
||||||
}
|
|
||||||
|
|
||||||
var build []string
|
|
||||||
if buildStr != "" {
|
|
||||||
build = strings.Split(buildStr, ".")
|
|
||||||
}
|
|
||||||
|
|
||||||
result := partialVersion{
|
|
||||||
version: Version{
|
|
||||||
major: majorNumeric,
|
|
||||||
minor: minorNumeric,
|
|
||||||
patch: patchNumeric,
|
|
||||||
prerelease: prerelease,
|
|
||||||
build: build,
|
|
||||||
},
|
|
||||||
majorStr: majorStr,
|
|
||||||
minorStr: minorStr,
|
|
||||||
patchStr: patchStr,
|
|
||||||
}
|
|
||||||
|
|
||||||
return result, true
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseComparator(op string, text string) ([]versionComparator, bool) {
|
|
||||||
operator := comparatorOperator(op)
|
|
||||||
|
|
||||||
result, ok := parsePartial(text)
|
|
||||||
if !ok {
|
|
||||||
return nil, false
|
|
||||||
}
|
|
||||||
|
|
||||||
var comparatorsResult []versionComparator
|
|
||||||
|
|
||||||
if !isWildcard(result.majorStr) {
|
|
||||||
switch operator {
|
|
||||||
case "~":
|
|
||||||
first := versionComparator{rangeGreaterThanEqual, result.version}
|
|
||||||
|
|
||||||
var secondVersion Version
|
|
||||||
if isWildcard(result.minorStr) {
|
|
||||||
secondVersion = result.version.incrementMajor()
|
|
||||||
} else {
|
|
||||||
secondVersion = result.version.incrementMinor()
|
|
||||||
}
|
|
||||||
|
|
||||||
second := versionComparator{rangeLessThan, secondVersion}
|
|
||||||
comparatorsResult = []versionComparator{first, second}
|
|
||||||
|
|
||||||
case "^":
|
|
||||||
first := versionComparator{rangeGreaterThanEqual, result.version}
|
|
||||||
|
|
||||||
var secondVersion Version
|
|
||||||
if result.version.major > 0 || isWildcard(result.minorStr) {
|
|
||||||
secondVersion = result.version.incrementMajor()
|
|
||||||
} else if result.version.minor > 0 || isWildcard(result.patchStr) {
|
|
||||||
secondVersion = result.version.incrementMinor()
|
|
||||||
} else {
|
|
||||||
secondVersion = result.version.incrementPatch()
|
|
||||||
}
|
|
||||||
second := versionComparator{rangeLessThan, secondVersion}
|
|
||||||
comparatorsResult = []versionComparator{first, second}
|
|
||||||
|
|
||||||
case "<", ">=":
|
|
||||||
version := result.version
|
|
||||||
if isWildcard(result.minorStr) || isWildcard(result.patchStr) {
|
|
||||||
version.prerelease = []string{"0"}
|
|
||||||
}
|
|
||||||
comparatorsResult = []versionComparator{
|
|
||||||
{operator, version},
|
|
||||||
}
|
|
||||||
|
|
||||||
case "<=", ">":
|
|
||||||
version := result.version
|
|
||||||
if isWildcard(result.minorStr) {
|
|
||||||
if operator == rangeLessThanEqual {
|
|
||||||
operator = rangeLessThan
|
|
||||||
} else {
|
|
||||||
operator = rangeGreaterThanEqual
|
|
||||||
}
|
|
||||||
|
|
||||||
version = version.incrementMajor()
|
|
||||||
version.prerelease = []string{"0"}
|
|
||||||
} else if isWildcard(result.patchStr) {
|
|
||||||
if operator == rangeLessThanEqual {
|
|
||||||
operator = rangeLessThan
|
|
||||||
} else {
|
|
||||||
operator = rangeGreaterThanEqual
|
|
||||||
}
|
|
||||||
|
|
||||||
version = version.incrementMinor()
|
|
||||||
version.prerelease = []string{"0"}
|
|
||||||
}
|
|
||||||
|
|
||||||
comparatorsResult = []versionComparator{
|
|
||||||
{operator, version},
|
|
||||||
}
|
|
||||||
case "=", "":
|
|
||||||
// normalize empty string to `=`
|
|
||||||
operator = rangeEqual
|
|
||||||
|
|
||||||
if isWildcard(result.minorStr) || isWildcard(result.patchStr) {
|
|
||||||
originalVersion := result.version
|
|
||||||
|
|
||||||
firstVersion := originalVersion
|
|
||||||
firstVersion.prerelease = []string{"0"}
|
|
||||||
|
|
||||||
var secondVersion Version
|
|
||||||
if isWildcard(result.minorStr) {
|
|
||||||
secondVersion = originalVersion.incrementMajor()
|
|
||||||
} else {
|
|
||||||
secondVersion = originalVersion.incrementMinor()
|
|
||||||
}
|
|
||||||
secondVersion.prerelease = []string{"0"}
|
|
||||||
|
|
||||||
comparatorsResult = []versionComparator{
|
|
||||||
{rangeGreaterThanEqual, firstVersion},
|
|
||||||
{rangeLessThan, secondVersion},
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
comparatorsResult = []versionComparator{
|
|
||||||
{operator, result.version},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
panic("Unexpected operator: " + operator)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if operator == "<" || operator == ">" {
|
|
||||||
comparatorsResult = []versionComparator{
|
|
||||||
// < 0.0.0-0
|
|
||||||
{rangeLessThan, versionZero},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return comparatorsResult, true
|
|
||||||
}
|
|
||||||
|
|
||||||
func isWildcard(text string) bool {
|
|
||||||
return text == "*" || text == "x" || text == "X"
|
|
||||||
}
|
|
||||||
@ -1,959 +0,0 @@
|
|||||||
package semver
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"gotest.tools/v3/assert"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestWildcardsHaveSameString(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
majorWildcardStrings := []string{
|
|
||||||
"",
|
|
||||||
"*",
|
|
||||||
"*.*",
|
|
||||||
"*.*.*",
|
|
||||||
"x",
|
|
||||||
"x.x",
|
|
||||||
"x.x.x",
|
|
||||||
"X",
|
|
||||||
"X.X",
|
|
||||||
"X.X.X",
|
|
||||||
}
|
|
||||||
|
|
||||||
minorWildcardStrings := []string{
|
|
||||||
"1",
|
|
||||||
"1.*",
|
|
||||||
"1.*.*",
|
|
||||||
"1.x",
|
|
||||||
"1.x.x",
|
|
||||||
"1.X",
|
|
||||||
"1.X.X",
|
|
||||||
}
|
|
||||||
|
|
||||||
patchWildcardStrings := []string{
|
|
||||||
"1.2",
|
|
||||||
"1.2.*",
|
|
||||||
"1.2.x",
|
|
||||||
"1.2.X",
|
|
||||||
}
|
|
||||||
|
|
||||||
mixedCaseWildcardStrings := []string{
|
|
||||||
"x",
|
|
||||||
"X",
|
|
||||||
"*",
|
|
||||||
"x.X.x",
|
|
||||||
"X.x.*",
|
|
||||||
}
|
|
||||||
|
|
||||||
assertAllVersionRangesHaveIdenticalStrings(t, "majorWildcardStrings", majorWildcardStrings)
|
|
||||||
assertAllVersionRangesHaveIdenticalStrings(t, "minorWildcardStrings", minorWildcardStrings)
|
|
||||||
assertAllVersionRangesHaveIdenticalStrings(t, "patchWildcardStrings", patchWildcardStrings)
|
|
||||||
assertAllVersionRangesHaveIdenticalStrings(t, "mixedCaseWildcardStrings", mixedCaseWildcardStrings)
|
|
||||||
}
|
|
||||||
|
|
||||||
func assertAllVersionRangesHaveIdenticalStrings(t *testing.T, name string, strs []string) {
|
|
||||||
t.Run(name, func(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
for _, s1 := range strs {
|
|
||||||
for _, s2 := range strs {
|
|
||||||
t.Run(s1+" == "+s2, func(t *testing.T) {
|
|
||||||
v1, ok := TryParseVersionRange(s1)
|
|
||||||
assert.Assert(t, ok)
|
|
||||||
v2, ok := TryParseVersionRange(s2)
|
|
||||||
assert.Assert(t, ok)
|
|
||||||
assert.DeepEqual(t, v1.String(), v2.String())
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
type testGoodBad struct {
|
|
||||||
good []string
|
|
||||||
bad []string
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestVersionRanges(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
assertRangesGoodBad(t, "1", testGoodBad{
|
|
||||||
good: []string{"1.0.0", "1.9.9", "1.0.0-pre", "1.0.0+build"},
|
|
||||||
bad: []string{"0.0.0", "2.0.0", "0.0.0-pre", "0.0.0+build"},
|
|
||||||
})
|
|
||||||
assertRangesGoodBad(t, "1.2", testGoodBad{
|
|
||||||
good: []string{"1.2.0", "1.2.9", "1.2.0-pre", "1.2.0+build"},
|
|
||||||
bad: []string{"1.1.0", "1.3.0", "1.1.0-pre", "1.1.0+build"},
|
|
||||||
})
|
|
||||||
|
|
||||||
assertRangesGoodBad(t, "1.2.3", testGoodBad{
|
|
||||||
good: []string{"1.2.3", "1.2.3+build"},
|
|
||||||
bad: []string{"1.2.2", "1.2.4", "1.2.2-pre", "1.2.2+build", "1.2.3-pre"},
|
|
||||||
})
|
|
||||||
|
|
||||||
assertRangesGoodBad(t, "1.2.3-pre", testGoodBad{
|
|
||||||
good: []string{"1.2.3-pre", "1.2.3-pre+build.stuff"},
|
|
||||||
bad: []string{"1.2.3", "1.2.3-pre.0", "1.2.3-pre.9", "1.2.3-pre.0+build", "1.2.3-pre.9+build", "1.2.3+build", "1.2.4"},
|
|
||||||
})
|
|
||||||
|
|
||||||
assertRangesGoodBad(t, "<3.8.0", testGoodBad{
|
|
||||||
good: []string{"3.6", "3.7"},
|
|
||||||
bad: []string{"3.8", "3.9", "4.0"},
|
|
||||||
})
|
|
||||||
|
|
||||||
assertRangesGoodBad(t, "<=3.8.0", testGoodBad{
|
|
||||||
good: []string{"3.6", "3.7", "3.8"},
|
|
||||||
bad: []string{"3.9", "4.0"},
|
|
||||||
})
|
|
||||||
assertRangesGoodBad(t, ">3.8.0", testGoodBad{
|
|
||||||
good: []string{"3.9", "4.0"},
|
|
||||||
bad: []string{"3.6", "3.7", "3.8"},
|
|
||||||
})
|
|
||||||
assertRangesGoodBad(t, ">=3.8.0", testGoodBad{
|
|
||||||
good: []string{"3.8", "3.9", "4.0"},
|
|
||||||
bad: []string{"3.6", "3.7"},
|
|
||||||
})
|
|
||||||
|
|
||||||
assertRangesGoodBad(t, "<3.8.0-0", testGoodBad{
|
|
||||||
good: []string{"3.6", "3.7"},
|
|
||||||
bad: []string{"3.8", "3.9", "4.0"},
|
|
||||||
})
|
|
||||||
|
|
||||||
assertRangesGoodBad(t, "<=3.8.0-0", testGoodBad{
|
|
||||||
good: []string{"3.6", "3.7"},
|
|
||||||
bad: []string{"3.8", "3.9", "4.0"},
|
|
||||||
})
|
|
||||||
|
|
||||||
// Big numbers in prerelease strings.
|
|
||||||
lotsaOnes := strings.Repeat("1", 320)
|
|
||||||
assertRangesGoodBad(t, ">=1.2.3-1"+lotsaOnes, testGoodBad{
|
|
||||||
good: []string{"1.2.3-1" + lotsaOnes, "1.2.3-11" + lotsaOnes + ".1", "1.2.3-1" + lotsaOnes + ".1+build"},
|
|
||||||
bad: []string{"1.2.3-" + lotsaOnes + ".1+build"},
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestComparatorsOfVersionRanges(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
comparatorsTests := []testForRangeOnVersion{
|
|
||||||
// empty (matches everything)
|
|
||||||
{"", "2.0.0", true},
|
|
||||||
{"", "2.0.0-0", true},
|
|
||||||
{"", "1.1.0", true},
|
|
||||||
{"", "1.1.0-0", true},
|
|
||||||
{"", "1.0.1", true},
|
|
||||||
{"", "1.0.1-0", true},
|
|
||||||
{"", "1.0.0", true},
|
|
||||||
{"", "1.0.0-0", true},
|
|
||||||
{"", "0.0.0", true},
|
|
||||||
{"", "0.0.0-0", true},
|
|
||||||
|
|
||||||
// wildcard major (matches everything)
|
|
||||||
{"*", "2.0.0", true},
|
|
||||||
{"*", "2.0.0-0", true},
|
|
||||||
{"*", "1.1.0", true},
|
|
||||||
{"*", "1.1.0-0", true},
|
|
||||||
{"*", "1.0.1", true},
|
|
||||||
{"*", "1.0.1-0", true},
|
|
||||||
{"*", "1.0.0", true},
|
|
||||||
{"*", "1.0.0-0", true},
|
|
||||||
{"*", "0.0.0", true},
|
|
||||||
{"*", "0.0.0-0", true},
|
|
||||||
|
|
||||||
// wildcard minor
|
|
||||||
{"1", "2.0.0", false},
|
|
||||||
{"1", "2.0.0-0", false},
|
|
||||||
{"1", "1.1.0", true},
|
|
||||||
{"1", "1.1.0-0", true},
|
|
||||||
{"1", "1.0.1", true},
|
|
||||||
{"1", "1.0.1-0", true},
|
|
||||||
{"1", "1.0.0", true},
|
|
||||||
{"1", "1.0.0-0", true},
|
|
||||||
{"1", "0.0.0", false},
|
|
||||||
{"1", "0.0.0-0", false},
|
|
||||||
|
|
||||||
// wildcard patch
|
|
||||||
{"1.1", "2.0.0", false},
|
|
||||||
{"1.1", "2.0.0-0", false},
|
|
||||||
{"1.1", "1.1.0", true},
|
|
||||||
{"1.1", "1.1.0-0", true},
|
|
||||||
{"1.1", "1.0.1", false},
|
|
||||||
{"1.1", "1.0.1-0", false},
|
|
||||||
{"1.1", "1.0.0", false},
|
|
||||||
{"1.1", "1.0.0-0", false},
|
|
||||||
{"1.1", "0.0.0", false},
|
|
||||||
{"1.1", "0.0.0-0", false},
|
|
||||||
{"1.0", "2.0.0", false},
|
|
||||||
{"1.0", "2.0.0-0", false},
|
|
||||||
{"1.0", "1.1.0", false},
|
|
||||||
{"1.0", "1.1.0-0", false},
|
|
||||||
{"1.0", "1.0.1", true},
|
|
||||||
{"1.0", "1.0.1-0", true},
|
|
||||||
{"1.0", "1.0.0", true},
|
|
||||||
{"1.0", "1.0.0-0", true},
|
|
||||||
{"1.0", "0.0.0", false},
|
|
||||||
{"1.0", "0.0.0-0", false},
|
|
||||||
|
|
||||||
// exact
|
|
||||||
{"1.1.0", "2.0.0", false},
|
|
||||||
{"1.1.0", "2.0.0-0", false},
|
|
||||||
{"1.1.0", "1.1.0", true},
|
|
||||||
{"1.1.0", "1.1.0-0", false},
|
|
||||||
{"1.1.0", "1.0.1", false},
|
|
||||||
{"1.1.0", "1.0.1-0", false},
|
|
||||||
{"1.1.0", "1.0.0-0", false},
|
|
||||||
{"1.1.0", "1.0.0", false},
|
|
||||||
{"1.1.0", "0.0.0", false},
|
|
||||||
{"1.1.0", "0.0.0-0", false},
|
|
||||||
{"1.1.0-0", "2.0.0", false},
|
|
||||||
{"1.1.0-0", "2.0.0-0", false},
|
|
||||||
{"1.1.0-0", "1.1.0", false},
|
|
||||||
{"1.1.0-0", "1.1.0-0", true},
|
|
||||||
{"1.1.0-0", "1.0.1", false},
|
|
||||||
{"1.1.0-0", "1.0.1-0", false},
|
|
||||||
{"1.1.0-0", "1.0.0-0", false},
|
|
||||||
{"1.1.0-0", "1.0.0", false},
|
|
||||||
{"1.1.0-0", "0.0.0", false},
|
|
||||||
{"1.1.0-0", "0.0.0-0", false},
|
|
||||||
{"1.0.1", "2.0.0", false},
|
|
||||||
{"1.0.1", "2.0.0-0", false},
|
|
||||||
{"1.0.1", "1.1.0", false},
|
|
||||||
{"1.0.1", "1.1.0-0", false},
|
|
||||||
{"1.0.1", "1.0.1", true},
|
|
||||||
{"1.0.1", "1.0.1-0", false},
|
|
||||||
{"1.0.1", "1.0.0-0", false},
|
|
||||||
{"1.0.1", "1.0.0", false},
|
|
||||||
{"1.0.1", "0.0.0", false},
|
|
||||||
{"1.0.1", "0.0.0-0", false},
|
|
||||||
{"1.0.1-0", "2.0.0", false},
|
|
||||||
{"1.0.1-0", "2.0.0-0", false},
|
|
||||||
{"1.0.1-0", "1.1.0", false},
|
|
||||||
{"1.0.1-0", "1.1.0-0", false},
|
|
||||||
{"1.0.1-0", "1.0.1", false},
|
|
||||||
{"1.0.1-0", "1.0.1-0", true},
|
|
||||||
{"1.0.1-0", "1.0.0-0", false},
|
|
||||||
{"1.0.1-0", "1.0.0", false},
|
|
||||||
{"1.0.1-0", "0.0.0", false},
|
|
||||||
{"1.0.1-0", "0.0.0-0", false},
|
|
||||||
{"1.0.0", "2.0.0", false},
|
|
||||||
{"1.0.0", "2.0.0-0", false},
|
|
||||||
{"1.0.0", "1.1.0", false},
|
|
||||||
{"1.0.0", "1.1.0-0", false},
|
|
||||||
{"1.0.0", "1.0.1", false},
|
|
||||||
{"1.0.0", "1.0.1-0", false},
|
|
||||||
{"1.0.0", "1.0.0-0", false},
|
|
||||||
{"1.0.0", "1.0.0", true},
|
|
||||||
{"1.0.0", "0.0.0", false},
|
|
||||||
{"1.0.0", "0.0.0-0", false},
|
|
||||||
{"1.0.0-0", "2.0.0", false},
|
|
||||||
{"1.0.0-0", "2.0.0-0", false},
|
|
||||||
{"1.0.0-0", "1.1.0", false},
|
|
||||||
{"1.0.0-0", "1.1.0-0", false},
|
|
||||||
{"1.0.0-0", "1.0.1", false},
|
|
||||||
{"1.0.0-0", "1.0.1-0", false},
|
|
||||||
{"1.0.0-0", "1.0.0", false},
|
|
||||||
{"1.0.0-0", "1.0.0-0", true},
|
|
||||||
|
|
||||||
// = wildcard major (matches everything)
|
|
||||||
{"=*", "2.0.0", true},
|
|
||||||
{"=*", "2.0.0-0", true},
|
|
||||||
{"=*", "1.1.0", true},
|
|
||||||
{"=*", "1.1.0-0", true},
|
|
||||||
{"=*", "1.0.1", true},
|
|
||||||
{"=*", "1.0.1-0", true},
|
|
||||||
{"=*", "1.0.0", true},
|
|
||||||
{"=*", "1.0.0-0", true},
|
|
||||||
{"=*", "0.0.0", true},
|
|
||||||
{"=*", "0.0.0-0", true},
|
|
||||||
|
|
||||||
// = wildcard minor
|
|
||||||
{"=1", "2.0.0", false},
|
|
||||||
{"=1", "2.0.0-0", false},
|
|
||||||
{"=1", "1.1.0", true},
|
|
||||||
{"=1", "1.1.0-0", true},
|
|
||||||
{"=1", "1.0.1", true},
|
|
||||||
{"=1", "1.0.1-0", true},
|
|
||||||
{"=1", "1.0.0", true},
|
|
||||||
{"=1", "1.0.0-0", true},
|
|
||||||
{"=1", "0.0.0", false},
|
|
||||||
{"=1", "0.0.0-0", false},
|
|
||||||
|
|
||||||
// = wildcard patch
|
|
||||||
{"=1.1", "2.0.0", false},
|
|
||||||
{"=1.1", "2.0.0-0", false},
|
|
||||||
{"=1.1", "1.1.0", true},
|
|
||||||
{"=1.1", "1.1.0-0", true},
|
|
||||||
{"=1.1", "1.0.1", false},
|
|
||||||
{"=1.1", "1.0.1-0", false},
|
|
||||||
{"=1.1", "1.0.0", false},
|
|
||||||
{"=1.1", "1.0.0-0", false},
|
|
||||||
{"=1.1", "0.0.0", false},
|
|
||||||
{"=1.1", "0.0.0-0", false},
|
|
||||||
{"=1.0", "2.0.0", false},
|
|
||||||
{"=1.0", "2.0.0-0", false},
|
|
||||||
{"=1.0", "1.1.0", false},
|
|
||||||
{"=1.0", "1.1.0-0", false},
|
|
||||||
{"=1.0", "1.0.1", true},
|
|
||||||
{"=1.0", "1.0.1-0", true},
|
|
||||||
{"=1.0", "1.0.0", true},
|
|
||||||
{"=1.0", "1.0.0-0", true},
|
|
||||||
{"=1.0", "0.0.0", false},
|
|
||||||
{"=1.0", "0.0.0-0", false},
|
|
||||||
|
|
||||||
// = exact
|
|
||||||
{"=1.1.0", "2.0.0", false},
|
|
||||||
{"=1.1.0", "2.0.0-0", false},
|
|
||||||
{"=1.1.0", "1.1.0", true},
|
|
||||||
{"=1.1.0", "1.1.0-0", false},
|
|
||||||
{"=1.1.0", "1.0.1", false},
|
|
||||||
{"=1.1.0", "1.0.1-0", false},
|
|
||||||
{"=1.1.0", "1.0.0-0", false},
|
|
||||||
{"=1.1.0", "1.0.0", false},
|
|
||||||
{"=1.1.0", "0.0.0", false},
|
|
||||||
{"=1.1.0", "0.0.0-0", false},
|
|
||||||
{"=1.1.0-0", "2.0.0", false},
|
|
||||||
{"=1.1.0-0", "2.0.0-0", false},
|
|
||||||
{"=1.1.0-0", "1.1.0", false},
|
|
||||||
{"=1.1.0-0", "1.1.0-0", true},
|
|
||||||
{"=1.1.0-0", "1.0.1", false},
|
|
||||||
{"=1.1.0-0", "1.0.1-0", false},
|
|
||||||
{"=1.1.0-0", "1.0.0-0", false},
|
|
||||||
{"=1.1.0-0", "1.0.0", false},
|
|
||||||
{"=1.1.0-0", "0.0.0", false},
|
|
||||||
{"=1.1.0-0", "0.0.0-0", false},
|
|
||||||
{"=1.0.1", "2.0.0", false},
|
|
||||||
{"=1.0.1", "2.0.0-0", false},
|
|
||||||
{"=1.0.1", "1.1.0", false},
|
|
||||||
{"=1.0.1", "1.1.0-0", false},
|
|
||||||
{"=1.0.1", "1.0.1", true},
|
|
||||||
{"=1.0.1", "1.0.1-0", false},
|
|
||||||
{"=1.0.1", "1.0.0-0", false},
|
|
||||||
{"=1.0.1", "1.0.0", false},
|
|
||||||
{"=1.0.1", "0.0.0", false},
|
|
||||||
{"=1.0.1", "0.0.0-0", false},
|
|
||||||
{"=1.0.1-0", "2.0.0", false},
|
|
||||||
{"=1.0.1-0", "2.0.0-0", false},
|
|
||||||
{"=1.0.1-0", "1.1.0", false},
|
|
||||||
{"=1.0.1-0", "1.1.0-0", false},
|
|
||||||
{"=1.0.1-0", "1.0.1", false},
|
|
||||||
{"=1.0.1-0", "1.0.1-0", true},
|
|
||||||
{"=1.0.1-0", "1.0.0-0", false},
|
|
||||||
{"=1.0.1-0", "1.0.0", false},
|
|
||||||
{"=1.0.1-0", "0.0.0", false},
|
|
||||||
{"=1.0.1-0", "0.0.0-0", false},
|
|
||||||
{"=1.0.0", "2.0.0", false},
|
|
||||||
{"=1.0.0", "2.0.0-0", false},
|
|
||||||
{"=1.0.0", "1.1.0", false},
|
|
||||||
{"=1.0.0", "1.1.0-0", false},
|
|
||||||
{"=1.0.0", "1.0.1", false},
|
|
||||||
{"=1.0.0", "1.0.1-0", false},
|
|
||||||
{"=1.0.0", "1.0.0-0", false},
|
|
||||||
{"=1.0.0", "1.0.0", true},
|
|
||||||
{"=1.0.0", "0.0.0", false},
|
|
||||||
{"=1.0.0", "0.0.0-0", false},
|
|
||||||
{"=1.0.0-0", "2.0.0", false},
|
|
||||||
{"=1.0.0-0", "2.0.0-0", false},
|
|
||||||
{"=1.0.0-0", "1.1.0", false},
|
|
||||||
{"=1.0.0-0", "1.1.0-0", false},
|
|
||||||
{"=1.0.0-0", "1.0.1", false},
|
|
||||||
{"=1.0.0-0", "1.0.1-0", false},
|
|
||||||
{"=1.0.0-0", "1.0.0", false},
|
|
||||||
{"=1.0.0-0", "1.0.0-0", true},
|
|
||||||
|
|
||||||
// > wildcard major (matches nothing)
|
|
||||||
{">*", "2.0.0", false},
|
|
||||||
{">*", "2.0.0-0", false},
|
|
||||||
{">*", "1.1.0", false},
|
|
||||||
{">*", "1.1.0-0", false},
|
|
||||||
{">*", "1.0.1", false},
|
|
||||||
{">*", "1.0.1-0", false},
|
|
||||||
{">*", "1.0.0", false},
|
|
||||||
{">*", "1.0.0-0", false},
|
|
||||||
{">*", "0.0.0", false},
|
|
||||||
{">*", "0.0.0-0", false},
|
|
||||||
|
|
||||||
// > wildcard minor
|
|
||||||
{">1", "2.0.0", true},
|
|
||||||
{">1", "2.0.0-0", true},
|
|
||||||
{">1", "1.1.0", false},
|
|
||||||
{">1", "1.1.0-0", false},
|
|
||||||
{">1", "1.0.1", false},
|
|
||||||
{">1", "1.0.1-0", false},
|
|
||||||
{">1", "1.0.0", false},
|
|
||||||
{">1", "1.0.0-0", false},
|
|
||||||
{">1", "0.0.0", false},
|
|
||||||
{">1", "0.0.0-0", false},
|
|
||||||
|
|
||||||
// > wildcard patch
|
|
||||||
{">1.1", "2.0.0", true},
|
|
||||||
{">1.1", "2.0.0-0", true},
|
|
||||||
{">1.1", "1.1.0", false},
|
|
||||||
{">1.1", "1.1.0-0", false},
|
|
||||||
{">1.1", "1.0.1", false},
|
|
||||||
{">1.1", "1.0.1-0", false},
|
|
||||||
{">1.1", "1.0.0", false},
|
|
||||||
{">1.1", "1.0.0-0", false},
|
|
||||||
{">1.1", "0.0.0", false},
|
|
||||||
{">1.1", "0.0.0-0", false},
|
|
||||||
{">1.0", "2.0.0", true},
|
|
||||||
{">1.0", "2.0.0-0", true},
|
|
||||||
{">1.0", "1.1.0", true},
|
|
||||||
{">1.0", "1.1.0-0", true},
|
|
||||||
{">1.0", "1.0.1", false},
|
|
||||||
{">1.0", "1.0.1-0", false},
|
|
||||||
{">1.0", "1.0.0", false},
|
|
||||||
{">1.0", "1.0.0-0", false},
|
|
||||||
{">1.0", "0.0.0", false},
|
|
||||||
{">1.0", "0.0.0-0", false},
|
|
||||||
|
|
||||||
// > exact
|
|
||||||
{">1.1.0", "2.0.0", true},
|
|
||||||
{">1.1.0", "2.0.0-0", true},
|
|
||||||
{">1.1.0", "1.1.0", false},
|
|
||||||
{">1.1.0", "1.1.0-0", false},
|
|
||||||
{">1.1.0", "1.0.1", false},
|
|
||||||
{">1.1.0", "1.0.1-0", false},
|
|
||||||
{">1.1.0", "1.0.0", false},
|
|
||||||
{">1.1.0", "1.0.0-0", false},
|
|
||||||
{">1.1.0", "0.0.0", false},
|
|
||||||
{">1.1.0", "0.0.0-0", false},
|
|
||||||
{">1.1.0-0", "2.0.0", true},
|
|
||||||
{">1.1.0-0", "2.0.0-0", true},
|
|
||||||
{">1.1.0-0", "1.1.0", true},
|
|
||||||
{">1.1.0-0", "1.1.0-0", false},
|
|
||||||
{">1.1.0-0", "1.0.1", false},
|
|
||||||
{">1.1.0-0", "1.0.1-0", false},
|
|
||||||
{">1.1.0-0", "1.0.0", false},
|
|
||||||
{">1.1.0-0", "1.0.0-0", false},
|
|
||||||
{">1.1.0-0", "0.0.0", false},
|
|
||||||
{">1.1.0-0", "0.0.0-0", false},
|
|
||||||
{">1.0.1", "2.0.0", true},
|
|
||||||
{">1.0.1", "2.0.0-0", true},
|
|
||||||
{">1.0.1", "1.1.0", true},
|
|
||||||
{">1.0.1", "1.1.0-0", true},
|
|
||||||
{">1.0.1", "1.0.1", false},
|
|
||||||
{">1.0.1", "1.0.1-0", false},
|
|
||||||
{">1.0.1", "1.0.0", false},
|
|
||||||
{">1.0.1", "1.0.0-0", false},
|
|
||||||
{">1.0.1", "0.0.0", false},
|
|
||||||
{">1.0.1", "0.0.0-0", false},
|
|
||||||
{">1.0.1-0", "2.0.0", true},
|
|
||||||
{">1.0.1-0", "2.0.0-0", true},
|
|
||||||
{">1.0.1-0", "1.1.0", true},
|
|
||||||
{">1.0.1-0", "1.1.0-0", true},
|
|
||||||
{">1.0.1-0", "1.0.1", true},
|
|
||||||
{">1.0.1-0", "1.0.1-0", false},
|
|
||||||
{">1.0.1-0", "1.0.0", false},
|
|
||||||
{">1.0.1-0", "1.0.0-0", false},
|
|
||||||
{">1.0.1-0", "0.0.0", false},
|
|
||||||
{">1.0.1-0", "0.0.0-0", false},
|
|
||||||
{">1.0.0", "2.0.0", true},
|
|
||||||
{">1.0.0", "2.0.0-0", true},
|
|
||||||
{">1.0.0", "1.1.0", true},
|
|
||||||
{">1.0.0", "1.1.0-0", true},
|
|
||||||
{">1.0.0", "1.0.1", true},
|
|
||||||
{">1.0.0", "1.0.1-0", true},
|
|
||||||
{">1.0.0", "1.0.0", false},
|
|
||||||
{">1.0.0", "1.0.0-0", false},
|
|
||||||
{">1.0.0", "0.0.0", false},
|
|
||||||
{">1.0.0", "0.0.0-0", false},
|
|
||||||
{">1.0.0-0", "2.0.0", true},
|
|
||||||
{">1.0.0-0", "2.0.0-0", true},
|
|
||||||
{">1.0.0-0", "1.1.0", true},
|
|
||||||
{">1.0.0-0", "1.1.0-0", true},
|
|
||||||
{">1.0.0-0", "1.0.1", true},
|
|
||||||
{">1.0.0-0", "1.0.1-0", true},
|
|
||||||
{">1.0.0-0", "1.0.0", true},
|
|
||||||
{">1.0.0-0", "1.0.0-0", false},
|
|
||||||
{">1.0.0-0", "0.0.0", false},
|
|
||||||
{">1.0.0-0", "0.0.0-0", false},
|
|
||||||
|
|
||||||
// >= wildcard major (matches everything)
|
|
||||||
{">=*", "2.0.0", true},
|
|
||||||
{">=*", "2.0.0-0", true},
|
|
||||||
{">=*", "1.1.0", true},
|
|
||||||
{">=*", "1.1.0-0", true},
|
|
||||||
{">=*", "1.0.1", true},
|
|
||||||
{">=*", "1.0.1-0", true},
|
|
||||||
{">=*", "1.0.0", true},
|
|
||||||
{">=*", "1.0.0-0", true},
|
|
||||||
{">=*", "0.0.0", true},
|
|
||||||
{">=*", "0.0.0-0", true},
|
|
||||||
|
|
||||||
// >= wildcard minor
|
|
||||||
{">=1", "2.0.0", true},
|
|
||||||
{">=1", "2.0.0-0", true},
|
|
||||||
{">=1", "1.1.0", true},
|
|
||||||
{">=1", "1.1.0-0", true},
|
|
||||||
{">=1", "1.0.1", true},
|
|
||||||
{">=1", "1.0.1-0", true},
|
|
||||||
{">=1", "1.0.0", true},
|
|
||||||
{">=1", "1.0.0-0", true},
|
|
||||||
{">=1", "0.0.0", false},
|
|
||||||
{">=1", "0.0.0-0", false},
|
|
||||||
|
|
||||||
// >= wildcard patch
|
|
||||||
{">=1.1", "2.0.0", true},
|
|
||||||
{">=1.1", "2.0.0-0", true},
|
|
||||||
{">=1.1", "1.1.0", true},
|
|
||||||
{">=1.1", "1.1.0-0", true},
|
|
||||||
{">=1.1", "1.0.1", false},
|
|
||||||
{">=1.1", "1.0.1-0", false},
|
|
||||||
{">=1.1", "1.0.0", false},
|
|
||||||
{">=1.1", "1.0.0-0", false},
|
|
||||||
{">=1.1", "0.0.0", false},
|
|
||||||
{">=1.1", "0.0.0-0", false},
|
|
||||||
{">=1.0", "2.0.0", true},
|
|
||||||
{">=1.0", "2.0.0-0", true},
|
|
||||||
{">=1.0", "1.1.0", true},
|
|
||||||
{">=1.0", "1.1.0-0", true},
|
|
||||||
{">=1.0", "1.0.1", true},
|
|
||||||
{">=1.0", "1.0.1-0", true},
|
|
||||||
{">=1.0", "1.0.0", true},
|
|
||||||
{">=1.0", "1.0.0-0", true},
|
|
||||||
{">=1.0", "0.0.0", false},
|
|
||||||
{">=1.0", "0.0.0-0", false},
|
|
||||||
|
|
||||||
// >= exact
|
|
||||||
{">=1.1.0", "2.0.0", true},
|
|
||||||
{">=1.1.0", "2.0.0-0", true},
|
|
||||||
{">=1.1.0", "1.1.0", true},
|
|
||||||
{">=1.1.0", "1.1.0-0", false},
|
|
||||||
{">=1.1.0", "1.0.1", false},
|
|
||||||
{">=1.1.0", "1.0.1-0", false},
|
|
||||||
{">=1.1.0", "1.0.0", false},
|
|
||||||
{">=1.1.0", "1.0.0-0", false},
|
|
||||||
{">=1.1.0", "0.0.0", false},
|
|
||||||
{">=1.1.0", "0.0.0-0", false},
|
|
||||||
{">=1.1.0-0", "2.0.0", true},
|
|
||||||
{">=1.1.0-0", "2.0.0-0", true},
|
|
||||||
{">=1.1.0-0", "1.1.0", true},
|
|
||||||
{">=1.1.0-0", "1.1.0-0", true},
|
|
||||||
{">=1.1.0-0", "1.0.1", false},
|
|
||||||
{">=1.1.0-0", "1.0.1-0", false},
|
|
||||||
{">=1.1.0-0", "1.0.0", false},
|
|
||||||
{">=1.1.0-0", "1.0.0-0", false},
|
|
||||||
{">=1.1.0-0", "0.0.0", false},
|
|
||||||
{">=1.1.0-0", "0.0.0-0", false},
|
|
||||||
{">=1.0.1", "2.0.0", true},
|
|
||||||
{">=1.0.1", "2.0.0-0", true},
|
|
||||||
{">=1.0.1", "1.1.0", true},
|
|
||||||
{">=1.0.1", "1.1.0-0", true},
|
|
||||||
{">=1.0.1", "1.0.1", true},
|
|
||||||
{">=1.0.1", "1.0.1-0", false},
|
|
||||||
{">=1.0.1", "1.0.0", false},
|
|
||||||
{">=1.0.1", "1.0.0-0", false},
|
|
||||||
{">=1.0.1", "0.0.0", false},
|
|
||||||
{">=1.0.1", "0.0.0-0", false},
|
|
||||||
{">=1.0.1-0", "2.0.0", true},
|
|
||||||
{">=1.0.1-0", "2.0.0-0", true},
|
|
||||||
{">=1.0.1-0", "1.1.0", true},
|
|
||||||
{">=1.0.1-0", "1.1.0-0", true},
|
|
||||||
{">=1.0.1-0", "1.0.1", true},
|
|
||||||
{">=1.0.1-0", "1.0.1-0", true},
|
|
||||||
{">=1.0.1-0", "1.0.0", false},
|
|
||||||
{">=1.0.1-0", "1.0.0-0", false},
|
|
||||||
{">=1.0.1-0", "0.0.0", false},
|
|
||||||
{">=1.0.1-0", "0.0.0-0", false},
|
|
||||||
{">=1.0.0", "2.0.0", true},
|
|
||||||
{">=1.0.0", "2.0.0-0", true},
|
|
||||||
{">=1.0.0", "1.1.0", true},
|
|
||||||
{">=1.0.0", "1.1.0-0", true},
|
|
||||||
{">=1.0.0", "1.0.1", true},
|
|
||||||
{">=1.0.0", "1.0.1-0", true},
|
|
||||||
{">=1.0.0", "1.0.0", true},
|
|
||||||
{">=1.0.0", "1.0.0-0", false},
|
|
||||||
{">=1.0.0", "0.0.0", false},
|
|
||||||
{">=1.0.0", "0.0.0-0", false},
|
|
||||||
{">=1.0.0-0", "2.0.0", true},
|
|
||||||
{">=1.0.0-0", "2.0.0-0", true},
|
|
||||||
{">=1.0.0-0", "1.1.0", true},
|
|
||||||
{">=1.0.0-0", "1.1.0-0", true},
|
|
||||||
{">=1.0.0-0", "1.0.1", true},
|
|
||||||
{">=1.0.0-0", "1.0.1-0", true},
|
|
||||||
{">=1.0.0-0", "1.0.0", true},
|
|
||||||
{">=1.0.0-0", "1.0.0-0", true},
|
|
||||||
{">=1.0.0-0", "0.0.0", false},
|
|
||||||
{">=1.0.0-0", "0.0.0-0", false},
|
|
||||||
|
|
||||||
// < wildcard major (matches nothing)
|
|
||||||
{"<*", "2.0.0", false},
|
|
||||||
{"<*", "2.0.0-0", false},
|
|
||||||
{"<*", "1.1.0", false},
|
|
||||||
{"<*", "1.1.0-0", false},
|
|
||||||
{"<*", "1.0.1", false},
|
|
||||||
{"<*", "1.0.1-0", false},
|
|
||||||
{"<*", "1.0.0", false},
|
|
||||||
{"<*", "1.0.0-0", false},
|
|
||||||
{"<*", "0.0.0", false},
|
|
||||||
{"<*", "0.0.0-0", false},
|
|
||||||
|
|
||||||
// < wildcard minor
|
|
||||||
{"<1", "2.0.0", false},
|
|
||||||
{"<1", "2.0.0-0", false},
|
|
||||||
{"<1", "1.1.0", false},
|
|
||||||
{"<1", "1.1.0-0", false},
|
|
||||||
{"<1", "1.0.1", false},
|
|
||||||
{"<1", "1.0.1-0", false},
|
|
||||||
{"<1", "1.0.0", false},
|
|
||||||
{"<1", "1.0.0-0", false},
|
|
||||||
{"<1", "0.0.0", true},
|
|
||||||
{"<1", "0.0.0-0", true},
|
|
||||||
|
|
||||||
// < wildcard patch
|
|
||||||
{"<1.1", "2.0.0", false},
|
|
||||||
{"<1.1", "2.0.0-0", false},
|
|
||||||
{"<1.1", "1.1.0", false},
|
|
||||||
{"<1.1", "1.1.0-0", false},
|
|
||||||
{"<1.1", "1.0.1", true},
|
|
||||||
{"<1.1", "1.0.1-0", true},
|
|
||||||
{"<1.1", "1.0.0", true},
|
|
||||||
{"<1.1", "1.0.0-0", true},
|
|
||||||
{"<1.1", "0.0.0", true},
|
|
||||||
{"<1.1", "0.0.0-0", true},
|
|
||||||
{"<1.0", "2.0.0", false},
|
|
||||||
{"<1.0", "2.0.0-0", false},
|
|
||||||
{"<1.0", "1.1.0", false},
|
|
||||||
{"<1.0", "1.1.0-0", false},
|
|
||||||
{"<1.0", "1.0.1", false},
|
|
||||||
{"<1.0", "1.0.1-0", false},
|
|
||||||
{"<1.0", "1.0.0", false},
|
|
||||||
{"<1.0", "1.0.0-0", false},
|
|
||||||
{"<1.0", "0.0.0", true},
|
|
||||||
{"<1.0", "0.0.0-0", true},
|
|
||||||
|
|
||||||
// < exact
|
|
||||||
{"<1.1.0", "2.0.0", false},
|
|
||||||
{"<1.1.0", "2.0.0-0", false},
|
|
||||||
{"<1.1.0", "1.1.0", false},
|
|
||||||
{"<1.1.0", "1.1.0-0", true},
|
|
||||||
{"<1.1.0", "1.0.1", true},
|
|
||||||
{"<1.1.0", "1.0.1-0", true},
|
|
||||||
{"<1.1.0", "1.0.0", true},
|
|
||||||
{"<1.1.0", "1.0.0-0", true},
|
|
||||||
{"<1.1.0", "0.0.0", true},
|
|
||||||
{"<1.1.0", "0.0.0-0", true},
|
|
||||||
{"<1.1.0-0", "2.0.0", false},
|
|
||||||
{"<1.1.0-0", "2.0.0-0", false},
|
|
||||||
{"<1.1.0-0", "1.1.0", false},
|
|
||||||
{"<1.1.0-0", "1.1.0-0", false},
|
|
||||||
{"<1.1.0-0", "1.0.1", true},
|
|
||||||
{"<1.1.0-0", "1.0.1-0", true},
|
|
||||||
{"<1.1.0-0", "1.0.0", true},
|
|
||||||
{"<1.1.0-0", "1.0.0-0", true},
|
|
||||||
{"<1.1.0-0", "0.0.0", true},
|
|
||||||
{"<1.1.0-0", "0.0.0-0", true},
|
|
||||||
{"<1.0.1", "2.0.0", false},
|
|
||||||
{"<1.0.1", "2.0.0-0", false},
|
|
||||||
{"<1.0.1", "1.1.0", false},
|
|
||||||
{"<1.0.1", "1.1.0-0", false},
|
|
||||||
{"<1.0.1", "1.0.1", false},
|
|
||||||
{"<1.0.1", "1.0.1-0", true},
|
|
||||||
{"<1.0.1", "1.0.0", true},
|
|
||||||
{"<1.0.1", "1.0.0-0", true},
|
|
||||||
{"<1.0.1", "0.0.0", true},
|
|
||||||
{"<1.0.1", "0.0.0-0", true},
|
|
||||||
{"<1.0.1-0", "2.0.0", false},
|
|
||||||
{"<1.0.1-0", "2.0.0-0", false},
|
|
||||||
{"<1.0.1-0", "1.1.0", false},
|
|
||||||
{"<1.0.1-0", "1.1.0-0", false},
|
|
||||||
{"<1.0.1-0", "1.0.1", false},
|
|
||||||
{"<1.0.1-0", "1.0.1-0", false},
|
|
||||||
{"<1.0.1-0", "1.0.0", true},
|
|
||||||
{"<1.0.1-0", "1.0.0-0", true},
|
|
||||||
{"<1.0.1-0", "0.0.0", true},
|
|
||||||
{"<1.0.1-0", "0.0.0-0", true},
|
|
||||||
{"<1.0.0", "2.0.0", false},
|
|
||||||
{"<1.0.0", "2.0.0-0", false},
|
|
||||||
{"<1.0.0", "1.1.0", false},
|
|
||||||
{"<1.0.0", "1.1.0-0", false},
|
|
||||||
{"<1.0.0", "1.0.1", false},
|
|
||||||
{"<1.0.0", "1.0.1-0", false},
|
|
||||||
{"<1.0.0", "1.0.0", false},
|
|
||||||
{"<1.0.0", "1.0.0-0", true},
|
|
||||||
{"<1.0.0", "0.0.0", true},
|
|
||||||
{"<1.0.0", "0.0.0-0", true},
|
|
||||||
{"<1.0.0-0", "2.0.0", false},
|
|
||||||
{"<1.0.0-0", "2.0.0-0", false},
|
|
||||||
{"<1.0.0-0", "1.1.0", false},
|
|
||||||
{"<1.0.0-0", "1.1.0-0", false},
|
|
||||||
{"<1.0.0-0", "1.0.1", false},
|
|
||||||
{"<1.0.0-0", "1.0.1-0", false},
|
|
||||||
{"<1.0.0-0", "1.0.0", false},
|
|
||||||
{"<1.0.0-0", "1.0.0-0", false},
|
|
||||||
{"<1.0.0-0", "0.0.0", true},
|
|
||||||
{"<1.0.0-0", "0.0.0-0", true},
|
|
||||||
|
|
||||||
// <= wildcard major (matches everything)
|
|
||||||
{"<=*", "2.0.0", true},
|
|
||||||
{"<=*", "2.0.0-0", true},
|
|
||||||
{"<=*", "1.1.0", true},
|
|
||||||
{"<=*", "1.1.0-0", true},
|
|
||||||
{"<=*", "1.0.1", true},
|
|
||||||
{"<=*", "1.0.1-0", true},
|
|
||||||
{"<=*", "1.0.0", true},
|
|
||||||
{"<=*", "1.0.0-0", true},
|
|
||||||
{"<=*", "0.0.0", true},
|
|
||||||
{"<=*", "0.0.0-0", true},
|
|
||||||
|
|
||||||
// <= wildcard minor
|
|
||||||
{"<=1", "2.0.0", false},
|
|
||||||
{"<=1", "2.0.0-0", false},
|
|
||||||
{"<=1", "1.1.0", true},
|
|
||||||
{"<=1", "1.1.0-0", true},
|
|
||||||
{"<=1", "1.0.1", true},
|
|
||||||
{"<=1", "1.0.1-0", true},
|
|
||||||
{"<=1", "1.0.0", true},
|
|
||||||
{"<=1", "1.0.0-0", true},
|
|
||||||
{"<=1", "0.0.0", true},
|
|
||||||
{"<=1", "0.0.0-0", true},
|
|
||||||
|
|
||||||
// <= wildcard patch
|
|
||||||
{"<=1.1", "2.0.0", false},
|
|
||||||
{"<=1.1", "2.0.0-0", false},
|
|
||||||
{"<=1.1", "1.1.0", true},
|
|
||||||
{"<=1.1", "1.1.0-0", true},
|
|
||||||
{"<=1.1", "1.0.1", true},
|
|
||||||
{"<=1.1", "1.0.1-0", true},
|
|
||||||
{"<=1.1", "1.0.0", true},
|
|
||||||
{"<=1.1", "1.0.0-0", true},
|
|
||||||
{"<=1.1", "0.0.0", true},
|
|
||||||
{"<=1.1", "0.0.0-0", true},
|
|
||||||
{"<=1.0", "2.0.0", false},
|
|
||||||
{"<=1.0", "2.0.0-0", false},
|
|
||||||
{"<=1.0", "1.1.0", false},
|
|
||||||
{"<=1.0", "1.1.0-0", false},
|
|
||||||
{"<=1.0", "1.0.1", true},
|
|
||||||
{"<=1.0", "1.0.1-0", true},
|
|
||||||
{"<=1.0", "1.0.0", true},
|
|
||||||
{"<=1.0", "1.0.0-0", true},
|
|
||||||
{"<=1.0", "0.0.0", true},
|
|
||||||
{"<=1.0", "0.0.0-0", true},
|
|
||||||
|
|
||||||
// <= exact
|
|
||||||
{"<=1.1.0", "2.0.0", false},
|
|
||||||
{"<=1.1.0", "2.0.0-0", false},
|
|
||||||
{"<=1.1.0", "1.1.0", true},
|
|
||||||
{"<=1.1.0", "1.1.0-0", true},
|
|
||||||
{"<=1.1.0", "1.0.1", true},
|
|
||||||
{"<=1.1.0", "1.0.1-0", true},
|
|
||||||
{"<=1.1.0", "1.0.0", true},
|
|
||||||
{"<=1.1.0", "1.0.0-0", true},
|
|
||||||
{"<=1.1.0", "0.0.0", true},
|
|
||||||
{"<=1.1.0", "0.0.0-0", true},
|
|
||||||
{"<=1.1.0-0", "2.0.0", false},
|
|
||||||
{"<=1.1.0-0", "2.0.0-0", false},
|
|
||||||
{"<=1.1.0-0", "1.1.0", false},
|
|
||||||
{"<=1.1.0-0", "1.1.0-0", true},
|
|
||||||
{"<=1.1.0-0", "1.0.1", true},
|
|
||||||
{"<=1.1.0-0", "1.0.1-0", true},
|
|
||||||
{"<=1.1.0-0", "1.0.0", true},
|
|
||||||
{"<=1.1.0-0", "1.0.0-0", true},
|
|
||||||
{"<=1.1.0-0", "0.0.0", true},
|
|
||||||
{"<=1.1.0-0", "0.0.0-0", true},
|
|
||||||
{"<=1.0.1", "2.0.0", false},
|
|
||||||
{"<=1.0.1", "2.0.0-0", false},
|
|
||||||
{"<=1.0.1", "1.1.0", false},
|
|
||||||
{"<=1.0.1", "1.1.0-0", false},
|
|
||||||
{"<=1.0.1", "1.0.1", true},
|
|
||||||
{"<=1.0.1", "1.0.1-0", true},
|
|
||||||
{"<=1.0.1", "1.0.0", true},
|
|
||||||
{"<=1.0.1", "1.0.0-0", true},
|
|
||||||
{"<=1.0.1", "0.0.0", true},
|
|
||||||
{"<=1.0.1", "0.0.0-0", true},
|
|
||||||
{"<=1.0.1-0", "2.0.0", false},
|
|
||||||
{"<=1.0.1-0", "2.0.0-0", false},
|
|
||||||
{"<=1.0.1-0", "1.1.0", false},
|
|
||||||
{"<=1.0.1-0", "1.1.0-0", false},
|
|
||||||
{"<=1.0.1-0", "1.0.1", false},
|
|
||||||
{"<=1.0.1-0", "1.0.1-0", true},
|
|
||||||
{"<=1.0.1-0", "1.0.0", true},
|
|
||||||
{"<=1.0.1-0", "1.0.0-0", true},
|
|
||||||
{"<=1.0.1-0", "0.0.0", true},
|
|
||||||
{"<=1.0.1-0", "0.0.0-0", true},
|
|
||||||
{"<=1.0.0", "2.0.0", false},
|
|
||||||
{"<=1.0.0", "2.0.0-0", false},
|
|
||||||
{"<=1.0.0", "1.1.0", false},
|
|
||||||
{"<=1.0.0", "1.1.0-0", false},
|
|
||||||
{"<=1.0.0", "1.0.1", false},
|
|
||||||
{"<=1.0.0", "1.0.1-0", false},
|
|
||||||
{"<=1.0.0", "1.0.0", true},
|
|
||||||
{"<=1.0.0", "1.0.0-0", true},
|
|
||||||
{"<=1.0.0", "0.0.0", true},
|
|
||||||
{"<=1.0.0", "0.0.0-0", true},
|
|
||||||
{"<=1.0.0-0", "2.0.0", false},
|
|
||||||
{"<=1.0.0-0", "2.0.0-0", false},
|
|
||||||
{"<=1.0.0-0", "1.1.0", false},
|
|
||||||
{"<=1.0.0-0", "1.1.0-0", false},
|
|
||||||
{"<=1.0.0-0", "1.0.1", false},
|
|
||||||
{"<=1.0.0-0", "1.0.1-0", false},
|
|
||||||
{"<=1.0.0-0", "1.0.0", false},
|
|
||||||
{"<=1.0.0-0", "1.0.0-0", true},
|
|
||||||
{"<=1.0.0-0", "0.0.0", true},
|
|
||||||
{"<=1.0.0-0", "0.0.0-0", true},
|
|
||||||
|
|
||||||
// https://github.com/microsoft/TypeScript/issues/50909
|
|
||||||
{">4.8", "4.9.0-beta", true},
|
|
||||||
{">=4.9", "4.9.0-beta", true},
|
|
||||||
{"<4.9", "4.9.0-beta", false},
|
|
||||||
{"<=4.8", "4.9.0-beta", false},
|
|
||||||
}
|
|
||||||
for _, test := range comparatorsTests {
|
|
||||||
assertRangeTest(t, "comparators", test.rangeText, test.versionText, test.expected)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestConjunctionsOfVersionRanges(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
conjunctionTests := []testForRangeOnVersion{
|
|
||||||
{">1.0.0 <2.0.0", "1.0.1", true},
|
|
||||||
{">1.0.0 <2.0.0", "2.0.0", false},
|
|
||||||
{">1.0.0 <2.0.0", "1.0.0", false},
|
|
||||||
{">1 >2", "3.0.0", true},
|
|
||||||
}
|
|
||||||
for _, test := range conjunctionTests {
|
|
||||||
assertRangeTest(t, "conjunctions", test.rangeText, test.versionText, test.expected)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestDisjunctionsOfVersionRanges(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
disjunctionTests := []testForRangeOnVersion{
|
|
||||||
{">1.0.0 || <1.0.0", "1.0.1", true},
|
|
||||||
{">1.0.0 || <1.0.0", "0.0.1", true},
|
|
||||||
{">1.0.0 || <1.0.0", "1.0.0", false},
|
|
||||||
{">1.0.0 || <1.0.0", "0.0.0", true},
|
|
||||||
{">=1.0.0 <2.0.0 || >=3.0.0 <4.0.0", "1.0.0", true},
|
|
||||||
{">=1.0.0 <2.0.0 || >=3.0.0 <4.0.0", "2.0.0", false},
|
|
||||||
{">=1.0.0 <2.0.0 || >=3.0.0 <4.0.0", "3.0.0", true},
|
|
||||||
}
|
|
||||||
for _, test := range disjunctionTests {
|
|
||||||
assertRangeTest(t, "disjunctions", test.rangeText, test.versionText, test.expected)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestHyphensOfVersionRanges(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
hyphenTests := []testForRangeOnVersion{
|
|
||||||
{"1.0.0 - 2.0.0", "1.0.0", true},
|
|
||||||
{"1.0.0 - 2.0.0", "1.0.1", true},
|
|
||||||
{"1.0.0 - 2.0.0", "2.0.0", true},
|
|
||||||
{"1.0.0 - 2.0.0", "2.0.1", false},
|
|
||||||
{"1.0.0 - 2.0.0", "0.9.9", false},
|
|
||||||
{"1.0.0 - 2.0.0", "3.0.0", false},
|
|
||||||
}
|
|
||||||
for _, test := range hyphenTests {
|
|
||||||
assertRangeTest(t, "hyphens", test.rangeText, test.versionText, test.expected)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestTildesOfVersionRanges(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
tildeTests := []testForRangeOnVersion{
|
|
||||||
{"~0", "0.0.0", true},
|
|
||||||
{"~0", "0.1.0", true},
|
|
||||||
{"~0", "0.1.2", true},
|
|
||||||
{"~0", "0.1.9", true},
|
|
||||||
{"~0", "1.0.0", false},
|
|
||||||
{"~0.1", "0.1.0", true},
|
|
||||||
{"~0.1", "0.1.2", true},
|
|
||||||
{"~0.1", "0.1.9", true},
|
|
||||||
{"~0.1", "0.2.0", false},
|
|
||||||
{"~0.1.2", "0.1.2", true},
|
|
||||||
{"~0.1.2", "0.1.9", true},
|
|
||||||
{"~0.1.2", "0.2.0", false},
|
|
||||||
{"~1.0.0", "1.0.0", true},
|
|
||||||
{"~1.0.0", "1.0.1", true},
|
|
||||||
{"~1", "1.0.0", true},
|
|
||||||
{"~1", "1.2.0", true},
|
|
||||||
{"~1", "1.2.3", true},
|
|
||||||
{"~1", "0.0.0", false},
|
|
||||||
{"~1", "2.0.0", false},
|
|
||||||
{"~1.2", "1.2.0", true},
|
|
||||||
{"~1.2", "1.2.3", true},
|
|
||||||
{"~1.2", "1.1.0", false},
|
|
||||||
{"~1.2", "1.3.0", false},
|
|
||||||
{"~1.2.3", "1.2.3", true},
|
|
||||||
{"~1.2.3", "1.2.9", true},
|
|
||||||
{"~1.2.3", "1.1.0", false},
|
|
||||||
{"~1.2.3", "1.3.0", false},
|
|
||||||
}
|
|
||||||
for _, test := range tildeTests {
|
|
||||||
assertRangeTest(t, "tilde", test.rangeText, test.versionText, test.expected)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestCaretsOfVersionRanges(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
caretTests := []testForRangeOnVersion{
|
|
||||||
{"^0", "0.0.0", true},
|
|
||||||
{"^0", "0.1.0", true},
|
|
||||||
{"^0", "0.9.0", true},
|
|
||||||
{"^0", "0.1.2", true},
|
|
||||||
{"^0", "0.1.9", true},
|
|
||||||
{"^0", "1.0.0", false},
|
|
||||||
{"^0.1", "0.1.0", true},
|
|
||||||
{"^0.1", "0.1.2", true},
|
|
||||||
{"^0.1", "0.1.9", true},
|
|
||||||
{"^0.1.2", "0.1.2", true},
|
|
||||||
{"^0.1.2", "0.1.9", true},
|
|
||||||
{"^0.1.2", "0.0.0", false},
|
|
||||||
{"^0.1.2", "0.2.0", false},
|
|
||||||
{"^0.1.2", "1.0.0", false},
|
|
||||||
{"^1", "1.0.0", true},
|
|
||||||
{"^1", "1.2.0", true},
|
|
||||||
{"^1", "1.2.3", true},
|
|
||||||
{"^1", "1.9.0", true},
|
|
||||||
{"^1", "0.0.0", false},
|
|
||||||
{"^1", "2.0.0", false},
|
|
||||||
{"^1.2", "1.2.0", true},
|
|
||||||
{"^1.2", "1.2.3", true},
|
|
||||||
{"^1.2", "1.9.0", true},
|
|
||||||
{"^1.2", "1.1.0", false},
|
|
||||||
{"^1.2", "2.0.0", false},
|
|
||||||
{"^1.2.3", "1.2.3", true},
|
|
||||||
{"^1.2.3", "1.9.0", true},
|
|
||||||
{"^1.2.3", "1.2.2", false},
|
|
||||||
{"^1.2.3", "2.0.0", false},
|
|
||||||
}
|
|
||||||
for _, test := range caretTests {
|
|
||||||
assertRangeTest(t, "caret", test.rangeText, test.versionText, test.expected)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type testForRangeOnVersion struct {
|
|
||||||
rangeText string
|
|
||||||
versionText string
|
|
||||||
expected bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func assertRangesGoodBad(t *testing.T, versionRangeString string, tests testGoodBad) {
|
|
||||||
t.Run(versionRangeString, func(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
versionRange, ok := TryParseVersionRange(versionRangeString)
|
|
||||||
assert.Assert(t, ok)
|
|
||||||
for _, good := range tests.good {
|
|
||||||
v, ok := TryParseVersion(good)
|
|
||||||
assert.Assert(t, ok)
|
|
||||||
assert.Assert(t, versionRange.Test(&v), "%s should be matched by range %s", good, versionRangeString)
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, bad := range tests.bad {
|
|
||||||
v, ok := TryParseVersion(bad)
|
|
||||||
assert.Assert(t, ok)
|
|
||||||
assert.Assert(t, !versionRange.Test(&v), "%s should not be matched by range %s", bad, versionRangeString)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func assertRangeTest(t *testing.T, name string, rangeText string, versionText string, inRange bool) {
|
|
||||||
testName := fmt.Sprintf("%s (version %s in range %s) == %t", name, versionText, rangeText, inRange)
|
|
||||||
t.Run(testName, func(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
versionRange, ok := TryParseVersionRange(rangeText)
|
|
||||||
assert.Assert(t, ok)
|
|
||||||
version, err := TryParseVersion(versionText)
|
|
||||||
assert.NilError(t, err)
|
|
||||||
assert.Equal(t, versionRange.Test(&version), inRange)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@ -1,147 +0,0 @@
|
|||||||
package semver
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"gotest.tools/v3/assert"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestTryParseSemver(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
tests := []struct {
|
|
||||||
in string
|
|
||||||
out Version
|
|
||||||
}{
|
|
||||||
{"1.2.3-pre.4+build.5", Version{major: 1, minor: 2, patch: 3, prerelease: []string{"pre", "4"}, build: []string{"build", "5"}}},
|
|
||||||
{"1.2.3-pre.4", Version{major: 1, minor: 2, patch: 3, prerelease: []string{"pre", "4"}}},
|
|
||||||
{"1.2.3+build.4", Version{major: 1, minor: 2, patch: 3, build: []string{"build", "4"}}},
|
|
||||||
{"1.2.3", Version{major: 1, minor: 2, patch: 3}},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, test := range tests {
|
|
||||||
t.Run(test.in, func(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
v, err := TryParseVersion(test.in)
|
|
||||||
assert.NilError(t, err)
|
|
||||||
assertVersion(t, v, test.out)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestVersionString(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
tests := []struct {
|
|
||||||
in Version
|
|
||||||
out string
|
|
||||||
}{
|
|
||||||
{Version{major: 1, minor: 2, patch: 3, prerelease: []string{"pre", "4"}, build: []string{"build", "5"}}, "1.2.3-pre.4+build.5"},
|
|
||||||
{Version{major: 1, minor: 2, patch: 3, prerelease: []string{"pre", "4"}, build: []string{"build"}}, "1.2.3-pre.4+build"},
|
|
||||||
{Version{major: 1, minor: 2, patch: 3, build: []string{"build"}}, "1.2.3+build"},
|
|
||||||
{Version{major: 1, minor: 2, patch: 3, prerelease: []string{"pre", "4"}}, "1.2.3-pre.4"},
|
|
||||||
{Version{major: 1, minor: 2, patch: 3, build: []string{"build", "4"}}, "1.2.3+build.4"},
|
|
||||||
{Version{major: 1, minor: 2, patch: 3}, "1.2.3"},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, test := range tests {
|
|
||||||
t.Run(test.out, func(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
assert.Equal(t, test.in.String(), test.out)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestVersionCompare(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
tests := []struct {
|
|
||||||
v1, v2 string
|
|
||||||
want int
|
|
||||||
}{
|
|
||||||
// https://semver.org/#spec-item-11
|
|
||||||
// > Precedence is determined by the first difference when comparing each of these
|
|
||||||
// > identifiers from left to right as follows: Major, minor, and patch versions are
|
|
||||||
// > always compared numerically.
|
|
||||||
{"1.0.0", "2.0.0", comparisonLessThan},
|
|
||||||
{"1.0.0", "1.1.0", comparisonLessThan},
|
|
||||||
{"1.0.0", "1.0.1", comparisonLessThan},
|
|
||||||
{"2.0.0", "1.0.0", comparisonGreaterThan},
|
|
||||||
{"1.1.0", "1.0.0", comparisonGreaterThan},
|
|
||||||
{"1.0.1", "1.0.0", comparisonGreaterThan},
|
|
||||||
{"1.0.0", "1.0.0", comparisonEqualTo},
|
|
||||||
|
|
||||||
// https://semver.org/#spec-item-11
|
|
||||||
// > When major, minor, and patch are equal, a pre-release version has lower
|
|
||||||
// > precedence than a normal version.
|
|
||||||
{"1.0.0", "1.0.0-pre", comparisonGreaterThan},
|
|
||||||
{"1.0.1-pre", "1.0.0", comparisonGreaterThan},
|
|
||||||
{"1.0.0-pre", "1.0.0", comparisonLessThan},
|
|
||||||
|
|
||||||
// https://semver.org/#spec-item-11
|
|
||||||
// > identifiers consisting of only digits are compared numerically
|
|
||||||
{"1.0.0-0", "1.0.0-1", comparisonLessThan},
|
|
||||||
{"1.0.0-1", "1.0.0-0", comparisonGreaterThan},
|
|
||||||
{"1.0.0-2", "1.0.0-10", comparisonLessThan},
|
|
||||||
{"1.0.0-10", "1.0.0-2", comparisonGreaterThan},
|
|
||||||
{"1.0.0-0", "1.0.0-0", comparisonEqualTo},
|
|
||||||
|
|
||||||
// https://semver.org/#spec-item-11
|
|
||||||
// > identifiers with letters or hyphens are compared lexically in ASCII sort order.
|
|
||||||
{"1.0.0-a", "1.0.0-b", comparisonLessThan},
|
|
||||||
{"1.0.0-a-2", "1.0.0-a-10", comparisonGreaterThan},
|
|
||||||
{"1.0.0-b", "1.0.0-a", comparisonGreaterThan},
|
|
||||||
{"1.0.0-a", "1.0.0-a", comparisonEqualTo},
|
|
||||||
{"1.0.0-A", "1.0.0-a", comparisonLessThan},
|
|
||||||
|
|
||||||
// https://semver.org/#spec-item-11
|
|
||||||
// > Numeric identifiers always have lower precedence than non-numeric identifiers.
|
|
||||||
{"1.0.0-0", "1.0.0-alpha", comparisonLessThan},
|
|
||||||
{"1.0.0-alpha", "1.0.0-0", comparisonGreaterThan},
|
|
||||||
{"1.0.0-0", "1.0.0-0", comparisonEqualTo},
|
|
||||||
{"1.0.0-alpha", "1.0.0-alpha", comparisonEqualTo},
|
|
||||||
|
|
||||||
// https://semver.org/#spec-item-11
|
|
||||||
// > A larger set of pre-release fields has a higher precedence than a smaller set, if all
|
|
||||||
// > of the preceding identifiers are equal.
|
|
||||||
{"1.0.0-alpha", "1.0.0-alpha.0", comparisonLessThan},
|
|
||||||
{"1.0.0-alpha.0", "1.0.0-alpha", comparisonGreaterThan},
|
|
||||||
|
|
||||||
// https://semver.org/#spec-item-11
|
|
||||||
// > Precedence for two pre-release versions with the same major, minor, and patch version
|
|
||||||
// > MUST be determined by comparing each dot separated identifier from left to right until
|
|
||||||
// > a difference is found [...]
|
|
||||||
{"1.0.0-a.0.b.1", "1.0.0-a.0.b.2", comparisonLessThan},
|
|
||||||
{"1.0.0-a.0.b.1", "1.0.0-b.0.a.1", comparisonLessThan},
|
|
||||||
{"1.0.0-a.0.b.2", "1.0.0-a.0.b.1", comparisonGreaterThan},
|
|
||||||
{"1.0.0-b.0.a.1", "1.0.0-a.0.b.1", comparisonGreaterThan},
|
|
||||||
|
|
||||||
// https://semver.org/#spec-item-11
|
|
||||||
// > Build metadata does not figure into precedence
|
|
||||||
{"1.0.0+build", "1.0.0", comparisonEqualTo},
|
|
||||||
{"1.0.0+build.stuff", "1.0.0", comparisonEqualTo},
|
|
||||||
{"1.0.0", "1.0.0+build", comparisonEqualTo},
|
|
||||||
{"1.0.0+build", "1.0.0+stuff", comparisonEqualTo},
|
|
||||||
|
|
||||||
// https://semver.org/#spec-item-11
|
|
||||||
// Edge cases for numeric and lexical comparison of prerelease identifiers.
|
|
||||||
{"1.0.0-alpha.99999", "1.0.0-alpha.100000", comparisonLessThan},
|
|
||||||
{"1.0.0-alpha.beta", "1.0.0-alpha.alpha", comparisonGreaterThan},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, test := range tests {
|
|
||||||
t.Run(test.v1+" <=> "+test.v2, func(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
v1, err1 := TryParseVersion(test.v1)
|
|
||||||
assert.NilError(t, err1, test.v1)
|
|
||||||
v2, err2 := TryParseVersion(test.v2)
|
|
||||||
assert.NilError(t, err2, test.v2)
|
|
||||||
assert.Equal(t, v1.Compare(&v2), test.want)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func assertVersion(t *testing.T, a, b Version) {
|
|
||||||
assert.Equal(t, a.major, b.major)
|
|
||||||
assert.Equal(t, a.minor, b.minor)
|
|
||||||
assert.Equal(t, a.patch, b.patch)
|
|
||||||
assert.DeepEqual(t, a.prerelease, b.prerelease)
|
|
||||||
assert.DeepEqual(t, a.build, b.build)
|
|
||||||
}
|
|
||||||
Loading…
x
Reference in New Issue
Block a user