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

Side by Side Diff: lib/unittest/numeric_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 /**
6 * Returns a matcher which matches if the match argument is greater
7 * than the given [value].
8 */
9 IMatcher greaterThan(value) =>
10 new _OrderingComparison(value, false, false, true, 'greater than');
11
12 /**
13 * Returns a matcher which matches if the match argument is greater
14 * than or equal to the given [value].
15 */
16 IMatcher greaterThanOrEqualTo(value) =>
17 new _OrderingComparison(value, true, false, true, 'greater than or equal to');
18
19 /**
20 * Returns a matcher which matches if the match argument is less
21 * than the given [value].
22 */
23 IMatcher lessThan(value) =>
24 new _OrderingComparison(value, false, true, false, 'less than');
25
26 /**
27 * Returns a matcher which matches if the match argument is less
28 * than or equal to the given [value].
29 */
30 IMatcher lessThanOrEqualTo(value) =>
Bob Nystrom 2012/05/30 23:23:51 Is this really better than doing: expect(foo > ba
gram 2012/06/01 17:33:15 It gives better error messages. Either can be used
31 new _OrderingComparison(value, true, true, false, 'less than or equal to');
32
33 /**
34 * Returns a matcher which matches if the match argument is zero.
35 */
36 IMatcher isZero() {
Bob Nystrom 2012/05/30 23:23:51 Make these constants.
gram 2012/06/01 17:33:15 Done.
37 return new _OrderingComparison(0, true, false, false, 'equal to');
38 }
39
40 /**
41 * Returns a matcher which matches if the match argument is non-zero.
42 */
43 IMatcher isNonZero() {
44 return new _OrderingComparison(0, false, true, true, 'not equal to');
45 }
46
47 /**
48 * Returns a matcher which matches if the match argument is positive
49 * (0 inclusive).
50 */
51 IMatcher isPositive() {
52 return new _OrderingComparison(0, true, false, true, 'positive', false);
53 }
54
55 /**
56 * Returns a matcher which matches if the match argument is negative
57 * (0 exclusive).
58 */
59 IMatcher isNegative() {
60 return new _OrderingComparison(0, false, true, false, 'negative', false);
61 }
62
63 bool _isNumeric(value) {
64 return value is int || value is double;
Bob Nystrom 2012/05/30 23:23:51 "is num" But I would just get rid of this. You ca
gram 2012/06/01 17:33:15 This isn't a matcher - it's a utility function use
Bob Nystrom 2012/06/01 18:22:22 Oh, right. Sorry. In either case, you can still si
65 }
66
67 class _OrderingComparison extends _NumericMatcher {
68
69 var _value; // Expected value.
Bob Nystrom 2012/05/30 23:23:51 Make these doc comments. Make the fields final.
gram 2012/06/01 17:33:15 Done.
70 bool _equalValue; // Return this if values are equal.
71 bool _lessThanValue; // Return this if test value < expected.
72 bool _greaterThanValue; // Return this if test value > expected.
73 String _comparisonDescription; // Textual name of inequality.
74 bool _valueInDescription; // include value in description?
75
76 _OrderingComparison(
77 this._value,
78 bool this._equalValue,
Bob Nystrom 2012/05/30 23:23:51 Remove these type annotations.
gram 2012/06/01 17:33:15 Done.
79 bool this._lessThanValue,
80 bool this._greaterThanValue,
81 String this._comparisonDescription,
82 [bool this._valueInDescription = true]) {
83 if (!_isNumeric(_value)) {
84 throw new IllegalArgumentException(
85 'Expected value for ${_comparisonDescription} must be numeric');
86 }
87 }
88
89 bool matches(item) {
90 if (!_isNumeric(item)) {
Bob Nystrom 2012/05/30 23:23:51 Should we allow this on user-defined types that im
gram 2012/06/01 17:33:15 Done.
91 return false;
92 }
93 if (item == _value) {
94 return _equalValue;
95 } else if (item < _value) {
96 return _lessThanValue;
97 } else {
98 return _greaterThanValue;
99 }
100 }
101
102 IDescription describe(IDescription description) =>
Bob Nystrom 2012/05/30 23:23:51 I would use a {} body here.
gram 2012/06/01 17:33:15 Done.
103 description.append('a value ').
104 append(_comparisonDescription).
105 append(' ').
106 appendDescriptionOf(_value);
107 }
108
109 /**
110 * Returns a matcher which matches if the match argument is within [delta]
111 * of some [value]; i.e. if the match argument is greater than
112 * than or equal [value]-[delta] and less than or equal to [value]+[delta].
113 */
114 IMatcher closeTo(value, delta) => new _IsCloseTo(value, delta);
115
116 class _IsCloseTo extends _NumericMatcher {
117
118 var _value, _delta;
119
120 _IsCloseTo(this._value, this._delta) {
121 if (!_isNumeric(_value)) {
122 throw new IllegalArgumentException('IsCloseTo value must be numeric');
123 }
124 if (!_isNumeric(_delta)) {
125 throw new IllegalArgumentException('IsCloseTo delta must be numeric');
126 }
127 }
128
129 bool matches(item) {
130 if (!_isNumeric(item)) {
131 return false;
132 }
133 var diff = item - _value;
134 if (diff < 0) diff = -diff;
Bob Nystrom 2012/05/30 23:23:51 var diff = Math.abs(item - _value);
gram 2012/06/01 17:33:15 There is no Math.abs
Bob Nystrom 2012/06/01 18:22:22 Heh, whoops! Every now and then, the corelib desig
135 return (diff <= _delta);
136 }
137
138 IDescription describeMismatch(item, IDescription mismatchDescription) {
139 if (_isNumeric(item)) {
140 var diff = item - _value;
141 if (diff < 0) diff = -diff;
142 return mismatchDescription.
143 appendDescriptionOf(item).
144 append(' differed by ').
145 appendDescriptionOf(diff);
146 } else {
147 return super.describeMismatch(item, mismatchDescription);
148 }
149 }
150
151 IDescription describe(IDescription description) =>
152 description.append('a numeric value within ').
153 appendDescriptionOf(_delta).
154 append(' of ').
155 appendDescriptionOf(_value);
156 }
157
158 /**
159 * Returns a matcher which matches if the match argument is greater
160 * than or equal to a [low] and less than or equal to [high].
Bob Nystrom 2012/05/30 23:23:51 "to a" -> "to"
gram 2012/06/01 17:33:15 Done.
161 */
162 IMatcher inInclusiveRange(low, high) => new _InRange(low, high, false, false);
163
164 /**
165 * Returns a matcher which matches if the match argument is greater
166 * than [low] and less than [high].
167 */
168 IMatcher inExclusiveRange(low, high) => new _InRange(low, high, true, true);
Bob Nystrom 2012/05/30 23:23:51 Add a blank line after each member.
gram 2012/06/01 17:33:15 Done.
169 /**
170 * Returns a matcher which matches if the match argument is greater
171 * than [low] and less than or equal to [high].
172 */
173 IMatcher inOpenClosedRange(low, high) => new _InRange(low, high, true, false);
174 /**
175 * Returns a matcher which matches if the match argument is greater
176 * than or equal to a [low] and less than [high].
177 */
178 IMatcher inClosedOpenRange(low, high) => new _InRange(low, high, false, true);
179
180
181 class _InRange extends _NumericMatcher {
182 num _low, _high;
183 bool _lowExclusive, _highExclusive;
184
185 _InRange(num this._low, num this._high,
186 bool this._lowExclusive, bool this._highExclusive) {
187 if (!_isNumeric(_low) || !_isNumeric(_high)) {
Bob Nystrom 2012/05/30 23:23:51 Delete these checks. That's what checked mode is f
gram 2012/06/01 17:33:15 Done.
188 throw new
189 IllegalArgumentException('IsRange range arguments must be numeric');
190 }
191 if (!(_lowExclusive is bool) || !(_highExclusive is bool)) {
192 throw new IllegalArgumentException('IsRange flag arguments must be bool');
193 }
194 }
195
196 bool matches(value) {
197 if (!_isNumeric(value)) {
198 return false;
199 }
200 if (value < _low || value > _high) {
201 return false;
202 }
203 if (_lowExclusive && value == _low) {
204 return false;
205 }
206 if (_highExclusive && value == _high) {
207 return false;
208 }
209 return true;
210 }
211
212 IDescription describe(IDescription description) =>
213 description.append("be in range from "
214 "$_low (${_lowExclusive?'exclusive':'inclusive'}) to "
Bob Nystrom 2012/05/30 23:23:51 Spaces around ? and :
gram 2012/06/01 17:33:15 Done.
215 "$_high (${_highExclusive?'exclusive':'inclusive'})");
216
217 IDescription describeMismatch(item, IDescription mismatchDescription) {
218 if (!_isNumeric(item)) {
219 return mismatchDescription.
220 appendDescriptionOf(item).
221 append(' not numeric');
222 } else {
223 return super.describeMismatch(item, mismatchDescription);
224 }
225 }
226 }
227
228
229 // Numeric matchers match against a number. We add this intermediate
230 // class to give better mismatch error messages than the base Matcher class.
231 class _NumericMatcher extends Matcher {
232 IDescription describeMismatch(item, IDescription mismatchDescription) {
233 if (!_isNumeric(item)) {
234 return mismatchDescription.
235 appendDescriptionOf(item).
236 append(' not numeric');
237 } else {
238 return super.describeMismatch(item, mismatchDescription);
239 }
240 }
241 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698