babashka/test/babashka/proxy_test.clj
2021-03-13 18:08:36 +01:00

80 lines
2.4 KiB
Clojure

(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
(require '[clojure.core.protocols])
(require '[clojure.datafy :as d])
(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]
(proxy [clojure.lang.APersistentMap clojure.lang.IMeta clojure.lang.IObj clojure.core.protocols.Datafiable]
[]
(iterator []
::TODO)
(containsKey [k] (contains? m k))
(entryAt [k] (when (contains? m k) (proxy [clojure.lang.AMapEntry] []
(key [] k)
(val [] (auto-deref (get m k))))))
(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)
(val [] (auto-deref (get m k))))) m))
(withMeta [md] (proxy-deref-map (with-meta m md)))
(meta [] (meta m))
(datafy [] {:datafied true})))
(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))
(seq m)
(meta (with-meta m {:a 1}))
(d/datafy m)
(instance? clojure.lang.APersistentMap m)
(instance? java.io.FilenameFilter m)
,])))
(require 'clojure.pprint)
(deftest APersistentMap-proxy-test
(is (= [1 2 3 true [:c 3]
5 3 5 false
'([:a 1] [:b 2] [:c 3])
{:a 1}
{:datafied true}
true
false]
(bb (with-out-str (clojure.pprint/pprint code))))))