packages feed

composite-aeson-0.5.5.0: test/TupleSpec.hs

module TupleSpec where

import Composite.Aeson.Base (JsonFormat, fromJsonWithFormat, toJsonWithFormat)
import Composite.Aeson.Formats.Provided (tuple3JsonFormat, namedTuple3JsonFormat, integralJsonFormat, stringJsonFormat, charJsonFormat)
import Data.Aeson.BetterErrors (parseValue)
import Data.Aeson.QQ (aesonQQ)
import Data.Void (Void)
import Test.Hspec (Spec, describe, it, shouldBe)
import Test.QuickCheck (property)

tupleSuite :: Spec
tupleSuite =
  describe "Tuple formats" $ do
    it "works for 3-tuples" $ do
      let fmt :: JsonFormat Void (Int, String, Char)
          fmt = tuple3JsonFormat integralJsonFormat stringJsonFormat charJsonFormat
      property $ \ t ->
        parseValue (fromJsonWithFormat fmt) (toJsonWithFormat fmt t) `shouldBe` Right t

namedTupleSuite :: Spec
namedTupleSuite =
  describe "Named tuple formats" $ do
    let fmt :: JsonFormat Void (String, String, String)
        fmt = namedTuple3JsonFormat "foo" stringJsonFormat "bar" stringJsonFormat "baz" stringJsonFormat

    it "round trips" $
      property $ \ t ->
        parseValue (fromJsonWithFormat fmt) (toJsonWithFormat fmt t) `shouldBe` Right t

    it "property names the fields" $
      toJsonWithFormat fmt ("a", "b", "c") `shouldBe` [aesonQQ| {foo: "a", bar: "b", baz: "c"} |]