babashka/test/babashka/datafy_test.clj

75 lines
2 KiB
Clojure

(ns babashka.datafy-test
(:require [babashka.test-utils :as tu]
[clojure.edn :as edn]
[clojure.test :as t :refer [deftest is testing]]))
(defn bb [& args]
(edn/read-string (apply tu/bb nil (map str args))))
(deftest datafy-test
(testing "default implementation of datafy works"
(is (= #{:public} (bb "(require '[clojure.datafy :as d]) (:flags (d/datafy Exception))"))))
(testing "custom implementation of datafy works"
(is (= {:number 1} (bb "
(require '[clojure.datafy :as d]
'[clojure.core.protocols :as p])
(extend-type Number
p/Datafiable
(datafy [x]
{:number x}))
(d/datafy 1)
"))))
(testing "implement datafy via metadata"
(is (= {:datafied []} (bb "
(require '[clojure.datafy :as d]
'[clojure.core.protocols :as p])
(def x (with-meta [] {`p/datafy (fn [this] {:datafied this})}))
(d/datafy x)
"))))
(testing "reify Datafiable"
(let [prog "
(require '[clojure.datafy :as d]
'[clojure.core.protocols :as p])
(def x (reify p/Datafiable (datafy [_] [:data])))
(d/datafy x)"]
(is (= [:data] (bb prog)))))
(testing "default implementation of nav works"
(is (= 1 (bb "(require '[clojure.datafy :as d]) (d/nav {:a 1} :a 1)"))))
(testing "custom implementation of nav works"
(is (= \f (bb "
(require '[clojure.datafy :as d]
'[clojure.core.protocols :as p])
(extend-type String
p/Navigable
(nav [coll k v]
(.charAt coll k)))
(d/nav \"foo\" 0 nil)
"))))
(testing "implement nav via metadata"
(is (= {:nav [[] :k :v]} (bb "
(require '[clojure.datafy :as d]
'[clojure.core.protocols :as p])
(def x (with-meta [] {`p/nav (fn [this k v] {:nav [this k v]})}))
(d/nav x :k :v)
"))))
(testing "reify Navigable"
(let [prog "
(require '[clojure.datafy :as d]
'[clojure.core.protocols :as p])
(def x (reify p/Navigable (nav [_ _ _] [:data])))
(d/nav x nil nil)"]
(is (= [:data] (bb prog))))))
;;;; Scratch
(comment
(t/run-tests *ns*)
(datafy-test))