aboutsummaryrefslogtreecommitdiff
path: root/tests/Language/Elna/ParserSpec.hs
blob: 11907abb5a163520252952316766211d1ceaec11 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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"