@@ -0,0 +1,54 @@
1+{-# LANGUAGE GeneralizedNewtypeDeriving, TypeSynonymInstances, FlexibleInstances, QuasiQuotes, ExtendedDefaultRules #-}
2+
3+
4+module Main where
5+
6+import Test.Framework as TF (defaultMain, testGroup, Test)
7+import Test.Framework.Providers.QuickCheck2 (testProperty)
8+
9+import Text.InterpolatedString.Perl6 (qq)
10+import Parse.Parser
11+import Util.Arbs
12+
13+import Debug.Trace
14+
15+main :: IO ()
16+main = defaultMain tests
17+
18+parses :: String -> Bool
19+parses code = either (const False) (const True) (parseProgram code)
20+
21+parseFails :: String -> Bool
22+parseFails = not . parses
23+
24+tests :: [TF.Test]
25+tests = [
26+ testGroup "String Assignments" [
27+ testProperty "prop_assignString" prop_assignString
28+ , testProperty "prop_invalidIdent" prop_invalidIdent
29+ , testProperty "prop_emptyList" prop_emptyList
30+ , testProperty "prop_record" prop_record
31+ ]
32+ ]
33+
34+prop_assignString :: ValidIdent -> StringLiteral -> Bool
35+prop_assignString i s = parses [qq|
36+{i} = {s}
37+|]
38+
39+prop_invalidIdent :: ValidIdent -> InvalidIdentChar -> StringLiteral -> Bool
40+prop_invalidIdent i z s = parseFails [qq|
41+{i}{z} = {s}
42+|]
43+
44+prop_emptyList :: ValidIdent -> Bool
45+prop_emptyList i = parses [qq|
46+{i}=[]
47+|]
48+
49+prop_record :: ValidIdent -> ValidIdent -> ValidIdent -> ValidIdent -> StringLiteral -> Bool
50+prop_record a b c k v = parses [qq|
51+{a} = \{{k} = {v} \}
52+{b} = .{k} {a}
53+{c} = {a}.{k}
54+|]