rlm@10
|
1 ; Copyright (c) Rich Hickey. All rights reserved.
|
rlm@10
|
2 ; The use and distribution terms for this software are covered by the
|
rlm@10
|
3 ; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
|
rlm@10
|
4 ; which can be found in the file epl-v10.html at the root of this distribution.
|
rlm@10
|
5 ; By using this software in any fashion, you are agreeing to be bound by
|
rlm@10
|
6 ; the terms of this license.
|
rlm@10
|
7 ; You must not remove this notice, or any other, from this software.
|
rlm@10
|
8
|
rlm@10
|
9 ; Author: Frantisek Sodomka
|
rlm@10
|
10
|
rlm@10
|
11 ;;
|
rlm@10
|
12 ;; Created 1/28/2009
|
rlm@10
|
13
|
rlm@10
|
14 (ns clojure.test-clojure.predicates
|
rlm@10
|
15 (:use clojure.test))
|
rlm@10
|
16
|
rlm@10
|
17
|
rlm@10
|
18 ;; *** Type predicates ***
|
rlm@10
|
19
|
rlm@10
|
20 (def myvar 42)
|
rlm@10
|
21
|
rlm@10
|
22 (def sample-data {
|
rlm@10
|
23 :nil nil
|
rlm@10
|
24
|
rlm@10
|
25 :bool-true true
|
rlm@10
|
26 :bool-false false
|
rlm@10
|
27
|
rlm@10
|
28 :byte (byte 7)
|
rlm@10
|
29 :short (short 7)
|
rlm@10
|
30 :int (int 7)
|
rlm@10
|
31 :long (long 7)
|
rlm@10
|
32 :bigint (bigint 7)
|
rlm@10
|
33 :float (float 7)
|
rlm@10
|
34 :double (double 7)
|
rlm@10
|
35 :bigdec (bigdec 7)
|
rlm@10
|
36
|
rlm@10
|
37 :ratio 2/3
|
rlm@10
|
38
|
rlm@10
|
39 :character \a
|
rlm@10
|
40 :symbol 'abc
|
rlm@10
|
41 :keyword :kw
|
rlm@10
|
42
|
rlm@10
|
43 :empty-string ""
|
rlm@10
|
44 :empty-regex #""
|
rlm@10
|
45 :empty-list ()
|
rlm@10
|
46 :empty-lazy-seq (lazy-seq nil)
|
rlm@10
|
47 :empty-vector []
|
rlm@10
|
48 :empty-map {}
|
rlm@10
|
49 :empty-set #{}
|
rlm@10
|
50 :empty-array (into-array [])
|
rlm@10
|
51
|
rlm@10
|
52 :string "abc"
|
rlm@10
|
53 :regex #"a*b"
|
rlm@10
|
54 :list '(1 2 3)
|
rlm@10
|
55 :lazy-seq (lazy-seq [1 2 3])
|
rlm@10
|
56 :vector [1 2 3]
|
rlm@10
|
57 :map {:a 1 :b 2 :c 3}
|
rlm@10
|
58 :set #{1 2 3}
|
rlm@10
|
59 :array (into-array [1 2 3])
|
rlm@10
|
60
|
rlm@10
|
61 :fn (fn [x] (* 2 x))
|
rlm@10
|
62
|
rlm@10
|
63 :class java.util.Date
|
rlm@10
|
64 :object (new java.util.Date)
|
rlm@10
|
65
|
rlm@10
|
66 :var (var myvar)
|
rlm@10
|
67 :delay (delay (+ 1 2))
|
rlm@10
|
68 })
|
rlm@10
|
69
|
rlm@10
|
70
|
rlm@10
|
71 (def type-preds {
|
rlm@10
|
72 nil? [:nil]
|
rlm@10
|
73
|
rlm@10
|
74 true? [:bool-true]
|
rlm@10
|
75 false? [:bool-false]
|
rlm@10
|
76 ; boolean?
|
rlm@10
|
77
|
rlm@10
|
78 integer? [:byte :short :int :long :bigint]
|
rlm@10
|
79 float? [:float :double]
|
rlm@10
|
80 decimal? [:bigdec]
|
rlm@10
|
81 ratio? [:ratio]
|
rlm@10
|
82 rational? [:byte :short :int :long :bigint :ratio :bigdec]
|
rlm@10
|
83 number? [:byte :short :int :long :bigint :ratio :bigdec :float :double]
|
rlm@10
|
84
|
rlm@10
|
85 ; character?
|
rlm@10
|
86 symbol? [:symbol]
|
rlm@10
|
87 keyword? [:keyword]
|
rlm@10
|
88
|
rlm@10
|
89 string? [:empty-string :string]
|
rlm@10
|
90 ; regex?
|
rlm@10
|
91
|
rlm@10
|
92 list? [:empty-list :list]
|
rlm@10
|
93 vector? [:empty-vector :vector]
|
rlm@10
|
94 map? [:empty-map :map]
|
rlm@10
|
95 set? [:empty-set :set]
|
rlm@10
|
96
|
rlm@10
|
97 coll? [:empty-list :list
|
rlm@10
|
98 :empty-lazy-seq :lazy-seq
|
rlm@10
|
99 :empty-vector :vector
|
rlm@10
|
100 :empty-map :map
|
rlm@10
|
101 :empty-set :set]
|
rlm@10
|
102
|
rlm@10
|
103 seq? [:empty-list :list
|
rlm@10
|
104 :empty-lazy-seq :lazy-seq]
|
rlm@10
|
105 ; array?
|
rlm@10
|
106
|
rlm@10
|
107 fn? [:fn]
|
rlm@10
|
108 ifn? [:fn
|
rlm@10
|
109 :empty-vector :vector :empty-map :map :empty-set :set
|
rlm@10
|
110 :keyword :symbol :var]
|
rlm@10
|
111
|
rlm@10
|
112 class? [:class]
|
rlm@10
|
113 var? [:var]
|
rlm@10
|
114 delay? [:delay]
|
rlm@10
|
115 })
|
rlm@10
|
116
|
rlm@10
|
117
|
rlm@10
|
118 ;; Test all type predicates against all data types
|
rlm@10
|
119 ;;
|
rlm@10
|
120 (defn- get-fn-name [f]
|
rlm@10
|
121 (str
|
rlm@10
|
122 (apply str (nthnext (first (.split (str f) "_"))
|
rlm@10
|
123 (count "clojure.core$")))
|
rlm@10
|
124 "?"))
|
rlm@10
|
125
|
rlm@10
|
126 (deftest test-type-preds
|
rlm@10
|
127 (doseq [tp type-preds]
|
rlm@10
|
128 (doseq [dt sample-data]
|
rlm@10
|
129 (if (some #(= % (first dt)) (second tp))
|
rlm@10
|
130 (is ((first tp) (second dt))
|
rlm@10
|
131 (pr-str (list (get-fn-name (first tp)) (second dt))))
|
rlm@10
|
132 (is (not ((first tp) (second dt)))
|
rlm@10
|
133 (pr-str (list 'not (list (get-fn-name (first tp)) (second dt)))))))))
|
rlm@10
|
134
|
rlm@10
|
135
|
rlm@10
|
136 ;; Additional tests:
|
rlm@10
|
137 ;; http://groups.google.com/group/clojure/browse_thread/thread/537761a06edb4b06/bfd4f0705b746a38
|
rlm@10
|
138 ;;
|
rlm@10
|
139 (deftest test-string?-more
|
rlm@10
|
140 (are [x] (not (string? x))
|
rlm@10
|
141 (new java.lang.StringBuilder "abc")
|
rlm@10
|
142 (new java.lang.StringBuffer "xyz")))
|