// 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';

/// Some stock example versions to use in tests.
final v003 = new Version.parse('0.0.3');
final v010 = new Version.parse('0.1.0');
final v072 = new Version.parse('0.7.2');
final v080 = new Version.parse('0.8.0');
final v114 = new Version.parse('1.1.4');
final v123 = new Version.parse('1.2.3');
final v124 = new Version.parse('1.2.4');
final v130 = new Version.parse('1.3.0');
final v140 = new Version.parse('1.4.0');
final v200 = new Version.parse('2.0.0');
final v201 = new Version.parse('2.0.1');
final v234 = new Version.parse('2.3.4');
final v250 = new Version.parse('2.5.0');
final v300 = new Version.parse('3.0.0');

/// A [Matcher] that tests if a [VersionConstraint] allows or does not allow a
/// given list of [Version]s.
class _VersionConstraintMatcher implements Matcher {
  final List<Version> _expected;
  final bool _allow;

  _VersionConstraintMatcher(this._expected, this._allow);

  bool matches(item, Map matchState) =>
      (item is VersionConstraint) &&
      _expected.every((version) => item.allows(version) == _allow);

  Description describe(Description description) {
    description.addAll(' ${_allow ? "allows" : "does not allow"} versions ',
        ', ', '', _expected);
    return description;
  }

  Description describeMismatch(
      item, Description mismatchDescription, Map matchState, bool verbose) {
    if (item is! VersionConstraint) {
      mismatchDescription.add('was not a VersionConstraint');
      return mismatchDescription;
    }

    var first = true;
    for (var version in _expected) {
      if (item.allows(version) != _allow) {
        if (first) {
          if (_allow) {
            mismatchDescription.addDescriptionOf(item).add(' did not allow ');
          } else {
            mismatchDescription.addDescriptionOf(item).add(' allowed ');
          }
        } else {
          mismatchDescription.add(' and ');
        }
        first = false;

        mismatchDescription.add(version.toString());
      }
    }

    return mismatchDescription;
  }
}

/// Gets a [Matcher] that validates that a [VersionConstraint] allows all
/// given versions.
Matcher allows(Version v1,
    [Version v2,
    Version v3,
    Version v4,
    Version v5,
    Version v6,
    Version v7,
    Version v8]) {
  var versions = _makeVersionList(v1, v2, v3, v4, v5, v6, v7, v8);
  return new _VersionConstraintMatcher(versions, true);
}

/// Gets a [Matcher] that validates that a [VersionConstraint] allows none of
/// the given versions.
Matcher doesNotAllow(Version v1,
    [Version v2,
    Version v3,
    Version v4,
    Version v5,
    Version v6,
    Version v7,
    Version v8]) {
  var versions = _makeVersionList(v1, v2, v3, v4, v5, v6, v7, v8);
  return new _VersionConstraintMatcher(versions, false);
}

List<Version> _makeVersionList(Version v1,
    [Version v2,
    Version v3,
    Version v4,
    Version v5,
    Version v6,
    Version v7,
    Version v8]) {
  var versions = [v1];
  if (v2 != null) versions.add(v2);
  if (v3 != null) versions.add(v3);
  if (v4 != null) versions.add(v4);
  if (v5 != null) versions.add(v5);
  if (v6 != null) versions.add(v6);
  if (v7 != null) versions.add(v7);
  if (v8 != null) versions.add(v8);
  return versions;
}
