// Copyright (c) 2014, 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:pub_semver/pub_semver.dart'; import 'package:test/test.dart'; import 'utils.dart'; void main() { test('any', () { expect(VersionConstraint.any.isAny, isTrue); expect( VersionConstraint.any, allows(Version.parse('0.0.0-blah'), Version.parse('1.2.3'), Version.parse('12345.678.90'))); }); test('empty', () { expect(VersionConstraint.empty.isEmpty, isTrue); expect(VersionConstraint.empty.isAny, isFalse); expect( VersionConstraint.empty, doesNotAllow(Version.parse('0.0.0-blah'), Version.parse('1.2.3'), Version.parse('12345.678.90'))); }); group('parse()', () { test('parses an exact version', () { var constraint = VersionConstraint.parse('1.2.3-alpha'); expect(constraint is Version, isTrue); expect(constraint, equals(Version(1, 2, 3, pre: 'alpha'))); }); test('parses "any"', () { var constraint = VersionConstraint.parse('any'); expect( constraint, allows(Version.parse('0.0.0'), Version.parse('1.2.3'), Version.parse('12345.678.90'))); }); test('parses a ">" minimum version', () { var constraint = VersionConstraint.parse('>1.2.3'); expect(constraint, allows(Version.parse('1.2.3+foo'), Version.parse('1.2.4'))); expect( constraint, doesNotAllow(Version.parse('1.2.1'), Version.parse('1.2.3-build'), Version.parse('1.2.3'))); }); test('parses a ">=" minimum version', () { var constraint = VersionConstraint.parse('>=1.2.3'); expect( constraint, allows(Version.parse('1.2.3'), Version.parse('1.2.3+foo'), Version.parse('1.2.4'))); expect(constraint, doesNotAllow(Version.parse('1.2.1'), Version.parse('1.2.3-build'))); }); test('parses a "<" maximum version', () { var constraint = VersionConstraint.parse('<1.2.3'); expect(constraint, allows(Version.parse('1.2.1'), Version.parse('1.2.2+foo'))); expect( constraint, doesNotAllow(Version.parse('1.2.3'), Version.parse('1.2.3+foo'), Version.parse('1.2.4'))); }); test('parses a "<=" maximum version', () { var constraint = VersionConstraint.parse('<=1.2.3'); expect( constraint, allows(Version.parse('1.2.1'), Version.parse('1.2.3-build'), Version.parse('1.2.3'))); expect(constraint, doesNotAllow(Version.parse('1.2.3+foo'), Version.parse('1.2.4'))); }); test('parses a series of space-separated constraints', () { var constraint = VersionConstraint.parse('>1.0.0 >=1.2.3 <1.3.0'); expect( constraint, allows(Version.parse('1.2.3'), Version.parse('1.2.5'))); expect( constraint, doesNotAllow(Version.parse('1.2.3-pre'), Version.parse('1.3.0'), Version.parse('3.4.5'))); }); test('parses a pre-release-only constraint', () { var constraint = VersionConstraint.parse('>=1.0.0-dev.2 <1.0.0'); expect(constraint, allows(Version.parse('1.0.0-dev.2'), Version.parse('1.0.0-dev.3'))); expect(constraint, doesNotAllow(Version.parse('1.0.0-dev.1'), Version.parse('1.0.0'))); }); test('ignores whitespace around comparison operators', () { var constraint = VersionConstraint.parse(' >1.0.0>=1.2.3 < 1.3.0'); expect( constraint, allows(Version.parse('1.2.3'), Version.parse('1.2.5'))); expect( constraint, doesNotAllow(Version.parse('1.2.3-pre'), Version.parse('1.3.0'), Version.parse('3.4.5'))); }); test('does not allow "any" to be mixed with other constraints', () { expect(() => VersionConstraint.parse('any 1.0.0'), throwsFormatException); }); test('parses a "^" version', () { expect(VersionConstraint.parse('^0.0.3'), equals(VersionConstraint.compatibleWith(v003))); expect(VersionConstraint.parse('^0.7.2'), equals(VersionConstraint.compatibleWith(v072))); expect(VersionConstraint.parse('^1.2.3'), equals(VersionConstraint.compatibleWith(v123))); var min = Version.parse('0.7.2-pre+1'); expect(VersionConstraint.parse('^0.7.2-pre+1'), equals(VersionConstraint.compatibleWith(min))); }); test('does not allow "^" to be mixed with other constraints', () { expect(() => VersionConstraint.parse('>=1.2.3 ^1.0.0'), throwsFormatException); expect(() => VersionConstraint.parse('^1.0.0 <1.2.3'), throwsFormatException); }); test('ignores whitespace around "^"', () { var constraint = VersionConstraint.parse(' ^ 1.2.3 '); expect(constraint, equals(VersionConstraint.compatibleWith(v123))); }); test('throws FormatException on a bad string', () { var bad = [ '', ' ', // Empty string. 'foo', // Bad text. '>foo', // Bad text after operator. '^foo', // Bad text after "^". '1.0.0 foo', '1.0.0foo', // Bad text after version. 'anything', // Bad text after "any". '<>1.0.0', // Multiple operators. '1.0.0<' // Trailing operator. ]; for (var text in bad) { expect(() => VersionConstraint.parse(text), throwsFormatException); } }); }); group('compatibleWith()', () { test('returns the range of compatible versions', () { var constraint = VersionConstraint.compatibleWith(v072); expect( constraint, equals(VersionRange( min: v072, includeMin: true, max: v072.nextBreaking))); }); test('toString() uses "^"', () { var constraint = VersionConstraint.compatibleWith(v072); expect(constraint.toString(), equals('^0.7.2')); }); test('does not allow pre-releases of the next breaking version', () { var constraint = VersionConstraint.compatibleWith(v123); expect(constraint.allows(Version.parse('2.0.0--1')), isFalse); expect(constraint.allows(Version.parse('2.0.0-0xA')), isFalse); expect(constraint.allows(Version.parse('2.0.0-0')), isFalse); }); }); }