packages feed

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