on master help sign in
Split the Serialize.roundtrip test into reusable parts
4f00d1fAdithya Kumar
test/Streamly/Test/Data/Serialize.hs+25−8
@@ -22,7 +22,7 @@ module Streamly.Test.Data.Serialize (main) where
22--------------------------------------------------------------------------------
22--------------------------------------------------------------------------------
23
23
24import System.Random (randomRIO)
24import System.Random (randomRIO)
25−import Streamly.Internal.Data.Unbox (newBytes)
25+import Streamly.Internal.Data.Unbox (MutableByteArray, newBytes)
26import GHC.Generics (Generic)
26import GHC.Generics (Generic)
27import Streamly.Test.Data.Serialize.TH (genDatatype)
27import Streamly.Test.Data.Serialize.TH (genDatatype)
28import qualified Streamly.Internal.Data.Serialize.TH as Serialize
28import qualified Streamly.Internal.Data.Serialize.TH as Serialize
@@ -114,12 +114,11 @@ instance Arbitrary a => Arbitrary (BinTree a) where
114-- Test helpers
114-- Test helpers
115--------------------------------------------------------------------------------
115--------------------------------------------------------------------------------
116
116
117−roundtrip
117+poke ::
118− :: forall a. (Eq a, Show a, Serialize.Serialize a)
118+ forall a. Serialize.Serialize a
119 => a
119 => a
120− -> IO ()
120+ -> IO (MutableByteArray, Int, Int)
121−roundtrip val = do
121+poke val = do
122−
123 let sz = Serialize.size 0 val
122 let sz = Serialize.size 0 val
124
123
125 let excessSize = 100
124 let excessSize = 100
@@ -132,16 +131,34 @@ roundtrip val = do
132 arr <- newBytes arrSize
131 arr <- newBytes arrSize
133
132
134 off1 <- Serialize.serialize serStartOff arr val
133 off1 <- Serialize.serialize serStartOff arr val
134+ off1 `shouldBe` serEndOff
135+ pure (arr, serStartOff, serEndOff)
136+
137+peekAndVerify ::
138+ forall a. (Eq a, Show a, Serialize.Serialize a)
139+ => (MutableByteArray, Int, Int)
140+ -> a
141+ -> IO ()
142+peekAndVerify (arr, serStartOff, serEndOff) val = do
135 (off2, val2) <- Serialize.deserialize serStartOff arr serEndOff
143 (off2, val2) <- Serialize.deserialize serStartOff arr serEndOff
136 val2 `shouldBe` val
144 val2 `shouldBe` val
137− off2 `shouldBe` off1
138 off2 `shouldBe` serEndOff
145 off2 `shouldBe` serEndOff
139− val `shouldBe` Serialize.decode (Serialize.encode val)
140 let slice = Array.Array arr serStartOff serEndOff
146 let slice = Array.Array arr serStartOff serEndOff
141 val `shouldBe` Serialize.decode slice
147 val `shouldBe` Serialize.decode slice
142 clonedSlice <- Array.clone slice
148 clonedSlice <- Array.clone slice
143 val `shouldBe` Serialize.decode clonedSlice
149 val `shouldBe` Serialize.decode clonedSlice
144
150
151+roundtrip
152+ :: forall a. (Eq a, Show a, Serialize.Serialize a)
153+ => a
154+ -> IO ()
155+roundtrip val = do
156+
157+ val `shouldBe` Serialize.decode (Serialize.encode val)
158+
159+ res <- poke val
160+ peekAndVerify res val
161+
145testSerializeList
162testSerializeList
146 :: forall a. (Eq a, Show a, Serialize.Serialize a)
163 :: forall a. (Eq a, Show a, Serialize.Serialize a)
147 => Int
164 => Int