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"} |]