packages feed

willow-0.1.0.0: test/Test/Willow/Unit/Encoding/ShiftJis.hs

{-|
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]