...

Source file src/github.com/hashicorp/go-version/version_test.go

Documentation: github.com/hashicorp/go-version

     1  package version
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"reflect"
     7  	"testing"
     8  )
     9  
    10  func TestNewVersion(t *testing.T) {
    11  	cases := []struct {
    12  		version string
    13  		err     bool
    14  	}{
    15  		{"", true},
    16  		{"1.2.3", false},
    17  		{"1.0", false},
    18  		{"1", false},
    19  		{"1.2.beta", true},
    20  		{"1.21.beta", true},
    21  		{"foo", true},
    22  		{"1.2-5", false},
    23  		{"1.2-beta.5", false},
    24  		{"\n1.2", true},
    25  		{"1.2.0-x.Y.0+metadata", false},
    26  		{"1.2.0-x.Y.0+metadata-width-hyphen", false},
    27  		{"1.2.3-rc1-with-hyphen", false},
    28  		{"1.2.3.4", false},
    29  		{"1.2.0.4-x.Y.0+metadata", false},
    30  		{"1.2.0.4-x.Y.0+metadata-width-hyphen", false},
    31  		{"1.2.0-X-1.2.0+metadata~dist", false},
    32  		{"1.2.3.4-rc1-with-hyphen", false},
    33  		{"1.2.3.4", false},
    34  		{"v1.2.3", false},
    35  		{"foo1.2.3", true},
    36  		{"1.7rc2", false},
    37  		{"v1.7rc2", false},
    38  		{"1.0-", false},
    39  	}
    40  
    41  	for _, tc := range cases {
    42  		_, err := NewVersion(tc.version)
    43  		if tc.err && err == nil {
    44  			t.Fatalf("expected error for version: %q", tc.version)
    45  		} else if !tc.err && err != nil {
    46  			t.Fatalf("error for version %q: %s", tc.version, err)
    47  		}
    48  	}
    49  }
    50  
    51  func TestNewSemver(t *testing.T) {
    52  	cases := []struct {
    53  		version string
    54  		err     bool
    55  	}{
    56  		{"", true},
    57  		{"1.2.3", false},
    58  		{"1.0", false},
    59  		{"1", false},
    60  		{"1.2.beta", true},
    61  		{"1.21.beta", true},
    62  		{"foo", true},
    63  		{"1.2-5", false},
    64  		{"1.2-beta.5", false},
    65  		{"\n1.2", true},
    66  		{"1.2.0-x.Y.0+metadata", false},
    67  		{"1.2.0-x.Y.0+metadata-width-hyphen", false},
    68  		{"1.2.3-rc1-with-hyphen", false},
    69  		{"1.2.3.4", false},
    70  		{"1.2.0.4-x.Y.0+metadata", false},
    71  		{"1.2.0.4-x.Y.0+metadata-width-hyphen", false},
    72  		{"1.2.0-X-1.2.0+metadata~dist", false},
    73  		{"1.2.3.4-rc1-with-hyphen", false},
    74  		{"1.2.3.4", false},
    75  		{"v1.2.3", false},
    76  		{"foo1.2.3", true},
    77  		{"1.7rc2", true},
    78  		{"v1.7rc2", true},
    79  		{"1.0-", true},
    80  	}
    81  
    82  	for _, tc := range cases {
    83  		_, err := NewSemver(tc.version)
    84  		if tc.err && err == nil {
    85  			t.Fatalf("expected error for version: %q", tc.version)
    86  		} else if !tc.err && err != nil {
    87  			t.Fatalf("error for version %q: %s", tc.version, err)
    88  		}
    89  	}
    90  }
    91  
    92  func TestCore(t *testing.T) {
    93  	cases := []struct {
    94  		v1 string
    95  		v2 string
    96  	}{
    97  		{"1.2.3", "1.2.3"},
    98  		{"2.3.4-alpha1", "2.3.4"},
    99  		{"3.4.5alpha1", "3.4.5"},
   100  		{"1.2.3-2", "1.2.3"},
   101  		{"4.5.6-beta1+meta", "4.5.6"},
   102  		{"5.6.7.1.2.3", "5.6.7"},
   103  	}
   104  
   105  	for _, tc := range cases {
   106  		v1, err := NewVersion(tc.v1)
   107  		if err != nil {
   108  			t.Fatalf("error for version %q: %s", tc.v1, err)
   109  		}
   110  		v2, err := NewVersion(tc.v2)
   111  		if err != nil {
   112  			t.Fatalf("error for version %q: %s", tc.v2, err)
   113  		}
   114  
   115  		actual := v1.Core()
   116  		expected := v2
   117  
   118  		if !reflect.DeepEqual(actual, expected) {
   119  			t.Fatalf("expected: %s\nactual: %s", expected, actual)
   120  		}
   121  	}
   122  }
   123  
   124  func TestVersionCompare(t *testing.T) {
   125  	cases := []struct {
   126  		v1       string
   127  		v2       string
   128  		expected int
   129  	}{
   130  		{"1.2.3", "1.4.5", -1},
   131  		{"1.2-beta", "1.2-beta", 0},
   132  		{"1.2", "1.1.4", 1},
   133  		{"1.2", "1.2-beta", 1},
   134  		{"1.2+foo", "1.2+beta", 0},
   135  		{"v1.2", "v1.2-beta", 1},
   136  		{"v1.2+foo", "v1.2+beta", 0},
   137  		{"v1.2.3.4", "v1.2.3.4", 0},
   138  		{"v1.2.0.0", "v1.2", 0},
   139  		{"v1.2.0.0.1", "v1.2", 1},
   140  		{"v1.2", "v1.2.0.0", 0},
   141  		{"v1.2", "v1.2.0.0.1", -1},
   142  		{"v1.2.0.0", "v1.2.0.0.1", -1},
   143  		{"v1.2.3.0", "v1.2.3.4", -1},
   144  		{"1.7rc2", "1.7rc1", 1},
   145  		{"1.7rc2", "1.7", -1},
   146  		{"1.2.0", "1.2.0-X-1.2.0+metadata~dist", 1},
   147  	}
   148  
   149  	for _, tc := range cases {
   150  		v1, err := NewVersion(tc.v1)
   151  		if err != nil {
   152  			t.Fatalf("err: %s", err)
   153  		}
   154  
   155  		v2, err := NewVersion(tc.v2)
   156  		if err != nil {
   157  			t.Fatalf("err: %s", err)
   158  		}
   159  
   160  		actual := v1.Compare(v2)
   161  		expected := tc.expected
   162  		if actual != expected {
   163  			t.Fatalf(
   164  				"%s <=> %s\nexpected: %d\nactual: %d",
   165  				tc.v1, tc.v2,
   166  				expected, actual)
   167  		}
   168  	}
   169  }
   170  
   171  func TestVersionCompare_versionAndSemver(t *testing.T) {
   172  	cases := []struct {
   173  		versionRaw string
   174  		semverRaw  string
   175  		expected   int
   176  	}{
   177  		{"0.0.2", "0.0.2", 0},
   178  		{"1.0.2alpha", "1.0.2-alpha", 0},
   179  		{"v1.2+foo", "v1.2+beta", 0},
   180  		{"v1.2", "v1.2+meta", 0},
   181  		{"1.2", "1.2-beta", 1},
   182  		{"v1.2", "v1.2-beta", 1},
   183  		{"1.2.3", "1.4.5", -1},
   184  		{"v1.2", "v1.2.0.0.1", -1},
   185  		{"v1.0.3-", "v1.0.3", -1},
   186  	}
   187  
   188  	for _, tc := range cases {
   189  		ver, err := NewVersion(tc.versionRaw)
   190  		if err != nil {
   191  			t.Fatalf("err: %s", err)
   192  		}
   193  
   194  		semver, err := NewSemver(tc.semverRaw)
   195  		if err != nil {
   196  			t.Fatalf("err: %s", err)
   197  		}
   198  
   199  		actual := ver.Compare(semver)
   200  		if actual != tc.expected {
   201  			t.Fatalf(
   202  				"%s <=> %s\nexpected: %d\n actual: %d",
   203  				tc.versionRaw, tc.semverRaw, tc.expected, actual,
   204  			)
   205  		}
   206  	}
   207  }
   208  
   209  func TestVersionEqual_nil(t *testing.T) {
   210  	mustVersion := func(v string) *Version {
   211  		ver, err := NewVersion(v)
   212  		if err != nil {
   213  			t.Fatal(err)
   214  		}
   215  		return ver
   216  	}
   217  	cases := []struct {
   218  		leftVersion  *Version
   219  		rightVersion *Version
   220  		expected     bool
   221  	}{
   222  		{mustVersion("1.0.0"), nil, false},
   223  		{nil, mustVersion("1.0.0"), false},
   224  		{nil, nil, true},
   225  	}
   226  
   227  	for _, tc := range cases {
   228  		given := tc.leftVersion.Equal(tc.rightVersion)
   229  		if given != tc.expected {
   230  			t.Fatalf("expected Equal to nil to be %t", tc.expected)
   231  		}
   232  	}
   233  }
   234  
   235  func TestComparePreReleases(t *testing.T) {
   236  	cases := []struct {
   237  		v1       string
   238  		v2       string
   239  		expected int
   240  	}{
   241  		{"1.2-beta.2", "1.2-beta.2", 0},
   242  		{"1.2-beta.1", "1.2-beta.2", -1},
   243  		{"1.2-beta.2", "1.2-beta.11", -1},
   244  		{"3.2-alpha.1", "3.2-alpha", 1},
   245  		{"1.2-beta.2", "1.2-beta.1", 1},
   246  		{"1.2-beta.11", "1.2-beta.2", 1},
   247  		{"1.2-beta", "1.2-beta.3", -1},
   248  		{"1.2-alpha", "1.2-beta.3", -1},
   249  		{"1.2-beta", "1.2-alpha.3", 1},
   250  		{"3.0-alpha.3", "3.0-rc.1", -1},
   251  		{"3.0-alpha3", "3.0-rc1", -1},
   252  		{"3.0-alpha.1", "3.0-alpha.beta", -1},
   253  		{"5.4-alpha", "5.4-alpha.beta", 1},
   254  		{"v1.2-beta.2", "v1.2-beta.2", 0},
   255  		{"v1.2-beta.1", "v1.2-beta.2", -1},
   256  		{"v3.2-alpha.1", "v3.2-alpha", 1},
   257  		{"v3.2-rc.1-1-g123", "v3.2-rc.2", 1},
   258  	}
   259  
   260  	for _, tc := range cases {
   261  		v1, err := NewVersion(tc.v1)
   262  		if err != nil {
   263  			t.Fatalf("err: %s", err)
   264  		}
   265  
   266  		v2, err := NewVersion(tc.v2)
   267  		if err != nil {
   268  			t.Fatalf("err: %s", err)
   269  		}
   270  
   271  		actual := v1.Compare(v2)
   272  		expected := tc.expected
   273  		if actual != expected {
   274  			t.Fatalf(
   275  				"%s <=> %s\nexpected: %d\nactual: %d",
   276  				tc.v1, tc.v2,
   277  				expected, actual)
   278  		}
   279  	}
   280  }
   281  
   282  func TestVersionMetadata(t *testing.T) {
   283  	cases := []struct {
   284  		version  string
   285  		expected string
   286  	}{
   287  		{"1.2.3", ""},
   288  		{"1.2-beta", ""},
   289  		{"1.2.0-x.Y.0", ""},
   290  		{"1.2.0-x.Y.0+metadata", "metadata"},
   291  		{"1.2.0-metadata-1.2.0+metadata~dist", "metadata~dist"},
   292  	}
   293  
   294  	for _, tc := range cases {
   295  		v, err := NewVersion(tc.version)
   296  		if err != nil {
   297  			t.Fatalf("err: %s", err)
   298  		}
   299  
   300  		actual := v.Metadata()
   301  		expected := tc.expected
   302  		if actual != expected {
   303  			t.Fatalf("expected: %s\nactual: %s", expected, actual)
   304  		}
   305  	}
   306  }
   307  
   308  func TestVersionPrerelease(t *testing.T) {
   309  	cases := []struct {
   310  		version  string
   311  		expected string
   312  	}{
   313  		{"1.2.3", ""},
   314  		{"1.2-beta", "beta"},
   315  		{"1.2.0-x.Y.0", "x.Y.0"},
   316  		{"1.2.0-7.Y.0", "7.Y.0"},
   317  		{"1.2.0-x.Y.0+metadata", "x.Y.0"},
   318  		{"1.2.0-metadata-1.2.0+metadata~dist", "metadata-1.2.0"},
   319  		{"17.03.0-ce", "ce"}, // zero-padded fields
   320  	}
   321  
   322  	for _, tc := range cases {
   323  		v, err := NewVersion(tc.version)
   324  		if err != nil {
   325  			t.Fatalf("err: %s", err)
   326  		}
   327  
   328  		actual := v.Prerelease()
   329  		expected := tc.expected
   330  		if actual != expected {
   331  			t.Fatalf("expected: %s\nactual: %s", expected, actual)
   332  		}
   333  	}
   334  }
   335  
   336  func TestVersionSegments(t *testing.T) {
   337  	cases := []struct {
   338  		version  string
   339  		expected []int
   340  	}{
   341  		{"1.2.3", []int{1, 2, 3}},
   342  		{"1.2-beta", []int{1, 2, 0}},
   343  		{"1-x.Y.0", []int{1, 0, 0}},
   344  		{"1.2.0-x.Y.0+metadata", []int{1, 2, 0}},
   345  		{"1.2.0-metadata-1.2.0+metadata~dist", []int{1, 2, 0}},
   346  		{"17.03.0-ce", []int{17, 3, 0}}, // zero-padded fields
   347  	}
   348  
   349  	for _, tc := range cases {
   350  		v, err := NewVersion(tc.version)
   351  		if err != nil {
   352  			t.Fatalf("err: %s", err)
   353  		}
   354  
   355  		actual := v.Segments()
   356  		expected := tc.expected
   357  		if !reflect.DeepEqual(actual, expected) {
   358  			t.Fatalf("expected: %#v\nactual: %#v", expected, actual)
   359  		}
   360  	}
   361  }
   362  
   363  func TestVersionSegments64(t *testing.T) {
   364  	cases := []struct {
   365  		version  string
   366  		expected []int64
   367  	}{
   368  		{"1.2.3", []int64{1, 2, 3}},
   369  		{"1.2-beta", []int64{1, 2, 0}},
   370  		{"1-x.Y.0", []int64{1, 0, 0}},
   371  		{"1.2.0-x.Y.0+metadata", []int64{1, 2, 0}},
   372  		{"1.4.9223372036854775807", []int64{1, 4, 9223372036854775807}},
   373  	}
   374  
   375  	for _, tc := range cases {
   376  		v, err := NewVersion(tc.version)
   377  		if err != nil {
   378  			t.Fatalf("err: %s", err)
   379  		}
   380  
   381  		actual := v.Segments64()
   382  		expected := tc.expected
   383  		if !reflect.DeepEqual(actual, expected) {
   384  			t.Fatalf("expected: %#v\nactual: %#v", expected, actual)
   385  		}
   386  
   387  		{
   388  			expected := actual[0]
   389  			actual[0]++
   390  			actual = v.Segments64()
   391  			if actual[0] != expected {
   392  				t.Fatalf("Segments64 is mutable")
   393  			}
   394  		}
   395  	}
   396  }
   397  
   398  func TestJsonMarshal(t *testing.T) {
   399  	cases := []struct {
   400  		version string
   401  		err     bool
   402  	}{
   403  		{"1.2.3", false},
   404  		{"1.2.0-x.Y.0+metadata", false},
   405  		{"1.2.0-x.Y.0+metadata-width-hyphen", false},
   406  		{"1.2.3-rc1-with-hyphen", false},
   407  		{"1.2.3.4", false},
   408  		{"1.2.0.4-x.Y.0+metadata", false},
   409  		{"1.2.0.4-x.Y.0+metadata-width-hyphen", false},
   410  		{"1.2.0-X-1.2.0+metadata~dist", false},
   411  		{"1.2.3.4-rc1-with-hyphen", false},
   412  		{"1.2.3.4", false},
   413  	}
   414  
   415  	for _, tc := range cases {
   416  		v, err1 := NewVersion(tc.version)
   417  		if err1 != nil {
   418  			t.Fatalf("error for version %q: %s", tc.version, err1)
   419  		}
   420  
   421  		parsed, err2 := json.Marshal(v)
   422  		if err2 != nil {
   423  			t.Fatalf("error marshaling version %q: %s", tc.version, err2)
   424  		}
   425  		result := string(parsed)
   426  		expected := fmt.Sprintf("%q", tc.version)
   427  		if result != expected && !tc.err {
   428  			t.Fatalf("Error marshaling unexpected marshaled content: result=%q expected=%q", result, expected)
   429  		}
   430  	}
   431  }
   432  
   433  func TestJsonUnmarshal(t *testing.T) {
   434  	cases := []struct {
   435  		version string
   436  		err     bool
   437  	}{
   438  		{"1.2.3", false},
   439  		{"1.2.0-x.Y.0+metadata", false},
   440  		{"1.2.0-x.Y.0+metadata-width-hyphen", false},
   441  		{"1.2.3-rc1-with-hyphen", false},
   442  		{"1.2.3.4", false},
   443  		{"1.2.0.4-x.Y.0+metadata", false},
   444  		{"1.2.0.4-x.Y.0+metadata-width-hyphen", false},
   445  		{"1.2.0-X-1.2.0+metadata~dist", false},
   446  		{"1.2.3.4-rc1-with-hyphen", false},
   447  		{"1.2.3.4", false},
   448  	}
   449  
   450  	for _, tc := range cases {
   451  		expected, err1 := NewVersion(tc.version)
   452  		if err1 != nil {
   453  			t.Fatalf("err: %s", err1)
   454  		}
   455  
   456  		actual := &Version{}
   457  		err2 := json.Unmarshal([]byte(fmt.Sprintf("%q", tc.version)), actual)
   458  		if err2 != nil {
   459  			t.Fatalf("error unmarshaling version: %s", err2)
   460  		}
   461  		if !reflect.DeepEqual(actual, expected) {
   462  			t.Fatalf("error unmarshaling, unexpected object content: actual=%q expected=%q", actual, expected)
   463  		}
   464  	}
   465  }
   466  
   467  func TestVersionString(t *testing.T) {
   468  	cases := [][]string{
   469  		{"1.2.3", "1.2.3"},
   470  		{"1.2-beta", "1.2.0-beta"},
   471  		{"1.2.0-x.Y.0", "1.2.0-x.Y.0"},
   472  		{"1.2.0-x.Y.0+metadata", "1.2.0-x.Y.0+metadata"},
   473  		{"1.2.0-metadata-1.2.0+metadata~dist", "1.2.0-metadata-1.2.0+metadata~dist"},
   474  		{"17.03.0-ce", "17.3.0-ce"}, // zero-padded fields
   475  	}
   476  
   477  	for _, tc := range cases {
   478  		v, err := NewVersion(tc[0])
   479  		if err != nil {
   480  			t.Fatalf("err: %s", err)
   481  		}
   482  
   483  		actual := v.String()
   484  		expected := tc[1]
   485  		if actual != expected {
   486  			t.Fatalf("expected: %s\nactual: %s", expected, actual)
   487  		}
   488  		if actual := v.Original(); actual != tc[0] {
   489  			t.Fatalf("expected original: %q\nactual: %q", tc[0], actual)
   490  		}
   491  	}
   492  }
   493  
   494  func TestEqual(t *testing.T) {
   495  	cases := []struct {
   496  		v1       string
   497  		v2       string
   498  		expected bool
   499  	}{
   500  		{"1.2.3", "1.4.5", false},
   501  		{"1.2-beta", "1.2-beta", true},
   502  		{"1.2", "1.1.4", false},
   503  		{"1.2", "1.2-beta", false},
   504  		{"1.2+foo", "1.2+beta", true},
   505  		{"v1.2", "v1.2-beta", false},
   506  		{"v1.2+foo", "v1.2+beta", true},
   507  		{"v1.2.3.4", "v1.2.3.4", true},
   508  		{"v1.2.0.0", "v1.2", true},
   509  		{"v1.2.0.0.1", "v1.2", false},
   510  		{"v1.2", "v1.2.0.0", true},
   511  		{"v1.2", "v1.2.0.0.1", false},
   512  		{"v1.2.0.0", "v1.2.0.0.1", false},
   513  		{"v1.2.3.0", "v1.2.3.4", false},
   514  		{"1.7rc2", "1.7rc1", false},
   515  		{"1.7rc2", "1.7", false},
   516  		{"1.2.0", "1.2.0-X-1.2.0+metadata~dist", false},
   517  	}
   518  
   519  	for _, tc := range cases {
   520  		v1, err := NewVersion(tc.v1)
   521  		if err != nil {
   522  			t.Fatalf("err: %s", err)
   523  		}
   524  
   525  		v2, err := NewVersion(tc.v2)
   526  		if err != nil {
   527  			t.Fatalf("err: %s", err)
   528  		}
   529  
   530  		actual := v1.Equal(v2)
   531  		expected := tc.expected
   532  		if actual != expected {
   533  			t.Fatalf(
   534  				"%s <=> %s\nexpected: %t\nactual: %t",
   535  				tc.v1, tc.v2,
   536  				expected, actual)
   537  		}
   538  	}
   539  }
   540  
   541  func TestGreaterThan(t *testing.T) {
   542  	cases := []struct {
   543  		v1       string
   544  		v2       string
   545  		expected bool
   546  	}{
   547  		{"1.2.3", "1.4.5", false},
   548  		{"1.2-beta", "1.2-beta", false},
   549  		{"1.2", "1.1.4", true},
   550  		{"1.2", "1.2-beta", true},
   551  		{"1.2+foo", "1.2+beta", false},
   552  		{"v1.2", "v1.2-beta", true},
   553  		{"v1.2+foo", "v1.2+beta", false},
   554  		{"v1.2.3.4", "v1.2.3.4", false},
   555  		{"v1.2.0.0", "v1.2", false},
   556  		{"v1.2.0.0.1", "v1.2", true},
   557  		{"v1.2", "v1.2.0.0", false},
   558  		{"v1.2", "v1.2.0.0.1", false},
   559  		{"v1.2.0.0", "v1.2.0.0.1", false},
   560  		{"v1.2.3.0", "v1.2.3.4", false},
   561  		{"1.7rc2", "1.7rc1", true},
   562  		{"1.7rc2", "1.7", false},
   563  		{"1.2.0", "1.2.0-X-1.2.0+metadata~dist", true},
   564  	}
   565  
   566  	for _, tc := range cases {
   567  		v1, err := NewVersion(tc.v1)
   568  		if err != nil {
   569  			t.Fatalf("err: %s", err)
   570  		}
   571  
   572  		v2, err := NewVersion(tc.v2)
   573  		if err != nil {
   574  			t.Fatalf("err: %s", err)
   575  		}
   576  
   577  		actual := v1.GreaterThan(v2)
   578  		expected := tc.expected
   579  		if actual != expected {
   580  			t.Fatalf(
   581  				"%s > %s\nexpected: %t\nactual: %t",
   582  				tc.v1, tc.v2,
   583  				expected, actual)
   584  		}
   585  	}
   586  }
   587  
   588  func TestLessThan(t *testing.T) {
   589  	cases := []struct {
   590  		v1       string
   591  		v2       string
   592  		expected bool
   593  	}{
   594  		{"1.2.3", "1.4.5", true},
   595  		{"1.2-beta", "1.2-beta", false},
   596  		{"1.2", "1.1.4", false},
   597  		{"1.2", "1.2-beta", false},
   598  		{"1.2+foo", "1.2+beta", false},
   599  		{"v1.2", "v1.2-beta", false},
   600  		{"v1.2+foo", "v1.2+beta", false},
   601  		{"v1.2.3.4", "v1.2.3.4", false},
   602  		{"v1.2.0.0", "v1.2", false},
   603  		{"v1.2.0.0.1", "v1.2", false},
   604  		{"v1.2", "v1.2.0.0", false},
   605  		{"v1.2", "v1.2.0.0.1", true},
   606  		{"v1.2.0.0", "v1.2.0.0.1", true},
   607  		{"v1.2.3.0", "v1.2.3.4", true},
   608  		{"1.7rc2", "1.7rc1", false},
   609  		{"1.7rc2", "1.7", true},
   610  		{"1.2.0", "1.2.0-X-1.2.0+metadata~dist", false},
   611  	}
   612  
   613  	for _, tc := range cases {
   614  		v1, err := NewVersion(tc.v1)
   615  		if err != nil {
   616  			t.Fatalf("err: %s", err)
   617  		}
   618  
   619  		v2, err := NewVersion(tc.v2)
   620  		if err != nil {
   621  			t.Fatalf("err: %s", err)
   622  		}
   623  
   624  		actual := v1.LessThan(v2)
   625  		expected := tc.expected
   626  		if actual != expected {
   627  			t.Fatalf(
   628  				"%s < %s\nexpected: %t\nactual: %t",
   629  				tc.v1, tc.v2,
   630  				expected, actual)
   631  		}
   632  	}
   633  }
   634  
   635  func TestGreaterThanOrEqual(t *testing.T) {
   636  	cases := []struct {
   637  		v1       string
   638  		v2       string
   639  		expected bool
   640  	}{
   641  		{"1.2.3", "1.4.5", false},
   642  		{"1.2-beta", "1.2-beta", true},
   643  		{"1.2", "1.1.4", true},
   644  		{"1.2", "1.2-beta", true},
   645  		{"1.2+foo", "1.2+beta", true},
   646  		{"v1.2", "v1.2-beta", true},
   647  		{"v1.2+foo", "v1.2+beta", true},
   648  		{"v1.2.3.4", "v1.2.3.4", true},
   649  		{"v1.2.0.0", "v1.2", true},
   650  		{"v1.2.0.0.1", "v1.2", true},
   651  		{"v1.2", "v1.2.0.0", true},
   652  		{"v1.2", "v1.2.0.0.1", false},
   653  		{"v1.2.0.0", "v1.2.0.0.1", false},
   654  		{"v1.2.3.0", "v1.2.3.4", false},
   655  		{"1.7rc2", "1.7rc1", true},
   656  		{"1.7rc2", "1.7", false},
   657  		{"1.2.0", "1.2.0-X-1.2.0+metadata~dist", true},
   658  	}
   659  
   660  	for _, tc := range cases {
   661  		v1, err := NewVersion(tc.v1)
   662  		if err != nil {
   663  			t.Fatalf("err: %s", err)
   664  		}
   665  
   666  		v2, err := NewVersion(tc.v2)
   667  		if err != nil {
   668  			t.Fatalf("err: %s", err)
   669  		}
   670  
   671  		actual := v1.GreaterThanOrEqual(v2)
   672  		expected := tc.expected
   673  		if actual != expected {
   674  			t.Fatalf(
   675  				"%s >= %s\nexpected: %t\nactual: %t",
   676  				tc.v1, tc.v2,
   677  				expected, actual)
   678  		}
   679  	}
   680  }
   681  
   682  func TestLessThanOrEqual(t *testing.T) {
   683  	cases := []struct {
   684  		v1       string
   685  		v2       string
   686  		expected bool
   687  	}{
   688  		{"1.2.3", "1.4.5", true},
   689  		{"1.2-beta", "1.2-beta", true},
   690  		{"1.2", "1.1.4", false},
   691  		{"1.2", "1.2-beta", false},
   692  		{"1.2+foo", "1.2+beta", true},
   693  		{"v1.2", "v1.2-beta", false},
   694  		{"v1.2+foo", "v1.2+beta", true},
   695  		{"v1.2.3.4", "v1.2.3.4", true},
   696  		{"v1.2.0.0", "v1.2", true},
   697  		{"v1.2.0.0.1", "v1.2", false},
   698  		{"v1.2", "v1.2.0.0", true},
   699  		{"v1.2", "v1.2.0.0.1", true},
   700  		{"v1.2.0.0", "v1.2.0.0.1", true},
   701  		{"v1.2.3.0", "v1.2.3.4", true},
   702  		{"1.7rc2", "1.7rc1", false},
   703  		{"1.7rc2", "1.7", true},
   704  		{"1.2.0", "1.2.0-X-1.2.0+metadata~dist", false},
   705  	}
   706  
   707  	for _, tc := range cases {
   708  		v1, err := NewVersion(tc.v1)
   709  		if err != nil {
   710  			t.Fatalf("err: %s", err)
   711  		}
   712  
   713  		v2, err := NewVersion(tc.v2)
   714  		if err != nil {
   715  			t.Fatalf("err: %s", err)
   716  		}
   717  
   718  		actual := v1.LessThanOrEqual(v2)
   719  		expected := tc.expected
   720  		if actual != expected {
   721  			t.Fatalf(
   722  				"%s <= %s\nexpected: %t\nactual: %t",
   723  				tc.v1, tc.v2,
   724  				expected, actual)
   725  		}
   726  	}
   727  }
   728  

View as plain text