OLD | NEW |
| (Empty) |
1 library version_test; | |
2 import 'package:unittest/unittest.dart'; | |
3 import 'test_pub.dart'; | |
4 import '../lib/src/version.dart'; | |
5 main() { | |
6 initConfig(); | |
7 final v114 = new Version.parse('1.1.4'); | |
8 final v123 = new Version.parse('1.2.3'); | |
9 final v124 = new Version.parse('1.2.4'); | |
10 final v130 = new Version.parse('1.3.0'); | |
11 final v140 = new Version.parse('1.4.0'); | |
12 final v200 = new Version.parse('2.0.0'); | |
13 final v201 = new Version.parse('2.0.1'); | |
14 final v234 = new Version.parse('2.3.4'); | |
15 final v250 = new Version.parse('2.5.0'); | |
16 final v300 = new Version.parse('3.0.0'); | |
17 group('Version', () { | |
18 test('none', () { | |
19 expect(Version.none.toString(), equals('0.0.0')); | |
20 }); | |
21 group('constructor', () { | |
22 test('throws on negative numbers', () { | |
23 throwsIllegalArg(() => new Version(-1, 1, 1)); | |
24 throwsIllegalArg(() => new Version(1, -1, 1)); | |
25 throwsIllegalArg(() => new Version(1, 1, -1)); | |
26 }); | |
27 }); | |
28 group('comparison', () { | |
29 var versions = [ | |
30 '1.0.0-alpha', | |
31 '1.0.0-alpha.1', | |
32 '1.0.0-beta.2', | |
33 '1.0.0-beta.11', | |
34 '1.0.0-rc.1', | |
35 '1.0.0-rc.1+build.1', | |
36 '1.0.0', | |
37 '1.0.0+0.3.7', | |
38 '1.3.7+build', | |
39 '1.3.7+build.2.b8f12d7', | |
40 '1.3.7+build.11.e0f985a', | |
41 '2.0.0', | |
42 '2.1.0', | |
43 '2.2.0', | |
44 '2.11.0', | |
45 '2.11.1']; | |
46 test('compareTo()', () { | |
47 for (var i = 0; i < versions.length; i++) { | |
48 for (var j = 0; j < versions.length; j++) { | |
49 var a = new Version.parse(versions[i]); | |
50 var b = new Version.parse(versions[j]); | |
51 var expectation = i.compareTo(j); | |
52 expect(a.compareTo(b), equals(expectation)); | |
53 } | |
54 } | |
55 }); | |
56 test('operators', () { | |
57 for (var i = 0; i < versions.length; i++) { | |
58 for (var j = 0; j < versions.length; j++) { | |
59 var a = new Version.parse(versions[i]); | |
60 var b = new Version.parse(versions[j]); | |
61 expect(a < b, equals(i < j)); | |
62 expect(a > b, equals(i > j)); | |
63 expect(a <= b, equals(i <= j)); | |
64 expect(a >= b, equals(i >= j)); | |
65 expect(a == b, equals(i == j)); | |
66 expect(a != b, equals(i != j)); | |
67 } | |
68 } | |
69 }); | |
70 test('equality', () { | |
71 expect(new Version.parse('01.2.3'), equals(new Version.parse('1.2.3'))); | |
72 expect(new Version.parse('1.02.3'), equals(new Version.parse('1.2.3'))); | |
73 expect(new Version.parse('1.2.03'), equals(new Version.parse('1.2.3'))); | |
74 expect( | |
75 new Version.parse('1.2.3-01'), | |
76 equals(new Version.parse('1.2.3-1'))); | |
77 expect( | |
78 new Version.parse('1.2.3+01'), | |
79 equals(new Version.parse('1.2.3+1'))); | |
80 }); | |
81 }); | |
82 test('allows()', () { | |
83 expect(v123.allows(v123), isTrue); | |
84 expect(v123.allows(v114), isFalse); | |
85 expect(v123.allows(v124), isFalse); | |
86 }); | |
87 test('intersect()', () { | |
88 expect(v123.intersect(v123), equals(v123)); | |
89 expect(v123.intersect(v114).isEmpty, isTrue); | |
90 expect( | |
91 v123.intersect(new VersionRange(min: v114, max: v124)), | |
92 equals(v123)); | |
93 expect( | |
94 v114.intersect(new VersionRange(min: v123, max: v124)).isEmpty, | |
95 isTrue); | |
96 }); | |
97 test('isEmpty', () { | |
98 expect(v123.isEmpty, isFalse); | |
99 }); | |
100 test('nextMajor', () { | |
101 expect(v123.nextMajor, equals(v200)); | |
102 expect(v114.nextMajor, equals(v200)); | |
103 expect(v200.nextMajor, equals(v300)); | |
104 expect(new Version.parse('1.2.3-dev').nextMajor, equals(v200)); | |
105 expect(new Version.parse('2.0.0-dev').nextMajor, equals(v200)); | |
106 expect(new Version.parse('1.2.3+patch').nextMajor, equals(v200)); | |
107 }); | |
108 test('nextMinor', () { | |
109 expect(v123.nextMinor, equals(v130)); | |
110 expect(v130.nextMinor, equals(v140)); | |
111 expect(new Version.parse('1.2.3-dev').nextMinor, equals(v130)); | |
112 expect(new Version.parse('1.3.0-dev').nextMinor, equals(v130)); | |
113 expect(new Version.parse('1.2.3+patch').nextMinor, equals(v130)); | |
114 }); | |
115 test('nextPatch', () { | |
116 expect(v123.nextPatch, equals(v124)); | |
117 expect(v200.nextPatch, equals(v201)); | |
118 expect(new Version.parse('1.2.4-dev').nextPatch, equals(v124)); | |
119 expect(new Version.parse('1.2.3+patch').nextPatch, equals(v124)); | |
120 }); | |
121 test('parse()', () { | |
122 expect(new Version.parse('0.0.0'), equals(new Version(0, 0, 0))); | |
123 expect(new Version.parse('12.34.56'), equals(new Version(12, 34, 56))); | |
124 expect( | |
125 new Version.parse('1.2.3-alpha.1'), | |
126 equals(new Version(1, 2, 3, pre: 'alpha.1'))); | |
127 expect( | |
128 new Version.parse('1.2.3-x.7.z-92'), | |
129 equals(new Version(1, 2, 3, pre: 'x.7.z-92'))); | |
130 expect( | |
131 new Version.parse('1.2.3+build.1'), | |
132 equals(new Version(1, 2, 3, build: 'build.1'))); | |
133 expect( | |
134 new Version.parse('1.2.3+x.7.z-92'), | |
135 equals(new Version(1, 2, 3, build: 'x.7.z-92'))); | |
136 expect( | |
137 new Version.parse('1.0.0-rc-1+build-1'), | |
138 equals(new Version(1, 0, 0, pre: 'rc-1', build: 'build-1'))); | |
139 expect(() => new Version.parse('1.0'), throwsFormatException); | |
140 expect(() => new Version.parse('1.2.3.4'), throwsFormatException); | |
141 expect(() => new Version.parse('1234'), throwsFormatException); | |
142 expect(() => new Version.parse('-2.3.4'), throwsFormatException); | |
143 expect(() => new Version.parse('1.3-pre'), throwsFormatException); | |
144 expect(() => new Version.parse('1.3+build'), throwsFormatException); | |
145 expect(() => new Version.parse('1.3+bu?!3ild'), throwsFormatException); | |
146 }); | |
147 test('toString()', () { | |
148 expect(new Version(0, 0, 0).toString(), equals('0.0.0')); | |
149 expect(new Version(12, 34, 56).toString(), equals('12.34.56')); | |
150 expect( | |
151 new Version(1, 2, 3, pre: 'alpha.1').toString(), | |
152 equals('1.2.3-alpha.1')); | |
153 expect( | |
154 new Version(1, 2, 3, pre: 'x.7.z-92').toString(), | |
155 equals('1.2.3-x.7.z-92')); | |
156 expect( | |
157 new Version(1, 2, 3, build: 'build.1').toString(), | |
158 equals('1.2.3+build.1')); | |
159 expect( | |
160 new Version(1, 2, 3, pre: 'pre', build: 'bui').toString(), | |
161 equals('1.2.3-pre+bui')); | |
162 }); | |
163 }); | |
164 group('VersionRange', () { | |
165 group('constructor', () { | |
166 test('takes a min and max', () { | |
167 var range = new VersionRange(min: v123, max: v124); | |
168 expect(range.isAny, isFalse); | |
169 expect(range.min, equals(v123)); | |
170 expect(range.max, equals(v124)); | |
171 }); | |
172 test('allows omitting max', () { | |
173 var range = new VersionRange(min: v123); | |
174 expect(range.isAny, isFalse); | |
175 expect(range.min, equals(v123)); | |
176 expect(range.max, isNull); | |
177 }); | |
178 test('allows omitting min and max', () { | |
179 var range = new VersionRange(); | |
180 expect(range.isAny, isTrue); | |
181 expect(range.min, isNull); | |
182 expect(range.max, isNull); | |
183 }); | |
184 test('takes includeMin', () { | |
185 var range = new VersionRange(min: v123, includeMin: true); | |
186 expect(range.includeMin, isTrue); | |
187 }); | |
188 test('includeMin defaults to false if omitted', () { | |
189 var range = new VersionRange(min: v123); | |
190 expect(range.includeMin, isFalse); | |
191 }); | |
192 test('takes includeMax', () { | |
193 var range = new VersionRange(max: v123, includeMax: true); | |
194 expect(range.includeMax, isTrue); | |
195 }); | |
196 test('includeMax defaults to false if omitted', () { | |
197 var range = new VersionRange(max: v123); | |
198 expect(range.includeMax, isFalse); | |
199 }); | |
200 test('throws if min > max', () { | |
201 throwsIllegalArg(() => new VersionRange(min: v124, max: v123)); | |
202 }); | |
203 }); | |
204 group('allows()', () { | |
205 test('version must be greater than min', () { | |
206 var range = new VersionRange(min: v123); | |
207 expect(range.allows(new Version.parse('1.2.2')), isFalse); | |
208 expect(range.allows(new Version.parse('1.2.3')), isFalse); | |
209 expect(range.allows(new Version.parse('1.3.3')), isTrue); | |
210 expect(range.allows(new Version.parse('2.3.3')), isTrue); | |
211 }); | |
212 test('version must be min or greater if includeMin', () { | |
213 var range = new VersionRange(min: v123, includeMin: true); | |
214 expect(range.allows(new Version.parse('1.2.2')), isFalse); | |
215 expect(range.allows(new Version.parse('1.2.3')), isTrue); | |
216 expect(range.allows(new Version.parse('1.3.3')), isTrue); | |
217 expect(range.allows(new Version.parse('2.3.3')), isTrue); | |
218 }); | |
219 test('pre-release versions of inclusive min are excluded', () { | |
220 var range = new VersionRange(min: v123, includeMin: true); | |
221 expect(range.allows(new Version.parse('1.2.3-dev')), isFalse); | |
222 expect(range.allows(new Version.parse('1.2.4-dev')), isTrue); | |
223 }); | |
224 test('version must be less than max', () { | |
225 var range = new VersionRange(max: v234); | |
226 expect(range.allows(new Version.parse('2.3.3')), isTrue); | |
227 expect(range.allows(new Version.parse('2.3.4')), isFalse); | |
228 expect(range.allows(new Version.parse('2.4.3')), isFalse); | |
229 }); | |
230 test('pre-release versions of non-pre-release max are excluded', () { | |
231 var range = new VersionRange(max: v234); | |
232 expect(range.allows(new Version.parse('2.3.3')), isTrue); | |
233 expect(range.allows(new Version.parse('2.3.4-dev')), isFalse); | |
234 expect(range.allows(new Version.parse('2.3.4')), isFalse); | |
235 }); | |
236 test('pre-release versions of pre-release max are included', () { | |
237 var range = new VersionRange(max: new Version.parse('2.3.4-dev.2')); | |
238 expect(range.allows(new Version.parse('2.3.4-dev.1')), isTrue); | |
239 expect(range.allows(new Version.parse('2.3.4-dev.2')), isFalse); | |
240 expect(range.allows(new Version.parse('2.3.4-dev.3')), isFalse); | |
241 }); | |
242 test('version must be max or less if includeMax', () { | |
243 var range = new VersionRange(min: v123, max: v234, includeMax: true); | |
244 expect(range.allows(new Version.parse('2.3.3')), isTrue); | |
245 expect(range.allows(new Version.parse('2.3.4')), isTrue); | |
246 expect(range.allows(new Version.parse('2.4.3')), isFalse); | |
247 expect(range.allows(new Version.parse('2.3.4-dev')), isTrue); | |
248 }); | |
249 test('has no min if one was not set', () { | |
250 var range = new VersionRange(max: v123); | |
251 expect(range.allows(new Version.parse('0.0.0')), isTrue); | |
252 expect(range.allows(new Version.parse('1.2.3')), isFalse); | |
253 }); | |
254 test('has no max if one was not set', () { | |
255 var range = new VersionRange(min: v123); | |
256 expect(range.allows(new Version.parse('1.2.3')), isFalse); | |
257 expect(range.allows(new Version.parse('1.3.3')), isTrue); | |
258 expect(range.allows(new Version.parse('999.3.3')), isTrue); | |
259 }); | |
260 test('allows any version if there is no min or max', () { | |
261 var range = new VersionRange(); | |
262 expect(range.allows(new Version.parse('0.0.0')), isTrue); | |
263 expect(range.allows(new Version.parse('999.99.9')), isTrue); | |
264 }); | |
265 }); | |
266 group('intersect()', () { | |
267 test('two overlapping ranges', () { | |
268 var a = new VersionRange(min: v123, max: v250); | |
269 var b = new VersionRange(min: v200, max: v300); | |
270 var intersect = a.intersect(b); | |
271 expect(intersect.min, equals(v200)); | |
272 expect(intersect.max, equals(v250)); | |
273 expect(intersect.includeMin, isFalse); | |
274 expect(intersect.includeMax, isFalse); | |
275 }); | |
276 test('a non-overlapping range allows no versions', () { | |
277 var a = new VersionRange(min: v114, max: v124); | |
278 var b = new VersionRange(min: v200, max: v250); | |
279 expect(a.intersect(b).isEmpty, isTrue); | |
280 }); | |
281 test('adjacent ranges allow no versions if exclusive', () { | |
282 var a = new VersionRange(min: v114, max: v124, includeMax: false); | |
283 var b = new VersionRange(min: v124, max: v200, includeMin: true); | |
284 expect(a.intersect(b).isEmpty, isTrue); | |
285 }); | |
286 test('adjacent ranges allow version if inclusive', () { | |
287 var a = new VersionRange(min: v114, max: v124, includeMax: true); | |
288 var b = new VersionRange(min: v124, max: v200, includeMin: true); | |
289 expect(a.intersect(b), equals(v124)); | |
290 }); | |
291 test('with an open range', () { | |
292 var open = new VersionRange(); | |
293 var a = new VersionRange(min: v114, max: v124); | |
294 expect(open.intersect(open), equals(open)); | |
295 expect(a.intersect(open), equals(a)); | |
296 }); | |
297 test('returns the version if the range allows it', () { | |
298 expect( | |
299 new VersionRange(min: v114, max: v124).intersect(v123), | |
300 equals(v123)); | |
301 expect( | |
302 new VersionRange(min: v123, max: v124).intersect(v114).isEmpty, | |
303 isTrue); | |
304 }); | |
305 }); | |
306 test('isEmpty', () { | |
307 expect(new VersionRange().isEmpty, isFalse); | |
308 expect(new VersionRange(min: v123, max: v124).isEmpty, isFalse); | |
309 }); | |
310 }); | |
311 group('VersionConstraint', () { | |
312 test('any', () { | |
313 expect(VersionConstraint.any.isAny, isTrue); | |
314 expect( | |
315 VersionConstraint.any, | |
316 allows( | |
317 [ | |
318 new Version.parse('0.0.0-blah'), | |
319 new Version.parse('1.2.3'), | |
320 new Version.parse('12345.678.90')])); | |
321 }); | |
322 test('empty', () { | |
323 expect(VersionConstraint.empty.isEmpty, isTrue); | |
324 expect(VersionConstraint.empty.isAny, isFalse); | |
325 expect( | |
326 VersionConstraint.empty, | |
327 doesNotAllow( | |
328 [ | |
329 new Version.parse('0.0.0-blah'), | |
330 new Version.parse('1.2.3'), | |
331 new Version.parse('12345.678.90')])); | |
332 }); | |
333 group('parse()', () { | |
334 test('parses an exact version', () { | |
335 var constraint = new VersionConstraint.parse('1.2.3-alpha'); | |
336 expect(constraint is Version, isTrue); | |
337 expect(constraint, equals(new Version(1, 2, 3, pre: 'alpha'))); | |
338 }); | |
339 test('parses "any"', () { | |
340 var constraint = new VersionConstraint.parse('any'); | |
341 expect(constraint is VersionConstraint, isTrue); | |
342 expect( | |
343 constraint, | |
344 allows( | |
345 [ | |
346 new Version.parse('0.0.0'), | |
347 new Version.parse('1.2.3'), | |
348 new Version.parse('12345.678.90')])); | |
349 }); | |
350 test('parses a ">" minimum version', () { | |
351 expect( | |
352 new VersionConstraint.parse('>1.2.3'), | |
353 allows([new Version.parse('1.2.3+foo'), new Version.parse('1.2.4')])
); | |
354 expect( | |
355 new VersionConstraint.parse('>1.2.3'), | |
356 doesNotAllow( | |
357 [ | |
358 new Version.parse('1.2.1'), | |
359 new Version.parse('1.2.3-build'), | |
360 new Version.parse('1.2.3')])); | |
361 }); | |
362 test('parses a ">=" minimum version', () { | |
363 expect( | |
364 new VersionConstraint.parse('>=1.2.3'), | |
365 allows( | |
366 [ | |
367 new Version.parse('1.2.3'), | |
368 new Version.parse('1.2.3+foo'), | |
369 new Version.parse('1.2.4')])); | |
370 expect( | |
371 new VersionConstraint.parse('>=1.2.3'), | |
372 doesNotAllow([new Version.parse('1.2.1'), new Version.parse('1.2.3-b
uild')])); | |
373 }); | |
374 test('parses a "<" maximum version', () { | |
375 expect( | |
376 new VersionConstraint.parse('<1.2.3'), | |
377 allows([new Version.parse('1.2.1'), new Version.parse('1.2.2+foo')])
); | |
378 expect( | |
379 new VersionConstraint.parse('<1.2.3'), | |
380 doesNotAllow( | |
381 [ | |
382 new Version.parse('1.2.3'), | |
383 new Version.parse('1.2.3+foo'), | |
384 new Version.parse('1.2.4')])); | |
385 }); | |
386 test('parses a "<=" maximum version', () { | |
387 expect( | |
388 new VersionConstraint.parse('<=1.2.3'), | |
389 allows( | |
390 [ | |
391 new Version.parse('1.2.1'), | |
392 new Version.parse('1.2.3-build'), | |
393 new Version.parse('1.2.3')])); | |
394 expect( | |
395 new VersionConstraint.parse('<=1.2.3'), | |
396 doesNotAllow([new Version.parse('1.2.3+foo'), new Version.parse('1.2
.4')])); | |
397 }); | |
398 test('parses a series of space-separated constraints', () { | |
399 var constraint = new VersionConstraint.parse('>1.0.0 >=1.2.3 <1.3.0'); | |
400 expect( | |
401 constraint, | |
402 allows([new Version.parse('1.2.3'), new Version.parse('1.2.5')])); | |
403 expect( | |
404 constraint, | |
405 doesNotAllow( | |
406 [ | |
407 new Version.parse('1.2.3-pre'), | |
408 new Version.parse('1.3.0'), | |
409 new Version.parse('3.4.5')])); | |
410 }); | |
411 test('ignores whitespace around operators', () { | |
412 var constraint = new VersionConstraint.parse(' >1.0.0>=1.2.3 < 1.3.0'); | |
413 expect( | |
414 constraint, | |
415 allows([new Version.parse('1.2.3'), new Version.parse('1.2.5')])); | |
416 expect( | |
417 constraint, | |
418 doesNotAllow( | |
419 [ | |
420 new Version.parse('1.2.3-pre'), | |
421 new Version.parse('1.3.0'), | |
422 new Version.parse('3.4.5')])); | |
423 }); | |
424 test('does not allow "any" to be mixed with other constraints', () { | |
425 expect( | |
426 () => new VersionConstraint.parse('any 1.0.0'), | |
427 throwsFormatException); | |
428 }); | |
429 test('throws FormatException on a bad string', () { | |
430 var bad = [ | |
431 "", | |
432 " ", | |
433 "foo", | |
434 ">foo", | |
435 "1.0.0 foo", | |
436 "1.0.0foo", | |
437 "anything", | |
438 "<>1.0.0", | |
439 "1.0.0<"]; | |
440 for (var text in bad) { | |
441 expect( | |
442 () => new VersionConstraint.parse(text), | |
443 throwsFormatException); | |
444 } | |
445 }); | |
446 }); | |
447 }); | |
448 } | |
449 class VersionConstraintMatcher implements Matcher { | |
450 final List<Version> _expected; | |
451 final bool _allow; | |
452 VersionConstraintMatcher(this._expected, this._allow); | |
453 bool matches(item, Map matchState) => | |
454 (item is VersionConstraint) && | |
455 _expected.every((version) => item.allows(version) == _allow); | |
456 Description describe(Description description) => | |
457 description.add(' ${_allow ? "allows" : "does not allow"} versions'); | |
458 Description describeMismatch(item, Description mismatchDescription, | |
459 Map matchState, bool verbose) { | |
460 if (item is! VersionConstraint) { | |
461 mismatchDescription.add('was not a VersionConstraint'); | |
462 return mismatchDescription; | |
463 } | |
464 bool first = true; | |
465 for (var version in _expected) { | |
466 if (item.allows(version) != _allow) { | |
467 if (first) { | |
468 if (_allow) { | |
469 mismatchDescription.addDescriptionOf(item).add('did not allow '); | |
470 } else { | |
471 mismatchDescription.addDescriptionOf(item).add('allowed '); | |
472 } | |
473 } else { | |
474 mismatchDescription.add(' and '); | |
475 } | |
476 first = false; | |
477 mismatchDescription.add(version.toString()); | |
478 } | |
479 } | |
480 return mismatchDescription; | |
481 } | |
482 } | |
483 Matcher allows(List<Version> versions) => | |
484 new VersionConstraintMatcher(versions, true); | |
485 Matcher doesNotAllow(List<Version> versions) => | |
486 new VersionConstraintMatcher(versions, false); | |
487 throwsIllegalArg(function) { | |
488 expect(function, throwsA((e) => e is ArgumentError)); | |
489 } | |
OLD | NEW |