on master help sign in
Added regression test for parsing escaped UTF-16 characters (#477).
f6030eeVladimir Shabanov
aeson.cabal+1
@@ -180,6 +180,7 @@ test-suite tests
180 base,
180 base,
181 base-compat,
181 base-compat,
182 base-orphans >= 0.5.3 && <0.6,
182 base-orphans >= 0.5.3 && <0.6,
183+ base16-bytestring,
183 containers,
184 containers,
184 dlist,
185 dlist,
185 generic-deriving >= 1.10 && < 1.12,
186 generic-deriving >= 1.10 && < 1.12,
tests/UnitTests.hs+23−1
@@ -21,7 +21,7 @@ import Prelude ()
21import Prelude.Compat
21import Prelude.Compat
22
22
23import Control.Applicative (Const(..))
23import Control.Applicative (Const(..))
24−import Control.Monad (forM)
24+import Control.Monad (forM, forM_)
25import Data.Aeson ((.=), (.:), (.:?), (.:!), FromJSON(..), FromJSONKeyFunction(..), FromJSONKey(..), ToJSON1(..), decode, eitherDecode, encode, genericParseJSON, genericToEncoding, genericToJSON, object, withObject)
25import Data.Aeson ((.=), (.:), (.:?), (.:!), FromJSON(..), FromJSONKeyFunction(..), FromJSONKey(..), ToJSON1(..), decode, eitherDecode, encode, genericParseJSON, genericToEncoding, genericToJSON, object, withObject)
26import Data.Aeson.Internal (JSONPathElement(..), formatError)
26import Data.Aeson.Internal (JSONPathElement(..), formatError)
27import Data.Aeson.TH (deriveJSON, deriveToJSON, deriveToJSON1)
27import Data.Aeson.TH (deriveJSON, deriveToJSON, deriveToJSON1)
@@ -50,8 +50,10 @@ import Instances ()
50import Test.Framework (Test, testGroup)
50import Test.Framework (Test, testGroup)
51import Test.Framework.Providers.HUnit (testCase)
51import Test.Framework.Providers.HUnit (testCase)
52import Test.HUnit (Assertion, assertFailure, assertEqual)
52import Test.HUnit (Assertion, assertFailure, assertEqual)
53+import Text.Printf (printf)
53import Types (Approx(..), Compose3, Compose3', I)
54import Types (Approx(..), Compose3, Compose3', I)
54import UnitTests.NullaryConstructors (nullaryConstructors)
55import UnitTests.NullaryConstructors (nullaryConstructors)
56+import qualified Data.ByteString.Base16.Lazy as LBase16
55import qualified Data.ByteString.Lazy.Char8 as L
57import qualified Data.ByteString.Lazy.Char8 as L
56import qualified Data.DList as DList
58import qualified Data.DList as DList
57import qualified Data.HashMap.Strict as HM
59import qualified Data.HashMap.Strict as HM
@@ -104,6 +106,7 @@ tests = testGroup "unit" [
104 , testGroup "Nullary constructors" $ fmap (testCase "-") nullaryConstructors
106 , testGroup "Nullary constructors" $ fmap (testCase "-") nullaryConstructors
105 , testGroup "FromJSONKey" $ fmap (testCase "-") fromJSONKeyAssertions
107 , testGroup "FromJSONKey" $ fmap (testCase "-") fromJSONKeyAssertions
106 , testCase "PR #455" pr455
108 , testCase "PR #455" pr455
109+ , testCase "Unescape string (PR #477)" unescapeString
107 ]
110 ]
108
111
109roundTripCamel :: String -> Assertion
112roundTripCamel :: String -> Assertion
@@ -574,6 +577,25 @@ data MyRecord2 = MyRecord2 {_field3 :: Maybe Int, _field4 :: Maybe Bool}
574instance ToJSON MyRecord2
577instance ToJSON MyRecord2
575instance FromJSON MyRecord2
578instance FromJSON MyRecord2
576
579
580+-- A regression test for: https://github.com/bos/aeson/pull/477
581+unescapeString :: Assertion
582+unescapeString = do
583+ assertEqual "Basic escaping"
584+ (Right ("\" / \\ \b \f \n \r \t" :: String))
585+ (eitherDecode "\"\\\" \\/ \\\\ \\b \\f \\n \\r \\t\"")
586+
587+ forM_ [minBound .. maxBound :: Char] $ \ c ->
588+ let s = LT.pack [c] in
589+ assertEqual (printf "UTF-16 encoded '\\x%X'" c)
590+ (Right s) (eitherDecode $ utf16Char s)
591+ where
592+ utf16Char = formatString . LBase16.encode . LT.encodeUtf16BE
593+ formatString s
594+ | L.length s == 4 = L.concat ["\"\\u", s, "\""]
595+ | L.length s == 8 =
596+ L.concat ["\"\\u", L.take 4 s, "\\u", L.drop 4 s, "\""]
597+ | otherwise = error "unescapeString: can't happen"
598+
577-- A regression test for: https://github.com/bos/aeson/pull/455
599-- A regression test for: https://github.com/bos/aeson/pull/455
578data Foo a = FooNil | FooCons (Foo Int)
600data Foo a = FooNil | FooCons (Foo Int)
579
601