Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(145)

Side by Side Diff: utils/tests/pub/version_test.dart

Issue 10540151: First pass at version constraint solver. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Request all versions from the source, and not just the best. Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « utils/tests/pub/version_solver_test.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #library('version_test'); 5 #library('version_test');
6 6
7 #import('../../../lib/unittest/unittest.dart'); 7 #import('../../../lib/unittest/unittest.dart');
8 #import('../../pub/utils.dart'); 8 #import('../../pub/utils.dart');
9 #import('../../pub/version.dart'); 9 #import('../../pub/version.dart');
10 10
11 main() { 11 main() {
12 final v123 = new Version.parse('1.2.3');
13 final v114 = new Version.parse('1.1.4');
14 final v124 = new Version.parse('1.2.4');
15 final v200 = new Version.parse('2.0.0');
16 final v234 = new Version.parse('2.3.4');
17 final v250 = new Version.parse('2.5.0');
18 final v300 = new Version.parse('3.0.0');
19
12 group('Version', () { 20 group('Version', () {
13 test('none', () { 21 test('none', () {
14 expect(Version.none.toString(), equals('0.0.0')); 22 expect(Version.none.toString(), equals('0.0.0'));
15 }); 23 });
16 24
17 group('constructor', () { 25 group('constructor', () {
18 test('throws on negative numbers', () { 26 test('throws on negative numbers', () {
19 throwsIllegalArg(() => new Version(-1, 1, 1)); 27 throwsIllegalArg(() => new Version(-1, 1, 1));
20 throwsIllegalArg(() => new Version(1, -1, 1)); 28 throwsIllegalArg(() => new Version(1, -1, 1));
21 throwsIllegalArg(() => new Version(1, 1, -1)); 29 throwsIllegalArg(() => new Version(1, 1, -1));
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 expect(a <= b, equals(i <= j)); 74 expect(a <= b, equals(i <= j));
67 expect(a >= b, equals(i >= j)); 75 expect(a >= b, equals(i >= j));
68 expect(a == b, equals(i == j)); 76 expect(a == b, equals(i == j));
69 expect(a != b, equals(i != j)); 77 expect(a != b, equals(i != j));
70 } 78 }
71 } 79 }
72 }); 80 });
73 }); 81 });
74 82
75 test('allows()', () { 83 test('allows()', () {
76 expect(new Version.parse('1.2.3').allows(new Version.parse('1.2.3'))); 84 expect(v123.allows(v123));
77 expect(!new Version.parse('1.2.3').allows(new Version.parse('1.1.4'))); 85 expect(!v123.allows(v114));
78 expect(!new Version.parse('1.2.3').allows(new Version.parse('1.2.4'))); 86 expect(!v123.allows(v124));
87 });
88
89 test('intersect()', () {
90 // Intersecting the same version returns the version.
91 expect(v123.intersect(v123), equals(v123));
92
93 // Intersecting a different version allows no versions.
94 expect(v123.intersect(v114).isEmpty);
95
96 // Intersecting a range returns the version if the range allows it.
97 expect(v123.intersect(new VersionRange(v114, v124)), equals(v123));
98
99 // Intersecting a range allows no versions if the range doesn't allow it.
100 expect(v114.intersect(new VersionRange(v123, v124)).isEmpty);
101 });
102
103 test('isEmpty', () {
104 expect(!v123.isEmpty);
79 }); 105 });
80 106
81 test('parse()', () { 107 test('parse()', () {
82 expect(new Version.parse('0.0.0'), equals(new Version(0, 0, 0))); 108 expect(new Version.parse('0.0.0'), equals(new Version(0, 0, 0)));
83 expect(new Version.parse('12.34.56'), equals(new Version(12, 34, 56))); 109 expect(new Version.parse('12.34.56'), equals(new Version(12, 34, 56)));
84 110
85 expect(new Version.parse('1.2.3-alpha.1'), equals( 111 expect(new Version.parse('1.2.3-alpha.1'), equals(
86 new Version(1, 2, 3, pre: 'alpha.1'))); 112 new Version(1, 2, 3, pre: 'alpha.1')));
87 expect(new Version.parse('1.2.3-x.7.z-92'), equals( 113 expect(new Version.parse('1.2.3-x.7.z-92'), equals(
88 new Version(1, 2, 3, pre: 'x.7.z-92'))); 114 new Version(1, 2, 3, pre: 'x.7.z-92')));
(...skipping 27 matching lines...) Expand all
116 expect(new Version(1, 2, 3, build: 'build.1').toString(), equals( 142 expect(new Version(1, 2, 3, build: 'build.1').toString(), equals(
117 '1.2.3+build.1')); 143 '1.2.3+build.1'));
118 expect(new Version(1, 2, 3, pre: 'pre', build: 'bui').toString(), equals( 144 expect(new Version(1, 2, 3, pre: 'pre', build: 'bui').toString(), equals(
119 '1.2.3-pre+bui')); 145 '1.2.3-pre+bui'));
120 }); 146 });
121 }); 147 });
122 148
123 group('VersionRange', () { 149 group('VersionRange', () {
124 group('constructor', () { 150 group('constructor', () {
125 test('takes a min and max', () { 151 test('takes a min and max', () {
126 var min = new Version.parse('1.2.3'); 152 var range = new VersionRange(v123, v124);
127 var max = new Version.parse('1.3.5'); 153 expect(range.min, equals(v123));
128 var range = new VersionRange(min, max); 154 expect(range.max, equals(v124));
129 expect(range.min, equals(min));
130 expect(range.max, equals(max));
131 }); 155 });
132 156
133 test('allows omitting max', () { 157 test('allows omitting max', () {
134 var min = new Version.parse('1.2.3'); 158 var range = new VersionRange(v123);
135 var range = new VersionRange(min); 159 expect(range.min, equals(v123));
136 expect(range.min, equals(min));
137 expect(range.max, isNull); 160 expect(range.max, isNull);
138 }); 161 });
139 162
140 test('allows omitting min and max', () { 163 test('allows omitting min and max', () {
141 var range = new VersionRange(); 164 var range = new VersionRange();
142 expect(range.min, isNull); 165 expect(range.min, isNull);
143 expect(range.max, isNull); 166 expect(range.max, isNull);
144 }); 167 });
145 168
169 test('takes includeMin', () {
170 var range = new VersionRange(min: v123, includeMin: true);
171 expect(range.includeMin);
172 });
173
174 test('includeMin defaults to false if omitted', () {
175 var range = new VersionRange(min: v123);
176 expect(range.includeMin, isFalse);
177 });
178
179 test('takes includeMax', () {
180 var range = new VersionRange(max: v123, includeMax: true);
181 expect(range.includeMax);
182 });
183
184 test('includeMax defaults to false if omitted', () {
185 var range = new VersionRange(max: v123);
186 expect(range.includeMax, isFalse);
187 });
188
146 test('throws if min > max', () { 189 test('throws if min > max', () {
147 var min = new Version.parse('1.2.3'); 190 throwsIllegalArg(() => new VersionRange(v124, v123));
148 var max = new Version.parse('1.0.0');
149
150 throwsIllegalArg(() => new VersionRange(min, max));
151 }); 191 });
152 }); 192 });
153 193
154 group('allows()', () { 194 group('allows()', () {
155 test('version must be min or greater', () { 195 test('version must be greater than min', () {
156 var range = new VersionRange( 196 var range = new VersionRange(v123, v234);
157 new Version.parse('1.2.3'), new Version.parse('2.3.4')); 197
198 expect(!range.allows(new Version.parse('1.2.2')));
199 expect(!range.allows(new Version.parse('1.2.3')));
200 expect(range.allows(new Version.parse('1.3.3')));
201 expect(range.allows(new Version.parse('2.3.3')));
202 });
203
204 test('version must be min or greater if includeMin', () {
205 var range = new VersionRange(v123, v234, includeMin: true);
158 206
159 expect(!range.allows(new Version.parse('1.2.2'))); 207 expect(!range.allows(new Version.parse('1.2.2')));
160 expect(range.allows(new Version.parse('1.2.3'))); 208 expect(range.allows(new Version.parse('1.2.3')));
161 expect(range.allows(new Version.parse('1.3.3'))); 209 expect(range.allows(new Version.parse('1.3.3')));
162 expect(range.allows(new Version.parse('2.3.3'))); 210 expect(range.allows(new Version.parse('2.3.3')));
163 }); 211 });
164 212
165 test('version must be less than max', () { 213 test('version must be less than max', () {
166 var range = new VersionRange( 214 var range = new VersionRange(v123, v234);
167 new Version.parse('1.2.3'), new Version.parse('2.3.4'));
168 215
169 expect(range.allows(new Version.parse('2.3.3'))); 216 expect(range.allows(new Version.parse('2.3.3')));
170 expect(!range.allows(new Version.parse('2.3.4'))); 217 expect(!range.allows(new Version.parse('2.3.4')));
171 expect(!range.allows(new Version.parse('2.4.3'))); 218 expect(!range.allows(new Version.parse('2.4.3')));
172 }); 219 });
173 220
221 test('version must be max or less if includeMax', () {
222 var range = new VersionRange(v123, v234, includeMax: true);
223
224 expect(range.allows(new Version.parse('2.3.3')));
225 expect(range.allows(new Version.parse('2.3.4')));
226 expect(!range.allows(new Version.parse('2.4.3')));
227 });
228
174 test('has no min if one was not set', () { 229 test('has no min if one was not set', () {
175 var range = new VersionRange(max: new Version.parse('1.2.3')); 230 var range = new VersionRange(max: v123);
176 231
177 expect(range.allows(new Version.parse('0.0.0'))); 232 expect(range.allows(new Version.parse('0.0.0')));
178 expect(!range.allows(new Version.parse('1.2.3'))); 233 expect(!range.allows(new Version.parse('1.2.3')));
179 }); 234 });
180 235
181 test('has no max if one was not set', () { 236 test('has no max if one was not set', () {
182 var range = new VersionRange(new Version.parse('1.2.3')); 237 var range = new VersionRange(v123);
183 238
184 expect(range.allows(new Version.parse('1.2.3'))); 239 expect(!range.allows(new Version.parse('1.2.3')));
185 expect(range.allows(new Version.parse('1.3.3'))); 240 expect(range.allows(new Version.parse('1.3.3')));
186 expect(range.allows(new Version.parse('999.3.3'))); 241 expect(range.allows(new Version.parse('999.3.3')));
187 }); 242 });
188 243
189 test('allows any version if there is no min or max', () { 244 test('allows any version if there is no min or max', () {
190 var range = new VersionRange(); 245 var range = new VersionRange();
191 246
192 expect(range.allows(new Version.parse('0.0.0'))); 247 expect(range.allows(new Version.parse('0.0.0')));
193 expect(range.allows(new Version.parse('999.99.9'))); 248 expect(range.allows(new Version.parse('999.99.9')));
194 }); 249 });
195 }); 250 });
251
252 group('intersect()', () {
253 test('two overlapping ranges', () {
254 var a = new VersionRange(v123, v250);
255 var b = new VersionRange(v200, v300);
256 var intersect = a.intersect(b);
257 expect(intersect.min, equals(v200));
258 expect(intersect.max, equals(v250));
259 expect(intersect.includeMin, isFalse);
260 expect(intersect.includeMax, isFalse);
261 });
262
263 test('a non-overlapping range allows no versions', () {
264 var a = new VersionRange(v114, v124);
265 var b = new VersionRange(v200, v250);
266 expect(a.intersect(b).isEmpty);
267 });
268
269 test('adjacent ranges allow no versions if exclusive', () {
270 var a = new VersionRange(v114, v124, includeMax: false);
271 var b = new VersionRange(v124, v200, includeMin: true);
272 expect(a.intersect(b).isEmpty);
273 });
274
275 test('adjacent ranges allow version if inclusive', () {
276 var a = new VersionRange(v114, v124, includeMax: true);
277 var b = new VersionRange(v124, v200, includeMin: true);
278 expect(a.intersect(b), equals(v124));
279 });
280
281 test('with an open range', () {
282 var open = new VersionRange();
283 var a = new VersionRange(v114, v124);
284 expect(open.intersect(open), equals(open));
285 expect(a.intersect(open), equals(a));
286 });
287
288 test('returns the version if the range allows it', () {
289 expect(new VersionRange(v114, v124).intersect(v123), equals(v123));
290 expect(new VersionRange(v123, v124).intersect(v114).isEmpty);
291 });
292 });
293
294 test('isEmpty', () {
295 expect(new VersionRange().isEmpty, isFalse);
296 expect(new VersionRange(v123, v124).isEmpty, isFalse);
297 });
298 });
299
300 group('VersionConstraint', () {
301 test('empty', () {
302 expect(new VersionConstraint.empty().isEmpty);
303 });
304
305 group('parse()', () {
306 test('parses an exact version', () {
307 var constraint = new VersionConstraint.parse('1.2.3-alpha');
308 expect(constraint is Version);
309 expect(constraint, equals(new Version(1, 2, 3, pre: 'alpha')));
310 });
311
312 test('parses "any"', () {
313 var constraint = new VersionConstraint.parse('any');
314 expect(constraint is VersionConstraint);
315 expect(constraint, allows([
316 new Version.parse('0.0.0'),
317 new Version.parse('1.2.3'),
318 new Version.parse('12345.678.90')]));
319 });
320
321 test('parses a ">" minimum version', () {
322 expect(new VersionConstraint.parse('>1.2.3'), allows([
323 new Version.parse('1.2.3+foo'),
324 new Version.parse('1.2.4')]));
325 expect(new VersionConstraint.parse('>1.2.3'), doesNotAllow([
326 new Version.parse('1.2.1'),
327 new Version.parse('1.2.3-build'),
328 new Version.parse('1.2.3')]));
329 });
330
331 test('parses a ">=" minimum version', () {
332 expect(new VersionConstraint.parse('>=1.2.3'), allows([
333 new Version.parse('1.2.3'),
334 new Version.parse('1.2.3+foo'),
335 new Version.parse('1.2.4')]));
336 expect(new VersionConstraint.parse('>=1.2.3'), doesNotAllow([
337 new Version.parse('1.2.1'),
338 new Version.parse('1.2.3-build')]));
339 });
340
341 test('parses a "<" maximum version', () {
342 expect(new VersionConstraint.parse('<1.2.3'), allows([
343 new Version.parse('1.2.1'),
344 new Version.parse('1.2.3-build')]));
345 expect(new VersionConstraint.parse('<1.2.3'), doesNotAllow([
346 new Version.parse('1.2.3'),
347 new Version.parse('1.2.3+foo'),
348 new Version.parse('1.2.4')]));
349 });
350
351 test('parses a "<=" maximum version', () {
352 expect(new VersionConstraint.parse('<=1.2.3'), allows([
353 new Version.parse('1.2.1'),
354 new Version.parse('1.2.3-build'),
355 new Version.parse('1.2.3')]));
356 expect(new VersionConstraint.parse('<=1.2.3'), doesNotAllow([
357 new Version.parse('1.2.3+foo'),
358 new Version.parse('1.2.4')]));
359 });
360
361 test('parses a series of space-separated constraints', () {
362 var constraint = new VersionConstraint.parse('>1.0.0 >=1.2.3 <1.3.0');
363 expect(constraint, allows([
364 new Version.parse('1.2.3'),
365 new Version.parse('1.2.5')]));
366 expect(constraint, doesNotAllow([
367 new Version.parse('1.2.3-pre'),
368 new Version.parse('1.3.0'),
369 new Version.parse('3.4.5')]));
370 });
371
372 test('throws FormatException on a bad string', () {
373 throwsBadFormat(() => new VersionConstraint.parse(''));
374 throwsBadFormat(() => new VersionConstraint.parse(' '));
375 throwsBadFormat(() => new VersionConstraint.parse('not a version'));
376 });
377 });
196 }); 378 });
197 } 379 }
198 380
381 class VersionConstraintMatcher implements Matcher {
382 final List<Version> _expected;
383 final bool _allow;
384
385 VersionConstraintMatcher(this._expected, this._allow);
386
387 bool matches(item) => (item is VersionConstraint) &&
388 _expected.every((version) => item.allows(version) == _allow);
389
390 Description describe(Description description) =>
391 description.add(' ${_allow ? "allows" : "does not allow"} versions');
392
393 Description describeMismatch(item, Description mismatchDescription) {
394 if (item is! VersionConstraint) {
395 mismatchDescription.add('was not a VersionConstraint');
396 return mismatchDescription;
397 }
398
399 bool first = true;
400 for (var version in _expected) {
401 if (item.allows(version) != _allow) {
402 if (first) {
403 if (_allow) {
404 mismatchDescription.addDescriptionOf(item).add('did not allow ');
405 } else {
406 mismatchDescription.addDescriptionOf(item).add('allowed ');
407 }
408 } else {
409 mismatchDescription.add(' and ');
410 }
411 first = false;
412
413 mismatchDescription.add(version.toString());
414 }
415 }
416
417 return mismatchDescription;
418 }
419 }
420
421 Matcher allows(List<Version> versions) =>
422 new VersionConstraintMatcher(versions, true);
423
424 Matcher doesNotAllow(List<Version> versions) =>
425 new VersionConstraintMatcher(versions, false);
426
199 throwsIllegalArg(function) { 427 throwsIllegalArg(function) {
200 expectThrow(function, (e) => e is IllegalArgumentException); 428 expectThrow(function, (e) => e is IllegalArgumentException);
201 } 429 }
202 430
203 throwsBadFormat(function) { 431 throwsBadFormat(function) {
204 expectThrow(function, (e) => e is FormatException); 432 expectThrow(function, (e) => e is FormatException);
205 } 433 }
OLDNEW
« no previous file with comments | « utils/tests/pub/version_solver_test.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698