{-# OPTIONS_GHC -Wall #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TemplateHaskell #-} module Base (baseTestGroup) where import Control.DeepSeq import qualified Data.ByteString.Lazy.Encoding as Enc import qualified Data.ByteString.Lazy.Encoding.Internal as Enc import qualified Data.ByteString.Lazy as BL import qualified Data.ByteString as B import qualified Data.Text.Lazy as TL import qualified Data.Text.Lazy.Encoding as TL import Test.Tasty import Test.Tasty.QuickCheck import Test.Tasty.HUnit import Test.Tasty.TH checkEncode :: Enc.TextEncoding -> (TL.Text -> BL.ByteString) -> Property checkEncode enc f = forAll arbitrary $ \(s::String) -> forAll (choose (2,16)) $ \inBufSize -> forAll (choose (4,32)) $ \outBufSize -> let s' = TL.pack s in Enc.encodeWith enc inBufSize outBufSize s' == f s' checkRoundTrip :: Enc.TextEncoding -> Property checkRoundTrip enc = forAll arbitrary $ \(s::String) -> forAll (choose (2,16)) $ \inBufSizeE -> forAll (choose (4,32)) $ \outBufSizeE -> forAll (choose (4,32)) $ \inBufSizeD -> forAll (choose (2,16)) $ \outBufSizeD -> let s' = TL.pack s in (Enc.decodeWith enc inBufSizeD outBufSizeD $ Enc.encodeWith enc inBufSizeE outBufSizeE $ s') == s' prop_encode_utf8 :: Property prop_encode_utf8 = checkEncode Enc.utf8 TL.encodeUtf8 prop_encode_utf16le :: Property prop_encode_utf16le = checkEncode Enc.utf16le TL.encodeUtf16LE prop_encode_utf16be :: Property prop_encode_utf16be = checkEncode Enc.utf16be TL.encodeUtf16BE prop_encode_utf32le :: Property prop_encode_utf32le = checkEncode Enc.utf32le TL.encodeUtf32LE prop_encode_utf32be :: Property prop_encode_utf32be = checkEncode Enc.utf32be TL.encodeUtf32BE prop_encode_decode_utf8 :: Property prop_encode_decode_utf8 = checkRoundTrip Enc.utf8 prop_encode_decode_utf16le :: Property prop_encode_decode_utf16le = checkRoundTrip Enc.utf16le prop_encode_decode_utf16be :: Property prop_encode_decode_utf16be = checkRoundTrip Enc.utf16be prop_encode_decode_utf32le :: Property prop_encode_decode_utf32le = checkRoundTrip Enc.utf32le prop_encode_decode_utf32be :: Property prop_encode_decode_utf32be = checkRoundTrip Enc.utf32be case_decoding_long_chunked_string :: IO () case_decoding_long_chunked_string = do let ls = [32752, 32752, 32752, 32752, 32752, 32752, 32752, 32752, 32752, 18193] bs = BL.fromChunks [B.pack (replicate l (fromIntegral (fromEnum 'a'))) | l <- ls] let t = Enc.decode Enc.utf8 bs deepseq t $ return () -- --------------------------------------------------------------------- baseTestGroup :: TestTree baseTestGroup = $(testGroupGenerator)