@@ -18,11 +18,11 @@ import Prelude ()
18import Prelude.Compat
18import Prelude.Compat
20import Control.Monad (forM, forM_)
20import 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)
22import Data.Aeson.Internal (JSONPathElement(..), formatError)
22import Data.Aeson.Internal (JSONPathElement(..), formatError)
23import Data.Aeson.TH (deriveJSON, deriveToJSON, deriveToJSON1)
23import Data.Aeson.TH (deriveJSON, deriveToJSON, deriveToJSON1)
24import Data.Aeson.Text (encodeToTextBuilder)
24import 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)
26import Data.Char (toUpper)
26import Data.Char (toUpper)
27import Data.Either.Compat (isLeft, isRight)
27import Data.Either.Compat (isLeft, isRight)
28import Data.Hashable (hash)
28import Data.Hashable (hash)
@@ -92,6 +92,7 @@ tests = testGroup "unit" [
92 , testCase "PR #455" pr455
92 , testCase "PR #455" pr455
93 , testCase "Unescape string (PR #477)" unescapeString
93 , testCase "Unescape string (PR #477)" unescapeString
94 , testCase "Show Options" showOptions
94 , testCase "Show Options" showOptions
95+ , testGroup "SingleMaybeField" singleMaybeField
97roundTripCamel :: String -> Assertion
98roundTripCamel :: String -> Assertion
@@ -496,7 +497,26 @@ showOptions =
497 (show defaultOptions)
498 (show defaultOptions)
500+newtype SingleMaybeField = SingleMaybeField { smf :: Maybe Int }
501+ deriving (Eq, Show, Generic)
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) ]
510+ assertEqual "toJSON" Null (gToJSON v)
511+ assertEqual "toEncoding" (toEncoding (gToJSON v)) (gToEncoding v)
512+ assertEqual "fromJSON" (Success v) (gFromJSON Null)
514+ v = SingleMaybeField Nothing
515+ opts = defaultOptions{omitNothingFields=True,unwrapUnaryRecords=True}
499deriveJSON defaultOptions{omitNothingFields=True} ''MyRecord
517deriveJSON defaultOptions{omitNothingFields=True} ''MyRecord
501deriveToJSON defaultOptions ''Foo
519deriveToJSON defaultOptions ''Foo
502deriveToJSON1 defaultOptions ''Foo
520deriveToJSON1 defaultOptions ''Foo
522+deriveJSON defaultOptions{omitNothingFields=True,unwrapUnaryRecords=True} ''SingleMaybeField