1
1
mirror of https://github.com/kanaka/mal.git synced 2024-09-11 13:55:55 +03:00
mal/tests/step1_read_print.mal
2019-07-26 00:08:48 +01:00

289 lines
3.3 KiB
Plaintext

;; Testing read of numbers
1
;=>1
7
;=>7
7
;=>7
-123
;=>-123
;; Testing read of symbols
+
;=>+
abc
;=>abc
abc
;=>abc
abc5
;=>abc5
abc-def
;=>abc-def
;; Testing non-numbers starting with a dash.
-
;=>-
-abc
;=>-abc
->>
;=>->>
;; Testing read of lists
(+ 1 2)
;=>(+ 1 2)
()
;=>()
( )
;=>()
(nil)
;=>(nil)
((3 4))
;=>((3 4))
(+ 1 (+ 2 3))
;=>(+ 1 (+ 2 3))
( + 1 (+ 2 3 ) )
;=>(+ 1 (+ 2 3))
(* 1 2)
;=>(* 1 2)
(** 1 2)
;=>(** 1 2)
(* -3 6)
;=>(* -3 6)
(()())
;=>(() ())
;; Test commas as whitespace
(1 2, 3,,,,),,
;=>(1 2 3)
;>>> deferrable=True
;;
;; -------- Deferrable Functionality --------
;; Testing read of nil/true/false
nil
;=>nil
true
;=>true
false
;=>false
;; Testing read of strings
"abc"
;=>"abc"
"abc"
;=>"abc"
"abc (with parens)"
;=>"abc (with parens)"
"abc\"def"
;=>"abc\"def"
""
;=>""
"\\"
;=>"\\"
"\\\\\\\\\\\\\\\\\\"
;=>"\\\\\\\\\\\\\\\\\\"
"&"
;=>"&"
"'"
;=>"'"
"("
;=>"("
")"
;=>")"
"*"
;=>"*"
"+"
;=>"+"
","
;=>","
"-"
;=>"-"
"/"
;=>"/"
":"
;=>":"
";"
;=>";"
"<"
;=>"<"
"="
;=>"="
">"
;=>">"
"?"
;=>"?"
"@"
;=>"@"
"["
;=>"["
"]"
;=>"]"
"^"
;=>"^"
"_"
;=>"_"
"`"
;=>"`"
"{"
;=>"{"
"}"
;=>"}"
"~"
;=>"~"
;; Testing reader errors
(1 2
;/.*(EOF|end of input|unbalanced).*
[1 2
;/.*(EOF|end of input|unbalanced).*
;;; These should throw some error with no return value
"abc
;/.*(EOF|end of input|unbalanced).*
"
;/.*(EOF|end of input|unbalanced).*
"\"
;/.*(EOF|end of input|unbalanced).*
"\\\\\\\\\\\\\\\\\\\"
;/.*(EOF|end of input|unbalanced).*
(1 "abc
;/.*(EOF|end of input|unbalanced).*
(1 "abc"
;/.*(EOF|end of input|unbalanced).*
;; Testing read of quoting
'1
;=>(quote 1)
'(1 2 3)
;=>(quote (1 2 3))
`1
;=>(quasiquote 1)
`(1 2 3)
;=>(quasiquote (1 2 3))
~1
;=>(unquote 1)
~(1 2 3)
;=>(unquote (1 2 3))
`(1 ~a 3)
;=>(quasiquote (1 (unquote a) 3))
~@(1 2 3)
;=>(splice-unquote (1 2 3))
;; Testing keywords
:kw
;=>:kw
(:kw1 :kw2 :kw3)
;=>(:kw1 :kw2 :kw3)
;; Testing read of vectors
[+ 1 2]
;=>[+ 1 2]
[]
;=>[]
[ ]
;=>[]
[[3 4]]
;=>[[3 4]]
[+ 1 [+ 2 3]]
;=>[+ 1 [+ 2 3]]
[ + 1 [+ 2 3 ] ]
;=>[+ 1 [+ 2 3]]
([])
;=>([])
;; Testing read of hash maps
{}
;=>{}
{ }
;=>{}
{"abc" 1}
;=>{"abc" 1}
{"a" {"b" 2}}
;=>{"a" {"b" 2}}
{"a" {"b" {"c" 3}}}
;=>{"a" {"b" {"c" 3}}}
{ "a" {"b" { "cde" 3 } }}
;=>{"a" {"b" {"cde" 3}}}
;;; The regexp sorcery here ensures that each key goes with the correct
;;; value and that each key appears only once.
{"a1" 1 "a2" 2 "a3" 3}
;/{"a([1-3])" \1 "a(?!\1)([1-3])" \2 "a(?!\1)(?!\2)([1-3])" \3}
{ :a {:b { :cde 3 } }}
;=>{:a {:b {:cde 3}}}
{"1" 1}
;=>{"1" 1}
({})
;=>({})
;; Testing read of comments
;; whole line comment (not an exception)
1 ; comment after expression
;=>1
1; comment after expression
;=>1
;; Testing read of @/deref
@a
;=>(deref a)
;>>> soft=True
;>>> optional=True
;;
;; -------- Optional Functionality --------
;; Testing read of ^/metadata
^{"a" 1} [1 2 3]
;=>(with-meta [1 2 3] {"a" 1})
;; Non alphanumerice characters in strings
;;; \t is not specified enough to be tested
"\n"
;=>"\n"
"#"
;=>"#"
"$"
;=>"$"
"%"
;=>"%"
"."
;=>"."
"\\"
;=>"\\"
"|"
;=>"|"
;; Non alphanumeric characters in comments
1;!
;=>1
1;"
;=>1
1;#
;=>1
1;$
;=>1
1;%
;=>1
1;'
;=>1
1;\
;=>1
1;\\
;=>1
1;\\\
;=>1
1;`
;=>1
;;; Hopefully less problematic characters
1; &()*+,-./:;<=>?@[]^_{|}~
;; FIXME: These tests have no reasons to be optional, but...
;; fantom fails this one
"!"
;=>"!"