This commit is contained in:
1 parent
a2b73e761b
commit
5936ec978b
4 files changed
+108
-36
No files matched your search
@@ -1,23 +1,45 @@
|
||||
(ns expand.syntax-rules-test
|
||||
(:require [expand.syntax-rules :as sut]
|
||||
[clojure.test :as t]))
|
||||
[clojure.core.match :refer [match]]
|
||||
[clojure.test :as t]
|
||||
[clojure.walk :as walk]))
|
||||
|
||||
(defn- unify [pattern datum]
|
||||
(some-> (sut/unify (scm/datum->syntax-recursive pattern)
|
||||
(scm/datum->syntax-recursive datum))
|
||||
(update-vals
|
||||
(fn [unif]
|
||||
(walk/prewalk
|
||||
#(if (scm/syntax? %)
|
||||
(scm/syntax-e %)
|
||||
%)
|
||||
unif)))))
|
||||
|
||||
(t/deftest unify-test
|
||||
(t/is (= '{x (1 2 3)}
|
||||
(sut/unify 'x '(1 2 3))))
|
||||
(unify 'x '(1 2 3))))
|
||||
(t/is (= '{x 1 y 2}
|
||||
(sut/unify '(x y)
|
||||
'(1 2))))
|
||||
(unify '(x y) '(1 2))))
|
||||
(t/is (= '{x [:ellipsis (1 2 3 4)]}
|
||||
(sut/unify '(x ...)
|
||||
'(1 2 3 4))))
|
||||
(unify '(x ...) '(1 2 3 4))))
|
||||
(t/is (= '{x [:ellipsis (1 3)]
|
||||
y [:ellipsis (2 4)]}
|
||||
(sut/unify '((x y) ...)
|
||||
'((1 2) (3 4)))))
|
||||
(unify '((x y) ...) '((1 2) (3 4)))))
|
||||
(t/is (= nil
|
||||
(sut/unify '(x y z)
|
||||
'(1 2))))
|
||||
(unify '(x y z) '(1 2))))
|
||||
(t/is (= nil
|
||||
(sut/unify '((x y) ...)
|
||||
'((1 2) (1 2 3))))))
|
||||
(unify '((x y) ...)
|
||||
'((1 2) (1 2 3)))))
|
||||
(t/is (= '{x (1 2 3)}
|
||||
(unify 'x '(1 2 3))))
|
||||
(t/is (= {'x [:ellipsis '(1 2 3)]}
|
||||
(unify '(x ...) '(1 2 3))))
|
||||
(t/is (= {'x 1
|
||||
'y [:ellipsis '(2 3)]}
|
||||
(unify '(x y ...) '(1 2 3))))
|
||||
(t/is (= {'x 1 'y 2}
|
||||
(unify '(x y) '(1 2))))
|
||||
(t/is (= {'x [:ellipsis '(1 3)]
|
||||
'y [:ellipsis '(2 4)]}
|
||||
(unify '((x y) ...)
|
||||
'((1 2) (3 4))))))
|
||||
Reference in new issue
Block a user