OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 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 | 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. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 /** | 5 /** |
6 * Expect is used for tests that do not want to make use of the | 6 * Expect is used for tests that do not want to make use of the |
7 * Dart unit test library - for example, the core language tests. | 7 * Dart unit test library - for example, the core language tests. |
8 * Third parties are discouraged from using this, and should use | 8 * Third parties are discouraged from using this, and should use |
9 * the expect() function in the unit test library instead for | 9 * the expect() function in the unit test library instead for |
10 * test assertions. | 10 * test assertions. |
11 */ | 11 */ |
12 class Expect { | 12 class Expect { |
13 /** | 13 /** |
14 * Checks whether the expected and actual values are equal (using `==`). | 14 * Checks whether the expected and actual values are equal (using `==`). |
15 */ | 15 */ |
16 static void equals(var expected, var actual, [String reason = null]) { | 16 static void equals(var expected, var actual, [String reason = null]) { |
17 if (expected == actual) return; | 17 if (expected == actual) return; |
18 String msg = _getMessage(reason); | 18 String msg = _getMessage(reason); |
19 _fail("Expect.equals(expected: <$expected>, actual: <$actual>$msg) fails."); | 19 _fail("Expect.equals(expected: <$expected>, actual: <$actual>$msg) fails."); |
20 } | 20 } |
21 | 21 |
22 /** | 22 /** |
23 * Checks whether the actual value is a bool and its value is true. | 23 * Checks whether the actual value is a bool and its value is true. |
24 */ | 24 */ |
25 static void isTrue(var actual, [String reason = null]) { | 25 static void isTrue(var actual, [String reason = null]) { |
26 if (actual === true) return; | 26 if (_identical(actual, true)) return; |
27 String msg = _getMessage(reason); | 27 String msg = _getMessage(reason); |
28 _fail("Expect.isTrue($actual$msg) fails."); | 28 _fail("Expect.isTrue($actual$msg) fails."); |
29 } | 29 } |
30 | 30 |
31 /** | 31 /** |
32 * Checks whether the actual value is a bool and its value is false. | 32 * Checks whether the actual value is a bool and its value is false. |
33 */ | 33 */ |
34 static void isFalse(var actual, [String reason = null]) { | 34 static void isFalse(var actual, [String reason = null]) { |
35 if (actual === false) return; | 35 if (_identical(actual, false)) return; |
36 String msg = _getMessage(reason); | 36 String msg = _getMessage(reason); |
37 _fail("Expect.isFalse($actual$msg) fails."); | 37 _fail("Expect.isFalse($actual$msg) fails."); |
38 } | 38 } |
39 | 39 |
40 /** | 40 /** |
41 * Checks whether [actual] is null. | 41 * Checks whether [actual] is null. |
42 */ | 42 */ |
43 static void isNull(actual, [String reason = null]) { | 43 static void isNull(actual, [String reason = null]) { |
44 if (null === actual) return; | 44 if (null == actual) return; |
45 String msg = _getMessage(reason); | 45 String msg = _getMessage(reason); |
46 _fail("Expect.isNull(actual: <$actual>$msg) fails."); | 46 _fail("Expect.isNull(actual: <$actual>$msg) fails."); |
47 } | 47 } |
48 | 48 |
49 /** | 49 /** |
50 * Checks whether [actual] is not null. | 50 * Checks whether [actual] is not null. |
51 */ | 51 */ |
52 static void isNotNull(actual, [String reason = null]) { | 52 static void isNotNull(actual, [String reason = null]) { |
53 if (null !== actual) return; | 53 if (null != actual) return; |
54 String msg = _getMessage(reason); | 54 String msg = _getMessage(reason); |
55 _fail("Expect.isNotNull(actual: <$actual>$msg) fails."); | 55 _fail("Expect.isNotNull(actual: <$actual>$msg) fails."); |
56 } | 56 } |
57 | 57 |
58 /** | 58 /** |
59 * Checks whether the expected and actual values are identical | 59 * Checks whether the expected and actual values are identical |
60 * (using `===`). | 60 * (using `===`). |
61 */ | 61 */ |
62 static void identical(var expected, var actual, [String reason = null]) { | 62 static void identical(var expected, var actual, [String reason = null]) { |
63 if (expected === actual) return; | 63 if (_identical(expected, actual)) return; |
64 String msg = _getMessage(reason); | 64 String msg = _getMessage(reason); |
65 _fail("Expect.identical(expected: <$expected>, actual: <$actual>$msg) " | 65 _fail("Expect.identical(expected: <$expected>, actual: <$actual>$msg) " |
66 "fails."); | 66 "fails."); |
67 } | 67 } |
68 | 68 |
69 // Unconditional failure. | 69 // Unconditional failure. |
70 static void fail(String msg) { | 70 static void fail(String msg) { |
71 _fail("Expect.fail('$msg')"); | 71 _fail("Expect.fail('$msg')"); |
72 } | 72 } |
73 | 73 |
74 /** | 74 /** |
75 * Failure if the difference between expected and actual is greater than the | 75 * Failure if the difference between expected and actual is greater than the |
76 * given tolerance. If no tolerance is given, tolerance is assumed to be the | 76 * given tolerance. If no tolerance is given, tolerance is assumed to be the |
77 * value 4 significant digits smaller than the value given for expected. | 77 * value 4 significant digits smaller than the value given for expected. |
78 */ | 78 */ |
79 static void approxEquals(num expected, | 79 static void approxEquals(num expected, |
80 num actual, | 80 num actual, |
81 [num tolerance = null, | 81 [num tolerance = null, |
82 String reason = null]) { | 82 String reason = null]) { |
83 if (tolerance === null) { | 83 if (tolerance == null) { |
84 tolerance = (expected / 1e4).abs(); | 84 tolerance = (expected / 1e4).abs(); |
85 } | 85 } |
86 // Note: use !( <= ) rather than > so we fail on NaNs | 86 // Note: use !( <= ) rather than > so we fail on NaNs |
87 if ((expected - actual).abs() <= tolerance) return; | 87 if ((expected - actual).abs() <= tolerance) return; |
88 | 88 |
89 String msg = _getMessage(reason); | 89 String msg = _getMessage(reason); |
90 _fail('Expect.approxEquals(expected:<$expected>, actual:<$actual>, ' | 90 _fail('Expect.approxEquals(expected:<$expected>, actual:<$actual>, ' |
91 'tolerance:<$tolerance>$msg) fails'); | 91 'tolerance:<$tolerance>$msg) fails'); |
92 } | 92 } |
93 | 93 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
152 * this method shows where the mismatch starts and ends. | 152 * this method shows where the mismatch starts and ends. |
153 */ | 153 */ |
154 static void stringEquals(String expected, | 154 static void stringEquals(String expected, |
155 String actual, | 155 String actual, |
156 [String reason = null]) { | 156 [String reason = null]) { |
157 String msg = _getMessage(reason); | 157 String msg = _getMessage(reason); |
158 String defaultMessage = | 158 String defaultMessage = |
159 'Expect.stringEquals(expected: <$expected>", <$actual>$msg) fails'; | 159 'Expect.stringEquals(expected: <$expected>", <$actual>$msg) fails'; |
160 | 160 |
161 if (expected == actual) return; | 161 if (expected == actual) return; |
162 if ((expected === null) || (actual === null)) { | 162 if ((expected == null) || (actual == null)) { |
163 _fail('$defaultMessage'); | 163 _fail('$defaultMessage'); |
164 } | 164 } |
165 // scan from the left until we find a mismatch | 165 // scan from the left until we find a mismatch |
166 int left = 0; | 166 int left = 0; |
167 int eLen = expected.length; | 167 int eLen = expected.length; |
168 int aLen = actual.length; | 168 int aLen = actual.length; |
169 while (true) { | 169 while (true) { |
170 if (left == eLen) { | 170 if (left == eLen) { |
171 assert (left < aLen); | 171 assert (left < aLen); |
172 String snippet = actual.substring(left, aLen); | 172 String snippet = actual.substring(left, aLen); |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
258 * the type of the exception you could write this: | 258 * the type of the exception you could write this: |
259 * | 259 * |
260 * Expect.throws(myThrowingFunction, (e) => e is MyException); | 260 * Expect.throws(myThrowingFunction, (e) => e is MyException); |
261 */ | 261 */ |
262 static void throws(void f(), | 262 static void throws(void f(), |
263 [_CheckExceptionFn check = null, | 263 [_CheckExceptionFn check = null, |
264 String reason = null]) { | 264 String reason = null]) { |
265 try { | 265 try { |
266 f(); | 266 f(); |
267 } catch (e, s) { | 267 } catch (e, s) { |
268 if (check !== null) { | 268 if (check != null) { |
269 if (!check(e)) { | 269 if (!check(e)) { |
270 String msg = reason == null ? "" : reason; | 270 String msg = reason == null ? "" : reason; |
271 _fail("Expect.throws($msg): Unexpected '$e'\n$s"); | 271 _fail("Expect.throws($msg): Unexpected '$e'\n$s"); |
272 } | 272 } |
273 } | 273 } |
274 return; | 274 return; |
275 } | 275 } |
276 String msg = reason == null ? "" : reason; | 276 String msg = reason == null ? "" : reason; |
277 _fail('Expect.throws($msg) fails'); | 277 _fail('Expect.throws($msg) fails'); |
278 } | 278 } |
279 | 279 |
280 static String _getMessage(String reason) | 280 static String _getMessage(String reason) |
281 => (reason === null) ? "" : ", '$reason'"; | 281 => (reason == null) ? "" : ", '$reason'"; |
282 | 282 |
283 static void _fail(String message) { | 283 static void _fail(String message) { |
284 throw new ExpectException(message); | 284 throw new ExpectException(message); |
285 } | 285 } |
286 } | 286 } |
287 | 287 |
| 288 bool _identical(a, b) => identical(a, b); |
| 289 |
288 typedef bool _CheckExceptionFn(exception); | 290 typedef bool _CheckExceptionFn(exception); |
289 | 291 |
290 class ExpectException implements Exception { | 292 class ExpectException implements Exception { |
291 ExpectException(this.message); | 293 ExpectException(this.message); |
292 String toString() => message; | 294 String toString() => message; |
293 String message; | 295 String message; |
294 } | 296 } |
OLD | NEW |