{-# language LambdaCase #-}
{-# language OverloadedStrings #-}
import Data.ByteString.Short.Internal (ShortByteString(SBS))
import Data.Bytes (Bytes)
import Data.Primitive (ByteArray(ByteArray))
import Data.Scientific (Scientific,scientific)
import Data.Text.Short (ShortText)
import Test.Tasty (defaultMain,testGroup,TestTree)
import Test.Tasty.HUnit ((@=?))
import Twitter100 (encodedTwitter100,byteStringTwitter100)
import qualified Data.Aeson as AE
import qualified Data.Bytes as Bytes
import qualified Data.Chunks as Chunks
import qualified Data.HashMap.Strict as HM
import qualified Data.Number.Scientific as SCI
import qualified Data.Text.Short as TS
import qualified GHC.Exts as Exts
import qualified Json as J
import qualified Test.Tasty.HUnit as THU
main :: IO ()
main = defaultMain tests
tests :: TestTree
tests = testGroup "Tests"
[ THU.testCase "A" $
Right (J.Object mempty)
@=?
J.decode (Bytes.fromAsciiString "{}")
, THU.testCase "B" $
Right (J.Object (Exts.fromList [Exts.fromList [J.Member "foo" J.True]]))
@=?
J.decode (Bytes.fromAsciiString "{\"foo\" : true}")
, THU.testCase "C" $
Right (J.Array (Exts.fromList [Exts.fromList [J.String "bar"]]))
@=?
J.decode (Bytes.fromAsciiString "[\"bar\"]")
, THU.testCase "D" $
Right (J.Object (Exts.fromList [Exts.fromList [J.Member "foo" J.True, J.Member "bar" J.False]]))
@=?
J.decode (Bytes.fromAsciiString "{\"foo\" : true, \"bar\": false }")
, THU.testCase "E" $
Right (J.String "Smile: 😂")
@=?
J.decode (shortTextToBytes "\"Smile: 😂\"")
, THU.testCase "F" $
Right (J.Array (Exts.fromList [Exts.fromList [ J.Object mempty, J.Object mempty, J.Null ]]))
@=?
J.decode (shortTextToBytes " [ {} , { } , null ] ")
, THU.testCase "G" $ case J.decode (shortTextToBytes " [ 55e2 , 1 ] ") of
Right (J.Array xs) -> case Exts.toList (Chunks.concat xs) of
[J.Number a, J.Number b] -> do
SCI.toWord32 a @=? Just 5500
SCI.toWord32 b @=? Just 1
_ -> fail "no good y"
_ -> fail "no good x"
, THU.testCase "H" $ case J.decode (shortTextToBytes " [] x") of
Left _ -> pure ()
Right _ -> fail "this was not supposed parse"
, THU.testCase "Twitter100" $
case J.decode (Bytes.fromByteArray encodedTwitter100) of
Left _ -> fail "nope"
Right j -> case AE.decodeStrict byteStringTwitter100 of
Nothing -> fail "aeson is messed up"
Just ae -> ae @=? toAesonValue j
]
toBadSci :: SCI.Scientific -> Scientific
toBadSci = SCI.withExposed
(\a b -> scientific (fromIntegral a) b)
(\a b -> scientific a (fromIntegral b))
toAesonValue :: J.Value -> AE.Value
toAesonValue = \case
J.True -> AE.Bool True
J.False -> AE.Bool False
J.Null -> AE.Null
J.String t -> AE.String (TS.toText t)
J.Number n -> AE.Number (toBadSci n)
J.Object mbrs -> AE.Object $ foldr
(\(J.Member key val) hm -> HM.insert (TS.toText key) (toAesonValue val) hm)
HM.empty mbrs
J.Array vals -> AE.Array $ Exts.fromList $ foldr
(\x xs -> toAesonValue x : xs) [] vals
shortTextToBytes :: ShortText -> Bytes
shortTextToBytes str = case TS.toShortByteString str of
SBS x -> let y = ByteArray x in Bytes.fromByteArray y