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

Unified Diff: pkg/unittest/lib/src/core_matchers.dart

Issue 184103002: Support nested matchers in deep equality matching. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 10 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 | « no previous file | pkg/unittest/lib/src/pretty_print.dart » ('j') | pkg/unittest/lib/src/pretty_print.dart » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/unittest/lib/src/core_matchers.dart
diff --git a/pkg/unittest/lib/src/core_matchers.dart b/pkg/unittest/lib/src/core_matchers.dart
index 86f51f36569c3f43c6b0da4750b477971657865d..71548720b4cbb9d8cd78cdf90842e5dc005ceb00 100644
--- a/pkg/unittest/lib/src/core_matchers.dart
+++ b/pkg/unittest/lib/src/core_matchers.dart
@@ -99,9 +99,8 @@ class _DeepMatcher extends Matcher {
// Returns a pair (reason, location)
List _compareIterables(expected, actual, matcher, depth, location) {
- if (actual is! Iterable) {
- return ['is not Iterable', location];
- }
+ if (actual is! Iterable) return ['is not Iterable', location];
+
var expectedIterator = expected.iterator;
var actualIterator = actual.iterator;
var index = 0;
@@ -109,11 +108,10 @@ class _DeepMatcher extends Matcher {
var newLocation = '${location}[${index}]';
if (expectedIterator.moveNext()) {
if (actualIterator.moveNext()) {
- var rp = matcher(expectedIterator.current,
- actualIterator.current, newLocation,
- depth);
+ var rp = matcher(expectedIterator.current, actualIterator.current,
+ newLocation, depth);
if (rp != null) return rp;
- ++index;
+ index++;
} else {
return ['shorter than expected', newLocation];
}
@@ -123,82 +121,81 @@ class _DeepMatcher extends Matcher {
return null;
}
Siggi Cherem (dart-lang) 2014/02/28 02:41:04 since you are already fixing style :), consider ch
Bob Nystrom 2014/02/28 17:31:24 Done, and then some.
}
- return null;
}
List _recursiveMatch(expected, actual, String location, int depth) {
- String reason = null;
+ // If the expected value is a matcher, try to match it.
+ if (expected is Matcher) {
+ var matchState = {};
+ if (expected.matches(actual, matchState)) return null;
+
+ var description = new StringDescription();
+ expected.describe(description);
+ return ['does not match $description', location];
+ } else {
+ // Otherwise, test for equality.
+ try {
+ if (expected == actual) return null;
+ } catch (e, s) {
+ // TODO(gram): Add a test for this case.
+ return ['== threw "$e"', location];
+ }
+ }
+
+ if (depth > _limit) {
+ return ['recursion depth limit exceeded', location];
+ }
+
// If _limit is 1 we can only recurse one level into object.
bool canRecurse = depth == 0 || _limit > 1;
- bool equal;
- try {
- equal = (expected == actual);
- } catch (e, s) {
- // TODO(gram): Add a test for this case.
- reason = '== threw "$e"';
- return [reason, location];
+
+ if (expected is Iterable && canRecurse) {
+ return _compareIterables(expected, actual, _recursiveMatch, depth + 1,
+ location);
}
- if (equal) {
- // Do nothing.
- } else if (depth > _limit) {
- reason = 'recursion depth limit exceeded';
- } else {
- if (expected is Iterable && canRecurse) {
- List result = _compareIterables(expected, actual,
- _recursiveMatch, depth + 1, location);
- if (result != null) {
- reason = result[0];
- location = result[1];
- }
- } else if (expected is Map && canRecurse) {
- if (actual is! Map) {
- reason = 'expected a map';
- } else {
- var err = (expected.length == actual.length) ? '' :
- 'has different length and ';
- for (var key in expected.keys) {
- if (!actual.containsKey(key)) {
- reason = '${err}is missing map key \'$key\'';
- break;
- }
- }
- if (reason == null) {
- for (var key in actual.keys) {
- if (!expected.containsKey(key)) {
- reason = '${err}has extra map key \'$key\'';
- break;
- }
- }
- if (reason == null) {
- for (var key in expected.keys) {
- var rp = _recursiveMatch(expected[key], actual[key],
- "${location}['${key}']", depth + 1);
- if (rp != null) {
- reason = rp[0];
- location = rp[1];
- break;
- }
- }
- }
- }
+
+ if (expected is Map && canRecurse) {
+ if (actual is! Map) {
+ return ['expected a map', location];
Siggi Cherem (dart-lang) 2014/02/28 02:41:04 nit: this might fit the 1-line if: if(...) retu
Bob Nystrom 2014/02/28 17:31:24 Done.
+ }
+
+ var err = (expected.length == actual.length) ? '' :
+ 'has different length and ';
+ for (var key in expected.keys) {
+ if (!actual.containsKey(key)) {
+ return ["${err}is missing map key '$key'", location];
}
- } else {
- var description = new StringDescription();
- // If we have recursed, show the expected value too; if not,
- // expect() will show it for us.
- if (depth > 0) {
- description.add('was ').
- addDescriptionOf(actual).
- add(' instead of ').
- addDescriptionOf(expected);
- reason = description.toString();
- } else {
- reason = ''; // We're not adding any value to the actual value.
+ }
+
+ for (var key in actual.keys) {
+ if (!expected.containsKey(key)) {
+ return ["${err}has extra map key '$key'", location];
}
}
+
+ for (var key in expected.keys) {
+ var rp = _recursiveMatch(expected[key], actual[key],
+ "${location}['${key}']", depth + 1);
+ if (rp != null) return rp;
+ }
+
+ return null;
}
- if (reason == null) return null;
- return [reason, location];
+
+ var description = new StringDescription();
+
+ // If we have recursed, show the expected value too; if not, expect() will
+ // show it for us.
+ if (depth > 0) {
+ description.add('was ').
+ addDescriptionOf(actual).
+ add(' instead of ').
+ addDescriptionOf(expected);
+ return [description.toString(), location];
+ }
+
+ // We're not adding any value to the actual value.
+ return ["", location];
}
String _match(expected, actual, Map matchState) {
« no previous file with comments | « no previous file | pkg/unittest/lib/src/pretty_print.dart » ('j') | pkg/unittest/lib/src/pretty_print.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698