beowulf/test/beowulf/sexpr_test.clj
Simon Brooke 46f75a0c4f
SYSOUT now sort-of working; SYSIN present but not tested
Masses of stuff has had to be moved around because of cyclic dependency hell, and some of that may need to be revisited.
2023-03-26 20:23:48 +01:00

119 lines
3.8 KiB
Clojure

(ns beowulf.sexpr-test
(:require [clojure.test :refer [deftest is testing]]
[beowulf.cons-cell :refer []]
[beowulf.read :refer [gsp]]))
;; broadly, sexprs should be homoiconic
(deftest atom-tests
(testing "Reading atoms"
(let [expected 'A
actual (gsp (str expected))]
(is (= actual expected)))
(let [expected 'APPLE
actual (gsp (str expected))]
(is (= actual expected)))
(let [expected 'PART2
actual (gsp (str expected))]
(is (= actual expected)))
(let [expected 'EXTRALONGSTRINGOFLETTERS
actual (gsp (str expected))]
(is (= actual expected)))
(let [expected 'A4B66XYZ2
actual (gsp (str expected))]
(is (= actual expected)))))
(deftest comment-tests
(testing "Reading comments"
(let [expected 'A
actual (gsp "A ;; comment")]
(is (= actual expected)))
(let [expected 10
actual (gsp "10 ;; comment")]
(is (= actual expected)))
(let [expected 2/5
actual (gsp "4E-1 ;; comment")]
(is (= actual expected)))
(let [expected "(A B C)"
actual (print-str (gsp "(A ;; comment
B C)"))]
(is (= actual expected)
"Really important that comments work inside lists"))
;; ;; TODO: Currently failing and I'm not sure why
;; (binding [*options* {:strict true}]
;; (is (thrown-with-msg?
;; Exception
;; #"Cannot parse comments in strict mode"
;; (gsp "(A ;; comment
;; B C)"))))
))
(deftest number-tests
(testing "Reading octal numbers"
(let [expected 1
actual (gsp "1Q")]
(is (= actual expected)))
(let [expected -1
actual (gsp "-1Q")]
(is (= actual expected)))
(let [expected 8
actual (gsp "1Q1")]
(is (= actual expected)))
(let [expected -8
actual (gsp "-1Q1")]
(is (= actual expected)))
(let [expected 128
actual (gsp "2Q2")]
(is (= actual expected)))
(let [expected 2093056
actual (gsp "777Q4")]
(is (= actual expected))))
(testing "Reading decimal numbers - broadly should be homiconic"
(let [expected 7
actual (gsp "7")]
(is (= actual expected)))
(let [expected -7
actual (gsp "-7")]
(is (= actual expected)))
(let [expected 3.141592
actual (gsp "3.141592")]
(is (= actual expected)))
(let [expected 1234567890
actual (gsp "1234567890")]
(is (= actual expected)))
(let [expected -45.23
actual (gsp "-45.23")]
(is (= actual expected))))
(testing "Reading scientific notation")
(let [expected 2/5
actual (gsp "4E-1")]
(is (< (abs (- actual expected)) 0.0001)))
(let [expected 60
actual (gsp "6E1")]
(is (< (abs (- actual expected)) 0.0001)))
(let [expected 60
actual (gsp "600.00E-1")]
(is (< (abs (- actual expected)) 0.0001)))
(let [expected 60
actual (gsp "0.6E2")]
(is (< (abs (- actual expected)) 0.0001))))
(deftest dotted-pair-tests
(testing "Reading dotted pairs"
(let [expected "(A . B)"
actual (print-str (gsp expected))]
(is (= actual expected)))
(let [expected "(A B C . D)"
actual (print-str (gsp expected))]
(is (= actual expected)))
(let [expected "(A B (C . D) E)"
actual (print-str (gsp expected))]
(is (= actual expected)))))
(deftest list-tests
(testing "Reading arbitrarily structured lists"
(let [expected "(SET (QUOTE FACT) (LAMBDA (X) (COND ((ZEROP X) 1) (T (TIMES X (FACT (SUB1 X)))))))"
actual (print-str (gsp expected))]
(is (= actual expected)))))