packages feed

amazonka-core-0.2.3: test/Test/AWS/Data/Numeric.hs

{-# LANGUAGE OverloadedStrings  #-}
{-# LANGUAGE RecordWildCards    #-}

-- Module      : Test.AWS.Data.Numeric
-- Copyright   : (c) 2013-2015 Brendan Hay <brendan.g.hay@gmail.com>
-- License     : This Source Code Form is subject to the terms of
--               the Mozilla Public License, v. 2.0.
--               A copy of the MPL can be found in the LICENSE file or
--               you can obtain it at http://mozilla.org/MPL/2.0/.
-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
-- Stability   : experimental
-- Portability : non-portable (GHC extensions)

module Test.AWS.Data.Numeric (tests) where

import Data.Aeson
import Network.AWS.Prelude
import Test.Tasty
import Test.Tasty.HUnit

tests :: TestTree
tests = testGroup "numeric"
    [ testGroup "JSON serialization"
        [ testEncode encodeItems
        , testDecode decodeItems
        ]
    ]

-- With a basic record, checks several serialization edge cases
-- between String, Int, and Nat values for numbers.
data Item = Item
     { itemNat :: Maybe Nat
     , itemInt :: Maybe Int
     , itemStr :: Maybe String
     } deriving (Eq, Show)

instance ToJSON Item where
    toJSON Item{..} = object
        [ "item_nat" .= itemNat
        , "item_int" .= itemInt
        , "item_str" .= itemStr
        ]

instance FromJSON Item where
    parseJSON = withObject "Item" $ \o -> Item
        <$> o .:? "item_nat"
        <*> o .:? "item_int"
        <*> o .:? "item_str"

encodeItems :: [(Item, LazyByteString)]
encodeItems =
    [ ( Item (Just $ Nat 1) (Just 1) Nothing
      , "{\"item_str\":null,\"item_nat\":1,\"item_int\":1}"
      )

    , ( Item (Just $ Nat 1) (Just 1) (Just "1")
      , "{\"item_str\":\"1\",\"item_nat\":1,\"item_int\":1}"
      )
    ]

testEncode :: [(Item, LazyByteString)] -> TestTree
testEncode = testCase "Numeric JSON Encoding"
    . mapM_ (\(input, e) -> e @=? encode input)

decodeItems :: [(Maybe Item, LazyByteString)]
decodeItems =
    [ ( Just (Item (Just $ Nat 1) (Just 1) Nothing)
      , "{\"item_nat\":1,\"item_int\":1}"
      )

    , ( Just (Item (Just $ Nat 1) (Just (-1)) (Just "1"))
      , "{\"item_nat\":1,\"item_int\":-1, \"item_str\":\"1\"}"
      )

    , ( Nothing
      , "{\"item_nat\":1,\"item_int\":-1, \"item_str\":1}"
      )

    , ( Just (Item (Just $ Nat 1) (Just (-1)) Nothing)
      , "{\"item_nat\":1,\"item_int\":-1}"
      )

    , ( Just (Item (Just $ Nat 1) (Just (-1)) Nothing)
      , "{\"item_nat\":1.0,\"item_int\":-1}"
      )

    , ( Nothing
      , "{\"item_nat\":-1,\"item_int\":1}"
      )

    , ( Nothing
      , "{\"item_nat\":1.2,\"item_int\":1}"
      )

    , ( Nothing
      , "{\"item_nat\":\"1\",\"item_int\":1}"
      )
    ]

testDecode :: [(Maybe Item, LazyByteString)] -> TestTree
testDecode = testCase "Numeric JSON Decoding" . mapM_ check
  where
    check (e, input) = e @=? (decode input :: Maybe Item)