{-| Description: Copyright: (c) 2020 Samuel May License: MPL-2.0 Maintainer: ag.eitilt@gmail.com Stability: experimental Portability: portable -} module Test.Willow.Unit.Encoding.ShiftJis ( tests ) where import qualified Control.Monad as N import qualified Data.Word as W import qualified Test.HUnit as U import Test.HUnit ( (~:) ) import Web.Willow.Common.Encoding import Test.Willow.Unit.Encoding.Common tests :: U.Test tests = "ShiftJis" ~: U.TestList [ "decode" ~: U.TestList $ [ "ASCII" ~: U.TestList $ map (decodeAscii ShiftJis) ['\NUL'..'\x80'] , "failures" ~: U.TestList $ map (\(c, b) -> decodeShiftJis c b Nothing) [ ([toEnum i], [fromIntegral i]) | i <- [0xA0, 0xFD, 0xFE, 0xFF] ] , "EUDC" ~: U.TestList $ do (first, second) <- [ (b1, b2) | b1 <- [0xF0..0xF8] , b2 <- [0x40..0xFF] ] ++ [ (0xF9, b2) | b2 <- [0x40..0xFC] ] N.when (second == 0x7F) [] let bs = [first, second] cs = Just [toEnum $ 0xE000 - 8836 + (p1 * 188) + p2] p1 = first - if first < 0xA0 then 0x81 else 0xC1 p2 = second - if second < 0x7F then 0x40 else 0x41 return $ decodeShiftJis (map toEnum bs) (map fromIntegral bs) cs , "halfwidth" ~: U.TestList [ decodeShiftJis [toEnum i] [fromIntegral i] $ Just [toEnum $ 0xFF61 - 0xA1 + i] | i <- [0xA1..0xDF] ] ] , "encode" ~: U.TestList $ [ "ASCII" ~: U.TestList $ map (encodeAscii ShiftJis) ['\NUL'..'\x80'] , encodeShiftJis '\x00A5' $ Just [0x5C] , encodeShiftJis '\x203E' $ Just [0x7E] , encodeShiftJis '\x2212' $ Just [0x81, 0x7C] , "halfwidth" ~: U.TestList [ encodeShiftJis (toEnum i) $ Just [fromIntegral $ i - 0xFF61 + 0xA1] | i <- [0xFF61..0xFF9F] ] ] ] decodeShiftJis :: String -> [W.Word8] -> Maybe String -> U.Test decodeShiftJis = decodeTest ShiftJis encodeShiftJis :: Char -> Maybe [W.Word8] -> U.Test encodeShiftJis c = encodeTest ShiftJis [c] [c]