...

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

Documentation: github.com/hashicorp/go-version

     1  package version
     2  
     3  import (
     4  	"fmt"
     5  	"reflect"
     6  	"sort"
     7  	"testing"
     8  )
     9  
    10  func TestNewConstraint(t *testing.T) {
    11  	cases := []struct {
    12  		input string
    13  		count int
    14  		err   bool
    15  	}{
    16  		{">= 1.2", 1, false},
    17  		{"1.0", 1, false},
    18  		{">= 1.x", 0, true},
    19  		{">= 1.2, < 1.0", 2, false},
    20  
    21  		// Out of bounds
    22  		{"11387778780781445675529500000000000000000", 0, true},
    23  	}
    24  
    25  	for _, tc := range cases {
    26  		v, err := NewConstraint(tc.input)
    27  		if tc.err && err == nil {
    28  			t.Fatalf("expected error for input: %s", tc.input)
    29  		} else if !tc.err && err != nil {
    30  			t.Fatalf("error for input %s: %s", tc.input, err)
    31  		}
    32  
    33  		if len(v) != tc.count {
    34  			t.Fatalf("input: %s\nexpected len: %d\nactual: %d",
    35  				tc.input, tc.count, len(v))
    36  		}
    37  	}
    38  }
    39  
    40  func TestConstraintCheck(t *testing.T) {
    41  	cases := []struct {
    42  		constraint string
    43  		version    string
    44  		check      bool
    45  	}{
    46  		{">= 1.0, < 1.2", "1.1.5", true},
    47  		{"< 1.0, < 1.2", "1.1.5", false},
    48  		{"= 1.0", "1.1.5", false},
    49  		{"= 1.0", "1.0.0", true},
    50  		{"1.0", "1.0.0", true},
    51  		{"~> 1.0", "2.0", false},
    52  		{"~> 1.0", "1.1", true},
    53  		{"~> 1.0", "1.2.3", true},
    54  		{"~> 1.0.0", "1.2.3", false},
    55  		{"~> 1.0.0", "1.0.7", true},
    56  		{"~> 1.0.0", "1.1.0", false},
    57  		{"~> 1.0.7", "1.0.4", false},
    58  		{"~> 1.0.7", "1.0.7", true},
    59  		{"~> 1.0.7", "1.0.8", true},
    60  		{"~> 1.0.7", "1.0.7.5", true},
    61  		{"~> 1.0.7", "1.0.6.99", false},
    62  		{"~> 1.0.7", "1.0.8.0", true},
    63  		{"~> 1.0.9.5", "1.0.9.5", true},
    64  		{"~> 1.0.9.5", "1.0.9.4", false},
    65  		{"~> 1.0.9.5", "1.0.9.6", true},
    66  		{"~> 1.0.9.5", "1.0.9.5.0", true},
    67  		{"~> 1.0.9.5", "1.0.9.5.1", true},
    68  		{"~> 2.0", "2.1.0-beta", false},
    69  		{"~> 2.1.0-a", "2.2.0", false},
    70  		{"~> 2.1.0-a", "2.1.0", false},
    71  		{"~> 2.1.0-a", "2.1.0-beta", true},
    72  		{"~> 2.1.0-a", "2.2.0-alpha", false},
    73  		{"> 2.0", "2.1.0-beta", false},
    74  		{">= 2.1.0-a", "2.1.0-beta", true},
    75  		{">= 2.1.0-a", "2.1.1-beta", false},
    76  		{">= 2.0.0", "2.1.0-beta", false},
    77  		{">= 2.1.0-a", "2.1.1", true},
    78  		{">= 2.1.0-a", "2.1.1-beta", false},
    79  		{">= 2.1.0-a", "2.1.0", true},
    80  		{"<= 2.1.0-a", "2.0.0", 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 := NewVersion(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 TestConstraintPrerelease(t *testing.T) {
   104  	cases := []struct {
   105  		constraint string
   106  		prerelease bool
   107  	}{
   108  		{"= 1.0", false},
   109  		{"= 1.0-beta", true},
   110  		{"~> 2.1.0", false},
   111  		{"~> 2.1.0-dev", true},
   112  		{"> 2.0", false},
   113  		{">= 2.1.0-a", true},
   114  	}
   115  
   116  	for _, tc := range cases {
   117  		c, err := parseSingle(tc.constraint)
   118  		if err != nil {
   119  			t.Fatalf("err: %s", err)
   120  		}
   121  
   122  		actual := c.Prerelease()
   123  		expected := tc.prerelease
   124  		if actual != expected {
   125  			t.Fatalf("Constraint: %s\nExpected: %#v",
   126  				tc.constraint, expected)
   127  		}
   128  	}
   129  }
   130  
   131  func TestConstraintEqual(t *testing.T) {
   132  	cases := []struct {
   133  		leftConstraint  string
   134  		rightConstraint string
   135  		expectedEqual   bool
   136  	}{
   137  		{
   138  			"0.0.1",
   139  			"0.0.1",
   140  			true,
   141  		},
   142  		{ // whitespaces
   143  			" 0.0.1 ",
   144  			"0.0.1",
   145  			true,
   146  		},
   147  		{ // equal op implied
   148  			"=0.0.1 ",
   149  			"0.0.1",
   150  			true,
   151  		},
   152  		{ // version difference
   153  			"=0.0.1",
   154  			"=0.0.2",
   155  			false,
   156  		},
   157  		{ // operator difference
   158  			">0.0.1",
   159  			"=0.0.1",
   160  			false,
   161  		},
   162  		{ // different order
   163  			">0.1.0, <=1.0.0",
   164  			"<=1.0.0, >0.1.0",
   165  			true,
   166  		},
   167  	}
   168  
   169  	for _, tc := range cases {
   170  		leftCon, err := NewConstraint(tc.leftConstraint)
   171  		if err != nil {
   172  			t.Fatalf("err: %s", err)
   173  		}
   174  		rightCon, err := NewConstraint(tc.rightConstraint)
   175  		if err != nil {
   176  			t.Fatalf("err: %s", err)
   177  		}
   178  
   179  		actual := leftCon.Equals(rightCon)
   180  		if actual != tc.expectedEqual {
   181  			t.Fatalf("Constraints: %s vs %s\nExpected: %t\nActual: %t",
   182  				tc.leftConstraint, tc.rightConstraint, tc.expectedEqual, actual)
   183  		}
   184  	}
   185  }
   186  
   187  func TestConstraint_sort(t *testing.T) {
   188  	cases := []struct {
   189  		constraint          string
   190  		expectedConstraints string
   191  	}{
   192  		{
   193  			">= 0.1.0,< 1.12",
   194  			"< 1.12,>= 0.1.0",
   195  		},
   196  		{
   197  			"< 1.12,>= 0.1.0",
   198  			"< 1.12,>= 0.1.0",
   199  		},
   200  		{
   201  			"< 1.12,>= 0.1.0,0.2.0",
   202  			"< 1.12,0.2.0,>= 0.1.0",
   203  		},
   204  		{
   205  			">1.0,>0.1.0,>0.3.0,>0.2.0",
   206  			">0.1.0,>0.2.0,>0.3.0,>1.0",
   207  		},
   208  	}
   209  
   210  	for i, tc := range cases {
   211  		t.Run(fmt.Sprintf("%d", i), func(t *testing.T) {
   212  			c, err := NewConstraint(tc.constraint)
   213  			if err != nil {
   214  				t.Fatalf("err: %s", err)
   215  			}
   216  
   217  			sort.Sort(c)
   218  
   219  			actual := c.String()
   220  
   221  			if !reflect.DeepEqual(actual, tc.expectedConstraints) {
   222  				t.Fatalf("unexpected order\nexpected: %#v\nactual: %#v",
   223  					tc.expectedConstraints, actual)
   224  			}
   225  		})
   226  	}
   227  }
   228  
   229  func TestConstraintsString(t *testing.T) {
   230  	cases := []struct {
   231  		constraint string
   232  		result     string
   233  	}{
   234  		{">= 1.0, < 1.2", ""},
   235  		{"~> 1.0.7", ""},
   236  	}
   237  
   238  	for _, tc := range cases {
   239  		c, err := NewConstraint(tc.constraint)
   240  		if err != nil {
   241  			t.Fatalf("err: %s", err)
   242  		}
   243  
   244  		actual := c.String()
   245  		expected := tc.result
   246  		if expected == "" {
   247  			expected = tc.constraint
   248  		}
   249  
   250  		if actual != expected {
   251  			t.Fatalf("Constraint: %s\nExpected: %#v\nActual: %s",
   252  				tc.constraint, expected, actual)
   253  		}
   254  	}
   255  }
   256  

View as plain text