packages feed

binary-ext-2.0: test/Data/Conduit/Parsers/Binary/Put/Spec.hs

--
-- Copyright 2017 Warlock <internalmike@gmail.com>
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
--     http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
--

module Data.Conduit.Parsers.Binary.Put.Spec
  ( tests
  ) where

import Control.Monad hiding (fail)
import Control.Monad.Error.Class
import Control.Monad.Fix
import Control.Monad.Trans.Class
import Data.Bits
import qualified Data.ByteString as S (ByteString)
import Data.Conduit
import qualified Data.Conduit.Combinators as N
import Test.HUnit.Base hiding (Label)
import Data.Conduit.Parsers.Binary.Get
import Data.Conduit.Parsers.Binary.Put

tests :: Test
tests = TestList
  [ TestCase testExample
  ]

putWithSize :: (DefaultEncodingState s, Monad m) => PutM s i S.ByteString m () -> PutM s i S.ByteString m ()
putWithSize !p = void $ mfix $ \size -> do
  putWord64le size
  before <- bytesWrote
  p
  after <- bytesWrote
  return $ after - before

testPut1 :: Int -> Put
testPut1 n = do
  forM_ [1 .. n] putInthost

testExample :: Assertion
testExample = do
  runPut (putWithSize $ testPut1 3) $$ testResult
  where
  testResult = do
    (\x -> lift $ assertEqual "" (Right $ 3 * fromIntegral (finiteBitSize (0 :: Word))) x) =<< runGet getWord64le
    (\x -> lift $ assertEqual "" (Right 1) x) =<< runGet getWordhost
    (\x -> lift $ assertEqual "" (Right 2) x) =<< runGet getWordhost
    (\x -> lift $ assertEqual "" (Right 3) x) =<< runGet getWordhost
    (\x -> lift $ assertEqual "" (Right ()) x) =<< runGet (ensureEof ())

ensureEof :: e -> Get e ()
ensureEof e = do
  eof <- N.nullE
  if eof then return () else throwError e