summaryrefslogtreecommitdiff
path: root/tests/Language/Elna/ParserSpec.hs
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2024-07-23 22:44:42 +0200
committerEugen Wissner <belka@caraus.de>2024-07-23 22:44:42 +0200
commit9d1f0385945e926e7084e60fc72fe5846e7139b2 (patch)
tree96bd319dc0dc26059ce3f42d5a91f84624fe3ea0 /tests/Language/Elna/ParserSpec.hs
parent01398f48bf2d17a3836a5d5b5467d0fb05e3f337 (diff)
downloadelna-9d1f0385945e926e7084e60fc72fe5846e7139b2.tar.gz
Split in lib and tests
Diffstat (limited to 'tests/Language/Elna/ParserSpec.hs')
-rw-r--r--tests/Language/Elna/ParserSpec.hs58
1 files changed, 58 insertions, 0 deletions
diff --git a/tests/Language/Elna/ParserSpec.hs b/tests/Language/Elna/ParserSpec.hs
new file mode 100644
index 0000000..11907ab
--- /dev/null
+++ b/tests/Language/Elna/ParserSpec.hs
@@ -0,0 +1,58 @@
+module Language.Elna.ParserSpec
+ ( spec
+ ) where
+
+import Test.Hspec (Spec, describe, it, pendingWith, xit)
+import Test.Hspec.Megaparsec (shouldParse, shouldSucceedOn, parseSatisfies)
+import Language.Elna.Parser (programP)
+import Text.Megaparsec (parse)
+import Language.Elna.AST
+ ( Declaration(..)
+ , Parameter(..)
+ , Program(..)
+ , TypeExpression(..)
+ )
+
+spec :: Spec
+spec =
+ describe "programP" $ do
+ it "parses an empty main function" $
+ parse programP "" `shouldSucceedOn` "proc main() {}"
+
+ it "parses type definition for a type starting like array" $
+ let expected = Program [TypeDefinition "t" $ NamedType "arr"]
+ actual = parse programP "" "type t = arr"
+ in actual `shouldParse` expected
+
+ it "parses array type definition" $
+ let expected = Program [TypeDefinition "t" $ ArrayType (NamedType "integer") 10]
+ actual = parse programP "" "type t = array[10] of integer"
+ in actual `shouldParse` expected
+
+ it "parses parameters" $
+ let given = "proc main(x: integer) {}"
+ parameters = [Parameter "x" (NamedType "integer") False]
+ expected = Program [ProcedureDefinition "main" parameters [] []]
+ actual = parse programP "" given
+ in actual `shouldParse` expected
+
+ it "parses ref parameters" $
+ let given = "proc main(x: integer, ref y: boolean) {}"
+ parameters =
+ [ Parameter "x" (NamedType "integer") False
+ , Parameter "y" (NamedType "boolean") True
+ ]
+ expected = Program [ProcedureDefinition "main" parameters [] []]
+ actual = parse programP "" given
+ in actual `shouldParse` expected
+
+ it "parses variable declaration" $
+ let given = "proc main() { var x: integer; }"
+ expected (Program [ProcedureDefinition _ _ variables _]) =
+ not $ null variables
+ expected _ = False
+ actual = parse programP "" given
+ in actual `parseSatisfies` expected
+
+ it "parses procedure body statements" $
+ pendingWith "Not implemented"