{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Instana.SDK.Internal.IdTest (allTests) where
import qualified Data.Aeson as Aeson
import qualified Data.ByteString.Lazy.Char8 as LBSC8
import Test.HUnit
import Instana.SDK.Internal.Id (Id)
import qualified Instana.SDK.Internal.Id as Id
allTests :: Test
allTests =
TestList
[ TestLabel
"shouldConvertIntComponentsToString"
shouldConvertIntComponentsToString
, TestLabel "shouldEncodeIntComponents" shouldEncodeIntComponents
, TestLabel
"shouldConvertIntComponentsToString2"
shouldConvertIntComponentsToString2
, TestLabel "shouldEncodeIntComponents2" shouldEncodeIntComponents2
, TestLabel "shouldEncodeStringId" shouldEncodeStringId
, TestLabel "shouldDecodeStringId " shouldDecodeStringId
, TestLabel "shouldGenerate" shouldGenerate
]
shouldConvertIntComponentsToString :: Test
shouldConvertIntComponentsToString =
let
asString = Id.toString $ Id.createFromIntsForTest [12345, 67890]
in
TestCase $
assertEqual "as string" "0000303900010932" asString
shouldEncodeIntComponents :: Test
shouldEncodeIntComponents =
let
idFromInts = Id.createFromIntsForTest [12345, 67890]
encoded = LBSC8.unpack . Aeson.encode $ idFromInts
in
TestCase $
assertEqual "as string" "\"0000303900010932\"" encoded
shouldConvertIntComponentsToString2 :: Test
shouldConvertIntComponentsToString2 =
let
-- minimum for Int type as per
-- http://hackage.haskell.org/package/base-4.11.1.0/docs/Data-Int.html
-- is from -2^29 to 29-1 -> -536870912 to 536870911
asString =
Id.toString $ Id.createFromIntsForTest [-536870912, 536870911]
in
TestCase $
assertEqual "as string" "200000001fffffff" asString
shouldEncodeIntComponents2 :: Test
shouldEncodeIntComponents2 =
let
idFromInts = Id.createFromIntsForTest [-536870912, 536870911]
encoded = LBSC8.unpack . Aeson.encode $ idFromInts
in
TestCase $
assertEqual "encoded" "\"200000001fffffff\"" encoded
shouldEncodeStringId :: Test
shouldEncodeStringId =
let
idFromString = ("some string" :: Id)
encoded = LBSC8.unpack . Aeson.encode $ idFromString
in
TestCase $
assertEqual "encoded" "\"some string\"" encoded
shouldDecodeStringId :: Test
shouldDecodeStringId =
let
expected = ("some string" :: Id)
maybeId = Aeson.decode (LBSC8.pack "\"some string\"") :: Maybe Id
Just decoded = maybeId
in
TestCase $ assertEqual "decoded" expected decoded
shouldGenerate :: Test
shouldGenerate =
TestCase $
do
generated <- Id.generate
let
encoded = LBSC8.unpack . Aeson.encode $ generated
-- every encoded ID must be 16 chars wide + 2 chars for leading and
-- trailing "
assertEqual "generated" 18 (length encoded)