// 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.

library pub_semver.test.utils;

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;
}