;;; TODO: really a step5 test ;; ;; Testing that (do (do)) not broken by TCO (do (do 1 2)) ;=>2 ;; ;; Testing read-string, eval and slurp (read-string "(1 2 (3 4) nil)") ;=>(1 2 (3 4) nil) (= nil (read-string "nil")) ;=>true (read-string "(+ 2 3)") ;=>(+ 2 3) (read-string "\"\n\"") ;=>"\n" (read-string "7 ;; comment") ;=>7 ;;; Differing output, but make sure no fatal error (read-string ";; comment") (eval (read-string "(+ 2 3)")) ;=>5 (slurp "../tests/test.txt") ;=>"A line of text\n" ;;; Load the same file twice. (slurp "../tests/test.txt") ;=>"A line of text\n" ;; Testing load-file (load-file "../tests/inc.mal") ;=>nil (inc1 7) ;=>8 (inc2 7) ;=>9 (inc3 9) ;=>12 ;; ;; Testing atoms (def! inc3 (fn* (a) (+ 3 a))) (def! a (atom 2)) ;=>(atom 2) (atom? a) ;=>true (atom? 1) ;=>false (deref a) ;=>2 (reset! a 3) ;=>3 (deref a) ;=>3 (swap! a inc3) ;=>6 (deref a) ;=>6 (swap! a (fn* (a) a)) ;=>6 (swap! a (fn* (a) (* 2 a))) ;=>12 (swap! a (fn* (a b) (* a b)) 10) ;=>120 (swap! a + 3) ;=>123 ;; Testing swap!/closure interaction (def! inc-it (fn* (a) (+ 1 a))) (def! atm (atom 7)) (def! f (fn* () (swap! atm inc-it))) (f) ;=>8 (f) ;=>9 ;; Testing whether closures can retain atoms (def! g (let* (atm (atom 0)) (fn* () (deref atm)))) (def! atm (atom 1)) (g) ;=>0 ;>>> deferrable=True ;; ;; -------- Deferrable Functionality -------- ;; Testing reading of large files (load-file "../tests/computations.mal") ;=>nil (sumdown 2) ;=>3 (fib 2) ;=>1 ;; Testing `@` reader macro (short for `deref`) (def! atm (atom 9)) @atm ;=>9 ;;; TODO: really a step5 test ;; Testing that vector params not broken by TCO (def! g (fn* [] 78)) (g) ;=>78 (def! g (fn* [a] (+ a 78))) (g 3) ;=>81 ;; ;; Testing that *ARGV* exists and is an empty list (list? *ARGV*) ;=>true *ARGV* ;=>() ;; ;; Testing that eval sets aa in root scope, and that it is found in nested scope (let* (b 12) (do (eval (read-string "(def! aa 7)")) aa )) ;=>7 ;>>> soft=True ;>>> optional=True ;; ;; -------- Optional Functionality -------- ;; Testing comments in a file (load-file "../tests/incB.mal") ;=>nil (inc4 7) ;=>11 (inc5 7) ;=>12 ;; Testing map literal across multiple lines in a file (load-file "../tests/incC.mal") ;=>nil mymap ;=>{"a" 1} ;; Checking that eval does not use local environments. (def! a 1) ;=>1 (let* (a 2) (eval (read-string "a"))) ;=>1 ;; Non alphanumeric characters in comments in read-string (read-string "1;!") ;=>1 (read-string "1;\"") ;=>1 (read-string "1;#") ;=>1 (read-string "1;$") ;=>1 (read-string "1;%") ;=>1 (read-string "1;'") ;=>1 (read-string "1;\\") ;=>1 (read-string "1;\\\\") ;=>1 (read-string "1;\\\\\\") ;=>1 (read-string "1;`") ;=>1 ;;; Hopefully less problematic characters can be checked together (read-string "1; &()*+,-./:;<=>?@[]^_{|}~") ;=>1