module Network.Mattermost.QuickCheck where

import qualified Data.Sequence as Seq
import qualified Data.Text as T
import           Data.Time.Calendar (Day(..))
import           Data.Time.Clock (UTCTime(..), secondsToDiffTime)
import           Network.Mattermost.Types
import           Test.QuickCheck


genUserText :: Gen UserText
genUserText :: Gen UserText
genUserText = Text -> UserText
UserText forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Text
genText

genText :: Gen T.Text
genText :: Gen Text
genText = forall a. (Int -> Gen a) -> Gen a
sized forall a b. (a -> b) -> a -> b
$ \Int
s ->
          forall a. [Gen a] -> Gen a
oneof [ forall (m :: * -> *) a. Monad m => a -> m a
return Text
T.empty
                 , forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Char -> Text
T.singleton Char
'a'
                 , forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Char -> Text
T.singleton Char
'1'
                 , forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ String -> Text
T.pack String
"b2"
                 , forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Char -> Text
T.singleton Char
' '
                 , forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Char -> Text
T.singleton Char
'\n'
                 , forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Char -> Text
T.singleton Char
'\r'
                 , forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Char -> Text
T.singleton Char
'\t'
                 , forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ String -> Text
T.pack String
" \n\r\t"
                 , String -> Text
T.pack forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Int -> Gen a -> Gen [a]
vectorOf Int
s forall a. Arbitrary a => Gen a
arbitrary
                 ]

genMaybe :: Gen a -> Gen (Maybe a)
genMaybe :: forall a. Gen a -> Gen (Maybe a)
genMaybe Gen a
g = forall a. [(Int, Gen a)] -> Gen a
frequency [ (Int
1, forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing)
                       , (Int
11, forall a. a -> Maybe a
Just forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen a
g)
                       ]

genSeq :: Gen a -> Gen (Seq.Seq a)
genSeq :: forall a. Gen a -> Gen (Seq a)
genSeq Gen a
g = forall a. (Int -> Gen a) -> Gen a
sized forall a b. (a -> b) -> a -> b
$ \Int
s ->
           forall a. [(Int, Gen a)] -> Gen a
frequency [ (Int
1, forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Seq a
Seq.empty)
                     , (Int
9, forall a. [a] -> Seq a
Seq.fromList forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Int -> Gen a -> Gen [a]
vectorOf Int
s Gen a
g)
                     ]

genTime :: Gen ServerTime
genTime :: Gen ServerTime
genTime = UTCTime -> ServerTime
ServerTime forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
          (Day -> DiffTime -> UTCTime
UTCTime
           forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Integer -> Day
ModifiedJulianDay forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Integer
2000 forall a. Num a => a -> a -> a
+) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Arbitrary a => Gen a
arbitrary)
           forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Integer -> DiffTime
secondsToDiffTime forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Random a => (a, a) -> Gen a
choose (Integer
0, Integer
86400)))

genPostId :: Gen PostId
genPostId :: Gen PostId
genPostId = Id -> PostId
PI forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Id
Id forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Text
genText

genChannelId :: Gen ChannelId
genChannelId :: Gen ChannelId
genChannelId = Id -> ChannelId
CI forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Id
Id forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Text
genText

genFileId :: Gen FileId
genFileId :: Gen FileId
genFileId = Id -> FileId
FI forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Id
Id forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Text
genText

genUserId :: Gen UserId
genUserId :: Gen UserId
genUserId = Id -> UserId
UI forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Id
Id forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Text
genText

genType :: Gen Type
genType :: Gen Type
genType = forall a. [Gen a] -> Gen a
oneof [ forall (m :: * -> *) a. Monad m => a -> m a
return Type
Ordinary
                , forall (m :: * -> *) a. Monad m => a -> m a
return Type
Direct
                , forall (m :: * -> *) a. Monad m => a -> m a
return Type
Private
                , forall (m :: * -> *) a. Monad m => a -> m a
return Type
Group
                , Text -> Type
Unknown forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Text
genText
                ]

genPostProps :: Gen PostProps
genPostProps :: Gen PostProps
genPostProps = Maybe Text
-> Maybe Text
-> Maybe Bool
-> Maybe (Seq PostPropAttachment)
-> Maybe Text
-> Maybe Text
-> PostProps
PostProps
               forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Gen a -> Gen (Maybe a)
genMaybe Gen Text
genText
               forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall a. Gen a -> Gen (Maybe a)
genMaybe Gen Text
genText
               forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall a. Gen a -> Gen (Maybe a)
genMaybe forall a. Arbitrary a => Gen a
arbitrary
               forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen (Maybe (Seq PostPropAttachment))
attached
               forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall a. Gen a -> Gen (Maybe a)
genMaybe Gen Text
genText
               forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall a. Gen a -> Gen (Maybe a)
