| Index: pkg/matcher/lib/src/iterable_matchers.dart
 | 
| diff --git a/pkg/matcher/lib/src/iterable_matchers.dart b/pkg/matcher/lib/src/iterable_matchers.dart
 | 
| deleted file mode 100644
 | 
| index 60ef32d09b2abdbc0c9504c3c864b020d0475062..0000000000000000000000000000000000000000
 | 
| --- a/pkg/matcher/lib/src/iterable_matchers.dart
 | 
| +++ /dev/null
 | 
| @@ -1,266 +0,0 @@
 | 
| -// Copyright (c) 2012, 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 matcher.iterable_matchers;
 | 
| -
 | 
| -import 'core_matchers.dart';
 | 
| -import 'description.dart';
 | 
| -import 'interfaces.dart';
 | 
| -import 'util.dart';
 | 
| -
 | 
| -/// Returns a matcher which matches [Iterable]s in which all elements
 | 
| -/// match the given [matcher].
 | 
| -Matcher everyElement(matcher) => new _EveryElement(wrapMatcher(matcher));
 | 
| -
 | 
| -class _EveryElement extends _IterableMatcher {
 | 
| -  final Matcher _matcher;
 | 
| -
 | 
| -  _EveryElement(Matcher this._matcher);
 | 
| -
 | 
| -  bool matches(item, Map matchState) {
 | 
| -    if (item is! Iterable) {
 | 
| -      return false;
 | 
| -    }
 | 
| -    var i = 0;
 | 
| -    for (var element in item) {
 | 
| -      if (!_matcher.matches(element, matchState)) {
 | 
| -        addStateInfo(matchState, {'index': i, 'element': element});
 | 
| -        return false;
 | 
| -      }
 | 
| -      ++i;
 | 
| -    }
 | 
| -    return true;
 | 
| -  }
 | 
| -
 | 
| -  Description describe(Description description) =>
 | 
| -      description.add('every element(').addDescriptionOf(_matcher).add(')');
 | 
| -
 | 
| -  Description describeMismatch(item, Description mismatchDescription,
 | 
| -                               Map matchState, bool verbose) {
 | 
| -    if (matchState['index'] != null) {
 | 
| -      var index = matchState['index'];
 | 
| -      var element = matchState['element'];
 | 
| -      mismatchDescription.add('has value ').addDescriptionOf(element).
 | 
| -          add(' which ');
 | 
| -      var subDescription = new StringDescription();
 | 
| -      _matcher.describeMismatch(element, subDescription, matchState['state'],
 | 
| -          verbose);
 | 
| -      if (subDescription.length > 0) {
 | 
| -        mismatchDescription.add(subDescription.toString());
 | 
| -      } else {
 | 
| -        mismatchDescription.add("doesn't match ");
 | 
| -        _matcher.describe(mismatchDescription);
 | 
| -      }
 | 
| -      mismatchDescription.add(' at index $index');
 | 
| -      return mismatchDescription;
 | 
| -    }
 | 
| -    return super.describeMismatch(item, mismatchDescription,
 | 
| -          matchState, verbose);
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -/// Returns a matcher which matches [Iterable]s in which at least one
 | 
| -/// element matches the given [matcher].
 | 
| -Matcher anyElement(matcher) => new _AnyElement(wrapMatcher(matcher));
 | 
| -
 | 
| -class _AnyElement extends _IterableMatcher {
 | 
| -  final Matcher _matcher;
 | 
| -
 | 
| -  _AnyElement(this._matcher);
 | 
| -
 | 
| -  bool matches(item, Map matchState) {
 | 
| -    return item.any((e) => _matcher.matches(e, matchState));
 | 
| -  }
 | 
| -
 | 
| -  Description describe(Description description) =>
 | 
| -      description.add('some element ').addDescriptionOf(_matcher);
 | 
| -}
 | 
| -
 | 
| -/// Returns a matcher which matches [Iterable]s that have the same
 | 
| -/// length and the same elements as [expected], in the same order.
 | 
| -///
 | 
| -/// This is equivalent to [equals] but does not recurse.
 | 
| -Matcher orderedEquals(Iterable expected) => new _OrderedEquals(expected);
 | 
| -
 | 
| -class _OrderedEquals extends Matcher {
 | 
| -  final Iterable _expected;
 | 
| -  Matcher _matcher;
 | 
| -
 | 
| -  _OrderedEquals(this._expected) {
 | 
| -    _matcher = equals(_expected, 1);
 | 
| -  }
 | 
| -
 | 
| -  bool matches(item, Map matchState) =>
 | 
| -      (item is Iterable) && _matcher.matches(item, matchState);
 | 
| -
 | 
| -  Description describe(Description description) =>
 | 
| -      description.add('equals ').addDescriptionOf(_expected).add(' ordered');
 | 
| -
 | 
| -  Description describeMismatch(item, Description mismatchDescription,
 | 
| -                               Map matchState, bool verbose) {
 | 
| -    if (item is !Iterable) {
 | 
| -      return mismatchDescription.add('is not an Iterable');
 | 
| -    } else {
 | 
| -      return _matcher.describeMismatch(item, mismatchDescription,
 | 
| -          matchState, verbose);
 | 
| -    }
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -/// Returns a matcher which matches [Iterable]s that have the same length and
 | 
| -/// the same elements as [expected], but not necessarily in the same order.
 | 
| -///
 | 
| -/// Note that this is O(n^2) so should only be used on small objects.
 | 
| -Matcher unorderedEquals(Iterable expected) => new _UnorderedEquals(expected);
 | 
| -
 | 
| -class _UnorderedEquals extends _UnorderedMatches {
 | 
| -  final List _expectedValues;
 | 
| -
 | 
| -  _UnorderedEquals(Iterable expected)
 | 
| -      : super(expected.map(equals)),
 | 
| -        _expectedValues = expected.toList();
 | 
| -
 | 
| -  Description describe(Description description) =>
 | 
| -    description
 | 
| -        .add('equals ')
 | 
| -        .addDescriptionOf(_expectedValues)
 | 
| -        .add(' unordered');
 | 
| -}
 | 
| -
 | 
| -/// Iterable matchers match against [Iterable]s. We add this intermediate
 | 
| -/// class to give better mismatch error messages than the base Matcher class.
 | 
| -abstract class _IterableMatcher extends Matcher {
 | 
| -  const _IterableMatcher();
 | 
| -  Description describeMismatch(item, Description mismatchDescription,
 | 
| -                               Map matchState, bool verbose) {
 | 
| -    if (item is! Iterable) {
 | 
| -      return mismatchDescription.
 | 
| -          addDescriptionOf(item).
 | 
| -          add(' not an Iterable');
 | 
| -    } else {
 | 
| -      return super.describeMismatch(item, mismatchDescription, matchState,
 | 
| -          verbose);
 | 
| -    }
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -/// Returns a matcher which matches [Iterable]s whose elements match the
 | 
| -/// matchers in [expected], but not necessarily in the same order.
 | 
| -///
 | 
| -///  Note that this is `O(n^2)` and so should only be used on small objects.
 | 
| -Matcher unorderedMatches(Iterable expected) => new _UnorderedMatches(expected);
 | 
| -
 | 
| -class _UnorderedMatches extends Matcher {
 | 
| -  final List<Matcher> _expected;
 | 
| -
 | 
| -  _UnorderedMatches(Iterable expected)
 | 
| -      : _expected = expected.map(wrapMatcher).toList();
 | 
| -
 | 
| -  String _test(item) {
 | 
| -    if (item is! Iterable) return 'not iterable';
 | 
| -    item = item.toList();
 | 
| -
 | 
| -    // Check the lengths are the same.
 | 
| -    if (_expected.length > item.length) {
 | 
| -      return 'has too few elements (${item.length} < ${_expected.length})';
 | 
| -    } else if (_expected.length < item.length) {
 | 
| -      return 'has too many elements (${item.length} > ${_expected.length})';
 | 
| -    }
 | 
| -
 | 
| -    var matched = new List<bool>.filled(item.length, false);
 | 
| -    var expectedPosition = 0;
 | 
| -    for (var expectedMatcher in _expected) {
 | 
| -      var actualPosition = 0;
 | 
| -      var gotMatch = false;
 | 
| -      for (var actualElement in item) {
 | 
| -        if (!matched[actualPosition]) {
 | 
| -          if (expectedMatcher.matches(actualElement, {})) {
 | 
| -            matched[actualPosition] = gotMatch = true;
 | 
| -            break;
 | 
| -          }
 | 
| -        }
 | 
| -        ++actualPosition;
 | 
| -      }
 | 
| -
 | 
| -      if (!gotMatch) {
 | 
| -        return new StringDescription()
 | 
| -            .add('has no match for ')
 | 
| -            .addDescriptionOf(expectedMatcher)
 | 
| -            .add(' at index ${expectedPosition}')
 | 
| -            .toString();
 | 
| -      }
 | 
| -
 | 
| -      ++expectedPosition;
 | 
| -    }
 | 
| -    return null;
 | 
| -  }
 | 
| -
 | 
| -  bool matches(item, Map mismatchState) => _test(item) == null;
 | 
| -
 | 
| -  Description describe(Description description) =>
 | 
| -    description
 | 
| -      .add('matches ')
 | 
| -      .addAll('[', ', ', ']', _expected)
 | 
| -      .add(' unordered');
 | 
| -
 | 
| -  Description describeMismatch(item, Description mismatchDescription,
 | 
| -                               Map matchState, bool verbose) =>
 | 
| -      mismatchDescription.add(_test(item));
 | 
| -}
 | 
| -
 | 
| -/// A pairwise matcher for [Iterable]s.
 | 
| -///
 | 
| -/// The [comparator] function, taking an expected and an actual argument, and
 | 
| -/// returning whether they match, will be applied to each pair in order.
 | 
| -/// [description] should be a meaningful name for the comparator.
 | 
| -Matcher pairwiseCompare(Iterable expected, bool comparator(a, b),
 | 
| -    String description) =>
 | 
| -        new _PairwiseCompare(expected, comparator, description);
 | 
| -
 | 
| -typedef bool _Comparator(a, b);
 | 
| -
 | 
| -class _PairwiseCompare extends _IterableMatcher {
 | 
| -  final Iterable _expected;
 | 
| -  final _Comparator _comparator;
 | 
| -  final String _description;
 | 
| -
 | 
| -  _PairwiseCompare(this._expected, this._comparator, this._description);
 | 
| -
 | 
| -  bool matches(item, Map matchState) {
 | 
| -    if (item is! Iterable) return false;
 | 
| -    if (item.length != _expected.length) return false;
 | 
| -    var iterator = item.iterator;
 | 
| -    var i = 0;
 | 
| -    for (var e in _expected) {
 | 
| -      iterator.moveNext();
 | 
| -      if (!_comparator(e, iterator.current)) {
 | 
| -        addStateInfo(matchState, {'index': i, 'expected': e,
 | 
| -            'actual': iterator.current});
 | 
| -        return false;
 | 
| -      }
 | 
| -      i++;
 | 
| -    }
 | 
| -    return true;
 | 
| -  }
 | 
| -
 | 
| -  Description describe(Description description) =>
 | 
| -      description.add('pairwise $_description ').addDescriptionOf(_expected);
 | 
| -
 | 
| -  Description describeMismatch(item, Description mismatchDescription,
 | 
| -                               Map matchState, bool verbose) {
 | 
| -    if (item is !Iterable) {
 | 
| -      return mismatchDescription.add('is not an Iterable');
 | 
| -    } else if (item.length != _expected.length) {
 | 
| -      return mismatchDescription.
 | 
| -          add('has length ${item.length} instead of ${_expected.length}');
 | 
| -    } else {
 | 
| -      return mismatchDescription.
 | 
| -          add('has ').
 | 
| -          addDescriptionOf(matchState["actual"]).
 | 
| -          add(' which is not $_description ').
 | 
| -          addDescriptionOf(matchState["expected"]).
 | 
| -          add(' at index ${matchState["index"]}');
 | 
| -    }
 | 
| -  }
 | 
| -}
 | 
| 
 |