text-ldap-0.1.1.3: test/PrintParse.hs
{-# OPTIONS -fno-warn-orphans #-}
{-# LANGUAGE FlexibleInstances #-}
module PrintParse (ppTests) where
import Distribution.TestSuite (Test)
import Test.QuickCheck
(Gen, Arbitrary (..), choose, oneof, frequency, elements)
import Control.Applicative ((<$>), (<*>))
import Data.ByteString.Char8 (ByteString, pack)
import Text.LDAP.Data
(AttrType (..), AttrValue (..), Attribute, Component (..),
DN, List1)
import Text.LDAP.Printer (LdapPrinter, runLdapPrinter)
import qualified Text.LDAP.Printer as Printer
import Text.LDAP.Parser (LdapParser, runLdapParser)
import qualified Text.LDAP.Parser as Parser
import Data.List.NonEmpty (NonEmpty ((:|)))
import Suite (suite)
list :: Gen a -> Int -> Gen [a]
list g n = sequence [ g | _i <- [1..n] ]
sequence1 :: Monad m => NonEmpty (m a) -> m (NonEmpty a)
sequence1 (ma :| ms) = do
x <- ma
xs <- sequence ms
return $ x :| xs
list1 :: Gen a -> Int -> Gen (List1 a)
list1 g n = sequence1 $ do
_i <- 1 :| [2..n]
return g
digit :: Gen Char
digit = choose ('0', '9')
oidpe :: Gen ByteString
oidpe = (pack <$>) $ choose (1, 10) >>= list digit
alpha :: Gen Char
alpha = oneof [choose ('A', 'Z'), choose ('a', 'z')]
keychar :: Gen Char
keychar = elements $ '-' : ['0'..'9'] ++ ['A'..'Z'] ++ ['a'..'z']
keystr :: Gen ByteString
keystr = (pack <$>) $ (:) <$> alpha <*> (choose (0, 40) >>= list keychar)
bstring' :: Int -> Int -> Gen ByteString
bstring' n m = (pack <$>) $ choose (n, m) >>= list (elements ['\0'..'\255'])
bstring :: Int -> Gen ByteString
bstring = bstring' 0
attrType :: Gen AttrType
attrType =
oneof
[ AttrType <$> keystr
, AttrOid <$> (choose (1, 8) >>= list1 oidpe)
]
attrValue :: Gen AttrValue
attrValue = AttrValue <$> bstring 0x200
component :: Gen Component
component =
frequency
[ (1, S <$> arbitrary)
, (3, L <$> (choose (2, 5) >>= list1 arbitrary))
]
isoProp :: Eq a => LdapPrinter a -> LdapParser a -> a -> Bool
isoProp pr ps a = Right a == (runLdapParser ps . runLdapPrinter pr $ a)
instance Arbitrary AttrType where
arbitrary = attrType
instance Arbitrary AttrValue where
arbitrary = attrValue
instance Arbitrary Component where
arbitrary = component
instance Arbitrary DN where
arbitrary = choose (1, 30) >>= list1 arbitrary
prop_attributeIso :: Attribute -> Bool
prop_attributeIso = isoProp Printer.attribute Parser.attribute
prop_componentIso :: Component -> Bool
prop_componentIso = isoProp Printer.component Parser.component
prop_dnIso :: DN -> Bool
prop_dnIso = isoProp Printer.dn Parser.dn
prop_ldifAttrIso :: (AttrType, AttrValue) -> Bool
prop_ldifAttrIso =
isoProp
(Printer.ldifAttr Printer.ldifEncodeAttrValue)
(Parser.ldifAttr Parser.ldifDecodeAttrValue)
prop_openLdapEntryIso :: (DN, [(AttrType, AttrValue)]) -> Bool
prop_openLdapEntryIso =
isoProp
(Printer.openLdapEntry Printer.ldifEncodeAttrValue)
(Parser.openLdapEntry Parser.ldifDecodeAttrValue)
ppTests :: [Test]
ppTests =
[ suite prop_attributeIso "attribute iso - print parse"
, suite prop_componentIso "component iso - print parse"
, suite prop_dnIso "dn iso - print parse"
, suite prop_ldifAttrIso "ldifAttr iso - print parse"
, suite prop_openLdapEntryIso "openLdapEntry iso - print parse"
]