decred.org/dcrdex@v1.0.5/dex/version/version_test.go (about) 1 // Copyright (c) 2015-2022 The Decred developers 2 // Use of this source code is governed by an ISC license 3 // that can be found at https://github.com/decred/dcrd/blob/master/LICENSE. 4 5 package version 6 7 import "testing" 8 9 // TestSemVerParsing ensures parsing a semantic version string works as 10 // expected. 11 func TestSemVerParsing(t *testing.T) { 12 tests := []struct { 13 ver string // semantic version string to parse 14 major uint32 // expected major version 15 minor uint32 // expected minor version 16 patch uint32 // expected patch version 17 pre string // expected pre-release string 18 build string // expected build metadata string 19 invalid bool // expected error 20 }{{ 21 ver: "0.0.4", 22 major: 0, 23 minor: 0, 24 patch: 4, 25 }, { 26 ver: "1.2.3", 27 major: 1, 28 minor: 2, 29 patch: 3, 30 }, { 31 ver: "10.20.30", 32 major: 10, 33 minor: 20, 34 patch: 30, 35 }, { 36 ver: "1.1.2-prerelease+meta", 37 major: 1, 38 minor: 1, 39 patch: 2, 40 pre: "prerelease", 41 build: "meta", 42 }, { 43 ver: "1.1.2+meta", 44 major: 1, 45 minor: 1, 46 patch: 2, 47 build: "meta", 48 }, { 49 ver: "1.1.2+meta-valid", 50 major: 1, 51 minor: 1, 52 patch: 2, 53 build: "meta-valid", 54 }, { 55 ver: "1.0.0-alpha", 56 major: 1, 57 minor: 0, 58 patch: 0, 59 pre: "alpha", 60 }, { 61 ver: "1.0.0-beta", 62 major: 1, 63 minor: 0, 64 patch: 0, 65 pre: "beta", 66 }, { 67 ver: "1.0.0-alpha.beta", 68 major: 1, 69 minor: 0, 70 patch: 0, 71 pre: "alpha.beta", 72 }, { 73 ver: "1.0.0-alpha.beta.1", 74 major: 1, 75 minor: 0, 76 patch: 0, 77 pre: "alpha.beta.1", 78 }, { 79 ver: "1.0.0-alpha.1", 80 major: 1, 81 minor: 0, 82 patch: 0, 83 pre: "alpha.1", 84 }, { 85 ver: "1.0.0-alpha0.valid", 86 major: 1, 87 minor: 0, 88 patch: 0, 89 pre: "alpha0.valid", 90 }, { 91 ver: "1.0.0-alpha.0valid", 92 major: 1, 93 minor: 0, 94 patch: 0, 95 pre: "alpha.0valid", 96 }, { 97 ver: "1.0.0-alpha-a.b-c-somethinglong+build.1-aef.1-its-okay", 98 major: 1, 99 minor: 0, 100 patch: 0, 101 pre: "alpha-a.b-c-somethinglong", 102 build: "build.1-aef.1-its-okay", 103 }, { 104 ver: "1.0.0-rc.1+build.1", 105 major: 1, 106 minor: 0, 107 patch: 0, 108 pre: "rc.1", 109 build: "build.1", 110 }, { 111 ver: "2.0.0-rc.1+build.123", 112 major: 2, 113 minor: 0, 114 patch: 0, 115 pre: "rc.1", 116 build: "build.123", 117 }, { 118 ver: "1.2.3-beta", 119 major: 1, 120 minor: 2, 121 patch: 3, 122 pre: "beta", 123 }, { 124 ver: "10.2.3-DEV-SNAPSHOT", 125 major: 10, 126 minor: 2, 127 patch: 3, 128 pre: "DEV-SNAPSHOT", 129 }, { 130 ver: "1.2.3-SNAPSHOT-123", 131 major: 1, 132 minor: 2, 133 patch: 3, 134 pre: "SNAPSHOT-123", 135 }, { 136 ver: "1.0.0", 137 major: 1, 138 minor: 0, 139 patch: 0, 140 }, { 141 ver: "2.0.0", 142 major: 2, 143 minor: 0, 144 patch: 0, 145 }, { 146 ver: "1.1.7", 147 major: 1, 148 minor: 1, 149 patch: 7, 150 }, { 151 ver: "2.0.0+build.1848", 152 major: 2, 153 minor: 0, 154 patch: 0, 155 build: "build.1848", 156 }, { 157 ver: "2.0.1-alpha.1227", 158 major: 2, 159 minor: 0, 160 patch: 1, 161 pre: "alpha.1227", 162 }, { 163 ver: "1.0.0-alpha+beta", 164 major: 1, 165 minor: 0, 166 patch: 0, 167 pre: "alpha", 168 build: "beta", 169 }, { 170 ver: "1.2.3----RC-SNAPSHOT.12.9.1--.12+788", 171 major: 1, 172 minor: 2, 173 patch: 3, 174 pre: "---RC-SNAPSHOT.12.9.1--.12", 175 build: "788", 176 }, { 177 ver: "1.2.3----R-S.12.9.1--.12+meta", 178 major: 1, 179 minor: 2, 180 patch: 3, 181 pre: "---R-S.12.9.1--.12", 182 build: "meta", 183 }, { 184 ver: "1.2.3----RC-SNAPSHOT.12.9.1--.12", 185 major: 1, 186 minor: 2, 187 patch: 3, 188 pre: "---RC-SNAPSHOT.12.9.1--.12", 189 }, { 190 ver: "1.0.0+0.build.1-rc.10000aaa-kk-0.1", 191 major: 1, 192 minor: 0, 193 patch: 0, 194 build: "0.build.1-rc.10000aaa-kk-0.1", 195 }, { 196 ver: "1.0.0-0A.is.legal", 197 major: 1, 198 minor: 0, 199 patch: 0, 200 pre: "0A.is.legal", 201 }, { 202 ver: "1", 203 invalid: true, 204 }, { 205 ver: "1.2", 206 invalid: true, 207 }, { 208 ver: "1.2.3-0123", 209 invalid: true, 210 }, { 211 ver: "1.2.3-0123.0123", 212 invalid: true, 213 }, { 214 ver: "1.1.2+.123", 215 invalid: true, 216 }, { 217 ver: "+invalid", 218 invalid: true, 219 }, { 220 ver: "-invalid", 221 invalid: true, 222 }, { 223 ver: "-invalid+invalid", 224 invalid: true, 225 }, { 226 ver: "-invalid.01", 227 invalid: true, 228 }, { 229 ver: "alpha", 230 invalid: true, 231 }, { 232 ver: "alpha.beta", 233 invalid: true, 234 }, { 235 ver: "alpha.beta.1", 236 invalid: true, 237 }, { 238 ver: "alpha.1", 239 invalid: true, 240 }, { 241 ver: "alpha+beta", 242 invalid: true, 243 }, { 244 ver: "alpha_beta", 245 invalid: true, 246 }, { 247 ver: "alpha.", 248 invalid: true, 249 }, { 250 ver: "alpha..", 251 invalid: true, 252 }, { 253 ver: "beta", 254 invalid: true, 255 }, { 256 ver: "1.0.0-alpha_beta", 257 invalid: true, 258 }, { 259 ver: "-alpha.", 260 invalid: true, 261 }, { 262 ver: "1.0.0-alpha..", 263 invalid: true, 264 }, { 265 ver: "1.0.0-alpha..1", 266 invalid: true, 267 }, { 268 ver: "1.0.0-alpha...1", 269 invalid: true, 270 }, { 271 ver: "1.0.0-alpha....1", 272 invalid: true, 273 }, { 274 ver: "1.0.0-alpha.....1", 275 invalid: true, 276 }, { 277 ver: "1.0.0-alpha......1", 278 invalid: true, 279 }, { 280 ver: "1.0.0-alpha.......1", 281 invalid: true, 282 }, { 283 ver: "01.1.1", 284 invalid: true, 285 }, { 286 ver: "1.01.1", 287 invalid: true, 288 }, { 289 ver: "1.1.01", 290 invalid: true, 291 }, { 292 ver: "1.2", 293 invalid: true, 294 }, { 295 ver: "1.2.3.DEV", 296 invalid: true, 297 }, { 298 ver: "1.2-SNAPSHOT", 299 invalid: true, 300 }, { 301 ver: "1.2.31.2.3----RC-SNAPSHOT.12.09.1--..12+788", 302 invalid: true, 303 }, { 304 ver: "1.2-RC-SNAPSHOT", 305 invalid: true, 306 }, { 307 ver: "-1.0.3-gamma+b7718", 308 invalid: true, 309 }, { 310 ver: "+justmeta", 311 invalid: true, 312 }, { 313 ver: "9.8.7+meta+meta", 314 invalid: true, 315 }, { 316 ver: "9.8.7-whatever+meta+meta", 317 invalid: true, 318 }, { 319 // Would be valid except major is > max uint64. 320 ver: "99999999999999999999999.999999999999999999.99999999999999999", 321 invalid: true, 322 }, { 323 ver: "999999999.999999999.999999999----RC-SNAPSHOT.12.09.1-----------" + 324 "---------------------..12", 325 invalid: true, 326 }} 327 328 for _, test := range tests { 329 major, minor, patch, pre, build, err := ParseSemVer(test.ver) 330 if test.invalid && err == nil { 331 t.Errorf("%q: did not receive expected error", test.ver) 332 continue 333 } 334 if !test.invalid && err != nil { 335 t.Errorf("%q: unexpected err: %v", test.ver, err) 336 continue 337 } 338 339 if major != test.major { 340 t.Errorf("%q: mismatched major -- got %d, want %d", test.ver, 341 major, test.major) 342 continue 343 } 344 345 if minor != test.minor { 346 t.Errorf("%q: mismatched minor -- got %d, want %d", test.ver, 347 minor, test.minor) 348 continue 349 } 350 351 if patch != test.patch { 352 t.Errorf("%q: mismatched patch -- got %d, want %d", test.ver, 353 patch, test.patch) 354 continue 355 } 356 357 if pre != test.pre { 358 t.Errorf("%q: mismatched pre-release -- got %s, want %s", test.ver, 359 pre, test.pre) 360 continue 361 } 362 363 if build != test.build { 364 t.Errorf("%q: mismatched buildmetadata -- got %s, want %s", 365 test.ver, build, test.build) 366 continue 367 } 368 } 369 }