blob: 06a427dd9973a55a9a4f55b22239f2c2a6e9b90e [file] [log] [blame]
// 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', () {
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('returns an empty constraint for an empty list', () {
expect(new VersionConstraint.unionOf([]), 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)));
});
});
});
group("difference()", () {
test("ignores ranges that don't intersect", () {
expect(new VersionConstraint.unionOf([
new VersionRange(min: v072, max: v080),
new VersionRange(min: v123, max: v130)
]).difference(new VersionConstraint.unionOf([
new VersionRange(min: v003, max: v010),
new VersionRange(min: v080, max: v123),
new VersionRange(min: v140)
])), equals(new VersionConstraint.unionOf([
new VersionRange(min: v072, max: v080),
new VersionRange(min: v123, max: v130)
])));
});
test("removes overlapping portions", () {
expect(new VersionConstraint.unionOf([
new VersionRange(min: v010, max: v080),
new VersionRange(min: v123, max: v130)
]).difference(new VersionConstraint.unionOf([
new VersionRange(min: v003, max: v072),
new VersionRange(min: v124)
])), equals(new VersionConstraint.unionOf([
new VersionRange(min: v072, max: v080, includeMin: true),
new VersionRange(min: v123, max: v124, includeMax: true)
])));
});
test("removes multiple portions from the same range", () {
expect(new VersionConstraint.unionOf([
new VersionRange(min: v010, max: v114),
new VersionRange(min: v130, max: v200)
]).difference(new VersionConstraint.unionOf([v072, v080])),
equals(new VersionConstraint.unionOf([
new VersionRange(min: v010, max: v072),
new VersionRange(min: v072, max: v080),
new VersionRange(min: v080, max: v114),
new VersionRange(min: v130, max: v200)
])));
});
test("removes the same range from multiple ranges", () {
expect(new VersionConstraint.unionOf([
new VersionRange(min: v010, max: v072),
new VersionRange(min: v080, max: v123),
new VersionRange(min: v124, max: v130),
new VersionRange(min: v200, max: v234),
new VersionRange(min: v250, max: v300)
]).difference(new VersionRange(min: v114, max: v201)),
equals(new VersionConstraint.unionOf([
new VersionRange(min: v010, max: v072),
new VersionRange(min: v080, max: v114, includeMax: true),
new VersionRange(min: v201, max: v234, includeMin: true),
new VersionRange(min: v250, max: v300)
])));
});
});
}