packages feed

unwitch-1.0.0: test/Test/Convert/ByteStringSpec.hs

module Test.Convert.ByteStringSpec (spec) where

import Test.Hspec
import Data.ByteString qualified as BS
import Data.Word (Word8)
import qualified Unwitch.Convert.ByteString as ByteString
import qualified Unwitch.Convert.LazyByteString as LazyByteString
import qualified Unwitch.Convert.ShortByteString as ShortByteString

spec :: Spec
spec = describe "Unwitch.Convert.ByteString" $ do

  describe "toLazyByteString / toByteString round-trip" $
    it "round-trips" $
      let bs = BS.pack [104, 101, 108, 108, 111]
      in LazyByteString.toByteString (ByteString.toLazyByteString bs) `shouldBe` bs

  describe "toShortByteString round-trip" $
    it "round-trips with ShortByteString.toByteString" $
      let bs = BS.pack [1, 2, 3]
      in ShortByteString.toByteString (ByteString.toShortByteString bs) `shouldBe` bs

  describe "toWord8s / fromWord8s" $ do
    it "round-trips" $
      let ws = [72, 105] :: [Word8]
      in ByteString.toWord8s (ByteString.fromWord8s ws) `shouldBe` ws
    it "empty list" $
      ByteString.toWord8s (ByteString.fromWord8s []) `shouldBe` ([] :: [Word8])

  describe "toTextLatin1" $
    it "decodes latin1 bytes" $
      let bs = BS.pack [0xE9, 0xE8] -- e-acute, e-grave
      in ByteString.toTextLatin1 bs `shouldBe` "\x00E9\x00E8"

  describe "toTextUtf8" $ do
    it "decodes valid UTF-8" $
      ByteString.toTextUtf8 "hello" `shouldBe` Right "hello"
    it "fails on invalid UTF-8" $
      let bs = BS.pack [0xFF, 0xFE]
      in case ByteString.toTextUtf8 bs of
           Left _  -> pure ()
           Right _ -> expectationFailure "expected Left"

  describe "toTextUtf16LE" $ do
    it "decodes valid UTF-16LE" $
      let bs = BS.pack [0x41, 0x00] -- 'A' in UTF-16LE
      in ByteString.toTextUtf16LE bs `shouldBe` Right "A"
    it "fails on truncated input" $
      let bs = BS.pack [0x41] -- odd byte count
      in case ByteString.toTextUtf16LE bs of
           Left _  -> pure ()
           Right _ -> expectationFailure "expected Left"

  describe "toTextUtf16BE" $
    it "decodes valid UTF-16BE" $
      let bs = BS.pack [0x00, 0x42] -- 'B' in UTF-16BE
      in ByteString.toTextUtf16BE bs `shouldBe` Right "B"

  describe "toTextUtf32LE" $
    it "decodes valid UTF-32LE" $
      let bs = BS.pack [0x43, 0x00, 0x00, 0x00] -- 'C' in UTF-32LE
      in ByteString.toTextUtf32LE bs `shouldBe` Right "C"

  describe "toTextUtf32BE" $ do
    it "decodes valid UTF-32BE" $
      let bs = BS.pack [0x00, 0x00, 0x00, 0x44] -- 'D' in UTF-32BE
      in ByteString.toTextUtf32BE bs `shouldBe` Right "D"
    it "fails on invalid input" $
      let bs = BS.pack [0x01] -- not 4-byte aligned
      in case ByteString.toTextUtf32BE bs of
           Left _  -> pure ()
           Right _ -> expectationFailure "expected Left"