66 lines
2.1 KiB
Clojure
66 lines
2.1 KiB
Clojure
(ns scm-test
|
|
(:require [scm :as sut]
|
|
[clojure.test :as t]))
|
|
|
|
(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 resolved?-test
|
|
(t/is (sut/unresolved? #scm/stx 123)))
|