{-# LANGUAGE FlexibleInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Network.JSONRPC.Arbitrary where

import           Data.Aeson
import           Data.Text                 (Text)
import qualified Data.Text                 as T
import           Network.JSONRPC.Data
import           Test.QuickCheck.Arbitrary
import           Test.QuickCheck.Gen

instance Arbitrary Text where
    arbitrary :: Gen Text
arbitrary = String -> Text
T.pack (String -> Text) -> Gen String -> Gen Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen String
forall a. Arbitrary a => Gen a
arbitrary

instance Arbitrary Ver where
    arbitrary :: Gen Ver
arbitrary = [Ver] -> Gen Ver
forall a. [a] -> Gen a
elements [Ver
V1, Ver
V2]

instance Arbitrary Request where
    arbitrary :: Gen Request
arbitrary = [Gen Request] -> Gen Request
forall a. [Gen a] -> Gen a
oneof
        [ Ver -> Text -> Value -> Id -> Request
Request (Ver -> Text -> Value -> Id -> Request)
-> Gen Ver -> Gen (Text -> Value -> Id -> Request)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Ver
forall a. Arbitrary a => Gen a
arbitrary Gen (Text -> Value -> Id -> Request)
-> Gen Text -> Gen (Value -> Id -> Request)
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Text
forall a. Arbitrary a => Gen a
arbitrary Gen (Value -> Id -> Request) -> Gen Value -> Gen (Id -> Request)
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Value
forall a. Arbitrary a => Gen a
arbitrary Gen (Id -> Request) -> Gen Id -> Gen Request
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Id
forall a. Arbitrary a => Gen a
arbitrary
        , Ver -> Text -> Value -> Request
Notif (Ver -> Text -> Value -> Request)
-> Gen Ver -> Gen (Text -> Value -> Request)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Ver
forall a. Arbitrary a => Gen a
arbitrary Gen (Text -> Value -> Request)
-> Gen Text -> Gen (Value -> Request)
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Text
forall a. Arbitrary a => Gen a
arbitrary Gen (Value -> Request) -> Gen Value -> Gen Request
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Value
forall a. Arbitrary a => Gen a
arbitrary
        ]

instance Arbitrary Response where
    arbitrary :: Gen Response
arbitrary = [Gen Response] -> Gen Response
forall a. [Gen a] -> Gen a
oneof
        [ Ver -> Value -> Id -> Response
Response (Ver -> Value -> Id -> Response)
-> Gen Ver -> Gen (Value -> Id -> Response)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Ver
forall a. Arbitrary a => Gen a
arbitrary Gen (Value -> Id -> Response) -> Gen Value -> Gen (Id -> Response)
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Value
res Gen (Id -> Response) -> Gen Id -> Gen Response
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Id
forall a. Arbitrary a => Gen a
arbitrary
        , Ver -> ErrorObj -> Id -> Response
ResponseError (Ver -> ErrorObj -> Id -> Response)
-> Gen Ver -> Gen (ErrorObj -> Id -> Response)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Ver
forall a. Arbitrary a => Gen a
arbitrary Gen (ErrorObj -> Id -> Response)
-> Gen ErrorObj -> Gen (Id -> Response)
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen ErrorObj
forall a. Arbitrary a => Gen a
arbitrary Gen (Id -> Response) -> Gen Id -> Gen Response
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Id
forall a. Arbitrary a => Gen a
arbitrary
        , Ver -> ErrorObj -> Response
OrphanError (Ver -> ErrorObj -> Response)
-> Gen Ver -> Gen (ErrorObj -> Response)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Ver
forall a. Arbitrary a => Gen a
arbitrary Gen (ErrorObj -> Response) -> Gen ErrorObj -> Gen Response
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen ErrorObj
forall a. Arbitrary a => Gen a
arbitrary
        ]
      where
        res :: Gen Value
res = Gen Value
forall a. Arbitrary a => Gen a
arbitrary Gen Value -> (Value -> Bool) -> Gen Value
forall a. Gen a -> (a -> Bool) -> Gen a
`suchThat` (Value -> Value -> Bool
forall a. Eq a => a -> a -> Bool
/= Value
Null)


instance Arbitrary ErrorObj where
    arbitrary :: Gen ErrorObj
arbitrary = [Gen ErrorObj] -> Gen ErrorObj
forall a. [Gen a] -> Gen a
oneof
        [ String -> Int -> Value -> ErrorObj
ErrorObj (String -> Int -> Value -> ErrorObj)
-> Gen String -> Gen (Int -> Value -> ErrorObj)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen String
forall a. Arbitrary a => Gen a
arbitrary Gen (Int -> Value -> ErrorObj)
-> Gen Int -> Gen (Value -> ErrorObj)
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Int
forall a. Arbitrary a => Gen a
arbitrary Gen (Value -> ErrorObj) -> Gen Value -> Gen ErrorObj
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Value
forall a. Arbitrary a => Gen a
arbitrary
        , Value -> ErrorObj
ErrorVal (Value -> ErrorObj) -> Gen Value -> Gen ErrorObj
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Value
forall a. Arbitrary a => Gen a
arbitrary
        ]

instance Arbitrary BatchRequest where
    arbitrary :: Gen BatchRequest
arbitrary = [Gen BatchRequest] -> Gen BatchRequest
forall a. [Gen a] -> Gen a
oneof
        [ [Request] -> BatchRequest
BatchRequest ([Request] -> BatchRequest) -> Gen [Request] -> Gen BatchRequest
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen [Request]
forall a. Arbitrary a => Gen a
arbitrary
        , Request -> BatchRequest
SingleRequest (Request -> BatchRequest) -> Gen Request -> Gen BatchRequest
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Request
forall a. Arbitrary a => Gen a
arbitrary
        ]

instance Arbitrary BatchResponse where
    arbitrary :: Gen BatchResponse
arbitrary = [Gen BatchResponse] -> Gen BatchResponse
forall a. [Gen a] -> Gen a
oneof
        [ [Response] -> BatchResponse
BatchResponse ([Response] -> BatchResponse)
-> Gen [Response] -> Gen BatchResponse
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen [Response]
forall a. Arbitrary a => Gen a
arbitrary
        , Response -> BatchResponse
SingleResponse (Response -> BatchResponse) -> Gen Response -> Gen BatchResponse
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Response
forall a. Arbitrary a => Gen a
arbitrary
        ]

instance Arbitrary Message where
    arbitrary :: Gen Message
arbitrary = [Gen Message] -> Gen Message
forall a. [Gen a] -> Gen a
oneof
        [ Request -> Message
MsgRequest  (Request -> Message) -> Gen Request -> Gen Message
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Request
forall a. Arbitrary a => Gen a
arbitrary
        , Response -> Message
MsgResponse (Response -> Message) -> Gen Response -> Gen Message
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Response
forall a. Arbitrary a => Gen a
arbitrary
        , [Message] -> Message
MsgBatch    ([Message] -> Message) -> Gen [Message] -> Gen Message
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen [Message]
batch
        ]
      where
        batch :: Gen [Message]
batch = Gen Message -> Gen [Message]
forall a. Gen a -> Gen [a]
listOf (Gen Message -> Gen [Message]) -> Gen Message -> Gen [Message]
forall a b. (a -> b) -> a -> b
$ [Gen Message] -> Gen Message
forall a. [Gen a] -> Gen a
oneof [ Request -> Message
MsgRequest  (Request -> Message) -> Gen Request -> Gen Message
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Request
forall a. Arbitrary a => Gen a
arbitrary
                               , Response -> Message
MsgResponse (Response -> Message) -> Gen Response -> Gen Message
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Response
forall a. Arbitrary a => Gen a
arbitrary
                               ]

instance Arbitrary Id where
    arbitrary :: Gen Id
arbitrary = Int -> Id
IdInt (Int -> Id) -> Gen Int -> Gen Id
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Int
forall a. (Bounded a, Random a) => Gen a
arbitraryBoundedRandom