module Language.HaLex.Test_HaLex_Quickcheck where
import Language.HaLex.Dfa
import Language.HaLex.Ndfa
import Language.HaLex.RegExp
import Language.HaLex.RegExp2Fa
import Language.HaLex.RegExpParser
import Language.HaLex.FaOperations
import Language.HaLex.Minimize
import Language.HaLex.Sentences
import Language.HaLex.FaClasses
import Test.QuickCheck
import Data.Char
import Control.Monad
instance Arbitrary (RegExp Char) where
arbitrary = sized genRegExp
genRegExp :: Integral n => n -> Gen (RegExp Char)
genRegExp size
| size>0 = frequency [(13, genLiteral)
,(10, genThen)
,(4 , genPlus)
,(2 , genDigits)
,(1 , return Epsilon)
]
| otherwise = return Epsilon
where
genLiteral = do c <- elements "aeiouAEIOU-_+-*/\\"
return (Literal c)
genDigits = return digRegExp
genThen = do re1 <- genRegExp (size `div` 2)
re2 <- genRegExp (size `div` 2)
return (Then re1 re2)
genPlus = do re <- genRegExp (size `div` 2)
return (OneOrMore re)
digRegExp :: RegExp Char
digRegExp = foldr1 Or (map (\x -> Literal (intToDigit x)) [0..9])
digRegExp' = foldr (\l r -> Or (Literal (intToDigit l))
r) Empty [0..9]
genRegExp' size
| size>0 = oneof [genThen , genPlus , genLiteral , return Epsilon ]
| otherwise = return Epsilon
where
genLiteral = do c <- elements "aeiouAEIOU-_+-*/\\"
return (Literal c)
genThen = do re1 <- genRegExp' (size `div` 2)
re2 <- genRegExp' (size `div` 2)
return (Then re1 re2)
genPlus = do re <- genRegExp' (size `div` 2)
return (OneOrMore re)
exRegExp = sample (arbitrary :: Gen (RegExp Char))