genMaybe Gen Text
genText


attached :: Gen (Maybe (Seq.Seq PostPropAttachment))
attached :: Gen (Maybe (Seq PostPropAttachment))
attached = forall a. [Gen a] -> Gen a
oneof [ forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
                 , forall a. a -> Maybe a
Just forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (forall a. Gen a -> Gen (Seq a)
genSeq Gen PostPropAttachment
genPostPropAttachment)
                 ]

genPostPropAttachmentField :: Gen PostPropAttachmentField
genPostPropAttachmentField :: Gen PostPropAttachmentField
genPostPropAttachmentField =
  Text -> Text -> Bool -> PostPropAttachmentField
PostPropAttachmentField forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Text
genText
                          forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Text
genText
                          forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall a. [Gen a] -> Gen a
oneof [ forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True, forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False ]

genPostPropAttachment :: Gen PostPropAttachment
genPostPropAttachment :: Gen PostPropAttachment
genPostPropAttachment = Int
-> Text
-> Text
-> Text
-> Text
-> Text
-> Text
-> Text
-> Text
-> Text
-> Seq PostPropAttachmentField
-> Text
-> Text
-> Text
-> Text
-> PostPropAttachment
PostPropAttachment
                        forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Arbitrary a => Gen a
arbitrary
                        forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Text
genText
                        forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Text
genText
                        forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Text
genText
                        forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Text
genText
                        forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Text
genText
                        forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Text
genText
                        forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Text
genText
                        forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Text
genText
                        forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Text
genText
                        forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall a. Gen a -> Gen (Seq a)
genSeq Gen PostPropAttachmentField
genPostPropAttachmentField
                        forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Text
genText
                        forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Text
genText
                        forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Text
genText
                        forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Text
genText

genPostType :: Gen PostType
genPostType :: Gen PostType
genPostType = forall a. [Gen a] -> Gen a
oneof [ forall (m :: * -> *) a. Monad m => a -> m a
return PostType
PostTypeJoinChannel
                    , forall (m :: * -> *) a. Monad m => a -> m a
return PostType
PostTypeLeaveChannel
                    , forall (m :: * -> *) a. Monad m => a -> m a
return PostType
PostTypeAddToChannel
                    , forall (m :: * -> *) a. Monad m => a -> m a
return PostType
PostTypeRemoveFromChannel
                    , forall (m :: * -> *) a. Monad m => a -> m a
return PostType
PostTypeHeaderChange
                    , forall (m :: * -> *) a. Monad m => a -> m a
return PostType
PostTypeDisplayNameChange
                    , forall (m :: * -> *) a. Monad m => a -> m a
return PostType
PostTypePurposeChange
                    , forall (m :: * -> *) a. Monad m => a -> m a
return PostType
PostTypeChannelDeleted
                    , forall (m :: * -> *) a. Monad m => a -> m a
return PostType
PostTypeEphemeral
                    , Text -> PostType
PostTypeUnknown forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Text
genText
                    ]

genMetadata :: Gen PostMetadata
genMetadata :: Gen PostMetadata
genMetadata =
    forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Seq FileInfo -> Seq Reaction -> PostMetadata
PostMetadata forall a. Monoid a => a
mempty forall a. Monoid a => a
mempty

genPost :: Gen Post
genPost :: Gen Post
genPost = Maybe PostId
-> Maybe PostId
-> PostProps
-> Maybe PostId
-> Seq FileId
-> PostId
-> PostType
-> UserText
-> Maybe ServerTime
-> Text
-> ServerTime
-> ServerTime
-> Maybe UserId
-> ServerTime
-> ChannelId
-> Bool
-> Maybe Bool
-> PostMetadata
-> Post
Post
          forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Gen a -> Gen (Maybe a)
genMaybe Gen PostId
genPostId
          forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall a. Gen a -> Gen (Maybe a)
genMaybe Gen PostId
genPostId
          forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen PostProps
genPostProps
          forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall a. Gen a -> Gen (Maybe a)
genMaybe Gen PostId
genPostId
          forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall a. Gen a -> Gen (Seq a)
genSeq Gen FileId
genFileId
          forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen PostId
genPostId
          forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen PostType
genPostType
          forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen UserText
genUserText
          forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall a. Gen a -> Gen (Maybe a)
genMaybe Gen ServerTime
genTime
          forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Text
genText
          forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen ServerTime
genTime
          forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen ServerTime
genTime
          forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall a. Gen a -> Gen (Maybe a)
genMaybe Gen UserId
genUserId
          forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen ServerTime
genTime
          forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen ChannelId
genChannelId
          forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall a. Arbitrary a => Gen a
arbitrary
          forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall a. Gen a -> Gen (Maybe a)
genMaybe forall a. Arbitrary a => Gen a
arbitrary
          forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen PostMetadata
genMetadata