8 func TestNewVersion(t *testing.T) {
20 {"1.2-beta.5", false},
22 {"1.2.0-x.Y.0+metadata", false},
23 {"1.2.0-x.Y.0+metadata-width-hypen", false},
24 {"1.2.3-rc1-with-hypen", false},
26 {"1.2.0.4-x.Y.0+metadata", false},
27 {"1.2.0.4-x.Y.0+metadata-width-hypen", false},
28 {"1.2.0-X-1.2.0+metadata~dist", false},
29 {"1.2.3.4-rc1-with-hypen", false},
37 for _, tc := range cases {
38 _, err := NewVersion(tc.version)
39 if tc.err && err == nil {
40 t.Fatalf("expected error for version: %s", tc.version)
41 } else if !tc.err && err != nil {
42 t.Fatalf("error for version %s: %s", tc.version, err)
47 func TestVersionCompare(t *testing.T) {
53 {"1.2.3", "1.4.5", -1},
54 {"1.2-beta", "1.2-beta", 0},
56 {"1.2", "1.2-beta", 1},
57 {"1.2+foo", "1.2+beta", 0},
58 {"v1.2", "v1.2-beta", 1},
59 {"v1.2+foo", "v1.2+beta", 0},
60 {"v1.2.3.4", "v1.2.3.4", 0},
61 {"v1.2.0.0", "v1.2", 0},
62 {"v1.2.0.0.1", "v1.2", 1},
63 {"v1.2", "v1.2.0.0", 0},
64 {"v1.2", "v1.2.0.0.1", -1},
65 {"v1.2.0.0", "v1.2.0.0.1", -1},
66 {"v1.2.3.0", "v1.2.3.4", -1},
67 {"1.7rc2", "1.7rc1", 1},
68 {"1.7rc2", "1.7", -1},
69 {"1.2.0", "1.2.0-X-1.2.0+metadata~dist", 1},
72 for _, tc := range cases {
73 v1, err := NewVersion(tc.v1)
75 t.Fatalf("err: %s", err)
78 v2, err := NewVersion(tc.v2)
80 t.Fatalf("err: %s", err)
83 actual := v1.Compare(v2)
84 expected := tc.expected
85 if actual != expected {
87 "%s <=> %s\nexpected: %d\nactual: %d",
94 func TestComparePreReleases(t *testing.T) {
100 {"1.2-beta.2", "1.2-beta.2", 0},
101 {"1.2-beta.1", "1.2-beta.2", -1},
102 {"1.2-beta.2", "1.2-beta.11", -1},
103 {"3.2-alpha.1", "3.2-alpha", 1},
104 {"1.2-beta.2", "1.2-beta.1", 1},
105 {"1.2-beta.11", "1.2-beta.2", 1},
106 {"1.2-beta", "1.2-beta.3", -1},
107 {"1.2-alpha", "1.2-beta.3", -1},
108 {"1.2-beta", "1.2-alpha.3", 1},
109 {"3.0-alpha.3", "3.0-rc.1", -1},
110 {"3.0-alpha3", "3.0-rc1", -1},
111 {"3.0-alpha.1", "3.0-alpha.beta", -1},
112 {"5.4-alpha", "5.4-alpha.beta", 1},
113 {"v1.2-beta.2", "v1.2-beta.2", 0},
114 {"v1.2-beta.1", "v1.2-beta.2", -1},
115 {"v3.2-alpha.1", "v3.2-alpha", 1},
116 {"v3.2-rc.1-1-g123", "v3.2-rc.2", 1},
119 for _, tc := range cases {
120 v1, err := NewVersion(tc.v1)
122 t.Fatalf("err: %s", err)
125 v2, err := NewVersion(tc.v2)
127 t.Fatalf("err: %s", err)
130 actual := v1.Compare(v2)
131 expected := tc.expected
132 if actual != expected {
134 "%s <=> %s\nexpected: %d\nactual: %d",
141 func TestVersionMetadata(t *testing.T) {
149 {"1.2.0-x.Y.0+metadata", "metadata"},
150 {"1.2.0-metadata-1.2.0+metadata~dist", "metadata~dist"},
153 for _, tc := range cases {
154 v, err := NewVersion(tc.version)
156 t.Fatalf("err: %s", err)
159 actual := v.Metadata()
160 expected := tc.expected
161 if actual != expected {
162 t.Fatalf("expected: %s\nactual: %s", expected, actual)
167 func TestVersionPrerelease(t *testing.T) {
173 {"1.2-beta", "beta"},
174 {"1.2.0-x.Y.0", "x.Y.0"},
175 {"1.2.0-7.Y.0", "7.Y.0"},
176 {"1.2.0-x.Y.0+metadata", "x.Y.0"},
177 {"1.2.0-metadata-1.2.0+metadata~dist", "metadata-1.2.0"},
178 {"17.03.0-ce", "ce"}, // zero-padded fields
181 for _, tc := range cases {
182 v, err := NewVersion(tc.version)
184 t.Fatalf("err: %s", err)
187 actual := v.Prerelease()
188 expected := tc.expected
189 if actual != expected {
190 t.Fatalf("expected: %s\nactual: %s", expected, actual)
195 func TestVersionSegments(t *testing.T) {
200 {"1.2.3", []int{1, 2, 3}},
201 {"1.2-beta", []int{1, 2, 0}},
202 {"1-x.Y.0", []int{1, 0, 0}},
203 {"1.2.0-x.Y.0+metadata", []int{1, 2, 0}},
204 {"1.2.0-metadata-1.2.0+metadata~dist", []int{1, 2, 0}},
205 {"17.03.0-ce", []int{17, 3, 0}}, // zero-padded fields
208 for _, tc := range cases {
209 v, err := NewVersion(tc.version)
211 t.Fatalf("err: %s", err)
214 actual := v.Segments()
215 expected := tc.expected
216 if !reflect.DeepEqual(actual, expected) {
217 t.Fatalf("expected: %#v\nactual: %#v", expected, actual)
222 func TestVersionSegments64(t *testing.T) {
227 {"1.2.3", []int64{1, 2, 3}},
228 {"1.2-beta", []int64{1, 2, 0}},
229 {"1-x.Y.0", []int64{1, 0, 0}},
230 {"1.2.0-x.Y.0+metadata", []int64{1, 2, 0}},
231 {"1.4.9223372036854775807", []int64{1, 4, 9223372036854775807}},
234 for _, tc := range cases {
235 v, err := NewVersion(tc.version)
237 t.Fatalf("err: %s", err)
240 actual := v.Segments64()
241 expected := tc.expected
242 if !reflect.DeepEqual(actual, expected) {
243 t.Fatalf("expected: %#v\nactual: %#v", expected, actual)
247 expected := actual[0]
249 actual = v.Segments64()
250 if actual[0] != expected {
251 t.Fatalf("Segments64 is mutable")
257 func TestVersionString(t *testing.T) {
260 {"1.2-beta", "1.2.0-beta"},
261 {"1.2.0-x.Y.0", "1.2.0-x.Y.0"},
262 {"1.2.0-x.Y.0+metadata", "1.2.0-x.Y.0+metadata"},
263 {"1.2.0-metadata-1.2.0+metadata~dist", "1.2.0-metadata-1.2.0+metadata~dist"},
264 {"17.03.0-ce", "17.3.0-ce"}, // zero-padded fields
267 for _, tc := range cases {
268 v, err := NewVersion(tc[0])
270 t.Fatalf("err: %s", err)
275 if actual != expected {
276 t.Fatalf("expected: %s\nactual: %s", expected, actual)
278 if actual := v.Original(); actual != tc[0] {
279 t.Fatalf("expected original: %q\nactual: %q", tc[0], actual)