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

Unified Diff: lib/unittest/expect.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, 7 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 side-by-side diff with in-line comments
Download patch
Index: lib/unittest/expect.dart
===================================================================
--- lib/unittest/expect.dart (revision 0)
+++ lib/unittest/expect.dart (revision 0)
@@ -0,0 +1,130 @@
+// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * This is the main assertion function, and can be used in two ways:
+ *
+ * expect(value, matcher, reason)
Bob Nystrom 2012/05/30 23:23:51 Do five spaces here and elsewhere. The first one i
+ *
+ * or:
+ *
+ * expect(BooleanConditon, reason)
+ *
+ * The reason is optional and in the first case typically not
+ * supplied, as a reason can be generated from the matcher.
+ *
+ * In the first form expect() asserts that the value [arg1] satisfies
+ * the matcher [arg2] for the reason [arg3]. In the second form expect()
Bob Nystrom 2012/05/30 23:23:51 Do we use the second form anywhere? If not, we cou
gram 2012/06/01 17:33:15 Done.
+ * asserts that the Boolean condition [arg1] is true for reason [arg2].
+ *
+ * If the assertion fails, then the default behavior is to throw an
+ * ExpectException, but this behavior can be changed by calling
Bob Nystrom 2012/05/30 23:23:51 Put square brackets around ExpectException, config
gram 2012/06/01 17:33:15 Done.
+ * configureExpectHandler and providing an alternative handler that
+ * implements the IFailureHandler interface.
+ *
+ * expect is a 3rd generation assertion mechanism, drawing
Bob Nystrom 2012/05/30 23:23:51 `expect()`
gram 2012/06/01 17:33:15 Done.
+ * inspiration from Hamcrest and Ladislav Thon's matcher
Bob Nystrom 2012/05/30 23:23:51 Make these markdown links: [Hamcrest][] and Ladis
gram 2012/06/01 17:33:15 Done.
Bob Nystrom 2012/06/01 18:22:22 Almost done. :) The markdown syntax is very specif
+ * library.
+ *
+ * See http://en.wikipedia.org/wiki/Hamcrest
+ * http://http://code.google.com/p/hamcrest/
+ * https://github.com/Ladicek/dart-matchers
+ */
+
+void expect(arg1, [arg2=null, String arg3='']) {
+ if (arg2 is IMatcher) {
+ _assertMatch(arg1, arg2, arg3);
+ } else {
+ _assertBool(arg1, arg2);
+ }
+}
+
+// _assertMatch handles expect() calls that use a matcher.
Bob Nystrom 2012/05/30 23:23:51 This comment is probably not necessary.
gram 2012/06/01 17:33:15 Done.
+// It just checks if the matcher matches, and if not, builds up
+// an error message that then calls the failure handler.
+void _assertMatch(actual, IMatcher matcher, String reason) {
+ if (!matcher.matches(actual)) {
+ // Make sure we have a failure handler and formatter configured
+ configureExpectHandler(_assertFailureHandler);
+ configureExpectFormatter(_assertErrorFormatter);
+ _assertFailureHandler.failMatch(actual, matcher, reason);
+ }
+}
+
+// assertBool handles expect() calls that use a Boolean condition.
+void _assertBool(assertion, [String reason=null]) {
Bob Nystrom 2012/05/30 23:23:51 Type annotate assertion.
gram 2012/06/01 17:33:15 Done.
+ if (!assertion) {
+ if (reason == null) {
+ reason = 'Assertion failed';
+ }
+ // Make sure we have a failure handler configured
+ configureExpectHandler(_assertFailureHandler);
+ _assertFailureHandler.fail(reason);
+ }
+}
+
+// wrapMatcher takes an argument and returns a equivalent matcher.
Bob Nystrom 2012/05/30 23:23:51 "Takes an argument and returns an equivalent match
gram 2012/06/01 17:33:15 Done.
+// If the argument is already a matcher this does nothing, else it
+// generates a equals matcher for the argument.
Bob Nystrom 2012/05/30 23:23:51 "a equals" -> "an equals"
gram 2012/06/01 17:33:15 Done.
+IMatcher wrapMatcher(x) => ((x is IMatcher) ? x : equals(x));
Bob Nystrom 2012/05/30 23:23:51 What is this used for?
gram 2012/06/01 17:33:15 It allows matchers that themselves expect matcher
+
+//-----------------------------------------------------------
+// The reference to the failure handler for failed asserts
Bob Nystrom 2012/05/30 23:23:51 This comment doesn't add much.
gram 2012/06/01 17:33:15 Done.
+IFailureHandler _assertFailureHandler = null;
+
+// The default failure handler that throws ExpectExceptions
+class DefaultFailureHandler implements IFailureHandler {
+ void fail(String reason) {
+ throw new ExpectException(reason);
+ }
+ void failMatch(actual, IMatcher matcher, String reason) {
+ fail(_assertErrorFormatter.format(actual, matcher, reason));
+ }
+}
+
+/**
+ * Changes or resets to the default the failure handler for expect()
+ * [handler] is a reference to the new handler (that must implement
+ * IFailureHandler); if this is omitted or null then the failure handler
Bob Nystrom 2012/05/30 23:23:51 Remove "(that must implement IFailureHandler)" Tha
gram 2012/06/01 17:33:15 Done.
+ * is reset to the default, which throws ExpectExceptions on expect()
Bob Nystrom 2012/05/30 23:23:51 Square brackets around [ExpectException]s and [exp
gram 2012/06/01 17:33:15 Done.
+ * assertion failures.
+ */
+void configureExpectHandler([IFailureHandler handler = null]) {
Bob Nystrom 2012/05/30 23:23:51 Why make this optional?
gram 2012/06/01 17:33:15 For the reset to default case.
+ if (handler == null) {
+ handler = new DefaultFailureHandler();
+ }
+ _assertFailureHandler = handler;
+}
+
+//------------------------------------------------------------------
+// The reference to the error message formatter for failed asserts
+IErrorFormatter _assertErrorFormatter = null;
Bob Nystrom 2012/05/30 23:23:51 This comment doesn't add much.
gram 2012/06/01 17:33:15 Done.
+
+// The default error formatter implementation
+class DefaultErrorFormatter implements IErrorFormatter {
+ String format(actual, IMatcher matcher, String reason) {
+ var description = new StringDescription();
+ description.append(reason).
+ append('\nExpected: ').
Bob Nystrom 2012/05/30 23:23:51 Indent these +4.
gram 2012/06/01 17:33:15 Done.
+ appendDescriptionOf(matcher).
+ append('\n but: ');
+ matcher.describeMismatch(actual, description);
+ description.append('\n');
+ return description.toString();
+ }
+}
+
+/**
+ * Changes or resets to default the failure message formatter for expect().
+ * [formatter] is a reference to the new formatter (that must implement
Bob Nystrom 2012/05/30 23:23:51 Remove parenthetical.
gram 2012/06/01 17:33:15 Done.
+ * IFailureFormatter); if this is omitted or null then the failure formatter
+ * is reset to the default.
+ */
+void configureExpectFormatter([IErrorFormatter formatter = null]) {
+ if (formatter == null) {
+ formatter = new DefaultErrorFormatter();
+ }
+ _assertErrorFormatter = formatter;
+}
+

Powered by Google App Engine
This is Rietveld 408576698