You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

94 lines
4.0 KiB

{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE OverloadedStrings #-}
module Tests.Arbitrary.Xmpp where
import Control.Applicative ((<$>), (<*>))
import Data.Char
import Data.Maybe
import qualified Data.Text as Text
import Network.Xmpp.Internal hiding (elements)
import Test.QuickCheck
import Test.QuickCheck.Instances()
import qualified Text.CharRanges as Ranges
import qualified Text.StringPrep as SP
import qualified Text.StringPrep.Profiles as SP
import Tests.Arbitrary.Common
import Tests.Arbitrary.Xml ()
import Data.Derive.Arbitrary
import Data.DeriveTH
instance Arbitrary NonemptyText where
arbitrary = Nonempty . Text.pack <$> listOf1
(arbitrary `suchThat` (not . isSpace))
shrink (Nonempty txt) = map Nonempty
. filter (not . Text.all isSpace) $ shrink txt
instance Arbitrary Jid where
arbitrary = do
Just jid <- tryJid `suchThat` isJust
return jid
where
tryJid = jidFromTexts <$> maybeGen (genString nodeprepProfile False)
<*> genString (SP.namePrepProfile False) False
<*> maybeGen (genString resourceprepProfile True)
genString profile node = Text.pack . take 1024 <$> listOf1 genChar
where
genChar = arbitrary `suchThat` (not . isProhibited)
prohibited = Ranges.toSet $ concat (SP.prohibited profile)
isProhibited x = Ranges.member x prohibited
|| if node
then False
else x `elem` ['@','/']
shrink (Jid lp dp rp) = [ Jid lp' dp rp | lp' <- shrinkMaybe shrink lp]
++ [ Jid lp dp' rp | dp' <- shrink dp]
++ [ Jid lp dp rp' | rp' <- shrinkMaybe shrink rp]
-- string :: SP.StringPrepProfile -> Gen [Char]
-- string profile = take 1024 <$> listOf1 genChar
-- where
-- genChar = arbitrary `suchThat` (not . isProhibited)
-- prohibited = Ranges.toSet $ concat (SP.prohibited profile)
-- isProhibited x = Ranges.member x prohibited
-- || x `elem` "@/"
instance Arbitrary LangTag where
arbitrary = LangTag <$> genTag <*> listOf genTag
where genTag = fmap Text.pack . listOf1 . elements $ ['a'..'z'] ++ ['A'..'Z']
shrink (LangTag lt lts) = [LangTag lt' lts | lt' <- shrinkText1 lt] ++
[LangTag lt lts' | lts' <- filter (not . Text.null)
<$> shrink lts]
-- Auto-derive trivial instances
concat <$> mapM (derive makeArbitrary) [ ''StanzaErrorType
, ''StanzaErrorCondition
, ''StanzaError
, ''StreamErrorInfo
, ''IQRequestType
, ''IQRequest
, ''IQResult
, ''IQError
, ''MessageType
, ''Message
, ''MessageError
, ''PresenceType
, ''Presence
, ''PresenceError
, ''Stanza
, ''SaslError
, ''SaslFailure
, ''StreamErrorCondition
-- , ''HandshakeFailed
-- , ''XmppTlsError
-- , ''AuthFailure
, ''Version
, ''ConnectionState
, ''TlsBehaviour
]