packages feed

gopro-plus-0.6.6.3: src/GoPro/Plus/Arbitrary.hs

{-|
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 = genericArbitrary uniform

instance Arbitrary FileStuff where
  arbitrary = do
    _files <- vector =<< choose (0,3)
    _variations <- vector =<< choose (0,3)
    _sprites <- vector =<< choose (0,3)
    _sidecar_files <- vector =<< choose (0,3)
    pure FileStuff{..}

instance Arbitrary Variation where arbitrary = genericArbitrary uniform

instance Arbitrary SpriteFrame where arbitrary = genericArbitrary uniform

instance Arbitrary SidecarFile where arbitrary = genericArbitrary uniform

instance Arbitrary Sprite where arbitrary = genericArbitrary uniform

instance Arbitrary File where arbitrary = genericArbitrary uniform

instance Arbitrary AuthInfo where arbitrary = AuthInfo <$> aText <*> (getNonNegative <$> arbitrary) <*> aText <*> aText

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

aText :: Gen Text
aText = T.pack <$> aString

gMaybe :: Gen a -> Gen (Maybe a)
gMaybe a = oneof [pure Nothing, Just <$> a]

aCamera :: Gen String
aCamera = elements [
  "GoPro Max",
  "HERO11 Black",
  "HERO3+Silver Edition",
  "HERO4 Black",
  "HERO5 Black",
  "HERO5 Session",
  "HERO8 Black",
  "HERO9 Black"]

genID :: Gen MediumID
genID = T.pack <$> vectorOf 13 (elements (['a'..'z'] <> ['A'..'Z'] <> ['0'..'9']))

instance Arbitrary Medium where
  arbitrary = Medium
    <$> genID
    <*> gMaybe aCamera
    <*> arbitrary
    <*> arbitrary
    <*> (fmap getNonNegative <$> arbitrary)
    <*> (getNonNegative <$> arbitrary)
    <*> arbitrary
    <*> gMaybe aString
    <*> arbitrary
    <*> aString
    <*> (fmap getNonNegative <$> arbitrary)
    <*> (fmap getNonNegative <$> arbitrary)
    <*> gMaybe aString

instance Arbitrary Moment where arbitrary = Moment <$> aText <*> arbitrary

instance Arbitrary ReadyToViewType where arbitrary = arbitraryBoundedEnum

instance Arbitrary MediumType where arbitrary = arbitraryBoundedEnum

instance Arbitrary PageInfo where arbitrary = genericArbitrary uniform

instance Arbitrary Listing where arbitrary = genericArbitrary uniform