OLD | NEW |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |