Chromium Code Reviews| Index: test/version_union_test.dart |
| diff --git a/test/version_union_test.dart b/test/version_union_test.dart |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..167322d8936cfb37a697e442ba46429bdb8435f3 |
| --- /dev/null |
| +++ b/test/version_union_test.dart |
| @@ -0,0 +1,348 @@ |
| +// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| +// for details. All rights reserved. Use of this source code is governed by a |
| +// BSD-style license that can be found in the LICENSE file. |
| + |
| +import 'package:test/test.dart'; |
| + |
| +import 'package:pub_semver/pub_semver.dart'; |
| + |
| +import 'utils.dart'; |
| + |
| +main() { |
| + group('factory', () { |
|
Bob Nystrom
2015/05/05 20:49:09
Test an empty list.
nweiz
2015/05/05 22:52:34
Done.
|
| + test('ignores empty constraints', () { |
| + expect(new VersionConstraint.unionOf([ |
| + VersionConstraint.empty, |
| + VersionConstraint.empty, |
| + v123, |
| + VersionConstraint.empty |
| + ]), equals(v123)); |
| + |
| + expect(new VersionConstraint.unionOf([ |
| + VersionConstraint.empty, |
| + VersionConstraint.empty |
| + ]), isEmpty); |
| + }); |
| + |
| + test('any constraints override everything', () { |
| + expect(new VersionConstraint.unionOf([ |
| + v123, |
| + VersionConstraint.any, |
| + v200, |
| + new VersionRange(min: v234, max: v250) |
| + ]), equals(VersionConstraint.any)); |
| + }); |
| + |
| + test('flattens other unions', () { |
| + expect(new VersionConstraint.unionOf([ |
| + v072, |
| + new VersionConstraint.unionOf([v123, v124]), |
| + v250 |
| + ]), equals(new VersionConstraint.unionOf([v072, v123, v124, v250]))); |
| + }); |
| + |
| + test('returns a single merged range as-is', () { |
| + expect(new VersionConstraint.unionOf([ |
| + new VersionRange(min: v080, max: v140), |
| + new VersionRange(min: v123, max: v200) |
| + ]), equals(new VersionRange(min: v080, max: v200))); |
| + }); |
| + }); |
| + |
| + group('equality', () { |
| + test("doesn't depend on original order", () { |
| + expect(new VersionConstraint.unionOf([ |
| + v250, |
| + new VersionRange(min: v201, max: v234), |
| + v124, |
| + v072, |
| + new VersionRange(min: v080, max: v114), |
| + v123 |
| + ]), equals(new VersionConstraint.unionOf([ |
| + v072, |
| + new VersionRange(min: v080, max: v114), |
| + v123, |
| + v124, |
| + new VersionRange(min: v201, max: v234), |
| + v250 |
| + ]))); |
| + }); |
| + |
| + test("merges overlapping ranges", () { |
| + expect(new VersionConstraint.unionOf([ |
| + new VersionRange(min: v003, max: v072), |
| + new VersionRange(min: v010, max: v080), |
| + new VersionRange(min: v114, max: v124), |
| + new VersionRange(min: v123, max: v130) |
| + ]), equals(new VersionConstraint.unionOf([ |
| + new VersionRange(min: v003, max: v080), |
| + new VersionRange(min: v114, max: v130) |
| + ]))); |
| + }); |
| + |
| + test("merges adjacent ranges", () { |
| + expect(new VersionConstraint.unionOf([ |
| + new VersionRange(min: v003, max: v072, includeMax: true), |
| + new VersionRange(min: v072, max: v080), |
| + new VersionRange(min: v114, max: v124), |
| + new VersionRange(min: v124, max: v130, includeMin: true) |
| + ]), equals(new VersionConstraint.unionOf([ |
| + new VersionRange(min: v003, max: v080), |
| + new VersionRange(min: v114, max: v130) |
| + ]))); |
| + }); |
| + |
| + test("doesn't merge not-quite-adjacent ranges", () { |
| + expect(new VersionConstraint.unionOf([ |
| + new VersionRange(min: v003, max: v072), |
| + new VersionRange(min: v072, max: v080) |
| + ]), equals(new VersionConstraint.unionOf([ |
| + new VersionRange(min: v003, max: v072), |
| + new VersionRange(min: v072, max: v080) |
| + ]))); |
| + }); |
| + |
| + test("merges version numbers into ranges", () { |
| + expect(new VersionConstraint.unionOf([ |
| + new VersionRange(min: v003, max: v072), |
| + v010, |
| + new VersionRange(min: v114, max: v124), |
| + v123 |
| + ]), equals(new VersionConstraint.unionOf([ |
| + new VersionRange(min: v003, max: v072), |
| + new VersionRange(min: v114, max: v124) |
| + ]))); |
| + }); |
| + |
| + test("merges adjacent version numbers into ranges", () { |
| + expect(new VersionConstraint.unionOf([ |
| + new VersionRange(min: v003, max: v072), |
| + v072, |
| + v114, |
| + new VersionRange(min: v114, max: v124) |
| + ]), equals(new VersionConstraint.unionOf([ |
| + new VersionRange(min: v003, max: v072, includeMax: true), |
| + new VersionRange(min: v114, max: v124, includeMin: true) |
| + ]))); |
| + }); |
| + }); |
| + |
| + test('isEmpty returns false', () { |
| + expect(new VersionConstraint.unionOf([ |
| + new VersionRange(min: v003, max: v080), |
| + new VersionRange(min: v123, max: v130), |
| + ]), isNot(isEmpty)); |
| + }); |
| + |
| + test('isAny returns false', () { |
| + expect(new VersionConstraint.unionOf([ |
| + new VersionRange(min: v003, max: v080), |
| + new VersionRange(min: v123, max: v130), |
| + ]).isAny, isFalse); |
| + }); |
| + |
| + test('allows() allows anything the components allow', () { |
| + var union = new VersionConstraint.unionOf([ |
| + new VersionRange(min: v003, max: v080), |
| + new VersionRange(min: v123, max: v130), |
| + v200 |
| + ]); |
| + |
| + expect(union, allows(v010)); |
| + expect(union, doesNotAllow(v080)); |
| + expect(union, allows(v124)); |
| + expect(union, doesNotAllow(v140)); |
| + expect(union, allows(v200)); |
| + }); |
| + |
| + group('allowsAll()', () { |
| + test('for a version, returns true if any component allows the version', () { |
| + var union = new VersionConstraint.unionOf([ |
| + new VersionRange(min: v003, max: v080), |
| + new VersionRange(min: v123, max: v130), |
| + v200 |
| + ]); |
| + |
| + expect(union.allowsAll(v010), isTrue); |
| + expect(union.allowsAll(v080), isFalse); |
| + expect(union.allowsAll(v124), isTrue); |
| + expect(union.allowsAll(v140), isFalse); |
| + expect(union.allowsAll(v200), isTrue); |
| + }); |
| + |
| + test('for a version range, returns true if any component allows the whole ' |
| + 'range', () { |
| + var union = new VersionConstraint.unionOf([ |
| + new VersionRange(min: v003, max: v080), |
| + new VersionRange(min: v123, max: v130) |
| + ]); |
| + |
| + expect(union.allowsAll(new VersionRange(min: v003, max: v080)), isTrue); |
| + expect(union.allowsAll(new VersionRange(min: v010, max: v072)), isTrue); |
| + expect(union.allowsAll(new VersionRange(min: v010, max: v124)), isFalse); |
| + }); |
| + |
| + group('for a union,', () { |
| + var union = new VersionConstraint.unionOf([ |
| + new VersionRange(min: v003, max: v080), |
| + new VersionRange(min: v123, max: v130) |
| + ]); |
| + |
| + test('returns true if every constraint matches a different constraint', |
| + () { |
| + expect(union.allowsAll(new VersionConstraint.unionOf([ |
| + new VersionRange(min: v010, max: v072), |
| + new VersionRange(min: v124, max: v130) |
| + ])), isTrue); |
| + }); |
| + |
| + test('returns true if every constraint matches the same constraint', () { |
| + expect(union.allowsAll(new VersionConstraint.unionOf([ |
| + new VersionRange(min: v003, max: v010), |
| + new VersionRange(min: v072, max: v080) |
| + ])), isTrue); |
| + }); |
| + |
| + test("returns false if there's an unmatched constraint", () { |
| + expect(union.allowsAll(new VersionConstraint.unionOf([ |
| + new VersionRange(min: v010, max: v072), |
| + new VersionRange(min: v124, max: v130), |
| + new VersionRange(min: v140, max: v200) |
| + ])), isFalse); |
| + }); |
| + |
| + test("returns false if a constraint isn't fully matched", () { |
| + expect(union.allowsAll(new VersionConstraint.unionOf([ |
| + new VersionRange(min: v010, max: v114), |
| + new VersionRange(min: v124, max: v130) |
| + ])), isFalse); |
| + }); |
| + }); |
| + }); |
| + |
| + group('allowsAny()', () { |
| + test('for a version, returns true if any component allows the version', () { |
| + var union = new VersionConstraint.unionOf([ |
| + new VersionRange(min: v003, max: v080), |
| + new VersionRange(min: v123, max: v130), |
| + v200 |
| + ]); |
| + |
| + expect(union.allowsAny(v010), isTrue); |
| + expect(union.allowsAny(v080), isFalse); |
| + expect(union.allowsAny(v124), isTrue); |
| + expect(union.allowsAny(v140), isFalse); |
| + expect(union.allowsAny(v200), isTrue); |
| + }); |
| + |
| + test('for a version range, returns true if any component allows part of ' |
| + 'the range', () { |
| + var union = new VersionConstraint.unionOf([ |
| + new VersionRange(min: v003, max: v080), |
| + v123 |
| + ]); |
| + |
| + expect(union.allowsAny(new VersionRange(min: v010, max: v114)), isTrue); |
| + expect(union.allowsAny(new VersionRange(min: v114, max: v124)), isTrue); |
| + expect(union.allowsAny(new VersionRange(min: v124, max: v130)), isFalse); |
| + }); |
| + |
| + group('for a union,', () { |
| + var union = new VersionConstraint.unionOf([ |
| + new VersionRange(min: v010, max: v080), |
| + new VersionRange(min: v123, max: v130) |
| + ]); |
| + |
| + test('returns true if any constraint matches', () { |
| + expect(union.allowsAny(new VersionConstraint.unionOf([ |
| + v072, |
| + new VersionRange(min: v200, max: v300) |
| + ])), isTrue); |
| + |
| + expect(union.allowsAny(new VersionConstraint.unionOf([ |
| + v003, |
| + new VersionRange(min: v124, max: v300) |
| + ])), isTrue); |
| + }); |
| + |
| + test("returns false if no constraint matches", () { |
| + expect(union.allowsAny(new VersionConstraint.unionOf([ |
| + v003, |
| + new VersionRange(min: v130, max: v140), |
| + new VersionRange(min: v140, max: v200) |
| + ])), isFalse); |
| + }); |
| + }); |
| + }); |
| + |
| + group("intersect()", () { |
| + test("with an overlapping version, returns that version", () { |
| + expect(new VersionConstraint.unionOf([ |
| + new VersionRange(min: v010, max: v080), |
| + new VersionRange(min: v123, max: v140) |
| + ]).intersect(v072), equals(v072)); |
| + }); |
| + |
| + test("with a non-overlapping version, returns an empty constraint", () { |
| + expect(new VersionConstraint.unionOf([ |
| + new VersionRange(min: v010, max: v080), |
| + new VersionRange(min: v123, max: v140) |
| + ]).intersect(v300), isEmpty); |
| + }); |
| + |
| + test("with an overlapping range, returns that range", () { |
| + var range = new VersionRange(min: v072, max: v080); |
| + expect(new VersionConstraint.unionOf([ |
| + new VersionRange(min: v010, max: v080), |
| + new VersionRange(min: v123, max: v140) |
| + ]).intersect(range), equals(range)); |
| + }); |
| + |
| + test("with a non-overlapping range, returns an empty constraint", () { |
| + expect(new VersionConstraint.unionOf([ |
| + new VersionRange(min: v010, max: v080), |
| + new VersionRange(min: v123, max: v140) |
| + ]).intersect(new VersionRange(min: v080, max: v123)), isEmpty); |
| + }); |
| + |
| + test("with a parially-overlapping range, returns the overlapping parts", |
| + () { |
| + expect(new VersionConstraint.unionOf([ |
| + new VersionRange(min: v010, max: v080), |
| + new VersionRange(min: v123, max: v140) |
| + ]).intersect(new VersionRange(min: v072, max: v130)), |
| + equals(new VersionConstraint.unionOf([ |
| + new VersionRange(min: v072, max: v080), |
| + new VersionRange(min: v123, max: v130) |
| + ]))); |
| + }); |
| + |
| + group("for a union,", () { |
| + var union = new VersionConstraint.unionOf([ |
| + new VersionRange(min: v003, max: v080), |
| + new VersionRange(min: v123, max: v130) |
| + ]); |
| + |
| + test("returns the overlapping parts", () { |
| + expect(union.intersect(new VersionConstraint.unionOf([ |
| + v010, |
| + new VersionRange(min: v072, max: v124), |
| + new VersionRange(min: v124, max: v130) |
| + ])), equals(new VersionConstraint.unionOf([ |
| + v010, |
| + new VersionRange(min: v072, max: v080), |
| + new VersionRange(min: v123, max: v124), |
| + new VersionRange(min: v124, max: v130) |
| + ]))); |
| + }); |
| + |
| + test("drops parts that don't match", () { |
| + expect(union.intersect(new VersionConstraint.unionOf([ |
| + v003, |
| + new VersionRange(min: v072, max: v080), |
| + new VersionRange(min: v080, max: v123) |
| + ])), equals(new VersionRange(min: v072, max: v080))); |
| + }); |
| + }); |
| + }); |
| +} |