🤡
This commit is contained in:
1 parent
38b4e22c1e
commit
e994dbda38
9 files changed
+53
-24
No files matched your search
File renamed without changes.
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)
|
||||
]
|
||||
Reference in new issue
Block a user