asif-1.0.0: test/Arbor/File/Format/Asif/ByteString/BuilderSpec.hs
{-# LANGUAGE ScopedTypeVariables #-}
module Arbor.File.Format.Asif.ByteString.BuilderSpec
( spec
) where
import Arbor.File.Format.Asif.ByteString.Builder
import Arbor.File.Format.Asif.Segment
import Conduit
import Control.Lens
import HaskellWorks.Hspec.Hedgehog
import Hedgehog
import System.IO (openTempFile)
import Test.Hspec
import qualified Arbor.File.Format.Asif as C
import qualified Arbor.File.Format.Asif.ByteString.Builder as LB
import qualified Arbor.File.Format.Asif.Lens as L
import qualified Data.Attoparsec.ByteString as AP
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as LBS
import qualified Hedgehog.Gen as G
import qualified Hedgehog.Range as R
import qualified System.IO as IO
{-# ANN module ("HLint: ignore Redundant do" :: String) #-}
spec :: Spec
spec = describe "App.ByteString.Lazy.Builder" $ do
it "should extract segments" $ require $ withTests 1 $ property $ do
b1 :: LBS.ByteString <- forAll $ flip LBS.replicate 65 <$> G.int64 (R.linear 0 10)
b2 :: LBS.ByteString <- forAll $ flip LBS.replicate 66 <$> G.int64 (R.linear 0 10)
b3 :: LBS.ByteString <- forAll $ flip LBS.replicate 67 <$> G.int64 (R.linear 0 10)
(_, h1) <- liftIO $ openTempFile "/tmp" "h1.tmp"
(_, h2) <- liftIO $ openTempFile "/tmp" "h2.tmp"
(_, h3) <- liftIO $ openTempFile "/tmp" "h3.tmp"
(_, he) <- liftIO $ openTempFile "/tmp" "he.tmp"
liftIO $ BS.hPut h1 (LBS.toStrict b1)
liftIO $ BS.hPut h2 (LBS.toStrict b2)
liftIO $ BS.hPut h3 (LBS.toStrict b3)
let segs = LB.segmentsRawC "wxyz"
[ h1
, h2
, h3
]
liftIO $ runConduit $ segs .| sinkHandle he
liftIO $ IO.hSeek he IO.AbsoluteSeek 0
contents <- liftIO $ LBS.hGetContents he
_ <- forAll $ pure $ LBS.unpack contents
let Right segments = extractSegments (AP.string "seg:wxyz") contents
((^. L.payload) <$> segments) === [b1, b2, b3]