This commit is contained in:
NikolajDanger committed 2024-10-11 14:41:07 +02:00
1 parent 38b4e22c1e
commit e994dbda38
9 files changed
+53 -24

No files matched your search

File renamed without changes.
View File
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -1,4 +1,4 @@
module APL.Parser (parseAPL) where
module APL.Parser (parseAPL, keywords) where
import APL.AST (Exp (..), VName)
import Control.Monad (void)
@@ -1,9 +1,11 @@
module APL.Tests
( properties
( properties,
genVar
)
where
import APL.AST (Exp (..), subExp)
import APL.AST (Exp (..), subExp, VName, printExp)
import APL.Parser (parseAPL, keywords)
import APL.Error (isVariableError, isDomainError, isTypeError)
import APL.Check (checkExp)
import Test.QuickCheck
@@ -15,10 +17,25 @@ import Test.QuickCheck
, checkCoverage
, oneof
, sized
, frequency
, elements
, listOf
, suchThat
, resize
)
genString :: Gen String
genString = resize 4 $ listOf $ elements ['a'..'z']
varTest :: String -> Bool
varTest s = (not (s `elem` keywords)) && ((length s) > 1)
genVar :: Gen String
genVar = suchThat (genString) (varTest)
instance Arbitrary Exp where
arbitrary = sized genExp
arbitrary = sized (genExp [])
shrink (Add e1 e2) =
e1 : e2 : [Add e1' e2 | e1' <- shrink e1] ++ [Add e1 e2' | e2' <- shrink e2]
@@ -44,24 +61,34 @@ instance Arbitrary Exp where
e1 : e2 : [TryCatch e1' e2 | e1' <- shrink e1] ++ [TryCatch e1 e2' | e2' <- shrink e2]
shrink _ = []
genExp :: Int -> Gen Exp
genExp 0 = oneof [CstInt <$> arbitrary, CstBool <$> arbitrary]
genExp size =
oneof
[ CstInt <$> arbitrary
, CstBool <$> arbitrary
, Add <$> genExp halfSize <*> genExp halfSize
, Sub <$> genExp halfSize <*> genExp halfSize
, Mul <$> genExp halfSize <*> genExp halfSize
, Div <$> genExp halfSize <*> genExp halfSize
, Pow <$> genExp halfSize <*> genExp halfSize
, Eql <$> genExp halfSize <*> genExp halfSize
, If <$> genExp thirdSize <*> genExp thirdSize <*> genExp thirdSize
, Var <$> arbitrary
, Let <$> arbitrary <*> genExp halfSize <*> genExp halfSize
, Lambda <$> arbitrary <*> genExp (size - 1)
, Apply <$> genExp halfSize <*> genExp halfSize
, TryCatch <$> genExp halfSize <*> genExp halfSize
genExp :: [VName] -> Int -> Gen Exp
genExp _ 0 = oneof [CstInt <$> arbitrary, CstBool <$> arbitrary]
genExp vars size =
frequency
[ (1, CstInt <$> arbitrary)
, (1, CstBool <$> arbitrary)
, (1, Add <$> genExp vars halfSize <*> genExp vars halfSize)
, (1, Sub <$> genExp vars halfSize <*> genExp vars halfSize)
, (1, Mul <$> genExp vars halfSize <*> genExp vars halfSize)
, (1, Div <$> genExp vars halfSize <*> genExp vars halfSize)
, (1, Pow <$> genExp vars halfSize <*> genExp vars halfSize)
, (1, Eql <$> genExp vars halfSize <*> genExp vars halfSize)
, (1, If <$> genExp vars thirdSize <*> genExp vars thirdSize <*> genExp vars thirdSize)
, (1, Var <$> arbitrary)
, (if (length vars) > 0 then 50 else 0, Var <$> elements vars)
, (25, do
var <- genVar
e1 <- genExp vars halfSize
e2 <- genExp (var:vars) halfSize
pure $ Let var e1 e2
)
, (25, do
var <- genVar
body <- genExp vars (size - 1)
pure $ Lambda var body
)
, (1, Apply <$> genExp vars halfSize <*> genExp vars halfSize)
, (1, TryCatch <$> genExp vars halfSize <*> genExp vars halfSize)
]
where
halfSize = size `div` 2
@@ -79,7 +106,9 @@ expCoverage e = checkCoverage
$ ()
parsePrinted :: Exp -> Bool
parsePrinted _ = undefined
parsePrinted e = case (parseAPL "input" (printExp e)) of
Left _ -> False
Right e' -> e == e'
onlyCheckedErrors :: Exp -> Bool
onlyCheckedErrors _ = undefined
@@ -87,6 +116,6 @@ onlyCheckedErrors _ = undefined
properties :: [(String, Property)]
properties =
[ ("expCoverage", property expCoverage)
, ("onlyCheckedErrors", property onlyCheckedErrors)
, ("parsePrinted", property parsePrinted)
, ("onlyCheckedErrors", property onlyCheckedErrors)
]