{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE RankNTypes #-}
{-# OPTIONS_GHC -fwarn-unused-imports #-}
-- |
module Test.SanitySpec where
import Data.TypedEncoding
import Data.TypedEncoding.Pkg.Encoding.Conv
import Data.TypedEncoding.Pkg.Encoding.Instances ()
import Data.TypedEncoding
import Test.QuickCheck.Instances.ByteString ()
import Test.Hspec
import Data.Either
-- OneBitProblems are one bit encodings that somehow can encode chars > '\255'
data TestSuite = MultiBit | OneBit | OneBitProblems
-- | encoding for one bit encodings should always fail string has chars > '\255'
-- this does not seem to be the case with some encodings like /cp1257/ which could be a bug
-- in encodings library
-- Even adding chars like \1057 (0x421) does not help e.g. /iso8859_5/ encodes it!
--
expectToFailEnc :: forall s . (Algorithm s "enc-pkg/encoding") => String -> Encoding (Either EncodeEx) s "enc-pkg/encoding" () String -> Decoding (Either UnexpectedDecodeEx) s "enc-pkg/encoding" () String -> Bool
expectToFailEnc str encf decf = isLeft enc
where
enc = _runEncoding encf . toEncoding () $ str
-- | encoding does not fail on numbers 0-9
expectSucceedEnc :: forall s . (Algorithm s "enc-pkg/encoding") => String -> Encoding (Either EncodeEx) s "enc-pkg/encoding" () String -> Decoding (Either UnexpectedDecodeEx) s "enc-pkg/encoding" () String -> Bool
expectSucceedEnc str encf decf = isRight enc
where
enc = _runEncoding encf . toEncoding () $ str
suite ::
TestSuite
-> (forall s . (Algorithm s "enc-pkg/encoding") =>
Encoding (Either EncodeEx) s "enc-pkg/encoding" () String
-> Decoding (Either UnexpectedDecodeEx) s "enc-pkg/encoding" () String
-> Bool)
-> SpecWith (Arg Bool)
suite which test =
case which of
MultiBit -> do
it "utf8" $ test @"enc-pkg/encoding:utf8" encString decString
it "jis_x_0208" $ test @"enc-pkg/encoding:jis_x_0208" encString decString
OneBitProblems -> do
it "iso8859_4" $ test @"enc-pkg/encoding:iso8859_4" encString decString
it "iso8859_10" $ test @"enc-pkg/encoding:iso8859_10" encString decString
it "iso8859_13" $ test @"enc-pkg/encoding:iso8859_13" encString decString
it "cp1257" $ test @"enc-pkg/encoding:cp1257" encString decString
it "gb18030" $ test @"enc-pkg/encoding:gb18030" encString decString
it "gb18030" $ test @"enc-pkg/encoding:gb18030" encString decString
OneBit -> do
it "koi8_r" $ test @"enc-pkg/encoding:koi8_r" encString decString
it "koi8_u" $ test @"enc-pkg/encoding:koi8_u" encString decString
it "iso8859_1" $ test @"enc-pkg/encoding:iso8859_1" encString decString
it "iso8859_2" $ test @"enc-pkg/encoding:iso8859_2" encString decString
it "iso8859_3" $ test @"enc-pkg/encoding:iso8859_3" encString decString
it "iso8859_5" $ test @"enc-pkg/encoding:iso8859_5" encString decString
it "iso8859_6" $ test @"enc-pkg/encoding:iso8859_6" encString decString
it "iso8859_7" $ test @"enc-pkg/encoding:iso8859_7" encString decString
it "iso8859_8" $ test @"enc-pkg/encoding:iso8859_8" encString decString
it "iso8859_9" $ test @"enc-pkg/encoding:iso8859_9" encString decString
it "iso8859_11" $ test @"enc-pkg/encoding:iso8859_11" encString decString
it "iso8859_14" $ test @"enc-pkg/encoding:iso8859_14" encString decString
it "iso8859_15" $ test @"enc-pkg/encoding:iso8859_15" encString decString
it "iso8859_16" $ test @"enc-pkg/encoding:iso8859_16" encString decString
it "cp1250" $ test @"enc-pkg/encoding:cp1250" encString decString
it "cp1251" $ test @"enc-pkg/encoding:cp1251" encString decString
it "cp1252" $ test @"enc-pkg/encoding:cp1252" encString decString
it "cp1253" $ test @"enc-pkg/encoding:cp1253" encString decString
it "cp1254" $ test @"enc-pkg/encoding:cp1254" encString decString
it "cp1255" $ test @"enc-pkg/encoding:cp1255" encString decString
it "cp1256" $ test @"enc-pkg/encoding:cp1256" encString decString
it "cp1258" $ test @"enc-pkg/encoding:cp1258" encString decString
it "macintosh" $ test @"enc-pkg/encoding:macintosh" encString decString
it "jis_x_0201" $ test @"enc-pkg/encoding:jis_x_0201" encString decString
it "cp437" $ test @"enc-pkg/encoding:cp437" encString decString
it "cp737" $ test @"enc-pkg/encoding:cp737" encString decString
it "cp850" $ test @"enc-pkg/encoding:cp850" encString decString
it "cp852" $ test @"enc-pkg/encoding:cp852" encString decString
it "cp855" $ test @"enc-pkg/encoding:cp855" encString decString
it "cp857" $ test @"enc-pkg/encoding:cp857" encString decString
it "cp860" $ test @"enc-pkg/encoding:cp860" encString decString
it "cp861" $ test @"enc-pkg/encoding:cp861" encString decString
it "cp862" $ test @"enc-pkg/encoding:cp862" encString decString
it "cp863" $ test @"enc-pkg/encoding:cp863" encString decString
it "cp864" $ test @"enc-pkg/encoding:cp864" encString decString
it "cp865" $ test @"enc-pkg/encoding:cp865" encString decString
it "cp866" $ test @"enc-pkg/encoding:cp866" encString decString
it "cp869" $ test @"enc-pkg/encoding:cp869" encString decString
it "cp874" $ test @"enc-pkg/encoding:cp874" encString decString
-- /encoding/ package issue, it allows encoding on invalid character that later fails during decode:
it "cp932" $ test @"enc-pkg/encoding:cp932" encString decString
spec :: Spec
spec =
describe "Sanity" $ do
-- /encoding/ package issue, numerous one-bit encodings encode chars > 255 just fine!
describe "> xFF expect to fail on onebit" $
suite OneBit $ expectToFailEnc "\x100"
describe "> xFF expect to fail on onebit" $
suite OneBitProblems $ fmap not . expectToFailEnc "\x100"
describe "succeed on digit 1" $
suite OneBit $ expectSucceedEnc "1" -- fails on jis_x_0208
describe "succeed on digit 1" $
suite OneBitProblems $ expectSucceedEnc "1"
runSpec :: IO ()
runSpec = hspec spec