module Text.XML.Selector.Test (prop_parseJQ) where
import Text.XML.Selector (showJQ)
import Text.XML.Selector.Types
import Text.XML.Selector.Parser
import Test.QuickCheck
import Control.Monad
import Data.Maybe
prop_parseJQ :: [JQSelector] -> Bool
prop_parseJQ ss = (parseJQ . showJQ) ss == ss
instance Arbitrary JQSelector where
arbitrary = do
rel <- arbitrary
nm <- arbCssId
a <- choose (0,1)
let name = [Nothing, Just nm] !! a
ids <- arbCssId
c <- choose (0,1)
let id = [Nothing, Just ids] !! c
kl <- arbCssId
b <- choose (0,10)
klass <- replicateM b arbCssId
attr <- case (name, id, klass) of
(Nothing, Nothing, []) -> do
n <- choose (1,10)
replicateM n (arbitrary :: Gen TagAttr)
_ -> arbitrary
return (JQSelector rel name id klass attr)
instance Arbitrary TagAttr where
arbitrary = do
name <- arbCssId
rel <- arbitrary
s <- arbCssId
let v = Just s
let val = if rel == Exists then Nothing else v
return (TagAttr name val rel)
instance Arbitrary RelPrev where
arbitrary = elements (enumFrom (toEnum 0))
instance Arbitrary AttrRel where
arbitrary = elements (enumFrom (toEnum 0))
arbCssId :: Gen String
arbCssId = do
n <- choose (1,10)
replicateM n (elements "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_")