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  }