github.com/hernad/nomad@v1.6.112/helper/constraints/semver/constraints_test.go (about)

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