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

Side by Side Diff: lib/unittest/string_matchers.dart

Issue 10441104: New expectation functions plus convert old tests to use these. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 6 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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 /** Returns a matcher which matches strings that are empty. */
6 IMatcher isEmptyString() => new _Empty();
Bob Nystrom 2012/05/30 23:23:51 Does this add a lot of value over just doing: exp
7
8 class _Empty extends _StringMatcher {
9
10 _Empty();
11
12 bool matches(item) => (item is String && item.length == 0);
13
14 IDescription describe(IDescription description) =>
15 description.append('empty string');
16 }
17
18 /**
19 * Returns a matcher which matches if the interpolated string form of the
20 * match argument matches the given [matcher]. That is:
21 *
22 * expect(foo, isInterpolated(bar))
23 *
24 * is equivalent to:
25 *
26 * expect("${foo}", bar)
27 */
28 IMatcher isInterpolated(matcher) => new _IsInterpolated(wrapMatcher(matcher));
Bob Nystrom 2012/05/30 23:23:51 I think this is equivalent to toString(). Do we ne
gram 2012/06/01 17:33:15 Done.
29
30 class _IsInterpolated extends Matcher {
31 Matcher _matcher;
32
33 _IsInterpolated(this._matcher) {
34 if (!(_matcher is Matcher)) {
35 throw new IllegalArgumentException('isInterpolated expects Matcher');
36 }
37 }
38
39 bool matches(item) => _matcher.matches("${item}");
40
41 IDescription describe(IDescription description) =>
42 description.appendDescriptionOf(_matcher).append(' interpolated');
43 }
44
45 /**
46 * Returns a matcher which matches if the match argument is a string and
47 * is equal to [value] when compared case-insensitively.
48 */
49 IMatcher equalToIgnoringCase(String value) => new _IsEqualIgnoringCase(value);
Bob Nystrom 2012/05/30 23:23:51 "equalTo" -> "equals"
gram 2012/06/01 17:33:15 Done.
50
51 class _IsEqualIgnoringCase extends _StringMatcher {
52
53 String _value;
54 String _matchValue;
55
56 _IsEqualIgnoringCase(String this._value) {
57 if (!(_value is String)) {
Bob Nystrom 2012/05/30 23:23:51 Remove this check.
gram 2012/06/01 17:33:15 Done.
58 throw new IllegalArgumentException('equalToIgnoringCase requires string');
59 }
60 _matchValue = _value.toLowerCase();
61 }
62
63 bool matches(item) =>
64 (item is String && _matchValue == item.toLowerCase());
65
66 IDescription describe(IDescription description) =>
67 description.appendDescriptionOf(_value).append(' ignoring case');
68 }
69
70 //---------------------------------------------------------------------
71 // Utility functions
Bob Nystrom 2012/05/30 23:23:51 Remove this comment?
gram 2012/06/01 17:33:15 I removed the --- at least.
72
73 bool isWhiteSpace(String ch) => (' \n\r\t'.indexOf(ch) >= 0);
Bob Nystrom 2012/05/30 23:23:51 There is some debate here, but I think this should
gram 2012/06/01 17:33:15 Done.
74
75 String _stripspace(_string) {
Bob Nystrom 2012/05/30 23:23:51 "_normalizeWhitespace"?
gram 2012/06/01 17:33:15 Done.
gram 2012/06/01 17:33:15 Done.
76 StringBuffer result = new StringBuffer();
77 bool skipSpace = true;
78 for (var i = 0; i < _string.length; i++) {
79 var character = _string[i];
80 if (isWhiteSpace(character)) {
81 if (!skipSpace) {
82 result.add(' ');
83 skipSpace = true;
84 }
85 } else {
86 result.add(character);
87 skipSpace = false;
88 }
89 }
90 return result.toString().trim();
91 }
92
93 /**
94 * Returns a matcher which matches if the match argument is a string and
95 * is equal to [value] when compared with all runs of white space
Bob Nystrom 2012/05/30 23:23:51 "whitespace"
gram 2012/06/01 17:33:15 Done.
96 * collapsed to single spaces and leading and trailing whitespace removed.
97 *
98 * For example, equalToIgnoringCase("hello world") will match
Bob Nystrom 2012/05/30 23:23:51 Put inline code in backticks: `equalToIgnoringWhit
gram 2012/06/01 17:33:15 Done.
99 * "hello world", " hello world" and "hello world ".
100 */
101 IMatcher equalToIgnoringWhitespace(_string) =>
Bob Nystrom 2012/05/30 23:23:51 "equalTo" -> "equals"
gram 2012/06/01 17:33:15 Done.
102 new _IsEqualIgnoringWhiteSpace(_string);
103
104 class _IsEqualIgnoringWhiteSpace extends _StringMatcher {
105
106 String _value;
107 String _matchValue;
108
109 _IsEqualIgnoringWhiteSpace(this._value) {
110 if (!(_value is String)) {
Bob Nystrom 2012/05/30 23:23:51 Remove check.
gram 2012/06/01 17:33:15 Done.
111 throw new
112 IllegalArgumentException('equalToIgnoringWhitespace requires string');
113 }
114 _matchValue = _stripspace(_value);
115 }
116
117 bool matches(item) => (item is String && _matchValue == _stripspace(item));
Bob Nystrom 2012/05/30 23:23:51 Unneeded ().
gram 2012/06/01 17:33:15 Done.
118
119 IDescription describe(IDescription description) =>
120 description.appendDescriptionOf(_matchValue).
Bob Nystrom 2012/05/30 23:23:51 I would use a {} here. If not, +2 indent.
gram 2012/06/01 17:33:15 Done.
121 append(' ignoring whitespace');
122
123 IDescription describeMismatch(item, IDescription mismatchDescription) {
124 if (item is String) {
125 return mismatchDescription.append('was ').
126 appendDescriptionOf(_stripspace(item));
127 } else {
128 return super.describeMismatch(item, mismatchDescription);
129 }
130 }
131 }
132
133 /**
134 * Returns a matcher that matches if the match argument is a string and
135 * starts with [value].
136 */
137 IMatcher startsWith(substring) => new _StringStartsWith(substring);
138
139 class _StringStartsWith extends _StringMatcher {
140
141 String _substring;
142
143 _StringStartsWith(String this._substring) {
144 if (!(_substring is String)) {
145 throw new
146 IllegalArgumentException('startsWith requires a string');
147 }
148 }
149
150 bool matches(item) => (item is String && item.startsWith(_substring));
151
152 IDescription describe(IDescription description) =>
153 description.append('a string starting with ').
154 appendDescriptionOf(_substring);
155 }
156
157 /**
158 * Returns a matcher that matches if the match argument is a string and
159 * ends with [value].
160 */
161 IMatcher endsWith(value) => new _StringEndsWith(value);
162
163 class _StringEndsWith extends _StringMatcher {
164
165 String _substring;
166
167 _StringEndsWith(String this._substring) {
168 if (!(_substring is String)) {
169 throw new
170 IllegalArgumentException('endsWith requires a string');
Bob Nystrom 2012/05/30 23:23:51 Indent +2.
gram 2012/06/01 17:33:15 Done.
171 }
172 }
173
174 bool matches(item) => (item is String && item.endsWith(_substring));
175
176 IDescription describe(IDescription description) =>
177 description.append('a string ending with ').
178 appendDescriptionOf(_substring);
179 }
180
181 /**
182 * Returns a matcher that matches if the match argument is a string and
183 * contains [substring].
184 */
185 IMatcher containsString(substring) => new _StringContains(substring);
Bob Nystrom 2012/05/30 23:23:51 Can we do a single unified contains() that works w
gram 2012/06/01 17:33:15 Done.
186
187 class _StringContains extends _StringMatcher {
188
189 String _substring;
190
191 _StringContains(String this._substring) {
192 if (!(_substring is String)) {
193 throw new
194 IllegalArgumentException('containsString requires a string');
195 }
196 }
197
198 bool matches(item) => (item is String && item.indexOf(_substring) >= 0);
199
200 IDescription describe(IDescription description) =>
201 description.append('a string containing ').
202 appendDescriptionOf(_substring);
203 }
204
205 /**
206 * Returns a matcher that matches if the match argument is a string and
207 * contains a given list of [substrings] in relative order.
208 *
209 * For example, stringContainsInOrder(["a", "e", "i", "o", "u"]) will match
210 * "abcdefghijklmnopqrstuvwxyz".
211 */
212 IMatcher stringContainsInOrder(substrings) =>
213 new _StringContainsInOrder(substrings);
214
215 class _StringContainsInOrder extends _StringMatcher {
216
217 List<String> _substrings;
218
219 _StringContainsInOrder(List<String> this._substrings) {
220 if (!(_substrings is List)) {
221 throw new IllegalArgumentException(
222 'stringContainsInOrder requires a list of strings');
223 }
224 for (var s in _substrings) {
225 if (!(s is String)) {
226 throw new IllegalArgumentException(
227 'stringContainsInOrder requires a list of strings');
228 }
229 }
230 }
231
232 bool matches(item) {
233 if (!(item is String)) {
234 return false;
235 }
236 var from_index = 0;
237 for (var s in _substrings) {
238 from_index = item.indexOf(s, from_index);
239 if (from_index < 0)
240 return false;
241 }
242 return true;
243 }
244
245 IDescription describe(IDescription description) =>
246 description.appendList('a string containing ', ', ', ' in order',
247 _substrings);
248 }
249
250 /**
251 * Returns a matcher that matches if the match argument is a string and
252 * matches the regular expression given by [re]. [re] can be a RegExp
253 * instance or a string; in the latter case it will be used to create
254 * a RegExp instance.
255 */
256 IMatcher matches(re) => new _MatchesRegExp(re);
257
258 class _MatchesRegExp extends _StringMatcher {
259 RegExp _regexp;
260
261 _MatchesRegExp(re) {
262 if (re is String) {
263 _regexp = new RegExp(re);
264 } else if (re is RegExp) {
265 _regexp = re;
266 } else {
267 throw new IllegalArgumentException('matches requires a regexp or string');
268 }
269 }
270
271 bool matches(String item) => _regexp.hasMatch(item);
272
273 IDescription describe(IDescription description) =>
Bob Nystrom 2012/05/30 23:23:51 Extra space.
gram 2012/06/01 17:33:15 Done.
274 description.append("match '${_regexp.pattern}'");
275 }
276
277 // String matchers match against a string. We add this intermediate
278 // class to give better mismatch error messages than the base Matcher class.
279 class _StringMatcher extends Matcher {
280 IDescription describeMismatch(item, IDescription mismatchDescription) {
281 if (!(item is String)) {
282 return mismatchDescription.
283 appendDescriptionOf(item).
284 append(' not a string');
285 } else {
286 return super.describeMismatch(item, mismatchDescription);
287 }
288 }
289 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698