Hello Stuart & all!
As discussed in this thread:
test-is: generating and processing testing data
http://groups.google.com/group/clojure/browse_frm/thread/3e84efefd7c0bebc/3652a4a9a124cc6b
, sometimes it is necessary to test each value against each value. Example
is zeros-are-equal (as you suggested):
(deftest zeros-are-equal
(doall (map (fn [[a b]] (is (= a b)))
(combinations [0 0.0 0M] 2))))
Truth is that these combinations are more common than I thought. For
example, when testing equality of maps (test-equality in data_structures.clj
in test_clojure), values of maps equal, but their classes are not.
(= (sorted-map :a 1) (hash-map :a 1) (array-map :a 1)) => true
(class (sorted-map :a 1)) => clojure.lang.PersistentTreeMap
(class (hash-map :a 1)) => clojure.lang.PersistentHashMap
(class (array-map :a 1)) => clojure.lang.PersistentArrayMap
To test for this property, we can either write down all combinations (as I
did) or write deftest function for each case (equality and non-equality).
Each of these seem too verbose to me. I see 2 different solutions:
1) Allow deftest (new version of it?) to accept parameters:
(deftest each-equals-each [parameter]
(doall (map (fn [[a b]] (is (= a b)))
(combinations parameter 2))))
This way we could call it:
(each-equals-each [0 0.0 0M])
and
(each-equals-each [(sorted-map :a 1) (hash-map :a 1) (array-map :a 1)])
2) Create new version of 'are' - 'are-combinations' or more preferably
'are-all', which uses 'combinations' in itself:
(are-all (= _1 _2)
0 0.0 0M)
=>
(is (= 0 0.0))
(is (= 0 0M))
(is (= 0.0 0M))
This way we can easily do:
(are-all (= _1 _2)
(sorted-map :a 1) (hash-map :a 1) (array-map :a 1) )
and
(are-all (not= _1 _2)
(class (sorted-map :a 1))
(class (hash-map :a 1))
(class (array-map :a 1)) )
or combined? ;-)
(are-all (and (= _1 _2) (not= (class _1) (class _2)))
(sorted-map :a 1) (hash-map :a 1) (array-map :a 1) )
Personally, I prefer the second solution. It looks really elegant. The first
solution - tests with parameters - is useful too and we could use it under
different conditions.
Thank you, Frantisek
PS: What is the status of 'are' macro? Documentation still says
"Experimental. May be removed in the future.". Do you have any plans for it?
I really like it and use it heavily in test-clojure.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To post to this group, send email to clojure@googlegroups.com
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---