aboutsummaryrefslogtreecommitdiff
path: root/luxc/test
diff options
context:
space:
mode:
authorEduardo Julian2016-12-01 11:00:44 -0400
committerEduardo Julian2016-12-01 11:00:44 -0400
commit7f66c54f4c9753b94dbf46ec50b8b16549daf324 (patch)
tree1b5b896cfba870a66a99a03315b09df842eb5737 /luxc/test
parent9c30546af022f8fe36b73e7e93414257ff28ee75 (diff)
- Collected the Lux compiler's repo, the Standard Library's, the Leiningen plugin's and the Emacs mode's into a big monorepo, to keep development unified.
Diffstat (limited to 'luxc/test')
-rw-r--r--luxc/test/test/lux/lexer.clj276
-rw-r--r--luxc/test/test/lux/parser.clj274
-rw-r--r--luxc/test/test/lux/reader.clj53
-rw-r--r--luxc/test/test/lux/type.clj473
4 files changed, 1076 insertions, 0 deletions
diff --git a/luxc/test/test/lux/lexer.clj b/luxc/test/test/lux/lexer.clj
new file mode 100644
index 000000000..3bd45cb5f
--- /dev/null
+++ b/luxc/test/test/lux/lexer.clj
@@ -0,0 +1,276 @@
+;; Copyright (c) Eduardo Julian. All rights reserved.
+;; This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
+;; If a copy of the MPL was not distributed with this file,
+;; You can obtain one at http://mozilla.org/MPL/2.0/.
+
+(ns test.lux.lexer
+ (:use clojure.test)
+ (:require (lux [base :as & :refer [|do return* return fail fail* |let |case]]
+ [reader :as &reader]
+ [lexer :as &lexer])
+ [lux.analyser.module :as &a-module]
+ :reload-all
+ ))
+
+;; [Utils]
+(def ^:private module-name "test")
+
+(defn ^:private make-state [source-code]
+ (&/set$ &/$source (&reader/from module-name source-code)
+ (&/init-state nil)))
+
+;; [Tests]
+(deftest lex-white-space
+ (let [input " \t"]
+ (|case (&/run-state &lexer/lex (make-state input))
+ (&/$Right state [cursor (&lexer/$White_Space output)])
+ (is (= input output))
+
+ _
+ (is false "Couldn't read.")
+ )))
+
+(deftest lex-comment
+ ;; Should be capable of recognizing both single-line & multi-line comments.
+ (let [input1 " YOLO"
+ input2 "\nLOL\n"
+ input3 " NYAN\n#(\nCAT )#\n"]
+ (|case (&/run-state (|do [[_ single-line] &lexer/lex
+ [_ multi-line] &lexer/lex
+ [_ multi-line-embedded] &lexer/lex]
+ (return (&/T [single-line multi-line multi-line-embedded])))
+ (make-state (str "##" input1 "\n" "#(" input2 ")#" "\n" "#(" input3 ")#")))
+ (&/$Right state [(&lexer/$Comment output1)
+ (&lexer/$Comment output2)
+ (&lexer/$Comment output3)])
+ (are [input output] (= input output)
+ input1 output1
+ input2 output2
+ input3 output3)
+
+ _
+ (is false "Couldn't read.")
+ )))
+
+(deftest lex-bool
+ (let [input1 "true"
+ input2 "false"]
+ (|case (&/run-state (|do [[_ output1] &lexer/lex
+ [_ output2] &lexer/lex]
+ (return (&/T [output1 output2])))
+ (make-state (str input1 "\n" input2)))
+ (&/$Right state [(&lexer/$Bool output1)
+ (&lexer/$Bool output2)])
+ (are [input output] (= input output)
+ input1 output1
+ input2 output2)
+
+ _
+ (is false "Couldn't read.")
+ )))
+
+(deftest lex-int
+ (let [input1 "0"
+ input2 "12"
+ input3 "-123"]
+ (|case (&/run-state (|do [[_ output1] &lexer/lex
+ [_ output2] &lexer/lex
+ [_ output3] &lexer/lex]
+ (return (&/T [output1 output2 output3])))
+ (make-state (str input1 "\n" input2 "\n" input3)))
+ (&/$Right state [(&lexer/$Int output1)
+ (&lexer/$Int output2)
+ (&lexer/$Int output3)])
+ (are [input output] (= input output)
+ input1 output1
+ input2 output2
+ input3 output3)
+
+ _
+ (is false "Couldn't read.")
+ )))
+
+(deftest lex-real
+ (let [input1 "0.00123"
+ input2 "12.01020300"
+ input3 "-12.3"]
+ (|case (&/run-state (|do [[_ output1] &lexer/lex
+ [_ output2] &lexer/lex
+ [_ output3] &lexer/lex]
+ (return (&/T [output1 output2 output3])))
+ (make-state (str input1 "\n" input2 "\n" input3)))
+ (&/$Right state [(&lexer/$Real output1)
+ (&lexer/$Real output2)
+ (&lexer/$Real output3)])
+ (are [input output] (= input output)
+ input1 output1
+ input2 output2
+ input3 output3)
+
+ _
+ (is false "Couldn't read.")
+ )))
+
+(deftest lex-char
+ (let [input1 "a"
+ input2 "\\n"
+ input3 " "
+ input4 "\\t"
+ input5 "\\b"
+ input6 "\\r"
+ input7 "\\f"
+ input8 "\\\""
+ input9 "\\\\"]
+ (|case (&/run-state (|do [[_ output1] &lexer/lex
+ [_ output2] &lexer/lex
+ [_ output3] &lexer/lex
+ [_ output4] &lexer/lex
+ [_ output5] &lexer/lex
+ [_ output6] &lexer/lex
+ [_ output7] &lexer/lex
+ [_ output8] &lexer/lex
+ [_ output9] &lexer/lex]
+ (return (&/T [output1 output2 output3 output4 output5 output6 output7 output8 output9])))
+ (make-state (str "#\"" input1 "\"" "\n" "#\"" input2 "\"" "\n" "#\"" input3 "\""
+ "\n" "#\"" input4 "\"" "\n" "#\"" input5 "\"" "\n" "#\"" input6 "\""
+ "\n" "#\"" input7 "\"" "\n" "#\"" input8 "\"" "\n" "#\"" input9 "\"")))
+ (&/$Right state [(&lexer/$Char output1)
+ (&lexer/$Char output2)
+ (&lexer/$Char output3)
+ (&lexer/$Char output4)
+ (&lexer/$Char output5)
+ (&lexer/$Char output6)
+ (&lexer/$Char output7)
+ (&lexer/$Char output8)
+ (&lexer/$Char output9)])
+ (are [input output] (= input output)
+ input1 output1
+ "\n" output2
+ input3 output3
+ "\t" output4
+ "\b" output5
+ "\r" output6
+ "\f" output7
+ "\"" output8
+ "\\" output9)
+
+ _
+ (is false "Couldn't read.")
+ )))
+
+(deftest lex-text
+ (let [input1 ""
+ input2 "abc"
+ input3 "yolo\\nlol\\tmeme"
+ input4 "This is a test\\nof multi-line text.\\n\\nI just wanna make sure it works alright..."]
+ (|case (&/run-state (|do [[_ output1] &lexer/lex
+ [_ output2] &lexer/lex
+ [_ output3] &lexer/lex
+ [_ output4] &lexer/lex]
+ (return (&/T [output1 output2 output3 output4])))
+ (make-state (str "\"" input1 "\"" "\n" "\"" input2 "\"" "\n" "\"" input3 "\"" "\n" "\"" input4 "\"")))
+ (&/$Right state [(&lexer/$Text output1)
+ (&lexer/$Text output2)
+ (&lexer/$Text output3)
+ (&lexer/$Text output4)])
+ (are [input output] (= input output)
+ input1 output1
+ input2 output2
+ "yolo\nlol\tmeme" output3
+ "This is a test\nof multi-line text.\n\nI just wanna make sure it works alright..." output4)
+
+ _
+ (is false "Couldn't read.")
+ )))
+
+(deftest lex-symbol
+ (let [input1 "foo"
+ input2 "test;bar0123456789"
+ input3 ";b1a2z3"
+ input4 ";;quux"
+ input5 "!_@$%^&*-+=.<>?/|\\~`':"]
+ (|case (&/run-state (|do [_ (&a-module/enter-module module-name)
+ [_ output1] &lexer/lex
+ [_ output2] &lexer/lex
+ [_ output3] &lexer/lex
+ [_ output4] &lexer/lex
+ [_ output5] &lexer/lex]
+ (return (&/T [output1 output2 output3 output4 output5])))
+ (make-state (str input1 "\n" input2 "\n" input3 "\n" input4 "\n" input5 " ")))
+ (&/$Right state [(&lexer/$Symbol output1)
+ (&lexer/$Symbol output2)
+ (&lexer/$Symbol output3)
+ (&lexer/$Symbol output4)
+ (&lexer/$Symbol output5)])
+ (are [input output] (&/ident= input output)
+ (&/T ["" "foo"]) output1
+ (&/T ["test" "bar0123456789"]) output2
+ (&/T ["lux" "b1a2z3"]) output3
+ (&/T ["test" "quux"]) output4
+ (&/T ["" "!_@$%^&*-+=.<>?/|\\~`':"]) output5)
+
+ _
+ (is false "Couldn't read")
+ )))
+
+(deftest lex-tag
+ (let [input1 "foo"
+ input2 "test;bar0123456789"
+ input3 ";b1a2z3"
+ input4 ";;quux"
+ input5 "!_@$%^&*-+=.<>?/|\\~`':"]
+ (|case (&/run-state (|do [_ (&a-module/enter-module module-name)
+ [_ output1] &lexer/lex
+ [_ output2] &lexer/lex
+ [_ output3] &lexer/lex
+ [_ output4] &lexer/lex
+ [_ output5] &lexer/lex]
+ (return (&/T [output1 output2 output3 output4 output5])))
+ (make-state (str "#" input1 "\n" "#" input2 "\n" "#" input3 "\n" "#" input4 "\n" "#" input5 " ")))
+ (&/$Right state [(&lexer/$Tag output1)
+ (&lexer/$Tag output2)
+ (&lexer/$Tag output3)
+ (&lexer/$Tag output4)
+ (&lexer/$Tag output5)])
+ (are [input output] (&/ident= input output)
+ (&/T ["" "foo"]) output1
+ (&/T ["test" "bar0123456789"]) output2
+ (&/T ["lux" "b1a2z3"]) output3
+ (&/T ["test" "quux"]) output4
+ (&/T ["" "!_@$%^&*-+=.<>?/|\\~`':"]) output5)
+
+ _
+ (is false "Couldn't read.")
+ )))
+
+(deftest lex-delimiter
+ (let [input1 "("
+ input2 ")"
+ input3 "["
+ input4 "]"
+ input5 "{"
+ input6 "}"]
+ (|case (&/run-state (|do [_ (&a-module/enter-module module-name)
+ [_ output1] &lexer/lex
+ [_ output2] &lexer/lex
+ [_ output3] &lexer/lex
+ [_ output4] &lexer/lex
+ [_ output5] &lexer/lex
+ [_ output6] &lexer/lex]
+ (return (&/T [output1 output2 output3 output4 output5 output6])))
+ (make-state (str input1 "\n" input2 "\n" input3 "\n" input4 "\n" input5 "\n" input6)))
+ (&/$Right state [(&lexer/$Open_Paren)
+ (&lexer/$Close_Paren)
+ (&lexer/$Open_Bracket)
+ (&lexer/$Close_Bracket)
+ (&lexer/$Open_Brace)
+ (&lexer/$Close_Brace)])
+ (is true)
+
+ _
+ (is false "Couldn't read.")
+ )))
+
+(comment
+ (run-all-tests)
+ )
diff --git a/luxc/test/test/lux/parser.clj b/luxc/test/test/lux/parser.clj
new file mode 100644
index 000000000..29e916b74
--- /dev/null
+++ b/luxc/test/test/lux/parser.clj
@@ -0,0 +1,274 @@
+;; Copyright (c) Eduardo Julian. All rights reserved.
+;; This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
+;; If a copy of the MPL was not distributed with this file,
+;; You can obtain one at http://mozilla.org/MPL/2.0/.
+
+(ns test.lux.parser
+ (:use (clojure test
+ template))
+ (:require (lux [base :as & :refer [|do return* return fail fail* |let |case]]
+ [reader :as &reader]
+ [parser :as &parser])
+ [lux.analyser.module :as &a-module]
+ :reload-all))
+
+;; [Utils]
+(def ^:private module-name "test")
+
+(defn ^:private make-state [source-code]
+ (&/set$ &/$source (&reader/from module-name source-code)
+ (&/init-state nil)))
+
+;; [Tests]
+(deftest parse-white-space
+ (let [input " \t"]
+ (|case (&/run-state &parser/parse (make-state input))
+ (&/$Right state (&/$Nil))
+ (is true)
+
+ _
+ (is false "Couldn't read.")
+ )))
+
+(deftest parse-comment
+ (let [input1 " YOLO"
+ input2 "\nLOL\n"
+ input3 " NYAN\n#(\nCAT )#\n"]
+ (|case (&/run-state &parser/parse (make-state (str "##" input1 "\n" "#(" input2 ")#" "\n" "#(" input3 ")#")))
+ (&/$Right state (&/$Nil))
+ (is true)
+
+ _
+ (is false "Couldn't read.")
+ )))
+
+(deftest parse-bool
+ (let [input1 "true"
+ input2 "false"]
+ (|case (&/run-state (|do [output1 &parser/parse
+ output2 &parser/parse]
+ (return (&/|++ output1 output2)))
+ (make-state (str input1 "\n" input2)))
+ (&/$Right state (&/$Cons [_ (&/$BoolS output1)] (&/$Cons [_ (&/$BoolS output2)] (&/$Nil))))
+ (are [input output] (= input output)
+ true output1
+ false output2)
+
+ _
+ (is false "Couldn't read.")
+ )))
+
+(deftest parse-int
+ (let [input1 "0"
+ input2 "12"
+ input3 "-123"]
+ (|case (&/run-state (|do [output1 &parser/parse
+ output2 &parser/parse
+ output3 &parser/parse]
+ (return (&/|++ output1 (&/|++ output2 output3))))
+ (make-state (str input1 "\n" input2 "\n" input3)))
+ (&/$Right state (&/$Cons [_ (&/$IntS output1)] (&/$Cons [_ (&/$IntS output2)] (&/$Cons [_ (&/$IntS output3)] (&/$Nil)))))
+ (are [input output] (= input output)
+ 0 output1
+ 12 output2
+ -123 output3)
+
+ _
+ (is false "Couldn't read.")
+ )))
+
+(deftest parse-real
+ (let [input1 "0.00123"
+ input2 "12.01020300"
+ input3 "-12.3"]
+ (|case (&/run-state (|do [output1 &parser/parse
+ output2 &parser/parse
+ output3 &parser/parse]
+ (return (&/|++ output1 (&/|++ output2 output3))))
+ (make-state (str input1 "\n" input2 "\n" input3)))
+ (&/$Right state (&/$Cons [_ (&/$RealS output1)] (&/$Cons [_ (&/$RealS output2)] (&/$Cons [_ (&/$RealS output3)] (&/$Nil)))))
+ (are [input output] (= input output)
+ 0.00123 output1
+ 12.010203 output2
+ -12.3 output3)
+
+ _
+ (is false "Couldn't read.")
+ )))
+
+(deftest parse-char
+ (let [input1 "a"
+ input2 "\\n"
+ input3 " "
+ input4 "\\t"
+ input5 "\\b"
+ input6 "\\r"
+ input7 "\\f"
+ input8 "\\\""
+ input9 "\\\\"]
+ (|case (&/run-state (|do [output1 &parser/parse
+ output2 &parser/parse
+ output3 &parser/parse
+ output4 &parser/parse
+ output5 &parser/parse
+ output6 &parser/parse
+ output7 &parser/parse
+ output8 &parser/parse
+ output9 &parser/parse]
+ (return (&/|++ output1 (&/|++ output2 (&/|++ output3 (&/|++ output4 (&/|++ output5 (&/|++ output6 (&/|++ output7 (&/|++ output8 output9))))))))))
+ (make-state (str "#\"" input1 "\"" "\n" "#\"" input2 "\"" "\n" "#\"" input3 "\""
+ "\n" "#\"" input4 "\"" "\n" "#\"" input5 "\"" "\n" "#\"" input6 "\""
+ "\n" "#\"" input7 "\"" "\n" "#\"" input8 "\"" "\n" "#\"" input9 "\"")))
+ (&/$Right state (&/$Cons [_ (&/$CharS output1)]
+ (&/$Cons [_ (&/$CharS output2)]
+ (&/$Cons [_ (&/$CharS output3)]
+ (&/$Cons [_ (&/$CharS output4)]
+ (&/$Cons [_ (&/$CharS output5)]
+ (&/$Cons [_ (&/$CharS output6)]
+ (&/$Cons [_ (&/$CharS output7)]
+ (&/$Cons [_ (&/$CharS output8)]
+ (&/$Cons [_ (&/$CharS output9)]
+ (&/$Nil)))))))))))
+ (are [input output] (= input output)
+ \a output1
+ \newline output2
+ \space output3
+ \tab output4
+ \backspace output5
+ \return output6
+ \formfeed output7
+ \" output8
+ \\ output9)
+
+ _
+ (is false "Couldn't read.")
+ )))
+
+(deftest parse-text
+ (let [input1 ""
+ input2 "abc"
+ input3 "yolo\\nlol\\tmeme"
+ input4 "This is a test\\nof multi-line text.\\n\\nI just wanna make sure it works alright..."]
+ (|case (&/run-state (|do [output1 &parser/parse
+ output2 &parser/parse
+ output3 &parser/parse
+ output4 &parser/parse]
+ (return (&/|++ output1 (&/|++ output2 (&/|++ output3 output4)))))
+ (make-state (str "\"" input1 "\"" "\n" "\"" input2 "\"" "\n" "\"" input3 "\"" "\n" "\"" input4 "\"")))
+ (&/$Right state (&/$Cons [_ (&/$TextS output1)] (&/$Cons [_ (&/$TextS output2)] (&/$Cons [_ (&/$TextS output3)] (&/$Cons [_ (&/$TextS output4)] (&/$Nil))))))
+ (are [input output] (= input output)
+ input1 output1
+ input2 output2
+ "yolo\nlol\tmeme" output3
+ "This is a test\nof multi-line text.\n\nI just wanna make sure it works alright..." output4)
+
+ _
+ (is false "Couldn't read.")
+ )))
+
+(deftest parse-symbol
+ (let [input1 "foo"
+ input2 "test;bar0123456789"
+ input3 ";b1a2z3"
+ input4 ";;quux"
+ input5 "!_@$%^&*-+=.<>?/|\\~`':"]
+ (|case (&/run-state (|do [_ (&a-module/enter-module module-name)
+ output1 &parser/parse
+ output2 &parser/parse
+ output3 &parser/parse
+ output4 &parser/parse
+ output5 &parser/parse]
+ (return (&/|++ output1 (&/|++ output2 (&/|++ output3 (&/|++ output4 output5))))))
+ (make-state (str input1 "\n" input2 "\n" input3 "\n" input4 "\n" input5 " ")))
+ (&/$Right state (&/$Cons [_ (&/$SymbolS output1)]
+ (&/$Cons [_ (&/$SymbolS output2)]
+ (&/$Cons [_ (&/$SymbolS output3)]
+ (&/$Cons [_ (&/$SymbolS output4)]
+ (&/$Cons [_ (&/$SymbolS output5)]
+ (&/$Nil)))))))
+ (are [input output] (&/ident= input output)
+ (&/T ["" "foo"]) output1
+ (&/T ["test" "bar0123456789"]) output2
+ (&/T ["lux" "b1a2z3"]) output3
+ (&/T ["test" "quux"]) output4
+ (&/T ["" "!_@$%^&*-+=.<>?/|\\~`':"]) output5)
+
+ _
+ (is false "Couldn't read.")
+ )))
+
+(deftest parse-tag
+ (let [input1 "foo"
+ input2 "test;bar0123456789"
+ input3 ";b1a2z3"
+ input4 ";;quux"
+ input5 "!_@$%^&*-+=.<>?/|\\~`':"]
+ (|case (&/run-state (|do [_ (&a-module/enter-module module-name)
+ output1 &parser/parse
+ output2 &parser/parse
+ output3 &parser/parse
+ output4 &parser/parse
+ output5 &parser/parse]
+ (return (&/|++ output1 (&/|++ output2 (&/|++ output3 (&/|++ output4 output5))))))
+ (make-state (str "#" input1 "\n" "#" input2 "\n" "#" input3 "\n" "#" input4 "\n" "#" input5 " ")))
+ (&/$Right state (&/$Cons [_ (&/$TagS output1)]
+ (&/$Cons [_ (&/$TagS output2)]
+ (&/$Cons [_ (&/$TagS output3)]
+ (&/$Cons [_ (&/$TagS output4)]
+ (&/$Cons [_ (&/$TagS output5)]
+ (&/$Nil)))))))
+ (are [input output] (&/ident= input output)
+ (&/T ["" "foo"]) output1
+ (&/T ["test" "bar0123456789"]) output2
+ (&/T ["lux" "b1a2z3"]) output3
+ (&/T ["test" "quux"]) output4
+ (&/T ["" "!_@$%^&*-+=.<>?/|\\~`':"]) output5)
+
+ _
+ (is false "Couldn't read.")
+ )))
+
+(do-template [<name> <tag> <open> <close>]
+ (deftest <name>
+ (let [input1 "yolo 123 \"lol\" #meme"]
+ (|case (&/run-state &parser/parse
+ (make-state (str <open> input1 <close>)))
+ (&/$Right state (&/$Cons [_ (<tag> (&/$Cons [_ (&/$SymbolS symv)]
+ (&/$Cons [_ (&/$IntS intv)]
+ (&/$Cons [_ (&/$TextS textv)]
+ (&/$Cons [_ (&/$TagS tagv)]
+ (&/$Nil))))))]
+ (&/$Nil)))
+ (do (is (&/ident= (&/T ["" "yolo"]) symv))
+ (is (= 123 intv))
+ (is (= "lol" textv))
+ (is (&/ident= (&/T ["" "meme"]) tagv)))
+
+ _
+ (is false "Couldn't read.")
+ )))
+
+ parse-form &/$FormS "(" ")"
+ parse-tuple &/$TupleS "[" "]"
+ )
+
+(deftest parse-record
+ (let [input1 "yolo 123 \"lol\" #meme"]
+ (|case (&/run-state &parser/parse
+ (make-state (str "{" input1 "}")))
+ (&/$Right state (&/$Cons [_ (&/$RecordS (&/$Cons [[_ (&/$SymbolS symv)] [_ (&/$IntS intv)]]
+ (&/$Cons [[_ (&/$TextS textv)] [_ (&/$TagS tagv)]]
+ (&/$Nil))))]
+ (&/$Nil)))
+ (do (is (&/ident= (&/T ["" "yolo"]) symv))
+ (is (= 123 intv))
+ (is (= "lol" textv))
+ (is (&/ident= (&/T ["" "meme"]) tagv)))
+
+ _
+ (is false "Couldn't read.")
+ )))
+
+(comment
+ (run-all-tests)
+ )
diff --git a/luxc/test/test/lux/reader.clj b/luxc/test/test/lux/reader.clj
new file mode 100644
index 000000000..ee9cb4c35
--- /dev/null
+++ b/luxc/test/test/lux/reader.clj
@@ -0,0 +1,53 @@
+;; Copyright (c) Eduardo Julian. All rights reserved.
+;; This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
+;; If a copy of the MPL was not distributed with this file,
+;; You can obtain one at http://mozilla.org/MPL/2.0/.
+
+(ns test.lux.reader
+ (:use clojure.test)
+ (:require (lux [base :as & :refer [|do return* return fail fail* |let |case]]
+ [reader :as &reader])
+ :reload-all))
+
+;; [Utils]
+(def source (&reader/from "test" "lol\nmeme\nnyan cat\n\nlolcat"))
+(def init-state (&/set$ &/$source source (&/init-state nil)))
+
+;; [Tests]
+(deftest test-source-code-reading
+ (is (= 5 (&/|length source))))
+
+(deftest test-text-reading
+ ;; Should be capable of recognizing literal texts.
+ (let [input "lo"]
+ (|case (&/run-state (&reader/read-text input) init-state)
+ (&/$Right state [cursor end-line? output])
+ (is (= input output))
+
+ _
+ (is false "Couldn't read.")
+ )))
+
+(deftest test-regex-reading
+ ;; Should be capable of matching simple, grouping regex-patterns.
+ (|case (&/run-state (&reader/read-regex #"l(.)l") init-state)
+ (&/$Right state [cursor end-line? output])
+ (is (= "lol" output))
+
+ _
+ (is false "Couldn't read.")
+ ))
+
+(deftest test-regex+-reading
+ ;; Should be capable of matching multi-line regex-patterns.
+ (|case (&/run-state (&reader/read-regex+ #"(?is)^((?!cat).)*") init-state)
+ (&/$Right state [cursor output])
+ (is (= "\nlol\nmeme\nnyan " output))
+
+ _
+ (is false "Couldn't read.")
+ ))
+
+(comment
+ (run-all-tests)
+ )
diff --git a/luxc/test/test/lux/type.clj b/luxc/test/test/lux/type.clj
new file mode 100644
index 000000000..1a43f7cc4
--- /dev/null
+++ b/luxc/test/test/lux/type.clj
@@ -0,0 +1,473 @@
+;; Copyright (c) Eduardo Julian. All rights reserved.
+;; This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
+;; If a copy of the MPL was not distributed with this file,
+;; You can obtain one at http://mozilla.org/MPL/2.0/.
+
+(ns test.lux.type
+ (:use clojure.test)
+ (:require (lux [base :as & :refer [|do return* return fail fail* |let |case]]
+ [type :as &type])
+ :reload-all
+ ))
+
+;; [Tests]
+(deftest check-base-types
+ (|case (&/run-state (|do [_ (&type/check &/$UnitT &/$UnitT)
+
+ _ (&type/check &/$VoidT &/$VoidT)]
+ (return nil))
+ (&/init-state nil))
+ (&/$Right state nil)
+ (is true)
+
+ (&/$Left error)
+ (is false error)
+ ))
+
+(deftest check-simple-host-types
+ (|case (&/run-state (|do [_ (&type/check (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil))
+
+ _ (&type/check (&/$HostT "java.lang.Object" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil))]
+ (return nil))
+ (&/init-state nil))
+ (&/$Right state nil)
+ (is true)
+
+ (&/$Left error)
+ (is false error)
+ ))
+
+(deftest check-complex-host-types
+ (|case (&/run-state (|do [_ (&type/check (&/$HostT "java.util.List" (&/|list (&/$HostT "java.lang.Boolean" &/$Nil)))
+ (&/$HostT "java.util.List" (&/|list (&/$HostT "java.lang.Boolean" &/$Nil))))
+
+ _ (&type/check (&/$HostT "java.util.List" (&/|list (&/$HostT "java.lang.Object" &/$Nil)))
+ (&/$HostT "java.util.List" (&/|list (&/$HostT "java.lang.Boolean" &/$Nil))))
+
+ _ (&type/check (&/$HostT "java.util.List" (&/|list (&/$HostT "java.lang.Boolean" &/$Nil)))
+ (&/$HostT "java.util.ArrayList" (&/|list (&/$HostT "java.lang.Boolean" &/$Nil))))]
+ (return nil))
+ (&/init-state nil))
+ (&/$Right state nil)
+ (is true)
+
+ (&/$Left error)
+ (is false error)
+ ))
+
+(deftest check-named-types
+ (|case (&/run-state (|do [_ (&type/check (&/$NamedT (&/T ["lux" "Bool"]) (&/$HostT "java.lang.Boolean" &/$Nil))
+ (&/$HostT "java.lang.Boolean" &/$Nil))
+
+ _ (&type/check (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$NamedT (&/T ["lux" "Bool"]) (&/$HostT "java.lang.Boolean" &/$Nil)))
+
+ _ (&type/check (&/$NamedT (&/T ["lux" "Bool"]) (&/$HostT "java.lang.Boolean" &/$Nil))
+ (&/$NamedT (&/T ["lux" "Bool"]) (&/$HostT "java.lang.Boolean" &/$Nil)))]
+ (return nil))
+ (&/init-state nil))
+ (&/$Right state nil)
+ (is true)
+
+ (&/$Left error)
+ (is false error)
+ ))
+
+(deftest check-sum-types
+ (|case (&/run-state (|do [_ (&type/check (&/$SumT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil))
+ (&/$SumT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil)))
+
+ _ (&type/check (&/$SumT (&/$HostT "java.lang.Object" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil))
+ (&/$SumT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil)))
+
+ _ (&type/check (&/$SumT (&/$HostT "java.lang.Object" &/$Nil)
+ (&/$HostT "java.lang.Object" &/$Nil))
+ (&/$SumT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil)))
+
+ _ (&type/check (&/$SumT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$SumT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil)))
+ (&/$SumT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$SumT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil))))
+
+ _ (&type/check (&/$SumT (&/$HostT "java.lang.Object" &/$Nil)
+ (&/$SumT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil)))
+ (&/$SumT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$SumT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil))))
+
+ _ (&type/check (&/$SumT (&/$HostT "java.lang.Object" &/$Nil)
+ (&/$SumT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$HostT "java.lang.Object" &/$Nil)))
+ (&/$SumT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$SumT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil))))]
+ (return nil))
+ (&/init-state nil))
+ (&/$Right state nil)
+ (is true)
+
+ (&/$Left error)
+ (is false error)
+ ))
+
+(deftest check-prod-types
+ (|case (&/run-state (|do [_ (&type/check (&/$ProdT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil))
+ (&/$ProdT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil)))
+
+ _ (&type/check (&/$ProdT (&/$HostT "java.lang.Object" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil))
+ (&/$ProdT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil)))
+
+ _ (&type/check (&/$ProdT (&/$HostT "java.lang.Object" &/$Nil)
+ (&/$HostT "java.lang.Object" &/$Nil))
+ (&/$ProdT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil)))
+
+ _ (&type/check (&/$ProdT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$ProdT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil)))
+ (&/$ProdT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$ProdT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil))))
+
+ _ (&type/check (&/$ProdT (&/$HostT "java.lang.Object" &/$Nil)
+ (&/$ProdT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil)))
+ (&/$ProdT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$ProdT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil))))
+
+ _ (&type/check (&/$ProdT (&/$HostT "java.lang.Object" &/$Nil)
+ (&/$ProdT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$HostT "java.lang.Object" &/$Nil)))
+ (&/$ProdT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$ProdT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil))))]
+ (return nil))
+ (&/init-state nil))
+ (&/$Right state nil)
+ (is true)
+
+ (&/$Left error)
+ (is false error)
+ ))
+
+(deftest check-lambda-types
+ (|case (&/run-state (|do [_ (&type/check (&/$LambdaT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil))
+ (&/$LambdaT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil)))
+
+ _ (&type/check (&/$LambdaT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil))
+ (&/$LambdaT (&/$HostT "java.lang.Object" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil)))
+
+ _ (&type/check (&/$LambdaT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$HostT "java.lang.Object" &/$Nil))
+ (&/$LambdaT (&/$HostT "java.lang.Object" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil)))
+
+ _ (&type/check (&/$LambdaT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$LambdaT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil)))
+ (&/$LambdaT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$LambdaT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil))))
+
+ _ (&type/check (&/$LambdaT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$LambdaT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil)))
+ (&/$LambdaT (&/$HostT "java.lang.Object" &/$Nil)
+ (&/$LambdaT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil))))
+
+ _ (&type/check (&/$LambdaT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$LambdaT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$HostT "java.lang.Object" &/$Nil)))
+ (&/$LambdaT (&/$HostT "java.lang.Object" &/$Nil)
+ (&/$LambdaT (&/$HostT "java.lang.Boolean" &/$Nil)
+ (&/$HostT "java.lang.Boolean" &/$Nil))))
+ ]
+ (return nil))
+ (&/init-state nil))
+ (&/$Right state nil)
+ (is true)
+
+ (&/$Left error)
+ (is false error)
+ ))
+
+(deftest check-ex-types
+ (|case (&/run-state (|do [_ (&type/check (&/$ExT 0) (&/$ExT 0))]
+ (return nil))
+ (&/init-state nil))
+ (&/$Right state nil)
+ (is true)
+
+ (&/$Left error)
+ (is false error)
+ ))
+
+(deftest check-univ-quantification
+ (|case (&/run-state (|do [_ (&type/check (&/$UnivQ (&/|list)
+ (&/$LambdaT &/$VoidT (&/$BoundT 1)))
+ (&/$UnivQ (&/|list)
+ (&/$LambdaT &/$VoidT (&/$BoundT 1))))
+
+ _ (&type/check (&/$UnivQ (&/|list)
+ (&/$SumT
+ ;; lux;None
+ &/$UnitT
+ ;; lux;Some
+ (&/$BoundT 1)))
+ (&/$UnivQ (&/|list)
+ (&/$SumT
+ ;; lux;None
+ &/$UnitT
+ ;; lux;Some
+ (&/$BoundT 1))))
+
+ _ (&type/check (&/$UnivQ (&/|list)
+ (&/$SumT
+ ;; lux;Nil
+ &/$UnitT
+ ;; lux;Cons
+ (&/$ProdT (&/$BoundT 1)
+ (&/$AppT (&/$BoundT 0)
+ (&/$BoundT 1)))))
+ (&/$UnivQ (&/|list)
+ (&/$SumT
+ ;; lux;Nil
+ &/$UnitT
+ ;; lux;Cons
+ (&/$ProdT (&/$BoundT 1)
+ (&/$AppT (&/$BoundT 0)
+ (&/$BoundT 1))))))]
+ (return nil))
+ (&/init-state nil))
+ (&/$Right state nil)
+ (is true)
+
+ (&/$Left error)
+ (is false error)
+ ))
+
+(deftest check-ex-quantification
+ (|case (&/run-state (|do [_ (&type/check (&/$ExQ (&/|list)
+ (&/$LambdaT &/$VoidT (&/$BoundT 1)))
+ (&/$ExQ (&/|list)
+ (&/$LambdaT &/$VoidT (&/$BoundT 1))))
+
+ _ (&type/check (&/$ExQ (&/|list)
+ (&/$SumT
+ ;; lux;None
+ &/$UnitT
+ ;; lux;Some
+ (&/$BoundT 1)))
+ (&/$ExQ (&/|list)
+ (&/$SumT
+ ;; lux;None
+ &/$UnitT
+ ;; lux;Some
+ (&/$BoundT 1))))
+
+ _ (&type/check (&/$ExQ (&/|list)
+ (&/$SumT
+ ;; lux;Nil
+ &/$UnitT
+ ;; lux;Cons
+ (&/$ProdT (&/$BoundT 1)
+ (&/$AppT (&/$BoundT 0)
+ (&/$BoundT 1)))))
+ (&/$ExQ (&/|list)
+ (&/$SumT
+ ;; lux;Nil
+ &/$UnitT
+ ;; lux;Cons
+ (&/$ProdT (&/$BoundT 1)
+ (&/$AppT (&/$BoundT 0)
+ (&/$BoundT 1))))))]
+ (return nil))
+ (&/init-state nil))
+ (&/$Right state nil)
+ (is true)
+
+ (&/$Left error)
+ (is false error)
+ ))
+
+(deftest check-app-type
+ (|case (&/run-state (|do [_ (&type/check (&/$AppT (&/$UnivQ (&/|list)
+ (&/$LambdaT &/$VoidT (&/$BoundT 1)))
+ (&/$HostT "java.lang.Boolean" &/$Nil))
+ (&/$AppT (&/$UnivQ (&/|list)
+ (&/$LambdaT &/$VoidT (&/$BoundT 1)))
+ (&/$HostT "java.lang.Boolean" &/$Nil)))
+
+ _ (&type/check (&/$AppT (&/$UnivQ (&/|list)
+ (&/$SumT
+ ;; lux;None
+ &/$UnitT
+ ;; lux;Some
+ (&/$BoundT 1)))
+ (&/$HostT "java.lang.Object" &/$Nil))
+ (&/$AppT (&/$UnivQ (&/|list)
+ (&/$SumT
+ ;; lux;None
+ &/$UnitT
+ ;; lux;Some
+ (&/$BoundT 1)))
+ (&/$HostT "java.lang.Boolean" &/$Nil)))
+
+ _ (&type/check (&/$AppT (&/$ExQ (&/|list)
+ (&/$LambdaT &/$VoidT (&/$BoundT 1)))
+ (&/$HostT "java.lang.Boolean" &/$Nil))
+ (&/$AppT (&/$ExQ (&/|list)
+ (&/$LambdaT &/$VoidT (&/$BoundT 1)))
+ (&/$HostT "java.lang.Boolean" &/$Nil)))
+
+ _ (&type/check (&/$AppT (&/$ExQ (&/|list)
+ (&/$SumT
+ ;; lux;None
+ &/$UnitT
+ ;; lux;Some
+ (&/$BoundT 1)))
+ (&/$HostT "java.lang.Object" &/$Nil))
+ (&/$AppT (&/$ExQ (&/|list)
+ (&/$SumT
+ ;; lux;None
+ &/$UnitT
+ ;; lux;Some
+ (&/$BoundT 1)))
+ (&/$HostT "java.lang.Boolean" &/$Nil)))]
+ (return nil))
+ (&/init-state nil))
+ (&/$Right state nil)
+ (is true)
+
+ (&/$Left error)
+ (is false error)
+ ))
+
+(deftest check-var-type
+ (|case (&/run-state (|do [_ (&type/with-var
+ (fn [$var]
+ (|do [_ (&type/check $var (&/$HostT "java.lang.Boolean" &/$Nil))
+ (&/$HostT "java.lang.Boolean" (&/$Nil)) (&type/deref+ $var)]
+ (return nil))))
+
+ _ (&type/with-var
+ (fn [$var]
+ (|do [_ (&type/check (&/$AppT (&/$UnivQ (&/|list)
+ (&/$LambdaT &/$VoidT (&/$BoundT 1)))
+ $var)
+ (&/$AppT (&/$UnivQ (&/|list)
+ (&/$LambdaT &/$VoidT (&/$BoundT 1)))
+ (&/$HostT "java.lang.Boolean" &/$Nil)))
+ (&/$HostT "java.lang.Boolean" (&/$Nil)) (&type/deref+ $var)]
+ (return nil))))
+
+ _ (&type/with-var
+ (fn [$var]
+ (|do [_ (&type/check (&/$HostT "java.lang.Boolean" &/$Nil) $var)
+ (&/$HostT "java.lang.Boolean" (&/$Nil)) (&type/deref+ $var)]
+ (return nil))))
+
+ _ (&type/with-var
+ (fn [$var]
+ (|do [_ (&type/check (&/$AppT (&/$UnivQ (&/|list)
+ (&/$LambdaT &/$VoidT (&/$BoundT 1)))
+ (&/$HostT "java.lang.Boolean" &/$Nil))
+ (&/$AppT (&/$UnivQ (&/|list)
+ (&/$LambdaT &/$VoidT (&/$BoundT 1)))
+ $var))
+ (&/$HostT "java.lang.Boolean" (&/$Nil)) (&type/deref+ $var)]
+ (return nil))))
+
+ _ (&type/with-var
+ (fn [$var1]
+ (&type/with-var
+ (fn [$var2]
+ (|do [_ (&type/check $var1 $var2)]
+ (return nil))))))
+
+ _ (&type/with-var
+ (fn [$var1]
+ (&type/with-var
+ (fn [$var2]
+ (|do [_ (&type/check $var2 $var1)]
+ (return nil))))))
+
+ _ (&type/with-var
+ (fn [$var1]
+ (&type/with-var
+ (fn [$var2]
+ (|do [_ (&type/check $var1 $var2)
+ _ (&type/check $var1 (&/$HostT "java.lang.Boolean" (&/|list)))
+ =var1 (&type/deref+ $var1)
+ _ (&/assert! (&type/type= =var1 $var2) "")
+ =var2 (&type/deref+ $var2)
+ _ (&/assert! (&type/type= =var2 (&/$HostT "java.lang.Boolean" (&/|list))) "")]
+ (return nil))))))
+
+ _ (&type/with-var
+ (fn [$var1]
+ (&type/with-var
+ (fn [$var2]
+ (|do [_ (&type/check $var2 $var1)
+ _ (&type/check $var1 (&/$HostT "java.lang.Boolean" (&/|list)))
+ =var2 (&type/deref+ $var2)
+ _ (&/assert! (&type/type= =var2 $var1) "")
+ =var1 (&type/deref+ $var1)
+ _ (&/assert! (&type/type= =var1 (&/$HostT "java.lang.Boolean" (&/|list))) "")]
+ (return nil))))))
+
+ _ (&type/with-var
+ (fn [$var1]
+ (&type/with-var
+ (fn [$var2]
+ (|do [_ (&type/check $var1 $var2)
+ _ (&type/check $var2 (&/$HostT "java.lang.Boolean" (&/|list)))
+ =var1 (&type/deref+ $var1)
+ _ (&/assert! (&type/type= =var1 $var2) "")
+ =var2 (&type/deref+ $var2)
+ _ (&/assert! (&type/type= =var2 (&/$HostT "java.lang.Boolean" (&/|list))) "")]
+ (return nil))))))
+
+ _ (&type/with-var
+ (fn [$var1]
+ (&type/with-var
+ (fn [$var2]
+ (|do [_ (&type/check $var2 $var1)
+ _ (&type/check $var2 (&/$HostT "java.lang.Boolean" (&/|list)))
+ =var2 (&type/deref+ $var2)
+ _ (&/assert! (&type/type= =var2 $var1) "")
+ =var1 (&type/deref+ $var1)
+ _ (&/assert! (&type/type= =var1 (&/$HostT "java.lang.Boolean" (&/|list))) "")]
+ (return nil))))))]
+ (return nil))
+ (&/init-state nil))
+ (&/$Right state nil)
+ (is true)
+
+ (&/$Left error)
+ (is false error)
+ ))
+
+(comment
+ (run-all-tests)
+ )