packages feed

speculate-0.3.5: bench/qs1/regexes.hs

{-# LANGUAGE StandaloneDeriving #-}
import Regex
import Test.QuickCheck
import Control.Monad
import Test.QuickSpec

deriving instance Eq a  => Eq  (RE a)
deriving instance Ord a => Ord (RE a)

instance Arbitrary Symbol where
  arbitrary = elements $ map Symbol ['a','b','c']

instance Arbitrary a => Arbitrary (RE a) where
  arbitrary = sized re
    where
    re 0 = oneof 
         [ return Empty
         , return None
         , liftM Lit arbitrary
         ]
    re n = oneof
         [ re 0
         , liftM Star (re (n - 1))
         , liftM2 (:.) re2 re2
         , liftM2 (:+) re2 re2
         ] where re2 = re (n `div` 2)
  shrink Empty    = []
  shrink None     = []
  shrink (Lit _)  = [Empty, None]
  shrink (Star r) = [r] ++ [Star r' | r' <- shrink r]
  shrink (r :+ s) = [r, s] ++ [r' :+ s' | (r',s') <- shrink (r,s)]
  shrink (r :. s) = [r, s] ++ [r' :. s' | (r',s') <- shrink (r,s)]

main = quickSpec
  [ ["r1", "r2", "r3"] `vars` (undefined :: RE Symbol)
  , "Empty" `fun0` (Empty :: RE Symbol)
  , "None"  `fun0` (None  :: RE Symbol)
  , "Star"  `fun1` (Star  :: RE Symbol -> RE Symbol)
  , ":+"    `fun2` ((:+)  :: RE Symbol -> RE Symbol -> RE Symbol)
  , ":."    `fun2` ((:.)  :: RE Symbol -> RE Symbol -> RE Symbol)
--, "=~"    `fun2` (=~)
--, "Lit"   `fun2` (Lit   :: Symbol -> RE Symbol)
  , observer2 (=~)
  , withDepth 3
  , withSize  100
  , withTests 500
  , withQuickCheckSize 20
  ]