🤡
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 APL.AST (Exp (..), VName)
|
||||||
import Control.Monad (void)
|
import Control.Monad (void)
|
||||||
@@ -1,9 +1,11 @@
|
|||||||
module APL.Tests
|
module APL.Tests
|
||||||
( properties
|
( properties,
|
||||||
|
genVar
|
||||||
)
|
)
|
||||||
where
|
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.Error (isVariableError, isDomainError, isTypeError)
|
||||||
import APL.Check (checkExp)
|
import APL.Check (checkExp)
|
||||||
import Test.QuickCheck
|
import Test.QuickCheck
|
||||||
@@ -15,10 +17,25 @@ import Test.QuickCheck
|
|||||||
, checkCoverage
|
, checkCoverage
|
||||||
, oneof
|
, oneof
|
||||||
, sized
|
, 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
|
instance Arbitrary Exp where
|
||||||
arbitrary = sized genExp
|
arbitrary = sized (genExp [])
|
||||||
|
|
||||||
shrink (Add e1 e2) =
|
shrink (Add e1 e2) =
|
||||||
e1 : e2 : [Add e1' e2 | e1' <- shrink e1] ++ [Add e1 e2' | e2' <- shrink 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]
|
e1 : e2 : [TryCatch e1' e2 | e1' <- shrink e1] ++ [TryCatch e1 e2' | e2' <- shrink e2]
|
||||||
shrink _ = []
|
shrink _ = []
|
||||||
|
|
||||||
genExp :: Int -> Gen Exp
|
genExp :: [VName] -> Int -> Gen Exp
|
||||||
genExp 0 = oneof [CstInt <$> arbitrary, CstBool <$> arbitrary]
|
genExp _ 0 = oneof [CstInt <$> arbitrary, CstBool <$> arbitrary]
|
||||||
genExp size =
|
genExp vars size =
|
||||||
oneof
|
frequency
|
||||||
[ CstInt <$> arbitrary
|
[ (1, CstInt <$> arbitrary)
|
||||||
, CstBool <$> arbitrary
|
, (1, CstBool <$> arbitrary)
|
||||||
, Add <$> genExp halfSize <*> genExp halfSize
|
, (1, Add <$> genExp vars halfSize <*> genExp vars halfSize)
|
||||||
, Sub <$> genExp halfSize <*> genExp halfSize
|
, (1, Sub <$> genExp vars halfSize <*> genExp vars halfSize)
|
||||||
, Mul <$> genExp halfSize <*> genExp halfSize
|
, (1, Mul <$> genExp vars halfSize <*> genExp vars halfSize)
|
||||||
, Div <$> genExp halfSize <*> genExp halfSize
|
, (1, Div <$> genExp vars halfSize <*> genExp vars halfSize)
|
||||||
, Pow <$> genExp halfSize <*> genExp halfSize
|
, (1, Pow <$> genExp vars halfSize <*> genExp vars halfSize)
|
||||||
, Eql <$> genExp halfSize <*> genExp halfSize
|
, (1, Eql <$> genExp vars halfSize <*> genExp vars halfSize)
|
||||||
, If <$> genExp thirdSize <*> genExp thirdSize <*> genExp thirdSize
|
, (1, If <$> genExp vars thirdSize <*> genExp vars thirdSize <*> genExp vars thirdSize)
|
||||||
, Var <$> arbitrary
|
, (1, Var <$> arbitrary)
|
||||||
, Let <$> arbitrary <*> genExp halfSize <*> genExp halfSize
|
, (if (length vars) > 0 then 50 else 0, Var <$> elements vars)
|
||||||
, Lambda <$> arbitrary <*> genExp (size - 1)
|
, (25, do
|
||||||
, Apply <$> genExp halfSize <*> genExp halfSize
|
var <- genVar
|
||||||
, TryCatch <$> genExp halfSize <*> genExp halfSize
|
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
|
where
|
||||||
halfSize = size `div` 2
|
halfSize = size `div` 2
|
||||||
@@ -79,7 +106,9 @@ expCoverage e = checkCoverage
|
|||||||
$ ()
|
$ ()
|
||||||
|
|
||||||
parsePrinted :: Exp -> Bool
|
parsePrinted :: Exp -> Bool
|
||||||
parsePrinted _ = undefined
|
parsePrinted e = case (parseAPL "input" (printExp e)) of
|
||||||
|
Left _ -> False
|
||||||
|
Right e' -> e == e'
|
||||||
|
|
||||||
onlyCheckedErrors :: Exp -> Bool
|
onlyCheckedErrors :: Exp -> Bool
|
||||||
onlyCheckedErrors _ = undefined
|
onlyCheckedErrors _ = undefined
|
||||||
@@ -87,6 +116,6 @@ onlyCheckedErrors _ = undefined
|
|||||||
properties :: [(String, Property)]
|
properties :: [(String, Property)]
|
||||||
properties =
|
properties =
|
||||||
[ ("expCoverage", property expCoverage)
|
[ ("expCoverage", property expCoverage)
|
||||||
, ("onlyCheckedErrors", property onlyCheckedErrors)
|
|
||||||
, ("parsePrinted", property parsePrinted)
|
, ("parsePrinted", property parsePrinted)
|
||||||
|
, ("onlyCheckedErrors", property onlyCheckedErrors)
|
||||||
]
|
]
|
||||||
Reference in new issue
Block a user