{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveDataTypeable #-}
import Syntax
import Parse
import Types
import Test.QuickCheck
import Test.QuickCheck.Arbitrary
import Control.Applicative
import Control.Monad
import Data.Char
import Data.List
import GHC.Generics
import Data.Typeable
main = checkTysys
-- checks for tysys
checkTysys :: IO ()
checkTysys = do
fc <- readFile "/home/rem/TransformeR/test/t.R"
let res = parse prog "/home/rem/TransformeR/test/t.R" fc
case res of
Left e -> putStrLn $ show e
Right r -> putStrLn $ show (tyTrans r)
-- checks for parser
checkParse :: IO ()
checkParse = do
quickCheck parseTranOK
-- fc <- readFile "/home/rem/TransformeR/test/t.R"
-- let res = parse prog "/home/rem/TransformeR/test/t.R" fc
-- case res of
-- Left e -> putStrLn $ show e
-- Right r -> putStrLn $ show r
parseTySigOK :: Descriptor -> Bool
parseTySigOK t = Right t == parse tysig "source" (show t)
parseRecSigOK :: Sig -> Bool
parseRecSigOK r = show r == let Right res = parse recsig "source" (show r) in show res
parseOpOK :: OPR -> Bool
parseOpOK o = Right o == parse opr "source" (show o)
parseValOK :: Value -> Bool
parseValOK v = Right v == parse value "source" (show v)
parseExpOK :: Expression -> Bool
parseExpOK e = show e == let Right res = parse expr "source" (show e) in show res
parseTranOK :: Transformation -> Bool
parseTranOK t = Right t == parse prog "source" (show t)
eps :: Double
eps = 0.00001
deriving instance Eq Transformation
deriving instance Eq Expression
deriving instance Eq Value
instance Eq Range where
SET xs == SET ys = xs == ys
INTERVAL n1 n2 == INTERVAL n3 n4 =
(n1 <= n3 + eps || n1 >= n3 - eps)
&& (n2 <= n4 + eps || n2 >= n4 - eps)
deriving instance Eq Sig
deriving instance Eq OPR
deriving instance Generic Transformation
deriving instance Generic Expression
deriving instance Generic Value
deriving instance Generic Range
deriving instance Generic Sig
deriving instance Generic OPR
deriving instance Typeable Transformation
deriving instance Typeable Expression
deriving instance Typeable Value
deriving instance Typeable Range
deriving instance Typeable Sig
deriving instance Typeable OPR
-- Default values
dn = "x"
dsig = Sig [(dn, ddes)]
ddes = INTERVAL 1 2
de = LIT $ NUM 1
arbitraryNum :: Gen Double
arbitraryNum = elements [1.0, 99.45, 2.34]
arbitraryName = suchThat arbitrary (\s -> (all isEnglish) s && s /= "")
where isEnglish x = elem x ['a'..'z']
instance Arbitrary Transformation where
arbitrary = TRANS <$> arbitraryName <*> arbitrary <*> arbitrary <*> arbitrary
-- shrink = genericShrink
-- shrink (TRANS n sig1 sig2 e) = [ TRANS dn dsig dsig de
-- , TRANS dn sig1 dsig de
-- , TRANS dn dsig sig2 de
-- , TRANS dn dsig dsig e
-- ]
shrink (TRANS n sig1 sig2 e) = [TRANS dn sig1' sig2' e' | (sig1', sig2', e') <- shrink (sig1, sig2, e)]
instance Arbitrary Sig where
-- arbitrary = Sig <$> sized (\n -> vectorOf n ((,) <$> arbitraryName <*> arbitrary))
arbitrary = Sig <$> vectorOf 3 ((,) <$> arbitraryName <*> arbitrary)
shrink = genericShrink
instance Arbitrary Expression where
arbitrary = oneof [ LIT <$> arbitrary
, PROJ <$> arbitrary <*> arbitraryName
-- , OP <$> arbitrary <*> sized (\n -> vectorOf n arbitrary)
, OP <$> arbitrary <*> vectorOf 3 arbitrary
, REC <$> vectorOf 3 ((,) <$> arbitraryName <*> arbitrary)
, VAR <$> arbitraryName
, MUTATE <$> arbitraryName <*> arbitraryName <*> arbitrary
, SEQ <$> arbitrary <*> arbitrary
, ASSIGN <$> arbitraryName <*> arbitrary
]
shrink (LIT x) = []
shrink (PROJ e f) = [e]
shrink (OP opr [e1, e2, e3]) = [e1, e2, e3]
shrink (REC [(f1, e1), (f2, e2), (f3, e3)]) = [e1, e2, e3]
shrink (VAR x) = []
shrink (MUTATE n l e) = [e]
shrink (SEQ e1 e2) = [e1, e2]
shrink (ASSIGN n e) = [e]
instance Arbitrary Value where
arbitrary = oneof [ NUM <$> arbitraryNum
, CAT <$> arbitraryName
, MAP <$> vectorOf 3 ((,) <$> arbitraryName <*> arbitrary)
]
shrink = genericShrink
instance Arbitrary OPR where
arbitrary = elements [SUM, CONCAT]
shrink = genericShrink
instance Arbitrary Range where
arbitrary = oneof [ INTERVAL <$> arbitraryNum <*> arbitraryNum
-- , SET <$> sized (\n -> vectorOf n arbitraryName)
, SET <$> vectorOf 3 arbitraryName
]
shrink = genericShrink
-- silly checks for parser
-- main = do
-- fc <- readFile "/home/rem/TransformeR/test/t.R"
-- let res = parse prog "/home/rem/TransformeR/test/t.R" fc
-- case res of
-- Left e -> putStrLn $ show e
-- Right r -> putStrLn $ show r
-- -- (putStrLn . show) <$> res
--
-- p1 = "transform (y : haha) : yolo { \"a\" }"
--
-- s = "haha"
-- OLD checks for tysys
-- main :: IO()
-- main = do
-- print $ c1
-- print $ c2
-- print $ c3
-- print $ c4
-- quickCheck ((\s -> s == s) :: [Char] -> Bool)
-- quickCheck numberForm
-- quickCheck catForm
--
-- numberForm :: Number -> Number -> Bool
-- numberForm n1 n2
-- | n1 <= n2 = tyOK $ NumTy (n1, n2)
-- | otherwise = not . tyOK $ NumTy (n1, n2)
--
-- catForm :: [Category] -> Bool
-- catForm cs
-- | isSet cs = tyOK $ CatTy cs
-- | otherwise = not . tyOK $ CatTy cs