Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | |
| 2 // for details. All rights reserved. Use of this source code is governed by a | |
| 3 // BSD-style license that can be found in the LICENSE file. | |
| 4 | |
| 5 // Collection matchers match against a collection. We add this intermediate | |
|
Bob Nystrom
2012/05/30 23:23:51
Make this a doc comment for the class:
/**
* Col
gram
2012/06/01 17:33:15
Done.
| |
| 6 // class to give better mismatch error messages than the base Matcher class. | |
| 7 | |
| 8 class _CollectionMatcher extends Matcher { | |
| 9 IDescription describeMismatch(item, IDescription mismatchDescription) { | |
| 10 if (!(item is Collection)) { | |
|
Bob Nystrom
2012/05/30 23:23:51
if (item is !Collection)
gram
2012/06/01 17:33:15
Done.
| |
| 11 return mismatchDescription. | |
| 12 appendDescriptionOf(item). | |
| 13 append(' not a collection'); | |
| 14 } else { | |
| 15 return super.describeMismatch(item, mismatchDescription); | |
| 16 } | |
| 17 } | |
| 18 } | |
| 19 //----------------------------------------------------------- | |
|
Bob Nystrom
2012/05/30 23:23:51
I don't think we need a comments for structure. Wh
gram
2012/06/01 17:33:15
Done.
| |
| 20 /** | |
| 21 * This returns a matcher that matches empty collections. | |
|
Bob Nystrom
2012/05/30 23:23:51
"This returns" -> "Returns"
Here and elsewhere. W
gram
2012/06/01 17:33:15
Done.
| |
| 22 */ | |
| 23 IMatcher emptyCollection() => new _EmptyCollection(); | |
|
Bob Nystrom
2012/05/30 23:23:51
Make this a variable so you don't need the ():
fi
gram
2012/06/01 17:33:15
Done.
| |
| 24 | |
| 25 class _EmptyCollection extends _CollectionMatcher { | |
| 26 bool matches(collection) { | |
|
Bob Nystrom
2012/05/30 23:23:51
Annotate this to type Collection?
gram
2012/06/01 17:33:15
None of the matches() methods are typed, as they a
Bob Nystrom
2012/06/01 18:22:22
That makes sense.
gram
2012/06/01 22:21:59
Done.
| |
| 27 try { | |
| 28 return collection.isEmpty(); | |
| 29 } catch (var e) { | |
|
Bob Nystrom
2012/05/30 23:23:51
Why are you swallowing exceptions here?
gram
2012/06/01 17:33:15
The idea is that you can pass anything in, and tha
Bob Nystrom
2012/06/01 18:22:22
Is that helpful to users? If I do:
expect(foo, is
gram
2012/06/01 22:21:59
I think we're both partly right. I do think that e
Bob Nystrom
2012/06/01 22:29:00
Perfect. I love it.
| |
| 30 return false; | |
| 31 } | |
| 32 } | |
| 33 | |
| 34 IDescription describe(IDescription description) => | |
| 35 description.append('be empty'); | |
| 36 } | |
| 37 | |
| 38 //----------------------------------------------------------- | |
| 39 /** | |
| 40 * This returns a matcher that matches collection that contains [obj]. | |
|
Bob Nystrom
2012/05/30 23:23:51
"collection" -> "a collection"
gram
2012/06/01 17:33:15
Done.
| |
| 41 */ | |
| 42 IMatcher contains(obj) => new _CollectionContains(obj); | |
| 43 | |
| 44 class _CollectionContains extends _CollectionMatcher { | |
| 45 | |
| 46 var _val; | |
|
Bob Nystrom
2012/05/30 23:23:51
"_val" -> "_value"
gram
2012/06/01 17:33:15
Done.
| |
| 47 | |
| 48 _CollectionContains(this._val); | |
| 49 | |
| 50 bool matches(item) { | |
| 51 try { | |
| 52 return item.some( (e) => e == _val ); | |
|
Bob Nystrom
2012/05/30 23:23:51
Space like:
return item.some((e) => e == _val);
gram
2012/06/01 17:33:15
Done.
| |
| 53 } catch (var e) { | |
| 54 return false; | |
| 55 } | |
| 56 } | |
| 57 IDescription describe(IDescription description) => | |
|
Bob Nystrom
2012/05/30 23:23:51
Maybe a blank line before this one?
gram
2012/06/01 17:33:15
Done.
| |
| 58 description.append('contains ').appendDescriptionOf(_val); | |
| 59 } | |
| 60 | |
| 61 //----------------------------------------------------------- | |
| 62 /** | |
| 63 * This returns a matcher which matches collections in which all elements | |
| 64 * match the given [matcher]. | |
| 65 */ | |
| 66 IMatcher everyElement(matcher) => new _EveryElement(wrapMatcher(matcher)); | |
| 67 | |
| 68 class _EveryElement extends _CollectionMatcher { | |
| 69 Matcher _matcher; | |
| 70 | |
| 71 _EveryElement(Matcher this._matcher); | |
|
Bob Nystrom
2012/05/30 23:23:51
We don't type annotate "this." constructor params
gram
2012/06/01 17:33:15
Done.
| |
| 72 | |
| 73 bool matches(item) { | |
| 74 try { | |
| 75 return item.every( (e) => _matcher.matches(e) ); | |
|
Bob Nystrom
2012/05/30 23:23:51
No spaces around lambda fn.
gram
2012/06/01 17:33:15
Done.
| |
| 76 } catch (var e) { | |
| 77 return false; | |
| 78 } | |
| 79 } | |
| 80 IDescription describe(IDescription description) => | |
| 81 description.append('every element '). | |
| 82 appendDescriptionOf(_matcher); | |
| 83 } | |
| 84 | |
| 85 //----------------------------------------------------------- | |
| 86 /** | |
| 87 * This returns a matcher which matches collections in which at least one | |
| 88 * element matches the given [matcher]. | |
| 89 */ | |
| 90 IMatcher someElement(matcher) => new _SomeElement(wrapMatcher(matcher)); | |
| 91 | |
| 92 class _SomeElement extends _CollectionMatcher { | |
| 93 Matcher _matcher; | |
| 94 | |
| 95 _SomeElement(Matcher this._matcher); | |
| 96 | |
| 97 bool matches(item) { | |
| 98 try { | |
| 99 return item.some( (e) => _matcher.matches(e) ); | |
| 100 } catch (var e) { | |
| 101 return false; | |
| 102 } | |
| 103 } | |
| 104 IDescription describe(IDescription description) => | |
| 105 description.append('some element '). | |
| 106 appendDescriptionOf(_matcher); | |
| 107 } | |
| 108 | |
| 109 //----------------------------------------------------------- | |
| 110 /** | |
| 111 * This returns a matcher which matches collections that have the same | |
| 112 * length and the same elements as [expected], and in the same order. | |
| 113 */ | |
| 114 | |
| 115 IMatcher orderedEquals(expected) => new _OrderedEquals(new List.from(expected)); | |
|
Bob Nystrom
2012/05/30 23:23:51
Why new List.from() here?
Can "expected" be annot
gram
2012/06/01 17:33:15
Done.
gram
2012/06/01 17:33:15
We need at least one of the two to be indexable. I
Bob Nystrom
2012/06/01 18:22:22
Is this comment still accurate? It looks like the
| |
| 116 | |
| 117 class _OrderedEquals extends Matcher { | |
| 118 var _expected; | |
| 119 | |
| 120 _OrderedEquals(this._expected); | |
| 121 | |
| 122 bool matches(item) { | |
| 123 try { | |
| 124 List actual = new List.from(item); | |
|
Bob Nystrom
2012/05/30 23:23:51
"List" -> "var".
We rarely annotate locals.
gram
2012/06/01 17:33:15
Done.
| |
| 125 if (_expected.length == actual.length) { | |
|
Bob Nystrom
2012/05/30 23:23:51
It would be nice if this worked with any Iterable
gram
2012/06/01 17:33:15
Done.
| |
| 126 for (int i = 0; i < _expected.length; i++) { | |
| 127 if (_expected[i] != actual[i]) { | |
| 128 return false; | |
| 129 } | |
| 130 } | |
| 131 return true; | |
| 132 } | |
| 133 } catch (var e) { | |
| 134 } | |
| 135 return false; | |
| 136 } | |
| 137 | |
| 138 IDescription describe(IDescription description) => | |
| 139 description.append('equals '). | |
| 140 appendDescriptionOf(_expected).append(' ordered'); | |
| 141 } | |
| 142 | |
| 143 //----------------------------------------------------------- | |
| 144 /** | |
| 145 * This returns a matcher which matches collections that have the same | |
| 146 * length and the same elements as [expected], but not necessarily in | |
| 147 * the same order. | |
| 148 */ | |
| 149 IMatcher unorderedEquals(expected) => | |
|
Bob Nystrom
2012/05/30 23:23:51
Can this be type annotated?
gram
2012/06/01 17:33:15
Done.
| |
| 150 new _UnorderedEquals(new Set.from(expected)); | |
|
Bob Nystrom
2012/05/30 23:23:51
Does this mean all items in expected must be hasha
gram
2012/06/01 17:33:15
I rewrote it so that isn't necessary. It is O(n^2)
| |
| 151 | |
| 152 class _UnorderedEquals extends Matcher { | |
| 153 var _expected; | |
| 154 | |
| 155 _UnorderedEquals(this._expected); | |
| 156 | |
| 157 bool matches(item) { | |
| 158 try { | |
| 159 Set items = new Set.from(item); | |
|
Bob Nystrom
2012/05/30 23:23:51
"Set" -> "var".
gram
2012/06/01 17:33:15
Done.
| |
| 160 Set missing = new Set.from(_expected); | |
| 161 missing.removeAll(items); | |
| 162 Set extra = items; | |
| 163 extra.removeAll(_expected); | |
| 164 return missing.isEmpty() && extra.isEmpty(); | |
| 165 } catch (var e) { | |
| 166 return false; | |
| 167 } | |
| 168 } | |
| 169 | |
| 170 IDescription describe(IDescription description) => | |
| 171 description.append('equals '). | |
| 172 appendDescriptionOf(_expected).append(' unordered'); | |
| 173 } | |
| 174 | |
| OLD | NEW |