{-|
Module      : GoPro.Plus.Arbitrary
Description : Arbitrary instances.
Copyright   : (c) Dustin Sallings, 2020
License     : BSD3
Maintainer  : dustin@spy.net
Stability   : experimental

Arbitrary instances for GoPro.Plus
-}

{-# OPTIONS_GHC -Wno-orphans #-}
module GoPro.Plus.Arbitrary where

import           Data.Text                      (Text)
import qualified Data.Text                      as T
import           Generic.Random                 (genericArbitrary, uniform)
import           Test.QuickCheck                (Arbitrary (..), Gen, NonNegative (..), arbitraryBoundedEnum, choose,
                                                 elements, listOf, oneof, vector, vectorOf)
import           Test.QuickCheck.Instances.Time ()

import           GoPro.Plus.Auth
import           GoPro.Plus.Media

instance Arbitrary FileInfo where arbitrary :: Gen FileInfo
arbitrary = forall a. GArbitrary UnsizedOpts a => Weights a -> Gen a
genericArbitrary forall a. UniformWeight_ (Rep a) => Weights a
uniform

instance Arbitrary FileStuff where
  arbitrary :: Gen FileStuff
arbitrary = do
    [File]
_files <- forall a. Arbitrary a => Int -> Gen [a]
vector forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< forall a. Random a => (a, a) -> Gen a
choose (Int
0,Int
3)
    [Variation]
_variations <- forall a. Arbitrary a => Int -> Gen [a]
vector forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< forall a. Random a => (a, a) -> Gen a
choose (Int
0,Int
3)
    [Sprite]
_sprites <- forall a. Arbitrary a => Int -> Gen [a]
vector forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< forall a. Random a => (a, a) -> Gen a
choose (Int
0,Int
3)
    [SidecarFile]
_sidecar_files <- forall a. Arbitrary a => Int -> Gen [a]
vector forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< forall a. Random a => (a, a) -> Gen a
choose (Int
0,Int
3)
    forall (f :: * -> *) a. Applicative f => a -> f a
pure FileStuff{[File]
[Variation]
[Sprite]
[SidecarFile]
_sidecar_files :: [SidecarFile]
_sprites :: [Sprite]
_variations :: [Variation]
_files :: [File]
_sidecar_files :: [SidecarFile]
_sprites :: [Sprite]
_variations :: [Variation]
_files :: [File]
..}

instance Arbitrary Variation where arbitrary :: Gen Variation
arbitrary = forall a. GArbitrary UnsizedOpts a => Weights a -> Gen a
genericArbitrary forall a. UniformWeight_ (Rep a) => Weights a
uniform

instance Arbitrary SpriteFrame where arbitrary :: Gen SpriteFrame
arbitrary = forall a. GArbitrary UnsizedOpts a => Weights a -> Gen a
genericArbitrary forall a. UniformWeight_ (Rep a) => Weights a
uniform

instance Arbitrary SidecarFile where arbitrary :: Gen SidecarFile
arbitrary = forall a. GArbitrary UnsizedOpts a => Weights a -> Gen a
genericArbitrary forall a. UniformWeight_ (Rep a) => Weights a
uniform

instance Arbitrary Sprite where arbitrary :: Gen Sprite
arbitrary = forall a. GArbitrary UnsizedOpts a => Weights a -> Gen a
genericArbitrary forall a. UniformWeight_ (Rep a) => Weights a
uniform

instance Arbitrary File where arbitrary :: Gen File
arbitrary = forall a. GArbitrary UnsizedOpts a => Weights a -> Gen a
genericArbitrary forall a. UniformWeight_ (Rep a) => Weights a
uniform

instance Arbitrary AuthInfo where arbitrary :: Gen AuthInfo
arbitrary = Text -> Int -> Text -> Text -> AuthInfo
AuthInfo forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Text
aText forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (forall a. NonNegative a -> a
getNonNegative 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
aText forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen Text
aText

aString :: Gen String
aString :: Gen [Char]
aString = forall a. Gen a -> Gen [a]
listOf (forall a. [a] -> Gen a
elements ([Char
'a'..Char
'z'] forall a. Semigroup a => a -> a -> a
<> [Char
'A'..Char
'Z'] forall a. Semigroup a => a -> a -> a
<> [Char
'0'..Char
'9'] forall a. Semigroup a => a -> a -> a
<> [Char]
"?<>/.\\!@#$%^&*()_-'\";:{}[]"))

aText :: Gen Text
aText :: Gen Text
aText = [Char] -> Text
T.pack forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen [Char]
aString

gMaybe :: Gen a -> Gen (Maybe a)
gMaybe :: forall a. Gen a -> Gen (Maybe a)
gMaybe Gen a
a = forall a. [Gen a] -> Gen a
oneof [forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a. Maybe a
Nothing, forall a. a -> Maybe a
Just forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen a
a]

aCamera :: Gen String
aCamera :: Gen [Char]
aCamera = forall a. [a] -> Gen a
elements [
  [Char]
"GoPro Max",
  [Char]
"HERO11 Black",
  [Char]
"HERO3+Silver Edition",
  [Char]
"HERO4 Black",
  [Char]
"HERO5 Black",
  [Char]
"HERO5 Session",
  [Char]
"HERO8 Black",
  [Char]
"HERO9 Black"]

genID :: Gen MediumID
genID :: Gen Text
genID = [Char] -> Text
T.pack forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Int -> Gen a -> Gen [a]
vectorOf Int
13 (forall a. [a] -> Gen a
elements ([Char
'a'..Char
'z'] forall a. Semigroup a => a -> a -> a
<> [Char
'A'..Char
'Z'] forall a. Semigroup a => a -> a -> a
<> [Char
'0'..Char
'9']))

instance Arbitrary Medium where
  arbitrary :: Gen Medium
arbitrary = Text
-> Maybe [Char]
-> UTCTime
-> UTCTime
-> Maybe Int
-> Int
-> ReadyToViewType
-> Maybe [Char]
-> MediumType
-> [Char]
-> Maybe Int
-> Maybe Int
-> Maybe [Char]
-> Medium
Medium
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Text
genID
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall a. Gen a -> Gen (Maybe a)
gMaybe Gen [Char]
aCamera
    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. Arbitrary a => Gen a
arbitrary
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. NonNegative a -> a
getNonNegative 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
<*> (forall a. NonNegative a -> a
getNonNegative 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
<*> 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)
gMaybe Gen [Char]
aString
    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
<*> Gen [Char]
aString
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. NonNegative a -> a
getNonNegative 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
<*> (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. NonNegative a -> a
getNonNegative 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
<*> forall a. Gen a -> Gen (Maybe a)
gMaybe Gen [Char]
aString

instance Arbitrary Moment where arbitrary :: Gen Moment
arbitrary = Text -> Maybe Int -> Moment
Moment forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Text
aText forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall a. Arbitrary a => Gen a
arbitrary

instance Arbitrary ReadyToViewType where arbitrary :: Gen ReadyToViewType
arbitrary = forall a. (Bounded a, Enum a) => Gen a
arbitraryBoundedEnum

instance Arbitrary MediumType where arbitrary :: Gen MediumType
arbitrary = forall a. (Bounded a, Enum a) => Gen a
arbitraryBoundedEnum

instance Arbitrary PageInfo where arbitrary :: Gen PageInfo
arbitrary = forall a. GArbitrary UnsizedOpts a => Weights a -> Gen a
genericArbitrary forall a. UniformWeight_ (Rep a) => Weights a
uniform

instance Arbitrary Listing where arbitrary :: Gen Listing
arbitrary = forall a. GArbitrary UnsizedOpts a => Weights a -> Gen a
genericArbitrary forall a. UniformWeight_ (Rep a) => Weights a
uniform