|
2 | 2 |
|
3 | 3 | module UnescapeSpec where |
4 | 4 |
|
5 | | -import Data.Text.Encoding (encodeUtf8) |
6 | | -import qualified Data.Text as T |
7 | | -import Data.Either (isLeft) |
8 | | -import qualified Data.ByteString as BS |
9 | | -import qualified Data.ByteString.Lazy as BSL |
10 | | -import qualified Data.Aeson as AE |
| 5 | +import Control.Applicative ((<$>)) |
| 6 | +import qualified Data.Aeson as AE |
| 7 | +import qualified Data.ByteString as BS |
| 8 | +import qualified Data.ByteString.Char8 as BSC |
| 9 | +import qualified Data.ByteString.Lazy as BSL |
| 10 | +import Data.Either (isLeft) |
| 11 | +import qualified Data.Text as T |
| 12 | +import Data.Text.Encoding (encodeUtf16BE, encodeUtf8) |
| 13 | +import Numeric (showHex) |
11 | 14 |
|
12 | | -import Test.QuickCheck |
13 | | -import Test.Hspec |
14 | | -import Data.JsonStream.Unescape |
15 | | -import qualified Test.QuickCheck.Unicode as QUNI |
| 15 | +import Data.JsonStream.Unescape |
| 16 | +import Test.Hspec |
| 17 | +import Test.QuickCheck |
| 18 | +import qualified Test.QuickCheck.Unicode as QUNI |
16 | 19 |
|
17 | 20 | spec :: Spec |
18 | 21 | spec = do |
@@ -52,11 +55,23 @@ spec = do |
52 | 55 | let txt = "žluťoučký kůň úpěl ďábelské kódy" :: T.Text |
53 | 56 | unescapeText (BS.drop 1 $ encodeUtf8 txt) `shouldSatisfy` isLeft |
54 | 57 |
|
55 | | - describe "It correctly decodes aeson encoded string" $ |
56 | | - it "QuickCheck with aeson encode" $ do |
| 58 | + describe "It correctly decodes aeson encoded string" $ do |
| 59 | + it "QuickCheck with aeson encode - standard UTF8" $ do |
57 | 60 | let check txt = |
58 | 61 | let encoded = BS.init $ BS.tail (BS.concat $ BSL.toChunks $ AE.encode (AE.String txt)) |
59 | | - in unescapeText encoded `shouldBe ` Right txt |
| 62 | + in unescapeText encoded `shouldBe` Right txt |
| 63 | + deepCheck check |
| 64 | + it "QuickCheck with aeson encode - \\u encoded data" $ do |
| 65 | + let check txt = -- Convert everything to \\uXXXX notation |
| 66 | + let u16chars = BS.concat $ map ((BS.append "\\u" . btohex) . BS.take 2) |
| 67 | + $ take (BS.length u16 `div` 2) |
| 68 | + $ iterate (BS.drop 2) u16 |
| 69 | + u16 = encodeUtf16BE txt |
| 70 | + btohex cb = BSC.pack $ concatMap tohex $ BS.unpack cb |
| 71 | + tohex c |
| 72 | + | c < 16 = "0" ++ showHex c "" |
| 73 | + | otherwise = showHex c "" |
| 74 | + in unescapeText u16chars `shouldBe` Right txt |
60 | 75 | deepCheck check |
61 | 76 |
|
62 | 77 | deepCheck :: (T.Text -> Expectation) -> IO () |
|
0 commit comments