packed-data-0.1.0.0: test/PackedTest/UnpackTest.hs
module PackedTest.UnpackTest (specs) where
import ByteString.StrictBuilder
import Data.Int (Int32)
import Data.Packed
import Data.Packed.TH
import PackedTest.Data
import Test.Hspec
$(mkPacked ''Tree1 [])
$(mkPacked ''Tree2 [])
$(mkPacked ''Tree3 [])
$(mkPacked ''Tree4 [InsertFieldSize])
specs :: Spec
specs = describe "Unpack Trees" $ do
describe "Tree1" $ do
test
"Leaf"
(storable (0 :: Tag) <> storable (10 :: Int))
(Leaf1 10 :: Tree1 Int)
test
"Node"
( let node = storable (1 :: Tag) <> subNode <> leaf
subNode = storable (1 :: Tag) <> subLeafL <> subLeafR
subLeafL = storable (0 :: Tag) <> storable (1 :: Int)
subLeafR = storable (0 :: Tag) <> storable (2 :: Int)
leaf = storable (0 :: Tag) <> storable (3 :: Int)
in node
)
(Node1 (Node1 (Leaf1 1) (Leaf1 2)) (Leaf1 3) :: Tree1 Int)
describe "Test2" $ do
test
"Leaf"
(storable (0 :: Tag))
(Leaf2 :: Tree2 Int)
test
"Node"
( let node = storable (1 :: Tag) <> leaf <> storable (1 :: Int) <> leaf
leaf = storable (0 :: Tag)
in node
)
(Node2 Leaf2 (1 :: Int) Leaf2)
describe "Test3" $ do
test
"Leaf"
(storable (0 :: Tag))
(Leaf3 :: Tree3 Int)
test
"Node"
( let node = storable (1 :: Tag) <> leaf <> leaf <> storable (42 :: Int)
leaf = storable (0 :: Tag)
in node
)
(Node3 Leaf3 Leaf3 (42 :: Int))
describe "Tree1 (with `InsertFieldSize`)" $ do
test
"Leaf"
(storable (0 :: Tag) <> storable (8 :: Int32) <> storable (10 :: Int))
(Leaf4 10 :: Tree4 Int)
test
"Node"
( let node =
storable (1 :: Tag)
<> packedNodeFieldSize
<> leafL
<> packedNodeFieldSize
<> leafR
packedNodeFieldSize = storable (1 + 8 + 8 :: Int32)
packedLeafFieldSize = storable (8 :: Int32)
leafL = storable (0 :: Tag) <> packedLeafFieldSize <> storable (4 :: Int)
leafR = storable (0 :: Tag) <> packedLeafFieldSize <> storable (5 :: Int)
in node
)
(Node4 (Leaf4 4) (Leaf4 5) :: Tree4 Int)
where
test name bldr t = it name $ case Data.Packed.unpack (unsafeToPacked (builderBytes bldr)) of
(tree, _) -> tree `shouldBe` t