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