hscdio-0.1.0.0: test/Data/Text/Encoding/MsJIS/Test/Unit.hs
{-|
Description:
Copyright: (c) 2020 Sam May
License: GPL-3.0-or-later
Maintainer: ag@eitilt.life
Stability: experimental
Portability: portable
-}
module Data.Text.Encoding.MsJIS.Test.Unit (tests) where
import qualified Test.HUnit as U
import Test.HUnit ( (@=?), (@?=), (~:) )
import qualified Data.ByteString as BS
import qualified Data.Maybe as Y
import qualified Data.Text as T
import qualified System.IO.Unsafe as IO.U
import Data.Text.Encoding.MsJIS
import Test.Libcdio.Unit.Common
testFile :: FilePath
testFile = dataFile "CP932.txt"
charRef :: [(JISChar, T.Text)]
charRef = IO.U.unsafePerformIO $ do
ls <- lines <$> readFile testFile
return . flip Y.mapMaybe ls $ \l -> case words l of
[] -> Nothing
[_] -> Nothing
(('#':_):_) -> Nothing
(_:('#':_):_) -> Nothing
(j:u:_) -> Just (toJIS $ read j, T.singleton . toEnum $ read u)
where toJIS i
| i > 0xFF = uncurry Double . mapBoth fromIntegral $ divMod i (0x100 :: Word)
| otherwise = Single $ fromIntegral i
tests :: U.Test
tests = "Data.Text.Encoding.MsJIS" ~: U.TestList
[ decode
, encode
, duplicatesDuplicated
]
decode :: U.Test
decode = "JIS characters are read correctly" ~: U.TestList
[ show j ++ " -> " ++ T.unpack u ~: U.TestCase (decodeMsJIS' (unpack j) @?= Right u)
| (j, u) <- charRef
]
encode :: U.Test
encode = "JIS characters are encoded correctly" ~: U.TestList
[ T.unpack u ++ " -> " ++ show j ~: U.TestCase (Right (unpack j) @=? encodeMsJIS' u)
| (j, u) <- charRef
, notElem j duplicateChars
]
duplicatesDuplicated :: U.Test
duplicatesDuplicated = "Duplicate JIS characters roundtrip to something else" ~: U.TestList
[ U.TestCase $ do
c <- either decodeFailure return $ decodeMsJIS' bs
bs' <- either encodeFailure return $ encodeMsJIS' c
U.assert $ bs /= bs'
| bs <- map unpack duplicateChars
]
where decodeFailure = U.assertFailure . mappend "JIS decode failed with " . show
encodeFailure = U.assertFailure . mappend "JIS encode failed with " . show
unpack :: JISChar -> BS.ByteString
unpack (Single w) = BS.singleton w
unpack (Double l t) = BS.pack [l, t]
duplicateChars :: [JISChar]
duplicateChars =
[ Double 0x81 0xBE
, Double 0x81 0xBF
, Double 0x81 0xCA
, Double 0x81 0xDA
, Double 0x81 0xDB
, Double 0x81 0xDF
, Double 0x81 0xE0
, Double 0x81 0xE3
, Double 0x81 0xE6
, Double 0x81 0xE7
] ++
[ Double 0x87 t
| t <- [0x54..0x5D]
] ++
[ Double 0x87 0x82
, Double 0x87 0x84
, Double 0x87 0x8A
, Double 0x87 0x9A
] ++
[ Double 0xED t
| t <- [0x40..0x7E] ++ [0x80..0xFC]
] ++
[ Double 0xEE t
| t <- [0x40..0x7E] ++ [0x80..0xEC] ++ [0xEF..0xFC]
]