on master help sign in
Add tests for sensitivity to ordering of object keys
commit0c8532927d2c81020691c2fbdea2697f2da8444d authorLysxia <lysxia@gmail.com> dateFri 21 Jun 2019, 22:28 (7 years ago) parent1bd485c
1 file changed+46−2
tests/UnitTests.hs+46−2
tests/UnitTests.hs+46−2
@@ -29,7 +29,13 @@ import Data.Aeson.Internal (JSONPathElement(..), formatError)
2929import Data.Aeson.QQ.Simple (aesonQQ)
3030import Data.Aeson.TH (deriveJSON, deriveToJSON, deriveToJSON1)
3131import Data.Aeson.Text (encodeToTextBuilder)
32−import Data.Aeson.Types (Options(..), Result(Success), ToJSON(..), Value(Null, Object), camelTo, camelTo2, defaultOptions, omitNothingFields, parse)
32+import Data.Aeson.Parser
33+ ( json, jsonLast, jsonAccum, jsonNoDup
34+ , json', jsonLast', jsonAccum', jsonNoDup')
35+import Data.Aeson.Types
36+ ( Options(..), Result(Success), ToJSON(..), Value(Array, Bool, Null, Object)
37+ , camelTo, camelTo2, defaultOptions, omitNothingFields, parse)
38+import Data.Attoparsec.ByteString (Parser, parseOnly)
3339import Data.Char (toUpper)
3440import Data.Either.Compat (isLeft, isRight)
3541import Data.Hashable (hash)
@@ -47,16 +53,19 @@ import Numeric.Natural (Natural)
4753import System.Directory (getDirectoryContents)
4854import System.FilePath ((</>), takeExtension, takeFileName)
4955import Test.Tasty (TestTree, testGroup)
50−import Test.Tasty.HUnit (Assertion, assertBool, assertFailure, assertEqual, testCase)
56+import Test.Tasty.HUnit (Assertion, assertBool, assertFailure, assertEqual, testCase, (@?=))
5157import Text.Printf (printf)
5258import UnitTests.NullaryConstructors (nullaryConstructors)
59+import qualified Data.ByteString as S
5360import qualified Data.ByteString.Base16.Lazy as LBase16
5461import qualified Data.ByteString.Lazy.Char8 as L
5562import qualified Data.HashSet as HashSet
63+import qualified Data.HashMap.Lazy as HashMap
5664import qualified Data.Text.Lazy as LT
5765import qualified Data.Text.Lazy.Builder as TLB
5866import qualified Data.Text.Lazy.Encoding as LT
5967import qualified Data.Text.Lazy.Encoding as TLE
68+import qualified Data.Vector as Vector
6069import qualified ErrorMessages
6170import qualified SerializationFormatSpec
6271
@@ -102,6 +111,7 @@ tests = testGroup "unit" [
102111 , testGroup "SingleMaybeField" singleMaybeField
103112 , testCase "withEmbeddedJSON" withEmbeddedJSONTest
104113 , testCase "SingleFieldCon" singleFieldCon
114+ , testGroup "Ordering of object keys" keyOrdering
105115 , testCase "Ratio with denominator 0" ratioDenominator0
106116 , testCase "Big scientific exponent" bigScientificExponent
107117 , testCase "Big integer decoding" bigIntegerDecoding
@@ -557,6 +567,40 @@ singleFieldCon :: Assertion
557567singleFieldCon =
558568 assertEqual "fromJSON" (Right (SingleFieldCon 0)) (eitherDecode "0")
559569
570+testParser :: (Eq a, Show a)
571+ => String -> Parser a -> S.ByteString -> Either String a -> TestTree
572+testParser name json_ s expected =
573+ testCase name (parseOnly json_ s @?= expected)
574+
575+keyOrdering :: [TestTree]
576+keyOrdering =
577+ [ testParser "json" json
578+ "{\"k\":true,\"k\":false}" $
579+ Right (Object (HashMap.fromList [("k", Bool True)]))
580+ , testParser "jsonLast" jsonLast
581+ "{\"k\":true,\"k\":false}" $
582+ Right (Object (HashMap.fromList [("k", Bool False)]))
583+ , testParser "jsonAccum" jsonAccum
584+ "{\"k\":true,\"k\":false}" $
585+ Right (Object (HashMap.fromList [("k", Array (Vector.fromList [Bool True, Bool False]))]))
586+ , testParser "jsonNoDup" jsonNoDup
587+ "{\"k\":true,\"k\":false}" $
588+ Left "Failed reading: found duplicate key: \"k\""
589+
590+ , testParser "json'" json'
591+ "{\"k\":true,\"k\":false}" $
592+ Right (Object (HashMap.fromList [("k", Bool True)]))
593+ , testParser "jsonLast'" jsonLast'
594+ "{\"k\":true,\"k\":false}" $
595+ Right (Object (HashMap.fromList [("k", Bool False)]))
596+ , testParser "jsonAccum'" jsonAccum'
597+ "{\"k\":true,\"k\":false}" $
598+ Right (Object (HashMap.fromList [("k", Array (Vector.fromList [Bool True, Bool False]))]))
599+ , testParser "jsonNoDup'" jsonNoDup'
600+ "{\"k\":true,\"k\":false}" $
601+ Left "Failed reading: found duplicate key: \"k\""
602+ ]
603+
560604ratioDenominator0 :: Assertion
561605ratioDenominator0 =
562606 assertEqual "Ratio with denominator 0"