| Index: quiver/lib/testing/src/equality/equality.dart
 | 
| diff --git a/quiver/lib/testing/src/equality/equality.dart b/quiver/lib/testing/src/equality/equality.dart
 | 
| deleted file mode 100644
 | 
| index 2053e57db190c6d4bb02cc6e0f2aac93f9937e91..0000000000000000000000000000000000000000
 | 
| --- a/quiver/lib/testing/src/equality/equality.dart
 | 
| +++ /dev/null
 | 
| @@ -1,215 +0,0 @@
 | 
| -// Copyright 2014 Google Inc. All Rights Reserved.
 | 
| -//
 | 
| -// Licensed under the Apache License, Version 2.0 (the "License");
 | 
| -// you may not use this file except in compliance with the License.
 | 
| -// You may obtain a copy of the License at
 | 
| -//
 | 
| -//     http://www.apache.org/licenses/LICENSE-2.0
 | 
| -//
 | 
| -// Unless required by applicable law or agreed to in writing, software
 | 
| -// distributed under the License is distributed on an "AS IS" BASIS,
 | 
| -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
| -// See the License for the specific language governing permissions and
 | 
| -// limitations under the License.
 | 
| -
 | 
| -part of quiver.testing.equality;
 | 
| -
 | 
| -/**
 | 
| - * Matcher for == and hashCode methods of a class.
 | 
| - *
 | 
| - * To use, invoke areEqualityGroups with a list of equality groups where each
 | 
| - * group contains objects that are supposed to be equal to each other, and
 | 
| - * objects of different groups are expected to be unequal. For example:
 | 
| - *
 | 
| - *     expect({
 | 
| - *      'hello': ["hello", "h" + "ello"],
 | 
| - *      'world': ["world", "wor" + "ld"],
 | 
| - *      'three': [2, 1 + 1]
 | 
| - *     }, areEqualityGroups);
 | 
| - *
 | 
| - * This tests that:
 | 
| - *
 | 
| - * * comparing each object against itself returns true
 | 
| - * * comparing each object against an instance of an incompatible class
 | 
| - *     returns false
 | 
| - * * comparing each pair of objects within the same equality group returns
 | 
| - *     true
 | 
| - * * comparing each pair of objects from different equality groups returns
 | 
| - *     false
 | 
| - * * the hash codes of any two equal objects are equal
 | 
| - * * equals implementation is idempotent
 | 
| - *
 | 
| - * The format of the Map passed to expect is such that the map keys are used in
 | 
| - * error messages to identify the group described by the map value.
 | 
| - *
 | 
| - * When a test fails, the error message labels the objects involved in
 | 
| - * the failed comparison as follows:
 | 
| - *
 | 
| - *      "`[group x, item j]`" refers to the ith item in the xth equality group,
 | 
| - *       where both equality groups and the items within equality groups are
 | 
| - *       numbered starting from 1.  When either a constructor argument or an
 | 
| - *       equal object is provided, that becomes group 1.
 | 
| - *
 | 
| - */
 | 
| -const Matcher areEqualityGroups = const _EqualityGroupMatcher();
 | 
| -
 | 
| -const _repetitions = 3;
 | 
| -
 | 
