content: module Test.Toml.Codec.SmallType
      ( smallTypeSpec
  
        -- * Internals
      , SmallType
      , smallTypeCodec
      , genSmallType
      ) where
  
  import Data.Monoid (Any (..))
  import Data.Text (Text)
  import Data.Time (Day)
  import GHC.Generics (Generic)
  import Hedgehog (Gen)
  import Test.Hspec (Spec, describe)
  
  import Test.Toml.Codec.Combinator.Common (codecRoundtrip, exactCodecRoundtrip)
  import Toml.Codec (ByteStringAsBytes (..), TomlCodec, (.=))
  
  import qualified Hedgehog.Gen as Gen
  import qualified Test.Toml.Gen as Gen
  import qualified Toml.Codec as Toml
  
  
  smallTypeSpec :: Spec
  smallTypeSpec = describe "SmallType: tests for custom data type" $ do
      codecRoundtrip "SmallType" (Toml.table smallTypeCodec) genSmallType
      exactCodecRoundtrip "SmallType" (Toml.table smallTypeCodec) genSmallType
  
  data SmallType = SmallType
      { smallTypeInt       :: !Int
      , smallTypeText      :: !Text
      , smallTypeAny       :: !Any
      , smallTypeDay       :: !Day
      , smallTypeMaybeWord :: !(Maybe Word)
      , smallTypeListInt   :: ![Int]
      , smallTypeBS        :: !ByteStringAsBytes
      } deriving stock (Eq, Show, Generic)
  
  smallTypeCodec :: TomlCodec SmallType
  smallTypeCodec = SmallType
      <$> Toml.int "int" .= smallTypeInt
      <*> Toml.text "text" .= smallTypeText
      <*> Toml.any "any" .= smallTypeAny
      <*> Toml.day "day" .= smallTypeDay
      <*> Toml.dioptional (Toml.word "maybe.word") .= smallTypeMaybeWord
      <*> Toml.arrayOf Toml._Int "list.int" .= smallTypeListInt
      <*> Toml.diwrap (Toml.byteStringArray "bs") .= smallTypeBS
  
  genSmallType :: Gen SmallType
  genSmallType = do
      smallTypeInt       <- Gen.genInt
      smallTypeText      <- Gen.genText
      smallTypeAny       <- Any <$> Gen.genBool
      smallTypeDay       <- Gen.genDay
      smallTypeMaybeWord <- Gen.maybe Gen.genWord
      smallTypeListInt   <- Gen.genSmallList Gen.genInt
      smallTypeBS        <- ByteStringAsBytes <$> Gen.genByteString
      pure SmallType{..}
  