packages feed

hnix-store-remote-0.8.0.0: tests/Data/SerializerSpec.hs

module Data.SerializerSpec (spec) where

import Control.Monad.Trans.Identity
import Data.Some
import Data.Serializer
import Data.Serializer.Example

import Test.Hspec (Spec, describe, it, shouldBe)
import Test.Hspec.QuickCheck (prop)

spec :: Spec
spec = describe "Serializer" $ do
  prop "Roundtrips GADT protocol" $ \someCmd ->
    (runG cmdS $ runP cmdS someCmd)
    `shouldBe`
    (pure someCmd ::
      Either (GetSerializerError MyGetError)
        (Some Cmd))

  it "Handles getS error" $
    runG cmdSGetError (runPutS (cmdS @IdentityT) (Some (Cmd_Bool True)))
    `shouldBe`
    Left (SerializerError_Get MyGetError_Example)

  it "Handles getS fail" $
    runG cmdSGetFail (runPutS (cmdS @IdentityT) (Some (Cmd_Bool True)))
    `shouldBe`
    Left (SerializerError_GetFail @MyGetError "Failed reading: no parse\nEmpty call stack\n")

  prop "Roundtrips elaborate example" $ \someCmd readerBool ->
    (runGRest (cmdSRest readerBool) readerBool 0
     $ runPRest (cmdSRest readerBool) someCmd)
    `shouldBe`
    (pure someCmd ::
      Either (GetSerializerError MyGetError)
        (Some Cmd))