babashka/test-resources/lib_tests/me/raynes/mock_midje.clj
2022-10-24 22:23:24 +02:00

38 lines
1.3 KiB
Clojure

;; BB-TEST-PATCH: add this file to mock the midje 'fact' macro
(ns me.raynes.mock-midje
(:require [rewrite-clj.paredit :as rcp]
[rewrite-clj.zip :as rcz]
[clojure.string :as str]
[clojure.test :refer [deftest is testing]]))
(defn- up-until-nil [z]
(if-let [new-z (rcz/up z)]
(recur new-z)
z))
(defn- replace-arrow [form-zipper-at-arrow]
(let [lhs (-> form-zipper-at-arrow rcz/left rcz/node)
rhs (-> form-zipper-at-arrow rcz/right rcz/node)]
(-> form-zipper-at-arrow
(rcp/wrap-around :list)
rcp/slurp-backward
rcp/slurp-forward
rcz/up
(rcz/replace `(is (= ~lhs ~rhs)))
up-until-nil)))
(defn- replace-arrows [form-zipper]
(if-let [next-arrow (rcz/find-next-value form-zipper rcz/next '=>)]
(let [rd (replace-arrow next-arrow)]
(recur rd))
(rcz/sexpr form-zipper)))
(defmacro fact
"mockup of midje's fact that just transforms `=>` into `is` checks and uses deftest"
[& _] ;operating on &form
(let [[nameish body] (if (string? (second &form))
[(str/replace (second &form) #"[^\w\d]" "-") (nnext &form)]
["test" (next &form)])
transformed-body (replace-arrows (rcz/of-string (pr-str body)))]
`(deftest ~(gensym nameish) ~@transformed-body)))