module Main where
import BasePrelude
import qualified BinaryParser as B
import qualified Data.ByteString as A
import qualified Data.ByteString.Builder as C
import qualified Data.ByteString.Lazy as D
import Test.Tasty
import Test.Tasty.HUnit
import Test.Tasty.QuickCheck
main :: IO ()
main =
defaultMain $
testGroup "All tests" $
[ builderIsomporhismProperty "byte" B.byte C.word8,
builderIsomporhismProperty "beWord16" B.beWord16 C.word16BE,
builderIsomporhismProperty "beWord32" B.beWord32 C.word32BE,
expectedResultTest "byte consumes" ((,) <$> B.byte <*> B.beWord32) (49, 4) "1\NUL\NUL\NUL\EOT",
expectedResultTest "Applicative composition" ((,) <$> B.beWord16 <*> B.beWord16) (1, 2) "\NUL\SOH\NUL\STX",
let parser =
do
a <- B.beWord16
b <- B.beWord16
return (a, b)
in expectedResultTest "Monadic composition" parser (1, 2) "\NUL\SOH\NUL\STX"
]
builderIsomporhismProperty :: (Arbitrary a, Show a, Eq a) => TestName -> B.BinaryParser a -> (a -> C.Builder) -> TestTree
builderIsomporhismProperty details parser valueToBuilder =
testProperty name $ \value ->
B.run parser (D.toStrict (C.toLazyByteString (valueToBuilder value)))
=== Right value
where
name =
"builderIsomporhismProperty: " <> details
expectedResultTest :: (Eq b, Show b) => TestName -> B.BinaryParser b -> b -> A.ByteString -> TestTree
expectedResultTest details parser expectedValue input =
testCase name $ do
assertEqual "" (Right expectedValue) (B.run parser input)
where
name =
"expectedResultTest: " <> details