packages feed

binary-parser-0.5.5: tests/Main.hs

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