| -class _EqualityGroupMatcher extends Matcher {
 | 
| -  static const failureReason = 'failureReason';
 | 
| -  const _EqualityGroupMatcher();
 | 
| -
 | 
| -  @override
 | 
| -  Description describe(Description description) =>
 | 
| -      description.add('to be equality groups');
 | 
| -
 | 
| -  @override
 | 
| -  bool matches(Map<String, List> item, Map matchState) {
 | 
| -    try {
 | 
| -      _verifyEqualityGroups(item, matchState);
 | 
| -      return true;
 | 
| -    } on MatchError catch (e) {
 | 
| -      matchState[failureReason] = e.toString();
 | 
| -      return false;
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
| -  Description describeMismatch(item, Description mismatchDescription,
 | 
| -          Map matchState, bool verbose) =>
 | 
| -      mismatchDescription.add(" ${matchState[failureReason]}");
 | 
| -
 | 
| -  void _verifyEqualityGroups(Map<String, List> equalityGroups, Map matchState) {
 | 
| -    if (equalityGroups == null) {
 | 
| -      throw new MatchError('Equality Group must not be null');
 | 
| -    }
 | 
| -    var equalityGroupsCopy = {};
 | 
| -    equalityGroups.forEach((String groupName, List group) {
 | 
| -      if (groupName == null) {
 | 
| -        throw new MatchError('Group name must not be null');
 | 
| -      }
 | 
| -      if (group == null) {
 | 
| -        throw new MatchError('Group must not be null');
 | 
| -      }
 | 
| -      equalityGroupsCopy[groupName] = new List.from(group);
 | 
| -    });
 | 
| -
 | 
| -    // Run the test multiple times to ensure deterministic equals
 | 
| -    for (var run in range(_repetitions)) {
 | 
| -      _checkBasicIdentity(equalityGroupsCopy, matchState);
 | 
| -      _checkGroupBasedEquality(equalityGroupsCopy);
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
| -  void _checkBasicIdentity(Map<String, List> equalityGroups, Map matchState) {
 | 
| -    var flattened = equalityGroups.values.expand((group) => group);
 | 
| -    for (var item in flattened) {
 | 
| -      if (item == _NotAnInstance.equalToNothing) {
 | 
| -        throw new MatchError(
 | 
| -            "$item must not be equal to an arbitrary object of another class");
 | 
| -      }
 | 
| -
 | 
| -      if (item != item) {
 | 
| -        throw new MatchError("$item must be equal to itself");
 | 
| -      }
 | 
| -
 | 
| -      if (item.hashCode != item.hashCode) {
 | 
| -        throw new MatchError("the implementation of hashCode of $item must "
 | 
| -            "be idempotent");
 | 
| -      }
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
| -  void _checkGroupBasedEquality(Map<String, List> equalityGroups) {
 | 
| -    equalityGroups.forEach((String groupName, List group) {
 | 
| -      var groupLength = group.length;
 | 
| -      for (var itemNumber = 0; itemNumber < groupLength; itemNumber++) {
 | 
| -        _checkEqualToOtherGroup(
 | 
| -            equalityGroups, groupLength, itemNumber, groupName);
 | 
| -        _checkUnequalToOtherGroups(equalityGroups, groupName, itemNumber);
 | 
| -      }
 | 
| -    });
 | 
| -  }
 | 
| -
 | 
| -  void _checkUnequalToOtherGroups(
 | 
| -      Map<String, List> equalityGroups, String groupName, int itemNumber) {
 | 
| -    equalityGroups.forEach((String unrelatedGroupName, List unrelatedGroup) {
 | 
| -      if (groupName != unrelatedGroupName) {
 | 
| -        for (var unrelatedItemNumber = 0;
 | 
| -            unrelatedItemNumber < unrelatedGroup.length;
 | 
| -            unrelatedItemNumber++) {
 | 
| -          _expectUnrelated(equalityGroups, groupName, itemNumber,
 | 
| -              unrelatedGroupName, unrelatedItemNumber);
 | 
| -        }
 | 
| -      }
 | 
| -    });
 | 
| -  }
 | 
| -
 | 
| -  void _checkEqualToOtherGroup(Map<String, List> equalityGroups,
 | 
| -      int groupLength, int itemNumber, String groupName) {
 | 
| -    for (var relatedItemNumber = 0;
 | 
| -        relatedItemNumber < groupLength;
 | 
| -        relatedItemNumber++) {
 | 
| -      if (itemNumber != relatedItemNumber) {
 | 
| -        _expectRelated(
 | 
| -            equalityGroups, groupName, itemNumber, relatedItemNumber);
 | 
| -      }
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
| -  void _expectRelated(Map<String, List> equalityGroups, String groupName,
 | 
| -      int itemNumber, int relatedItemNumber) {
 | 
| -    var itemInfo = _createItem(equalityGroups, groupName, itemNumber);
 | 
| -    var relatedInfo = _createItem(equalityGroups, groupName, relatedItemNumber);
 | 
| -
 | 
| -    if (itemInfo.value != relatedInfo.value) {
 | 
| -      throw new MatchError("$itemInfo must be equal to $relatedInfo");
 | 
| -    }
 | 
| -
 | 
| -    if (itemInfo.value.hashCode != relatedInfo.value.hashCode) {
 | 
| -      throw new MatchError(
 | 
| -          "the hashCode (${itemInfo.value.hashCode}) of $itemInfo must "
 | 
| -          "be equal to the hashCode (${relatedInfo.value.hashCode}) of "
 | 
| -          "$relatedInfo}");
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
| -  void _expectUnrelated(Map<String, List> equalityGroups, String groupName,
 | 
| -      int itemNumber, String unrelatedGroupName, int unrelatedItemNumber) {
 | 
| -    var itemInfo = _createItem(equalityGroups, groupName, itemNumber);
 | 
| -    var unrelatedInfo =
 | 
| -        _createItem(equalityGroups, unrelatedGroupName, unrelatedItemNumber);
 | 
| -
 | 
| -    if (itemInfo.value == unrelatedInfo.value) {
 | 
| -      throw new MatchError("$itemInfo must not be equal to " "$unrelatedInfo)");
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
| -  _Item _createItem(
 | 
| -          Map<String, List> equalityGroups, String groupName, int itemNumber) =>
 | 
| -      new _Item(equalityGroups[groupName][itemNumber], groupName, itemNumber);
 | 
| -}
 | 
| -
 | 
| -class _NotAnInstance {
 | 
| -  static const equalToNothing = const _NotAnInstance._();
 | 
| -  const _NotAnInstance._();
 | 
| -}
 | 
| -
 | 
| -class _Item {
 | 
| -  final Object value;
 | 
| -  final String groupName;
 | 
| -  final int itemNumber;
 | 
| -
 | 
| -  _Item(this.value, this.groupName, this.itemNumber);
 | 
| -
 | 
| -  @override
 | 
| -  String toString() => "$value [group '$groupName', item ${itemNumber + 1}]";
 | 
| -}
 | 
| -
 | 
| -class MatchError extends Error {
 | 
| -  final message;
 | 
| -
 | 
| -  /// The [message] describes the match error.
 | 
| -  MatchError([this.message]);
 | 
| -
 | 
| -  String toString() => message;
 | 
| -}
 | 
| 
 |