module OrphanInstances where

import Data.Aeson (Value (..))
import Test.QuickCheck.Instances ()
import Test.QuickCheck.Arbitrary (Arbitrary (..))
import qualified Test.QuickCheck.Gen as Gen

import Store (Modification (..))
import AccessControl

instance Arbitrary AccessMode where
  arbitrary = Gen.elements [minBound..maxBound]

instance Arbitrary AuthPath where
  arbitrary = AuthPath <$> arbitrary <*> arbitrary

instance Arbitrary IcepeakClaim where
  arbitrary = IcepeakClaim <$> arbitrary

instance Arbitrary Modification where
  arbitrary = Gen.oneof
    [ Put <$> arbitrary <*> arbitrary
    , Delete <$> arbitrary
    ]

instance Arbitrary Value where
  arbitrary = Gen.oneof
    [ Object <$> Gen.scale (`div` 2) arbitrary
    , Array  <$> Gen.scale (`div` 2) arbitrary
    , String <$> arbitrary
    , Bool   <$> arbitrary
    , pure Null
    ]