Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(72)

Unified Diff: quiver/lib/testing/src/equality/equality.dart

Issue 1400473008: Roll Observatory packages and add a roll script (Closed) Base URL: git@github.com:dart-lang/observatory_pub_packages.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « quiver/lib/testing/src/async/fake_async.dart ('k') | quiver/lib/testing/src/runtime/checked_mode.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
-}
« no previous file with comments | « quiver/lib/testing/src/async/fake_async.dart ('k') | quiver/lib/testing/src/runtime/checked_mode.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698