hasbolt-0.1.3.1: test/Spec.hs
{-# LANGUAGE OverloadedStrings #-}
import Control.Applicative ((<$>))
import Data.ByteString (ByteString)
import Data.ByteString.Lazy (fromStrict, toStrict)
import Data.Hex
import Data.Map (Map (..))
import qualified Data.Map as M (empty, fromList)
import Data.Text (Text)
import qualified Data.Text as T (pack)
import Test.Hspec
import Test.QuickCheck
import Database.Bolt
main :: IO ()
main = hspec $ do
packStreamTests
unpackStreamTests
unpackStreamTests :: Spec
unpackStreamTests =
describe "Unpack" $ do
it "unpacks integers correct" $ do
u1 <- prepareData "01" >>= unpack :: IO Int
u1 `shouldBe` 1
u42 <- prepareData "2A" >>= unpack :: IO Int
u42 `shouldBe` 42
u1234 <- prepareData "C904D2" >>= unpack :: IO Int
u1234 `shouldBe` 1234
it "unpacks doubles correct" $ do
u6d <- prepareData "C1401921FB54442D18" >>= unpack :: IO Double
u6d `shouldBe` 6.283185307179586
um1d <- prepareData "C1BFF199999999999A" >>= unpack :: IO Double
um1d `shouldBe` (-1.1)
it "unpacks booleans correct" $ do
uF <- prepareData "C2" >>= unpack :: IO Bool
uF `shouldBe` False
uT <- prepareData "C3" >>= unpack :: IO Bool
uT `shouldBe` True
it "unpacks strings correct" $ do
usE <- prepareData "80" >>= unpack :: IO Text
usE `shouldBe` T.pack ""
usA <- prepareData "8141" >>= unpack :: IO Text
usA `shouldBe` T.pack "A"
usU <- prepareData "D0124772C3B6C39F656E6D61C39F7374C3A46265" >>= unpack :: IO Text
usU `shouldBe` T.pack "Größenmaßstäbe"
it "unpacks lists correct" $ do
ulE <- prepareData "90" >>= unpack :: IO [Int]
ulE `shouldBe` []
ulI <- prepareData "93010203" >>= unpack :: IO [Int]
ulI `shouldBe` [1,2,3]
ulL <- prepareData "D4280102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728" >>= unpack :: IO [Int]
ulL `shouldBe` [1..40]
it "unpacks dicts correct" $ do
udE <- prepareData "A0" >>= unpack :: IO (Map Text ())
udE `shouldBe` M.fromList []
udS <- prepareData "A1836F6E658465696E73" >>= unpack :: IO (Map Text Text)
udS `shouldBe` M.fromList [(T.pack "one", T.pack "eins")]
it "unpacks () correct" $ do
uN <- prepareData "C0" >>= unpack :: IO ()
uN `shouldBe` ()
packStreamTests :: Spec
packStreamTests =
describe "Pack" $ do
it "packs integers correct" $ do
hex (pack (1::Int)) `shouldBe` "01"
hex (pack (42::Int)) `shouldBe` "2A"
hex (pack (1234::Int)) `shouldBe` "C904D2"
it "packs doubles correct" $ do
hex (pack (6.283185307179586::Double)) `shouldBe` "C1401921FB54442D18"
hex (pack (-1.1::Double)) `shouldBe` "C1BFF199999999999A"
it "packs booleans correct" $ do
hex (pack False) `shouldBe` "C2"
hex (pack True) `shouldBe` "C3"
it "packs strings correct" $ do
hex (pack $ T.pack "") `shouldBe` "80"
hex (pack $ T.pack "A") `shouldBe` "8141"
hex (pack $ T.pack "Größenmaßstäbe") `shouldBe` "D0124772C3B6C39F656E6D61C39F7374C3A46265"
hex (pack $ T.pack "ABCDEFGHIJKLMNOPQRSTUVWXYZ") `shouldBe` "D01A4142434445464748494A4B4C4D4E4F505152535455565758595A"
it "packs lists correct" $ do
hex (pack ([]::[Int])) `shouldBe` "90"
hex (pack ([1,2,3]::[Int])) `shouldBe` "93010203"
hex (pack ([1..40]::[Int])) `shouldBe` "D4280102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728"
it "packs dicts correct" $ do
hex (pack (M.empty :: Map Text ())) `shouldBe` "A0"
hex (pack (M.fromList [(T.pack "one", T.pack "eins")])) `shouldBe` "A1836F6E658465696E73"
it "packs () correct" $
hex (pack ()) `shouldBe` "C0"
prepareData :: Monad m => ByteString -> m ByteString
prepareData = (toStrict <$>) . unhex . fromStrict