github.com/tonyhb/nomad@v0.11.8/helper/constraints/semver/constraints_test.go (about)

     1  package semver
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/hashicorp/go-version"
     7  )
     8  
     9  // This file is a copy of github.com/hashicorp/go-version/constraint_test.go
    10  // with minimal changes to demonstrate differences. Diffing the files should
    11  // illustrate behavior differences in Constraint and version.Constraint.
    12  
    13  func TestNewConstraint(t *testing.T) {
    14  	cases := []struct {
    15  		input string
    16  		count int
    17  		err   bool
    18  	}{
    19  		{">= 1.2", 1, false},
    20  		{"1.0", 1, false},
    21  		{">= 1.x", 0, true},
    22  		{">= 1.2, < 1.0", 2, false},
    23  
    24  		// Out of bounds
    25  		{"11387778780781445675529500000000000000000", 0, true},
    26  
    27  		// Semver only
    28  		{">= 1.0beta1", 0, true},
    29  
    30  		// No pessimistic operator
    31  		{"~> 1.0", 0, true},
    32  	}
    33  
    34  	for _, tc := range cases {
    35  		v, err := NewConstraint(tc.input)
    36  		if tc.err && err == nil {
    37  			t.Fatalf("expected error for input: %s", tc.input)
    38  		} else if !tc.err && err != nil {
    39  			t.Fatalf("error for input %s: %s", tc.input, err)
    40  		}
    41  
    42  		if len(v) != tc.count {
    43  			t.Fatalf("input: %s\nexpected len: %d\nactual: %d",
    44  				tc.input, tc.count, len(v))
    45  		}
    46  	}
    47  }
    48  
    49  func TestConstraintCheck(t *testing.T) {
    50  	cases := []struct {
    51  		constraint string
    52  		version    string
    53  		check      bool
    54  	}{
    55  		{">= 1.0, < 1.2", "1.1.5", true},
    56  		{"< 1.0, < 1.2", "1.1.5", false},
    57  		{"= 1.0", "1.1.5", false},
    58  		{"= 1.0", "1.0.0", true},
    59  		{"1.0", "1.0.0", true},
    60  
    61  		// Assert numbers are *not* compared lexically as in #4729
    62  		{"> 10", "8", false},
    63  
    64  		// Pre-releases are ordered according to Semver v2
    65  		{"> 2.0", "2.1.0-beta", true},
    66  		{"> 2.1.0-a", "2.1.0-beta", true},
    67  		{"> 2.1.0-a", "2.1.1-beta", true},
    68  		{"> 2.0.0", "2.1.0-beta", true},
    69  		{"> 2.1.0-a", "2.1.1", true},
    70  		{"> 2.1.0-a", "2.1.1-beta", true},
    71  		{"> 2.1.0-a", "2.1.0", true},
    72  		{"<= 2.1.0-a", "2.0.0", true},
    73  		{">= 0.6.1", "1.3.0-beta1", true},
    74  		{"> 1.0-beta1", "1.0-rc1", true},
    75  
    76  		// Meta components are ignored according to Semver v2
    77  		{">= 0.6.1", "1.3.0-beta1+ent", true},
    78  		{">= 1.3.0-beta1", "1.3.0-beta1+ent", true},
    79  		{"> 1.3.0-beta1+cgo", "1.3.0-beta1+ent", false},
    80  		{"= 1.3.0-beta1+cgo", "1.3.0-beta1+ent", true},
    81  	}
    82  
    83  	for _, tc := range cases {
    84  		c, err := NewConstraint(tc.constraint)
    85  		if err != nil {
    86  			t.Fatalf("err: %s", err)
    87  		}
    88  
    89  		v, err := version.NewSemver(tc.version)
    90  		if err != nil {
    91  			t.Fatalf("err: %s", err)
    92  		}
    93  
    94  		actual := c.Check(v)
    95  		expected := tc.check
    96  		if actual != expected {
    97  			t.Fatalf("Version: %s\nConstraint: %s\nExpected: %#v",
    98  				tc.version, tc.constraint, expected)
    99  		}
   100  	}
   101  }
   102  
   103  func TestConstraintsString(t *testing.T) {
   104  	cases := []struct {
   105  		constraint string
   106  		result     string
   107  	}{
   108  		{">= 1.0, < 1.2", ""},
   109  	}
   110  
   111  	for _, tc := range cases {
   112  		c, err := NewConstraint(tc.constraint)
   113  		if err != nil {
   114  			t.Fatalf("err: %s", err)
   115  		}
   116  
   117  		actual := c.String()
   118  		expected := tc.result
   119  		if expected == "" {
   120  			expected = tc.constraint
   121  		}
   122  
   123  		if actual != expected {
   124  			t.Fatalf("Constraint: %s\nExpected: %#v\nActual: %s",
   125  				tc.constraint, expected, actual)
   126  		}
   127  	}
   128  }