| 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 part of unittest; | |
| 6 | |
| 7 /** | |
| 8 * This is the main assertion function. It asserts that [actual] | |
| 9 * matches the [matcher]. [reason] is optional and is typically not | |
| 10 * supplied, as a reason is generated from the matcher; if [reason] | |
| 11 * is included it is appended to the reason generated by the matcher. | |
| 12 * | |
| 13 * [matcher] can be a value in which case it will be wrapped in an | |
| 14 * [equals] matcher. | |
| 15 * | |
| 16 * If the assertion fails, then the default behavior is to throw an | |
| 17 * [ExpectException], but this behavior can be changed by calling | |
| 18 * [configureExpectFailureHandler] and providing an alternative handler that | |
| 19 * implements the [IFailureHandler] interface. It is also possible to | |
| 20 * pass a [failureHandler] to [expect] as a final parameter for fine- | |
| 21 * grained control. | |
| 22 * | |
| 23 * In some cases extra diagnostic info can be produced on failure (for | |
| 24 * example, stack traces on mismatched exceptions). To enable these, | |
| 25 * [verbose] should be specified as true; | |
| 26 * | |
| 27 * expect() is a 3rd generation assertion mechanism, drawing | |
| 28 * inspiration from [Hamcrest] and Ladislav Thon's [dart-matchers] | |
| 29 * library. | |
| 30 * | |
| 31 * See [Hamcrest] http://en.wikipedia.org/wiki/Hamcrest | |
| 32 * [Hamcrest] http://code.google.com/p/hamcrest/ | |
| 33 * [dart-matchers] https://github.com/Ladicek/dart-matchers | |
| 34 */ | |
| 35 void expect(actual, matcher, {String reason, FailureHandler failureHandler, | |
| 36 bool verbose : false}) { | |
| 37 matcher = wrapMatcher(matcher); | |
| 38 bool doesMatch; | |
| 39 var matchState = new MatchState(); | |
| 40 try { | |
| 41 doesMatch = matcher.matches(actual, matchState); | |
| 42 } catch (e, trace) { | |
| 43 doesMatch = false; | |
| 44 if (reason == null) { | |
| 45 reason = '${(e is String) ? e : e.toString()} at $trace'; | |
| 46 } | |
| 47 } | |
| 48 if (!doesMatch) { | |
| 49 if (failureHandler == null) { | |
| 50 failureHandler = getOrCreateExpectFailureHandler(); | |
| 51 } | |
| 52 failureHandler.failMatch(actual, matcher, reason, matchState, verbose); | |
| 53 } | |
| 54 } | |
| 55 | |
| 56 /** | |
| 57 * Takes an argument and returns an equivalent matcher. | |
| 58 * If the argument is already a matcher this does nothing, | |
| 59 * else if the argument is a function, it generates a predicate | |
| 60 * function matcher, else it generates an equals matcher. | |
| 61 */ | |
| 62 Matcher wrapMatcher(x) { | |
| 63 if (x is Matcher) { | |
| 64 return x; | |
| 65 } else if (x is Function) { | |
| 66 return predicate(x); | |
| 67 } else { | |
| 68 return equals(x); | |
| 69 } | |
| 70 } | |
| 71 | |
| 72 // The handler for failed asserts. | |
| 73 FailureHandler _assertFailureHandler = null; | |
| 74 | |
| 75 // The default failure handler that throws ExpectExceptions. | |
| 76 class DefaultFailureHandler implements FailureHandler { | |
| 77 DefaultFailureHandler() { | |
| 78 if (_assertErrorFormatter == null) { | |
| 79 _assertErrorFormatter = _defaultErrorFormatter; | |
| 80 } | |
| 81 } | |
| 82 void fail(String reason) { | |
| 83 throw new ExpectException(reason); | |
| 84 } | |
| 85 void failMatch(actual, Matcher matcher, String reason, | |
| 86 MatchState matchState, bool verbose) { | |
| 87 fail(_assertErrorFormatter(actual, matcher, reason, matchState, verbose)); | |
| 88 } | |
| 89 } | |
| 90 | |
| 91 /** | |
| 92 * Changes or resets to the default the failure handler for expect() | |
| 93 * [handler] is a reference to the new handler; if this is omitted | |
| 94 * or null then the failure handler is reset to the default, which | |
| 95 * throws [ExpectExceptions] on [expect] assertion failures. | |
| 96 */ | |
| 97 void configureExpectFailureHandler([FailureHandler handler = null]) { | |
| 98 if (handler == null) { | |
| 99 handler = new DefaultFailureHandler(); | |
| 100 } | |
| 101 _assertFailureHandler = handler; | |
| 102 } | |
| 103 | |
| 104 FailureHandler getOrCreateExpectFailureHandler() { | |
| 105 if (_assertFailureHandler == null) { | |
| 106 configureExpectFailureHandler(); | |
| 107 } | |
| 108 return _assertFailureHandler; | |
| 109 } | |
| 110 | |
| 111 // The error message formatter for failed asserts. | |
| 112 ErrorFormatter _assertErrorFormatter = null; | |
| 113 | |
| 114 // The default error formatter implementation. | |
| 115 String _defaultErrorFormatter(actual, Matcher matcher, String reason, | |
| 116 MatchState matchState, bool verbose) { | |
| 117 var description = new StringDescription(); | |
| 118 description.add('Expected: ').addDescriptionOf(matcher). | |
| 119 add('\n but: '); | |
| 120 matcher.describeMismatch(actual, description, matchState, verbose); | |
| 121 description.add('.\n'); | |
| 122 if (verbose && actual is Iterable) { | |
| 123 description.add('Actual: ').addDescriptionOf(actual).add('\n'); | |
| 124 } | |
| 125 if (reason != null) { | |
| 126 description.add(reason).add('\n'); | |
| 127 } | |
| 128 return description.toString(); | |
| 129 } | |
| 130 | |
| 131 /** | |
| 132 * Changes or resets to default the failure message formatter for expect(). | |
| 133 * [formatter] is a reference to the new formatter; if this is omitted or | |
| 134 * null then the failure formatter is reset to the default. The new | |
| 135 * formatter is returned; this allows custom expect handlers to easily | |
| 136 * get a reference to the default formatter. | |
| 137 */ | |
| 138 ErrorFormatter configureExpectFormatter([ErrorFormatter formatter = null]) { | |
| 139 if (formatter == null) { | |
| 140 formatter = _defaultErrorFormatter; | |
| 141 } | |
| 142 return _assertErrorFormatter = formatter; | |
| 143 } | |
| 144 | |
| OLD | NEW |