rlm@10: ; Copyright (c) Rich Hickey. All rights reserved. rlm@10: ; The use and distribution terms for this software are covered by the rlm@10: ; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) rlm@10: ; which can be found in the file epl-v10.html at the root of this distribution. rlm@10: ; By using this software in any fashion, you are agreeing to be bound by rlm@10: ; the terms of this license. rlm@10: ; You must not remove this notice, or any other, from this software. rlm@10: rlm@10: ; Author: Frantisek Sodomka rlm@10: rlm@10: ;; rlm@10: ;; Created 1/28/2009 rlm@10: rlm@10: (ns clojure.test-clojure.predicates rlm@10: (:use clojure.test)) rlm@10: rlm@10: rlm@10: ;; *** Type predicates *** rlm@10: rlm@10: (def myvar 42) rlm@10: rlm@10: (def sample-data { rlm@10: :nil nil rlm@10: rlm@10: :bool-true true rlm@10: :bool-false false rlm@10: rlm@10: :byte (byte 7) rlm@10: :short (short 7) rlm@10: :int (int 7) rlm@10: :long (long 7) rlm@10: :bigint (bigint 7) rlm@10: :float (float 7) rlm@10: :double (double 7) rlm@10: :bigdec (bigdec 7) rlm@10: rlm@10: :ratio 2/3 rlm@10: rlm@10: :character \a rlm@10: :symbol 'abc rlm@10: :keyword :kw rlm@10: rlm@10: :empty-string "" rlm@10: :empty-regex #"" rlm@10: :empty-list () rlm@10: :empty-lazy-seq (lazy-seq nil) rlm@10: :empty-vector [] rlm@10: :empty-map {} rlm@10: :empty-set #{} rlm@10: :empty-array (into-array []) rlm@10: rlm@10: :string "abc" rlm@10: :regex #"a*b" rlm@10: :list '(1 2 3) rlm@10: :lazy-seq (lazy-seq [1 2 3]) rlm@10: :vector [1 2 3] rlm@10: :map {:a 1 :b 2 :c 3} rlm@10: :set #{1 2 3} rlm@10: :array (into-array [1 2 3]) rlm@10: rlm@10: :fn (fn [x] (* 2 x)) rlm@10: rlm@10: :class java.util.Date rlm@10: :object (new java.util.Date) rlm@10: rlm@10: :var (var myvar) rlm@10: :delay (delay (+ 1 2)) rlm@10: }) rlm@10: rlm@10: rlm@10: (def type-preds { rlm@10: nil? [:nil] rlm@10: rlm@10: true? [:bool-true] rlm@10: false? [:bool-false] rlm@10: ; boolean? rlm@10: rlm@10: integer? [:byte :short :int :long :bigint] rlm@10: float? [:float :double] rlm@10: decimal? [:bigdec] rlm@10: ratio? [:ratio] rlm@10: rational? [:byte :short :int :long :bigint :ratio :bigdec] rlm@10: number? [:byte :short :int :long :bigint :ratio :bigdec :float :double] rlm@10: rlm@10: ; character? rlm@10: symbol? [:symbol] rlm@10: keyword? [:keyword] rlm@10: rlm@10: string? [:empty-string :string] rlm@10: ; regex? rlm@10: rlm@10: list? [:empty-list :list] rlm@10: vector? [:empty-vector :vector] rlm@10: map? [:empty-map :map] rlm@10: set? [:empty-set :set] rlm@10: rlm@10: coll? [:empty-list :list rlm@10: :empty-lazy-seq :lazy-seq rlm@10: :empty-vector :vector rlm@10: :empty-map :map rlm@10: :empty-set :set] rlm@10: rlm@10: seq? [:empty-list :list rlm@10: :empty-lazy-seq :lazy-seq] rlm@10: ; array? rlm@10: rlm@10: fn? [:fn] rlm@10: ifn? [:fn rlm@10: :empty-vector :vector :empty-map :map :empty-set :set rlm@10: :keyword :symbol :var] rlm@10: rlm@10: class? [:class] rlm@10: var? [:var] rlm@10: delay? [:delay] rlm@10: }) rlm@10: rlm@10: rlm@10: ;; Test all type predicates against all data types rlm@10: ;; rlm@10: (defn- get-fn-name [f] rlm@10: (str rlm@10: (apply str (nthnext (first (.split (str f) "_")) rlm@10: (count "clojure.core$"))) rlm@10: "?")) rlm@10: rlm@10: (deftest test-type-preds rlm@10: (doseq [tp type-preds] rlm@10: (doseq [dt sample-data] rlm@10: (if (some #(= % (first dt)) (second tp)) rlm@10: (is ((first tp) (second dt)) rlm@10: (pr-str (list (get-fn-name (first tp)) (second dt)))) rlm@10: (is (not ((first tp) (second dt))) rlm@10: (pr-str (list 'not (list (get-fn-name (first tp)) (second dt))))))))) rlm@10: rlm@10: rlm@10: ;; Additional tests: rlm@10: ;; http://groups.google.com/group/clojure/browse_thread/thread/537761a06edb4b06/bfd4f0705b746a38 rlm@10: ;; rlm@10: (deftest test-string?-more rlm@10: (are [x] (not (string? x)) rlm@10: (new java.lang.StringBuilder "abc") rlm@10: (new java.lang.StringBuffer "xyz")))