module Main where
import Prelude
import Bug
import Test.Tasty
import Test.Tasty.Runners
import Test.Tasty.HUnit
import Test.Tasty.QuickCheck
import Test.QuickCheck.Instances
import qualified ConcurrentBuffer as A
import qualified Data.ByteString as D
import qualified Data.ByteString.Internal as B
main =
defaultMain $
testGroup "All tests"
[
testCase "Interleaving" $ do
let (input1, input2, input3) = (1, 2, 3) :: (Word64, Word64, Word64)
buffer <- A.new 2
A.pushStorable buffer input1
A.pushStorable buffer input2
output1 <- A.pullStorable buffer
A.pushStorable buffer input3
output2 <- A.pullStorable buffer
output3 <- A.pullStorable buffer
assertEqual (show output1) input1 output1
assertEqual (show output2) input2 output2
assertEqual (show output3) input3 output3
,
testProperty "Numbers" $ \(inputs :: [Word64]) ->
unsafePerformIO $ do
buffer <- A.new 2
forM_ inputs $ \input -> A.pushStorable buffer input
outputs <- (traverse (const (A.pullStorable buffer)) inputs)
return (inputs === outputs)
,
testProperty "Concatenation of pushed bytestrings equals the binary representation" $ \(inputs :: [ByteString]) ->
unsafePerformIO $ do
buffer <- A.new (2 ^ 8)
forM_ inputs $ \input -> A.pushBytes buffer input
let concattedInputs = mconcat inputs
output <- A.pullBytes buffer (D.length concattedInputs)
return (concattedInputs === output)
,
testProperty "Concurrent push and pull equality" $ \(inputs :: Vector ByteString) ->
unsafePerformIO $ do
buffer <- A.new (2 ^ 8)
let !amounts = D.length <$!> inputs
forkIO $ forM_ inputs $ \input -> A.pushBytes buffer input
outputs <- traverse (A.pullBytes buffer) amounts
return (inputs == outputs)
]
inspect :: A.Buffer -> IO ()
inspect buffer =
print . D.unpack =<< A.getBytes buffer