Compare commits

...

2 Commits

Author SHA1 Message Date
8ab279d488 🤡 onlyCheckedErrors 2024-10-11 15:46:28 +02:00
533f16ba81 🤡 parsePrinted 2024-10-11 15:17:55 +02:00
2 changed files with 14 additions and 8 deletions

View File

@ -60,9 +60,9 @@ printExp (Let v e1 e2) =
printExp (Lambda v body) = printExp (Lambda v body) =
parens $ "\\" ++ v ++ " -> " ++ printExp body parens $ "\\" ++ v ++ " -> " ++ printExp body
printExp (Apply x y) = printExp (Apply x y) =
printExp x ++ " " ++ printExp y printExp x ++ " (" ++ printExp y ++ ")"
printExp (TryCatch x y) = printExp (TryCatch x y) =
"try " ++ printExp x ++ " catch " ++ printExp y parens $ "try " ++ printExp x ++ " catch " ++ printExp y
subExp :: Exp -> [Exp] subExp :: Exp -> [Exp]
subExp e = e : case e of subExp e = e : case e of

View File

@ -5,6 +5,7 @@ module APL.Tests
where where
import APL.AST (Exp (..), subExp, VName, printExp) import APL.AST (Exp (..), subExp, VName, printExp)
import APL.Eval (eval, runEval)
import APL.Parser (parseAPL, keywords) import APL.Parser (parseAPL, keywords)
import APL.Error (isVariableError, isDomainError, isTypeError) import APL.Error (isVariableError, isDomainError, isTypeError)
import APL.Check (checkExp) import APL.Check (checkExp)
@ -22,6 +23,7 @@ import Test.QuickCheck
, listOf , listOf
, suchThat , suchThat
, resize , resize
, withMaxSuccess
) )
genString :: Gen String genString :: Gen String
@ -33,6 +35,8 @@ varTest s = (not (s `elem` keywords)) && ((length s) > 1)
genVar :: Gen String genVar :: Gen String
genVar = suchThat (genString) (varTest) genVar = suchThat (genString) (varTest)
genInt :: Gen Integer
genInt = suchThat arbitrary (\i -> i >= 0)
instance Arbitrary Exp where instance Arbitrary Exp where
arbitrary = sized (genExp []) arbitrary = sized (genExp [])
@ -62,10 +66,10 @@ instance Arbitrary Exp where
shrink _ = [] shrink _ = []
genExp :: [VName] -> Int -> Gen Exp genExp :: [VName] -> Int -> Gen Exp
genExp _ 0 = oneof [CstInt <$> arbitrary, CstBool <$> arbitrary] genExp _ 0 = oneof [CstInt <$> genInt, CstBool <$> arbitrary]
genExp vars size = genExp vars size =
frequency frequency
[ (1, CstInt <$> arbitrary) [ (1, CstInt <$> genInt)
, (1, CstBool <$> arbitrary) , (1, CstBool <$> arbitrary)
, (1, Add <$> genExp vars halfSize <*> genExp vars halfSize) , (1, Add <$> genExp vars halfSize <*> genExp vars halfSize)
, (1, Sub <$> genExp vars halfSize <*> genExp vars halfSize) , (1, Sub <$> genExp vars halfSize <*> genExp vars halfSize)
@ -74,7 +78,7 @@ genExp vars size =
, (1, Pow <$> genExp vars halfSize <*> genExp vars halfSize) , (1, Pow <$> genExp vars halfSize <*> genExp vars halfSize)
, (1, Eql <$> 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, If <$> genExp vars thirdSize <*> genExp vars thirdSize <*> genExp vars thirdSize)
, (1, Var <$> arbitrary) , (1, Var <$> genVar)
, (if (length vars) > 0 then 50 else 0, Var <$> elements vars) , (if (length vars) > 0 then 50 else 0, Var <$> elements vars)
, (25, do , (25, do
var <- genVar var <- genVar
@ -111,11 +115,13 @@ parsePrinted e = case (parseAPL "input" (printExp e)) of
Right e' -> e == e' Right e' -> e == e'
onlyCheckedErrors :: Exp -> Bool onlyCheckedErrors :: Exp -> Bool
onlyCheckedErrors _ = undefined onlyCheckedErrors e = case runEval (eval e) of
Right _ -> True
Left err -> err `elem` (checkExp e)
properties :: [(String, Property)] properties :: [(String, Property)]
properties = properties =
[ ("expCoverage", property expCoverage) [ ("expCoverage", property expCoverage)
, ("parsePrinted", property parsePrinted) , ("parsePrinted", property (withMaxSuccess 10000 parsePrinted))
, ("onlyCheckedErrors", property onlyCheckedErrors) , ("onlyCheckedErrors", property (withMaxSuccess 1000000 onlyCheckedErrors))
] ]