summaryrefslogtreecommitdiff
path: root/libraries/compact/tests/compact_serialize.hs
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/compact/tests/compact_serialize.hs')
-rw-r--r--libraries/compact/tests/compact_serialize.hs53
1 files changed, 53 insertions, 0 deletions
diff --git a/libraries/compact/tests/compact_serialize.hs b/libraries/compact/tests/compact_serialize.hs
new file mode 100644
index 0000000000..e4ba88ea9e
--- /dev/null
+++ b/libraries/compact/tests/compact_serialize.hs
@@ -0,0 +1,53 @@
+module Main where
+
+import Control.Exception
+import Control.Monad
+import System.Mem
+
+import Data.IORef
+import Data.ByteString (ByteString, packCStringLen)
+import Foreign.Ptr
+import Control.DeepSeq
+
+import Data.Compact
+import Data.Compact.Serialized
+
+assertFail :: String -> IO ()
+assertFail msg = throwIO $ AssertionFailed msg
+
+assertEquals :: (Eq a, Show a) => a -> a -> IO ()
+assertEquals expected actual =
+ if expected == actual then return ()
+ else assertFail $ "expected " ++ (show expected)
+ ++ ", got " ++ (show actual)
+
+serialize :: NFData a => a -> IO (SerializedCompact a, [ByteString])
+serialize val = do
+ cnf <- newCompact 4096 val
+
+ bytestrref <- newIORef undefined
+ scref <- newIORef undefined
+ withSerializedCompact cnf $ \sc -> do
+ writeIORef scref sc
+ performMajorGC
+ bytestrs <- forM (serializedCompactBlockList sc) $ \(ptr, size) -> do
+ packCStringLen (castPtr ptr, fromIntegral size)
+ writeIORef bytestrref bytestrs
+
+ performMajorGC
+
+ bytestrs <- readIORef bytestrref
+ sc <- readIORef scref
+ return (sc, bytestrs)
+
+main = do
+ let val = ("hello", 1, 42, 42, Just 42) ::
+ (String, Int, Int, Integer, Maybe Int)
+
+ (sc, bytestrs) <- serialize val
+ performMajorGC
+
+ mcnf <- importCompactByteStrings sc bytestrs
+ case mcnf of
+ Nothing -> assertFail "import failed"
+ Just cnf -> assertEquals val (getCompact cnf)