diff options
author | Aaron Bedra and Stuart Halloway <pair@thinkrelevance.com> | 2009-08-23 13:56:31 -0400 |
---|---|---|
committer | Aaron Bedra and Stuart Halloway <pair@thinkrelevance.com> | 2009-08-23 13:56:31 -0400 |
commit | f9808c1e39e73bbf6234624e4f79c9e91dfcfd22 (patch) | |
tree | 3213869c093287da0d27250db620b94dbdd1961e | |
parent | cf4790b017ab4d2840f9d224abfa9c6023f71262 (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.clj | 2 | ||||
-rw-r--r-- | src/clojure/contrib/test_contrib/expect_test.clj | 128 | ||||
-rw-r--r-- | src/clojure/contrib/test_contrib/expect_test/util.clj | 8 |
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?#)))) + |