// 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:test/test.dart';

import 'package:pub_semver/pub_semver.dart';

import 'utils.dart';

main() {
  test('any', () {
    expect(VersionConstraint.any.isAny, isTrue);
    expect(
        VersionConstraint.any,
        allows(new Version.parse('0.0.0-blah'), new Version.parse('1.2.3'),
            new Version.parse('12345.678.90')));
  });

  test('empty', () {
    expect(VersionConstraint.empty.isEmpty, isTrue);
    expect(VersionConstraint.empty.isAny, isFalse);
    expect(
        VersionConstraint.empty,
        doesNotAllow(new Version.parse('0.0.0-blah'),
            new Version.parse('1.2.3'), new Version.parse('12345.678.90')));
  });

  group('parse()', () {
    test('parses an exact version', () {
      var constraint = new VersionConstraint.parse('1.2.3-alpha');

      expect(constraint is Version, isTrue);
      expect(constraint, equals(new Version(1, 2, 3, pre: 'alpha')));
    });

    test('parses "any"', () {
      var constraint = new VersionConstraint.parse('any');

      expect(constraint is VersionConstraint, isTrue);
      expect(
          constraint,
          allows(new Version.parse('0.0.0'), new Version.parse('1.2.3'),
              new Version.parse('12345.678.90')));
    });

    test('parses a ">" minimum version', () {
      var constraint = new VersionConstraint.parse('>1.2.3');

      expect(constraint,
          allows(new Version.parse('1.2.3+foo'), new Version.parse('1.2.4')));
      expect(
          constraint,
          doesNotAllow(new Version.parse('1.2.1'),
              new Version.parse('1.2.3-build'), new Version.parse('1.2.3')));
    });

    test('parses a ">=" minimum version', () {
      var constraint = new VersionConstraint.parse('>=1.2.3');

      expect(
          constraint,
          allows(new Version.parse('1.2.3'), new Version.parse('1.2.3+foo'),
              new Version.parse('1.2.4')));
      expect(
          constraint,
          doesNotAllow(
              new Version.parse('1.2.1'), new Version.parse('1.2.3-build')));
    });

    test('parses a "<" maximum version', () {
      var constraint = new VersionConstraint.parse('<1.2.3');

      expect(constraint,
          allows(new Version.parse('1.2.1'), new Version.parse('1.2.2+foo')));
      expect(
          constraint,
          doesNotAllow(new Version.parse('1.2.3'),
              new Version.parse('1.2.3+foo'), new Version.parse('1.2.4')));
    });

    test('parses a "<=" maximum version', () {
      var constraint = new VersionConstraint.parse('<=1.2.3');

      expect(
          constraint,
          allows(new Version.parse('1.2.1'), new Version.parse('1.2.3-build'),
              new Version.parse('1.2.3')));
      expect(
          constraint,
          doesNotAllow(
              new Version.parse('1.2.3+foo'), new Version.parse('1.2.4')));
    });

    test('parses a series of space-separated constraints', () {
      var constraint = new VersionConstraint.parse('>1.0.0 >=1.2.3 <1.3.0');

      expect(constraint,
          allows(new Version.parse('1.2.3'), new Version.parse('1.2.5')));
      expect(
          constraint,
          doesNotAllow(new Version.parse('1.2.3-pre'),
              new Version.parse('1.3.0'), new Version.parse('3.4.5')));
    });

    test('ignores whitespace around comparison operators', () {
      var constraint = new VersionConstraint.parse(' >1.0.0>=1.2.3 < 1.3.0');

      expect(constraint,
          allows(new Version.parse('1.2.3'), new Version.parse('1.2.5')));
      expect(
          constraint,
          doesNotAllow(new Version.parse('1.2.3-pre'),
              new Version.parse('1.3.0'), new Version.parse('3.4.5')));
    });

    test('does not allow "any" to be mixed with other constraints', () {
      expect(() => new VersionConstraint.parse('any 1.0.0'),
          throwsFormatException);
    });

    test('parses a "^" version', () {
      expect(new VersionConstraint.parse('^0.0.3'),
          equals(new VersionConstraint.compatibleWith(v003)));

      expect(new VersionConstraint.parse('^0.7.2'),
          equals(new VersionConstraint.compatibleWith(v072)));

      expect(new VersionConstraint.parse('^1.2.3'),
          equals(new VersionConstraint.compatibleWith(v123)));

      var min = new Version.parse('0.7.2-pre+1');
      expect(new VersionConstraint.parse('^0.7.2-pre+1'),
          equals(new VersionConstraint.compatibleWith(min)));
    });

    test('does not allow "^" to be mixed with other constraints', () {
      expect(() => new VersionConstraint.parse('>=1.2.3 ^1.0.0'),
          throwsFormatException);
      expect(() => new VersionConstraint.parse('^1.0.0 <1.2.3'),
          throwsFormatException);
    });

    test('ignores whitespace around "^"', () {
      var constraint = new VersionConstraint.parse(' ^ 1.2.3 ');

      expect(constraint, equals(new 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(() => new VersionConstraint.parse(text), throwsFormatException);
      }
    });
  });

  group('compatibleWith()', () {
    test('returns the range of compatible versions', () {
      var constraint = new VersionConstraint.compatibleWith(v072);

      expect(
          constraint,
          equals(new VersionRange(
              min: v072, includeMin: true, max: v072.nextBreaking)));
    });

    test('toString() uses "^"', () {
      var constraint = new VersionConstraint.compatibleWith(v072);

      expect(constraint.toString(), equals('^0.7.2'));
    });
  });
}
