packages feed

binrep-0.2.0: test/Binrep/Extra/HexByteStringSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module Binrep.Extra.HexByteStringSpec ( spec ) where

import Binrep.Extra.HexByteString
import Test.Hspec

import Data.ByteString qualified as B
import Text.Megaparsec
import Data.Void ( Void )

megaparsecParseFromCharStream :: forall s a. (Stream s, Token s ~ Char) => Parsec Void s a -> s -> Maybe a
megaparsecParseFromCharStream parser text = parseMaybe parser text

spec :: Spec
spec = do
    let bs = B.pack
    describe "parse" $ do
      let p = megaparsecParseFromCharStream @String (parseHexByteString B.pack)
      it "parses valid hex bytestrings" $ do
        p "00" `shouldBe` Just (bs [0x00])
        p "FF" `shouldBe` Just (bs [0xFF])
        p "1234" `shouldBe` Just (bs [0x12, 0x34])
        p "01 9A FE" `shouldBe` Just (bs [0x01, 0x9A, 0xFE])
        p "FFFFFFFF" `shouldBe` Just (B.replicate 4 0xFF)
        p "12 34    AB CD" `shouldBe` Just (bs [0x12, 0x34, 0xAB, 0xCD])
      it "fails to parse invalid hex bytestrings" $ do
        p "-00" `shouldBe` Nothing
        p "FG" `shouldBe` Nothing
      it "fails to parse 0x prefix" $ do
        p   "1234" `shouldBe` Just (bs [0x12, 0x34])
        p "0x1234" `shouldBe` Nothing
    describe "print" $ do
      it "prints pretty hex bytestrings" $ do
        let p = prettyHexByteString B.unpack
        p (bs [0x5a, 0x7d]) `shouldBe` "5A 7D"
      it "prints compact hex bytestrings" $ do
        let pc = prettyHexByteStringCompact B.unpack
        pc (bs [0xab, 0x25]) `shouldBe` "ab25"