Meikel  Brandmeyer avatar Meikel Brandmeyer committed e805f34

Added fatal directive

* directive.clj (fatal*): new function
(fatal): new macro
(FatalTestError): new Exception

* infrastructure.clj (test-driver): added check for *fatal*.
Throw FatalTestError if necessary.

* 012_fatal.t: new test

Comments (0)

Files changed (3)

src/de/kotka/tap/directives.clj

   |      (ok? (inject-flogiston) „flogiston injection works“))"
   [t reason & body]
   `(skip-if* ~t ~reason (fn [] ~@body)))
+
+(defvar- *fatal* false)
+(gen-and-load-class 'de.kotka.tap.FatalTestError :extends Exception)
+
+(defn fatal*
+  "Executes the thunk in fatal context. That is a failing test will
+  abort the thunk immediately. See also „fatal“ macro."
+  [thunk]
+  (binding [*fatal* true]
+    (try
+      (thunk)
+      (catch de.kotka.tap.FatalTestError e `test-failed))))
+
+(defmacro fatal
+  "Abort on failing tests. In case one has several tests, which depend on
+  each other, one can specify a fatal block around the tests in question.
+  Should a test fail, the rest of the tests of the block are skipped.
+
+  Example:
+
+  | => (fatal
+  |      (ok? (save-flogistion-pressure?) „flogiston pressure is save“)
+  |      (is? (open-reactor-door) :opened „reactor door opened“))
+  | not ok 1 - flogiston pressure is save
+
+  Note: the second test is not executed!"
+  [& body]
+  `(fatal* (fn [] ~@body)))

src/de/kotka/tap/infrastructure.clj

           (let [es (pr-str e)
                 as (pr-str qactual)
                 rs (pr-str a)]
-            (diagnose es as rs)))
+            (diagnose es as rs))
+          (when *fatal*
+            (throw (new de.kotka.tap.FatalTestError))))
         a)
+      (catch de.kotka.tap.FatalTestError e
+        (throw e))
       (catch Exception e
         (report-result *mode* false desc)
         (diag (str "Exception was thrown: " e))
-        `test-failed))))
+        (if *fatal*
+          (throw (new de.kotka.tap.FatalTestError))
+          `test-failed)))))
+#! /bin/sh
+#-
+# Copyright 2008 (c) Meikel Brandmeyer.
+# All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+. t/testlib.sh
+
+echo 1..2
+
+try '(fatal (ok? true) (ok? true))' 'ok 1
+ok 2' "fatal runs through on success"
+try '(fatal (ok? false) (ok? true))' 'not ok 1
+# Expected: false to be true' "fatal stops on failure"
+
+cleanup
+
+# vim:ft=sh:
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.