|
| 1 | +{-# LANGUAGE OverloadedStrings #-} |
| 2 | +{-# LANGUAGE DeriveFunctor #-} |
| 3 | +{-# LANGUAGE DeriveGeneric #-} |
| 4 | +{-# LANGUAGE StandaloneDeriving #-} |
| 5 | +{-# LANGUAGE UndecidableInstances #-} |
| 6 | + |
| 7 | +module Regression.Issue1059 (issue1059) where |
| 8 | + |
| 9 | +import GHC.Generics |
| 10 | +import Data.Aeson |
| 11 | +import Test.Tasty |
| 12 | +import Test.Tasty.HUnit |
| 13 | + |
| 14 | +data Item f a = Item { rec0 :: Int, par1 :: a, rec1 :: f a, comp1 :: f (f a) } deriving (Functor, Generic1) |
| 15 | + |
| 16 | +deriving instance (Eq a, Eq (f a), Eq (f (f a))) => Eq (Item f a) |
| 17 | +deriving instance (Show a, Show (f a), Show (f (f a))) => Show (Item f a) |
| 18 | + |
| 19 | +instance (Functor f, FromJSON1 f) => FromJSON1 (Item f) where |
| 20 | + liftParseJSON = genericLiftParseJSON $ defaultOptions { allowOmittedFields = True } |
| 21 | +instance (Functor f, ToJSON1 f) => ToJSON1 (Item f) where |
| 22 | + liftToJSON = genericLiftToJSON $ defaultOptions { omitNothingFields = True } |
| 23 | +instance (Functor f, FromJSON1 f, FromJSON a) => FromJSON (Item f a) where parseJSON = parseJSON1 |
| 24 | +instance (Functor f, ToJSON1 f, ToJSON a) => ToJSON (Item f a) where toJSON = toJSON1 |
| 25 | + |
| 26 | +data Test a = Test { a :: Item [] (Maybe a), b :: Item Maybe a } deriving (Eq, Show, Generic1) |
| 27 | + |
| 28 | +instance FromJSON1 Test where liftParseJSON = genericLiftParseJSON defaultOptions |
| 29 | +instance ToJSON1 Test where liftToJSON = genericLiftToJSON defaultOptions |
| 30 | +instance FromJSON a => FromJSON (Test a) where parseJSON = parseJSON1 |
| 31 | +instance ToJSON a => ToJSON (Test a) where toJSON = toJSON1 |
| 32 | + |
| 33 | +issue1059 :: TestTree |
| 34 | +issue1059 = testCase "issue1059" $ do |
| 35 | + let value = Test (Item 0 Nothing [] []) (Item 0 1 Nothing Nothing) :: Test Int |
| 36 | + let code = "{\"a\":{\"comp1\":[],\"rec0\":0,\"rec1\":[]},\"b\":{\"par1\":1,\"rec0\":0}}" |
| 37 | + encode value @?= code |
| 38 | + decode code @?= Just value |
0 commit comments