{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
import Control.Monad
import Data.Aeson
import Data.Aeson.TH
import Data.MessagePack
import Data.MessagePack.Aeson
import Test.Tasty
import Test.Tasty.HUnit
data T
= A Int String
| B Double
deriving (Show, Eq)
deriveJSON defaultOptions ''T
data U
= C { c1 :: Int, c2 :: String }
| D { z1 :: Double }
deriving (Show, Eq)
deriveJSON defaultOptions ''U
data V
= E String | F
deriving (Show, Eq)
deriveJSON defaultOptions ''V
data W a
= G a String
| H { hHoge :: Int, h_age :: a }
deriving (Show, Eq)
deriveJSON defaultOptions ''W
test :: (MessagePack a, Show a, Eq a) => a -> IO ()
test v = do
let bs = pack v
print bs
print (unpack bs == Just v)
let oa = toObject v
print oa
print (fromObject oa == Just v)
roundTrip :: (Show a, Eq a, ToJSON a, FromJSON a) => a -> IO ()
roundTrip v = do
let mp = pack (AsMessagePack v)
v' = unpack mp
v' @?= Just (AsMessagePack v)
main :: IO ()
main =
defaultMain $
testGroup "test case"
[ testCase "unnamed 1" $
roundTrip $ A 123 "hoge"
, testCase "unnamed 2" $
roundTrip $ B 3.14
, testCase "named 1" $
roundTrip $ C 123 "hoge"
, testCase "named 2" $
roundTrip $ D 3.14
, testCase "unit 1" $
roundTrip $ E "hello"
, testCase "unit 2" $
roundTrip F
, testCase "parameterized 1" $
roundTrip $ G (E "hello") "world"
, testCase "parameterized 2" $
roundTrip $ H 123 F
]