dcrd/internal/version/version_test.go
Dave Collins 5ae5760010
version: Use uint32 for major/minor/patch.
This modifies the semver handling to specifically use uint32 instead of
architecture-dependent uint so bounds checking is consistent across
architectures and only needs to be done in one place.
2021-11-10 07:08:23 -06:00

370 lines
6.6 KiB
Go

// Copyright (c) 2021 The Decred developers
// Use of this source code is governed by an ISC
// license that can be found in the LICENSE file.
package version
import "testing"
// TestSemVerParsing ensures parsing a semantic version string works as
// expected.
func TestSemVerParsing(t *testing.T) {
tests := []struct {
ver string // semantic version string to parse
major uint32 // expected major version
minor uint32 // expected minor version
patch uint32 // expected patch version
pre string // expected pre-release string
build string // expected build metadata string
invalid bool // expected error
}{{
ver: "0.0.4",
major: 0,
minor: 0,
patch: 4,
}, {
ver: "1.2.3",
major: 1,
minor: 2,
patch: 3,
}, {
ver: "10.20.30",
major: 10,
minor: 20,
patch: 30,
}, {
ver: "1.1.2-prerelease+meta",
major: 1,
minor: 1,
patch: 2,
pre: "prerelease",
build: "meta",
}, {
ver: "1.1.2+meta",
major: 1,
minor: 1,
patch: 2,
build: "meta",
}, {
ver: "1.1.2+meta-valid",
major: 1,
minor: 1,
patch: 2,
build: "meta-valid",
}, {
ver: "1.0.0-alpha",
major: 1,
minor: 0,
patch: 0,
pre: "alpha",
}, {
ver: "1.0.0-beta",
major: 1,
minor: 0,
patch: 0,
pre: "beta",
}, {
ver: "1.0.0-alpha.beta",
major: 1,
minor: 0,
patch: 0,
pre: "alpha.beta",
}, {
ver: "1.0.0-alpha.beta.1",
major: 1,
minor: 0,
patch: 0,
pre: "alpha.beta.1",
}, {
ver: "1.0.0-alpha.1",
major: 1,
minor: 0,
patch: 0,
pre: "alpha.1",
}, {
ver: "1.0.0-alpha0.valid",
major: 1,
minor: 0,
patch: 0,
pre: "alpha0.valid",
}, {
ver: "1.0.0-alpha.0valid",
major: 1,
minor: 0,
patch: 0,
pre: "alpha.0valid",
}, {
ver: "1.0.0-alpha-a.b-c-somethinglong+build.1-aef.1-its-okay",
major: 1,
minor: 0,
patch: 0,
pre: "alpha-a.b-c-somethinglong",
build: "build.1-aef.1-its-okay",
}, {
ver: "1.0.0-rc.1+build.1",
major: 1,
minor: 0,
patch: 0,
pre: "rc.1",
build: "build.1",
}, {
ver: "2.0.0-rc.1+build.123",
major: 2,
minor: 0,
patch: 0,
pre: "rc.1",
build: "build.123",
}, {
ver: "1.2.3-beta",
major: 1,
minor: 2,
patch: 3,
pre: "beta",
}, {
ver: "10.2.3-DEV-SNAPSHOT",
major: 10,
minor: 2,
patch: 3,
pre: "DEV-SNAPSHOT",
}, {
ver: "1.2.3-SNAPSHOT-123",
major: 1,
minor: 2,
patch: 3,
pre: "SNAPSHOT-123",
}, {
ver: "1.0.0",
major: 1,
minor: 0,
patch: 0,
}, {
ver: "2.0.0",
major: 2,
minor: 0,
patch: 0,
}, {
ver: "1.1.7",
major: 1,
minor: 1,
patch: 7,
}, {
ver: "2.0.0+build.1848",
major: 2,
minor: 0,
patch: 0,
build: "build.1848",
}, {
ver: "2.0.1-alpha.1227",
major: 2,
minor: 0,
patch: 1,
pre: "alpha.1227",
}, {
ver: "1.0.0-alpha+beta",
major: 1,
minor: 0,
patch: 0,
pre: "alpha",
build: "beta",
}, {
ver: "1.2.3----RC-SNAPSHOT.12.9.1--.12+788",
major: 1,
minor: 2,
patch: 3,
pre: "---RC-SNAPSHOT.12.9.1--.12",
build: "788",
}, {
ver: "1.2.3----R-S.12.9.1--.12+meta",
major: 1,
minor: 2,
patch: 3,
pre: "---R-S.12.9.1--.12",
build: "meta",
}, {
ver: "1.2.3----RC-SNAPSHOT.12.9.1--.12",
major: 1,
minor: 2,
patch: 3,
pre: "---RC-SNAPSHOT.12.9.1--.12",
}, {
ver: "1.0.0+0.build.1-rc.10000aaa-kk-0.1",
major: 1,
minor: 0,
patch: 0,
build: "0.build.1-rc.10000aaa-kk-0.1",
}, {
ver: "1.0.0-0A.is.legal",
major: 1,
minor: 0,
patch: 0,
pre: "0A.is.legal",
}, {
ver: "1",
invalid: true,
}, {
ver: "1.2",
invalid: true,
}, {
ver: "1.2.3-0123",
invalid: true,
}, {
ver: "1.2.3-0123.0123",
invalid: true,
}, {
ver: "1.1.2+.123",
invalid: true,
}, {
ver: "+invalid",
invalid: true,
}, {
ver: "-invalid",
invalid: true,
}, {
ver: "-invalid+invalid",
invalid: true,
}, {
ver: "-invalid.01",
invalid: true,
}, {
ver: "alpha",
invalid: true,
}, {
ver: "alpha.beta",
invalid: true,
}, {
ver: "alpha.beta.1",
invalid: true,
}, {
ver: "alpha.1",
invalid: true,
}, {
ver: "alpha+beta",
invalid: true,
}, {
ver: "alpha_beta",
invalid: true,
}, {
ver: "alpha.",
invalid: true,
}, {
ver: "alpha..",
invalid: true,
}, {
ver: "beta",
invalid: true,
}, {
ver: "1.0.0-alpha_beta",
invalid: true,
}, {
ver: "-alpha.",
invalid: true,
}, {
ver: "1.0.0-alpha..",
invalid: true,
}, {
ver: "1.0.0-alpha..1",
invalid: true,
}, {
ver: "1.0.0-alpha...1",
invalid: true,
}, {
ver: "1.0.0-alpha....1",
invalid: true,
}, {
ver: "1.0.0-alpha.....1",
invalid: true,
}, {
ver: "1.0.0-alpha......1",
invalid: true,
}, {
ver: "1.0.0-alpha.......1",
invalid: true,
}, {
ver: "01.1.1",
invalid: true,
}, {
ver: "1.01.1",
invalid: true,
}, {
ver: "1.1.01",
invalid: true,
}, {
ver: "1.2",
invalid: true,
}, {
ver: "1.2.3.DEV",
invalid: true,
}, {
ver: "1.2-SNAPSHOT",
invalid: true,
}, {
ver: "1.2.31.2.3----RC-SNAPSHOT.12.09.1--..12+788",
invalid: true,
}, {
ver: "1.2-RC-SNAPSHOT",
invalid: true,
}, {
ver: "-1.0.3-gamma+b7718",
invalid: true,
}, {
ver: "+justmeta",
invalid: true,
}, {
ver: "9.8.7+meta+meta",
invalid: true,
}, {
ver: "9.8.7-whatever+meta+meta",
invalid: true,
}, {
// Would be valid except major is > max uint64.
ver: "99999999999999999999999.999999999999999999.99999999999999999",
invalid: true,
}, {
ver: "999999999.999999999.999999999----RC-SNAPSHOT.12.09.1-----------" +
"---------------------..12",
invalid: true,
}}
for _, test := range tests {
major, minor, patch, pre, build, err := parseSemVer(test.ver)
if test.invalid && err == nil {
t.Errorf("%q: did not receive expected error", test.ver)
continue
}
if !test.invalid && err != nil {
t.Errorf("%q: unexpected err: %v", test.ver, err)
continue
}
if major != test.major {
t.Errorf("%q: mismatched major -- got %d, want %d", test.ver,
major, test.major)
continue
}
if minor != test.minor {
t.Errorf("%q: mismatched minor -- got %d, want %d", test.ver,
minor, test.minor)
continue
}
if patch != test.patch {
t.Errorf("%q: mismatched patch -- got %d, want %d", test.ver,
patch, test.patch)
continue
}
if pre != test.pre {
t.Errorf("%q: mismatched pre-release -- got %s, want %s", test.ver,
pre, test.pre)
continue
}
if build != test.build {
t.Errorf("%q: mismatched buildmetadata -- got %s, want %s",
test.ver, build, test.build)
continue
}
}
}