(ns expand-test (:require [expand :as sut] [clojure.test :as t] [clojure.spec.alpha :as s] [scm])) (t/deftest nearest-test (t/is (= '#{#{a b}} (sut/nearest '#{a b c} '[#{a} #{a b} #{a d}])) "unambiguous") (t/is (= '#{#{a b} #{a c}} (sut/nearest '#{a b c} '[#{a} #{a b} #{a c}])) "ambiguous") (t/is (= #{} (sut/nearest '#{a b c} '[#{d} #{d e} #{f}])) "undefined")) (t/deftest lookup-test (t/is (= [:primitive 'lambda] (sut/lookup #scm/stx [lambda #{}] {[:global 'lambda] [:primitive 'lambda]} {['lambda #{}] [:global 'lambda]}))) (t/is (= [:primitive 'lambda] (sut/lookup #scm/stx [lambda #{a b c}] {[:global 'lambda] [:primitive 'lambda]} {['lambda #{}] [:global 'lambda]}))) (t/is (= [:var] (sut/lookup #scm/stx [x #{a b c}] '{[:lexical x A] [:var] [:lexical x B] [:primitive lambda]} '{[x #{a b}] [:lexical x A] [x #{a}] [:lexical x B]})))) (t/deftest expand-test) ;;; specs (t/deftest spec-lambda-formals-test (t/are [x] (s/valid? ::sut/lambda-formals x) #scm/stx () #scm/stx (#scm/stx a #scm/stx b) #scm/stx xs (scm/datum->syntax (scm/improper-list #scm/stx a #scm/stx b)))) (t/deftest spec-prim-lambda-test (t/are [x] (s/valid? ::sut/prim-lambda x) #scm/stx (#scm/stx lambda #scm/stx (#scm/stx a) #scm/stx a)))