babashka/test/babashka/proxy_test.clj

81 lines
2.4 KiB
Clojure
Raw Normal View History

2021-03-12 19:31:58 +00:00
(ns babashka.proxy-test
(:require
[babashka.test-utils :as test-utils]
[clojure.edn :as edn]
[clojure.test :as test :refer [deftest is]]))
(defn bb [& args]
(edn/read-string
{:readers *data-readers*
:eof nil}
(apply test-utils/bb nil (map str args))))
(def code
'(do
2021-03-13 16:25:24 +00:00
(require '[clojure.core.protocols])
(require '[clojure.datafy :as d])
2021-03-12 19:31:58 +00:00
(defn auto-deref
"If value implements IDeref, deref it, otherwise return original."
[x]
(if (instance? clojure.lang.IDeref x)
@x
x))
(defn proxy-deref-map
{:added "1.0"}
[m]
2021-03-13 16:25:24 +00:00
(proxy [clojure.lang.APersistentMap clojure.lang.IMeta clojure.lang.IObj clojure.core.protocols.Datafiable]
2021-03-12 19:31:58 +00:00
[]
(iterator []
::TODO)
(containsKey [k] (contains? m k))
(entryAt [k] (when (contains? m k) (proxy [clojure.lang.AMapEntry] []
(key [] k)
2021-03-13 16:04:35 +00:00
(val [] (auto-deref (get m k))))))
2021-03-12 19:31:58 +00:00
(valAt ([k] (auto-deref (get m k)))
([k default] (auto-deref (get m k default))))
(cons [v] (proxy-deref-map (conj m v)))
(count [] (count m))
(assoc [k v] (proxy-deref-map (assoc m k v)))
(without [k] (proxy-deref-map (dissoc m k)))
(seq [] (map (fn [[k v]](proxy [clojure.lang.AMapEntry] []
(key [] k)
2021-03-13 16:04:35 +00:00
(val [] (auto-deref (get m k))))) m))
(withMeta [md] (proxy-deref-map (with-meta m md)))
2021-03-13 16:25:24 +00:00
(meta [] (meta m))
(datafy [] {:datafied true})))
2021-03-12 19:31:58 +00:00
(let [m (proxy-deref-map
{:a (delay 1)
:b (delay 2)
:c 3})]
[(:a m)
(:b m)
(:c m)
(contains? m :c)
(find m :c)
(-> (conj m [:d (delay 5)])
:d)
(count m)
(-> (assoc m :d (delay 5))
:d)
(-> (dissoc m :a)
(contains? :a))
2021-03-13 16:04:35 +00:00
(seq m)
(meta (with-meta m {:a 1}))
2021-03-13 16:25:24 +00:00
(d/datafy m)
2021-03-13 17:08:36 +00:00
(instance? clojure.lang.APersistentMap m)
(instance? java.io.FilenameFilter m)
2021-03-13 16:25:24 +00:00
,])))
(require 'clojure.pprint)
2021-03-12 19:31:58 +00:00
(deftest APersistentMap-proxy-test
(is (= [1 2 3 true [:c 3]
5 3 5 false
2021-03-13 16:04:35 +00:00
'([:a 1] [:b 2] [:c 3])
2021-03-13 16:25:24 +00:00
{:a 1}
2021-03-13 17:08:36 +00:00
{:datafied true}
true
false]
2021-03-13 16:25:24 +00:00
(bb (with-out-str (clojure.pprint/pprint code))))))