Skip to content

Commit 7b8d3ce

Browse files
authored
Merge pull request #532 from Lysxia/bug-single-maybe
Fix Generic encoding of records with single Maybe field
2 parents 0afa912 + f06d2b1 commit 7b8d3ce

File tree

1 file changed

+22
-2
lines changed

1 file changed

+22
-2
lines changed

tests/UnitTests.hs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ import Prelude ()
1818
import Prelude.Compat
1919

2020
import Control.Monad (forM, forM_)
21-
import Data.Aeson ((.=), (.:), (.:?), (.:!), FromJSON(..), FromJSONKeyFunction(..), FromJSONKey(..), ToJSON1(..), decode, eitherDecode, encode, genericToEncoding, genericToJSON, object, withObject)
21+
import Data.Aeson ((.=), (.:), (.:?), (.:!), FromJSON(..), FromJSONKeyFunction(..), FromJSONKey(..), ToJSON1(..), decode, eitherDecode, encode, fromJSON, genericParseJSON, genericToEncoding, genericToJSON, object, withObject)
2222
import Data.Aeson.Internal (JSONPathElement(..), formatError)
2323
import Data.Aeson.TH (deriveJSON, deriveToJSON, deriveToJSON1)
2424
import Data.Aeson.Text (encodeToTextBuilder)
25-
import Data.Aeson.Types (Options(..), ToJSON(..), Value, camelTo, camelTo2, defaultOptions, omitNothingFields)
25+
import Data.Aeson.Types (Options(..), Result(Success), ToJSON(..), Value(Null), camelTo, camelTo2, defaultOptions, omitNothingFields, parse)
2626
import Data.Char (toUpper)
2727
import Data.Either.Compat (isLeft, isRight)
2828
import Data.Hashable (hash)
@@ -92,6 +92,7 @@ tests = testGroup "unit" [
9292
, testCase "PR #455" pr455
9393
, testCase "Unescape string (PR #477)" unescapeString
9494
, testCase "Show Options" showOptions
95+
, testGroup "SingleMaybeField" singleMaybeField
9596
]
9697

9798
roundTripCamel :: String -> Assertion
@@ -496,7 +497,26 @@ showOptions =
496497
++ "}")
497498
(show defaultOptions)
498499

500+
newtype SingleMaybeField = SingleMaybeField { smf :: Maybe Int }
501+
deriving (Eq, Show, Generic)
502+
503+
singleMaybeField :: [Test]
504+
singleMaybeField = do
505+
(gName, gToJSON, gToEncoding, gFromJSON) <-
506+
[ ("generic", genericToJSON opts, genericToEncoding opts, parse (genericParseJSON opts))
507+
, ("th", toJSON, toEncoding, fromJSON) ]
508+
return $
509+
testCase gName $ do
510+
assertEqual "toJSON" Null (gToJSON v)
511+
assertEqual "toEncoding" (toEncoding (gToJSON v)) (gToEncoding v)
512+
assertEqual "fromJSON" (Success v) (gFromJSON Null)
513+
where
514+
v = SingleMaybeField Nothing
515+
opts = defaultOptions{omitNothingFields=True,unwrapUnaryRecords=True}
516+
499517
deriveJSON defaultOptions{omitNothingFields=True} ''MyRecord
500518

501519
deriveToJSON defaultOptions ''Foo
502520
deriveToJSON1 defaultOptions ''Foo
521+
522+
deriveJSON defaultOptions{omitNothingFields=True,unwrapUnaryRecords=True} ''SingleMaybeField

0 commit comments

Comments
 (0)