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
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 {
143 " 0.0.1 ",
144 "0.0.1",
145 true,
146 },
147 {
148 "=0.0.1 ",
149 "0.0.1",
150 true,
151 },
152 {
153 "=0.0.1",
154 "=0.0.2",
155 false,
156 },
157 {
158 ">0.0.1",
159 "=0.0.1",
160 false,
161 },
162 {
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