aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Bedra and Stuart Halloway <pair@thinkrelevance.com>2009-08-23 13:56:31 -0400
committerAaron Bedra and Stuart Halloway <pair@thinkrelevance.com>2009-08-23 13:56:31 -0400
commitf9808c1e39e73bbf6234624e4f79c9e91dfcfd22 (patch)
tree3213869c093287da0d27250db620b94dbdd1961e
parentcf4790b017ab4d2840f9d224abfa9c6023f71262 (diff)
got tests passing for clojure.contrib.expect
* had to use fully-qualified symbols in test-has-matching-signature. Should be a better way
-rw-r--r--src/clojure/contrib/test_contrib.clj2
-rw-r--r--src/clojure/contrib/test_contrib/expect_test.clj128
-rw-r--r--src/clojure/contrib/test_contrib/expect_test/util.clj8
3 files changed, 137 insertions, 1 deletions
diff --git a/src/clojure/contrib/test_contrib.clj b/src/clojure/contrib/test_contrib.clj
index d7b2597b..9624e987 100644
--- a/src/clojure/contrib/test_contrib.clj
+++ b/src/clojure/contrib/test_contrib.clj
@@ -20,7 +20,7 @@
[:complex-numbers :fnmap :macro-utils :monads :pprint.pretty
:pprint.cl-format :str-utils :shell-out :test-graph
:test-dataflow :test-java-utils :test-lazy-seqs
- :test-trace :test-jmx :java-utils])
+ :test-trace :test-jmx :java-utils :expect-test])
(def test-namespaces
(map #(symbol (str "clojure.contrib.test-contrib." (name %)))
diff --git a/src/clojure/contrib/test_contrib/expect_test.clj b/src/clojure/contrib/test_contrib/expect_test.clj
new file mode 100644
index 00000000..90528e89
--- /dev/null
+++ b/src/clojure/contrib/test_contrib/expect_test.clj
@@ -0,0 +1,128 @@
+(ns clojure.contrib.test-contrib.expect-test
+ (:use clojure.test
+ clojure.contrib.test-contrib.expect-test.util)
+ (:require [clojure.contrib.expect :as expect]))
+
+; Used as dummy dependency functions
+(defn fn1 [x] :ignore)
+(defn fn2 [x y] :ignore)
+(defn fn3 ([x] :ignore)
+ ([x y z] :ignore))
+(defn fn4 [x y & r] :ignore)
+
+;functions created using fn directly lack the argslist meta data
+(def deffed-differently (fn [x] :ignore))
+
+
+(deftest test-convenience
+ (testing "once"
+ (is (false? (expect/once 0)))
+ (is (false? (expect/once 123)))
+ (is (true? (expect/once 1))))
+
+ (testing "never"
+ (is (false? (expect/never 4)))
+ (is (true? (expect/never 0))))
+
+ (testing "more-than"
+ (is (false? ((expect/more-than 5) 3)))
+ (is (true? ((expect/more-than 5) 9))))
+
+ (testing "less-than"
+ (is (true? ((expect/less-than 5) 3)))
+ (is (false? ((expect/less-than 5) 9))))
+
+ (testing "between"
+ (is (true? ((expect/between 5 8) 6)))
+ (is (false? ((expect/between 5 8) 5)))))
+
+
+(deftest test-returns
+ (is (= {:returns 5} (expect/returns 5)))
+ (is (= {:other-key "test" :returns nil} (expect/returns nil {:other-key "test"}))))
+
+
+(deftest test-has-args
+ (let [ex (:has-args (expect/has-args [1]))]
+ (is (fn? ex))
+ (is (ex 'fn1 1))
+ (is (ex 'fn1 1 5 6))
+ (assert-called expect/unexpected-args true (ex 'fn1 5)))
+ (is (contains? (expect/has-args [] {:pre-existing-key "test"}) :pre-existing-key))
+ (is (true? (((expect/has-args [5]) :has-args)'fn1 5))))
+
+
+(deftest test-has-matching-signature
+ (assert-called expect/no-matching-function-signature true
+ (expect/has-matching-signature? 'clojure.contrib.test-contrib.expect-test/fn2 [1]))
+ (assert-called expect/no-matching-function-signature true
+ (expect/has-matching-signature? 'clojure.contrib.test-contrib.expect-test/fn3 [1 3]))
+ (assert-called expect/no-matching-function-signature false
+ (expect/has-matching-signature? 'clojure.contrib.test-contrib.expect-test/fn3 [1 3 5]))
+ (assert-called expect/no-matching-function-signature false
+ (expect/has-matching-signature? 'clojure.contrib.test-contrib.expect-test/fn4 [1 3 5 7 9]))
+ (assert-called expect/no-matching-function-signature false
+ (expect/has-matching-signature? 'clojure.contrib.test-contrib.expect-test/fn4 [1 3]))
+ (assert-called expect/no-matching-function-signature true
+ (expect/has-matching-signature? 'clojure.contrib.test-contrib.expect-test/fn4 [1]))
+ (assert-called expect/no-matching-function-signature false
+ (expect/has-matching-signature? 'clojure.contrib.test-contrib.expect-test/deffed-differently [1])))
+
+
+(deftest test-times
+ (is (fn? ((expect/times #(= 1 %)) :times)))
+ (is (contains? (expect/times #(= 1 %) {:existing-key "test"}) :existing-key)))
+
+(deftest test-make-mock
+ (testing "invalid arguments"
+ (is (thrown? IllegalArgumentException (expect/make-mock [5]))))
+
+ (testing "valid counter and unevaluated returns"
+ (let [[mock counter count-checker] (expect/make-mock 'fn1 (expect/returns 5 (expect/times 1)))]
+ (is (fn? mock))
+ (is (= 0 @counter))
+ (is (= 5 (mock :ignore-me)))
+ (is (= 1 @counter))))
+
+ (testing "returns as expected"
+ (let [[mock] (expect/make-mock 'fn1 (expect/returns 5))]
+ (is (= 5 (mock :ignore))))
+ (let [[mock] (expect/make-mock 'fn1 (expect/returns #(* 2 %)))]
+ (is (= 10 ((mock :ignore) 5)) ":returns a function should not automatically
+ evaluate it.")))
+
+ (testing "calls replacement-fn and returns the result"
+ (let [[mock] (expect/make-mock 'fn1 (expect/calls #(* 3 %)))]
+ (is (= 15 (mock 5))))
+ (let [[mock] (expect/make-mock 'fn1 (expect/calls #(* 2 %) (expect/returns 3)))]
+ (is (= 10 (mock 5)))))
+
+ (testing "argument validation"
+ (let [[mock] (expect/make-mock 'fn1 (expect/has-args [#(= 5 %)]))]
+ (assert-called expect/unexpected-args true (mock "test"))
+ (is (nil? (mock 5))))))
+
+
+(deftest test-make-count-checker
+ (let [checker (expect/make-count-checker 5 5)]
+ (assert-called expect/incorrect-invocation-count false (checker 'fn1 5))
+ (assert-called expect/incorrect-invocation-count true (checker 'fn1 3))))
+
+
+(deftest test-validate-counts
+ (assert-called expect/incorrect-invocation-count false
+ (expect/validate-counts (list [(fn []) (atom 0) (expect/make-count-checker #(< % 6) '#(< % 6)) 'fn1])))
+ (assert-called expect/incorrect-invocation-count true
+ (expect/validate-counts (list [(fn []) (atom 0) (expect/make-count-checker 4 4) 'fn1]))))
+
+
+(deftest test-expect-macro
+ (let [under-test (fn [x] (fn1 x))]
+ (is (true? (expect/expect [fn1 (expect/times 1 (expect/has-args [#(= 3 %)]))]
+ (under-test 3))))
+ (assert-called expect/unexpected-args true (expect/expect [fn1 (expect/times 1 (expect/has-args [#(= 4 %)]))]
+ (under-test 3))))
+ (let [under-test (fn [] (fn2 (fn1 1) 3))]
+ (is (true? (expect/expect [fn1 (expect/times 1 (expect/has-args [#(= 1 %)] (expect/returns 2)))
+ fn2 (expect/times 1 (expect/has-args [#(= 2 %) #(= 3 %)] (expect/returns 5)))]
+ (under-test)))))) \ No newline at end of file
diff --git a/src/clojure/contrib/test_contrib/expect_test/util.clj b/src/clojure/contrib/test_contrib/expect_test/util.clj
new file mode 100644
index 00000000..a7f0fea9
--- /dev/null
+++ b/src/clojure/contrib/test_contrib/expect_test/util.clj
@@ -0,0 +1,8 @@
+(ns clojure.contrib.test-contrib.expect-test.util
+ (:use clojure.test))
+
+(defmacro assert-called [fn-name called? & body]
+ `(let [called-status?# (atom false)]
+ (binding [~fn-name (fn [& args#] (swap! called-status?# (fn [& args#] true)))] ~@body)
+ (is (= ~called? @called-status?#))))
+