module Main where import Prelude import Test.QuickCheck.Instances import Test.Tasty import Test.Tasty.HUnit import Test.Tasty.QuickCheck import qualified Data.ByteString as A import qualified Data.ByteString.Builder as C import qualified Data.ByteString.Lazy as D import qualified BinaryParser as B 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 details parser valueToBuilder = testProperty name $ \value -> B.run parser (D.toStrict (C.toLazyByteString (valueToBuilder value))) === Right value where name = "builderIsomporhismProperty: " <> details expectedResultTest details parser expectedValue input = testCase name $ do assertEqual "" (Right expectedValue) (B.run parser input) where name = "expectedResultTest: " <> details