(ns scm-test (:require [scm :as sut] [clojure.test :as t]) (:import scm.ISyntax scm.Syntax)) (t/deftest read-test (t/testing "boolean" (t/is (= true (sut/read "#t"))) (t/is (= true (sut/read "#true"))) (t/is (= false (sut/read "#f"))) (t/is (= false (sut/read "#false")))) (t/testing "symbol" (t/is (= 'abc (sut/read "abc"))) (t/is (= 'truth-nuke (sut/read "truth-nuke")))) (t/testing "list" (t/is (= (list) (sut/read "()"))) (t/is (= (list 1 2 3) (sut/read "(1 2 3)"))) (t/is (= (sut/improper-list 1 2 3) (sut/read "(1 2 . 3)")))) (t/testing "number" (t/is (= 123 (sut/read "123"))) (t/is (= 123 (sut/read "+123"))) (t/is (= -123 (sut/read "-123")))) (t/testing "library" (t/are [s] (thrown? Exception (sut/read s :throw? true :library? true)) "" "()" "(define-library ())" ;; broken #_"(define-library (blah -123))") (t/is (= '#:library {:name (my cool lib) :declarations ([:import (scheme base)] [:export square] [:begin (define (square n) (* n n))])} (sut/read "(define-library (my cool lib) (import (scheme base)) (export square) (begin (define (square n) (* n n))))" :library? true))))) (t/deftest read-syntax-test (t/is (sut/unresolved? (sut/read-syntax "123"))) (t/is (sut/unresolved? (sut/read-syntax "(1 2 3)")))) (t/deftest improper-list?-test (t/is (sut/improper-list? (sut/improper-list 1 2 3)))) (t/deftest improper-list-test (t/is (= [1 2] (:initial (sut/improper-list 1 2 3)))) (t/is (= 3 (:dot (sut/improper-list 1 2 3))))) (t/deftest constant?-test (t/is (sut/constant? 123)) (t/is (sut/constant? #scm/stx 123))) (t/deftest syntax-test (t/is (not (sut/syntax? 123))) (t/is (sut/syntax? #scm/stx 123)) (t/is (sut/syntax? #scm/stx [123 #{}])) (t/is (= 123 (sut/syntax-e #scm/stx [123 #{}])))) (t/deftest unresolved?-test (t/is (sut/unresolved? (scm/->Syntax 123 nil))) (t/is (sut/unresolved? #scm/stx 123))) (t/deftest resolved?-test (t/is (sut/resolved? (scm/->Syntax 123 '#{a}))))