siren-json-0.1.0.1: test/Data/SirenJSON/Arbitrary.hs
{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# LANGUAGE RecordWildCards #-}
{-|
Module : Data.SirenJSON.Arbitrary
Description : Arbitrary Instances for Data.SirenJSON
Copyright : (c) Alex Brandt, 2017
License : MIT
Arbitrary instances for "Data.SirenJSON".
-}
module Data.SirenJSON.Arbitrary where
import Control.Applicative ((<$>), (<*>))
import Data.Maybe (mapMaybe)
import Test.QuickCheck (Arbitrary (arbitrary, shrink), elements, oneof, scale)
import Test.QuickCheck.Instances ()
import Data.SirenJSON
import External.Network.HTTP.Media.MediaType.Arbitrary ()
import External.Network.HTTP.Types.Method.Arbitrary ()
import External.Network.URI.Arbitrary ()
instance Arbitrary Entity where
arbitrary = Entity <$> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
shrink Entity{..} = mapMaybe e eEntities ++
[ Entity eClass' eProperties' eEntities' eLinks' eActions' eTitle' | (eClass', eProperties', eEntities', eLinks', eActions', eTitle') <- shrink (eClass, eProperties, eEntities, eLinks, eActions, eTitle) ]
where e EmbeddedRepresentation{..} = Just sEntity
e _ = Nothing
instance Arbitrary SubEntity where
arbitrary = oneof [ EmbeddedLink <$> arbitrary
, EmbeddedRepresentation <$> scale (`div` 2) arbitrary
<*> arbitrary
]
shrink (EmbeddedLink l) = [ EmbeddedLink l' | l' <- shrink l ]
shrink EmbeddedRepresentation{..} = map EmbeddedLink (eLinks sEntity) ++
filter isEntity (eEntities sEntity) ++
[ EmbeddedRepresentation sEntity' sRel' | (sEntity', sRel') <- shrink (sEntity, sRel) ]
where isEntity (EmbeddedRepresentation _ _) = True
isEntity _ = False
instance Arbitrary Link where
arbitrary = Link <$> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
shrink Link{..} = [ Link lClass' lRel' lHref' lType' lTitle' | (lClass', lRel', lHref', lType', lTitle') <- shrink (lClass, lRel, lHref, lType, lTitle) ]
instance Arbitrary Action where
arbitrary = Action <$> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
shrink Action{..} = [ Action aName' aClass' aMethod' aHref' aTitle' aType' aFields' | (aName', aClass', aMethod', aHref', aTitle', aType', aFields') <- shrink (aName, aClass, aMethod, aHref, aTitle, aType, aFields) ]
instance Arbitrary Field where
arbitrary = Field <$> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
shrink Field{..} = [ Field fName' fClass' fType' fValue' fTitle' | (fName', fClass', fType', fValue', fTitle') <- shrink (fName, fClass, fType, fValue, fTitle) ]
instance Arbitrary InputType where
arbitrary = elements [ Hidden
, Text
, Search
, Tel
, URL
, Email
, Password
, DateTime
, Date
, Month
, Week
, Time
, DateTimeLocal
, Number
, Range
, Color
, CheckBox
, Radio
, File
]