packages feed

willow-0.1.0.0: test/Test/Willow/WebPlatformTests/Manual/Encoding/Iso2022JpDecoder.hs

{-# LANGUAGE OverloadedStrings #-}

{-|
Description:    Emulating tests from @encoding/iso-2022-jp-decoder.any.js@

Copyright:      (c) 2020 Samuel May
License:        MPL-2.0
Maintainer:     ag.eitilt@gmail.com

Stability:      experimental
Portability:    portable
-}
module Test.Willow.WebPlatformTests.Manual.Encoding.Iso2022JpDecoder
    ( tests
    ) where


import qualified Data.ByteString as BS
import qualified Data.Text as T

import qualified Test.HUnit as U

import Test.HUnit ( (~:), (~?=) )

import Web.Willow.Common.Encoding

import Test.Willow.WebPlatformTests.Manual.Common


tests :: U.Test
tests = "iso-2022-jp-decoder.any.js" ~: U.TestList $ map test testData
  where test t = nameD t ~: decodeEnc' Iso2022Jp (inputD t) ~?= outputD t


testData :: [InlineDecode]
testData =
    [ InlineDecode
        { inputD = BS.pack [0x1b, 0x24]
        , outputD = T.pack "\xFFFD$"
        , nameD = "Error ESC"
        }
    , InlineDecode
        { inputD = BS.pack [0x1b, 0x24, 0x50]
        , outputD = T.pack "\xFFFD$P"
        , nameD = "Error ESC, character"
        }
    , InlineDecode
        { inputD = BS.pack [0x1b, 0x28, 0x42, 0x50]
        , outputD = T.pack "P"
        , nameD = "ASCII ESC, character"
        }
    , InlineDecode
        { inputD = BS.pack [0x1b, 0x28, 0x42, 0x1b, 0x28, 0x42, 0x50]
        , outputD = T.pack "\xFFFDP"
        , nameD = "Double ASCII ESC, character"
        }
    , InlineDecode
        { inputD = BS.pack [0x50, 0x1b, 0x28, 0x42, 0x50]
        , outputD = T.pack "PP"
        , nameD = "character, ASCII ESC, character"
        }
    , InlineDecode
        { inputD = BS.pack [0x5C, 0x5D, 0x7E]
        , outputD = T.pack "\\]~"
        , nameD = "characters"
        }
    , InlineDecode
        { inputD = BS.pack [0x0D, 0x0E, 0x0F, 0x10]
        , outputD = T.pack "\x0D\xFFFD\xFFFD\x10"
        , nameD = "SO / SI"
        }

    , InlineDecode
        { inputD = BS.pack [0x1b, 0x28, 0x4A, 0x5C, 0x5D, 0x7E]
        , outputD = T.pack "\x00A5]\x203E"
        , nameD = "Roman ESC, characters"
        }
    , InlineDecode
        { inputD = BS.pack [0x1b, 0x28, 0x4A, 0x0D, 0x0E, 0x0F, 0x10]
        , outputD = T.pack "\x0D\xFFFD\xFFFD\x10"
        , nameD = "Roman ESC, SO / SI"
        }
    , InlineDecode
        { inputD = BS.pack [0x1b, 0x28, 0x4A, 0x1b, 0x1b, 0x28, 0x49, 0x50]
        , outputD = T.pack "\xFFFD\xFF90"
        , nameD = "Roman ESC, error ESC, Katakana ESC"
        }

    , InlineDecode
        { inputD = BS.pack [0x1b, 0x28, 0x49, 0x50]
        , outputD = T.pack "\xFF90"
        , nameD = "Katakana ESC, character"
        }
    , InlineDecode
        { inputD = BS.pack [0x1b, 0x28, 0x49, 0x1b, 0x24, 0x40, 0x50, 0x50]
        , outputD = T.pack "\xFFFD\x4F69"
        , nameD = "Katakana ESC, multibyte ESC, character"
        }
    , InlineDecode
        { inputD = BS.pack [0x1b, 0x28, 0x49, 0x1b, 0x50]
        , outputD = T.pack "\xFFFD\xFF90"
        , nameD = "Katakana ESC, error ESC, character"
        }
    , InlineDecode
        { inputD = BS.pack [0x1b, 0x28, 0x49, 0x1b, 0x24, 0x50]
        , outputD = T.pack "\xFFFD\xFF64\xFF90"
        , nameD = "Katakana ESC, error ESC #2, character"
        }
    , InlineDecode
        { inputD = BS.pack [0x1b, 0x28, 0x49, 0x50, 0x1b, 0x28, 0x49, 0x50]
        , outputD = T.pack "\xFF90\xFF90"
        , nameD = "Katakana ESC, character, Katakana ESC, character"
        }
    , InlineDecode
        { inputD = BS.pack [0x1b, 0x28, 0x49, 0x0D, 0x0E, 0x0F, 0x10]
        , outputD = T.pack "\xFFFD\xFFFD\xFFFD\xFFFD"
        , nameD = "Katakana ESC, SO / SI"
        }

    , InlineDecode
        { inputD = BS.pack [0x1b, 0x24, 0x40, 0x50, 0x50]
        , outputD = T.pack "\x4F69"
        , nameD = "Multibyte ESC, character"
        }
    , InlineDecode
        { inputD = BS.pack [0x1b, 0x24, 0x42, 0x50, 0x50]
        , outputD = T.pack "\x4F69"
        , nameD = "Multibyte ESC #2, character"
        }
    , InlineDecode
        { inputD = BS.pack [0x1b, 0x24, 0x42, 0x1b, 0x50, 0x50]
        , outputD = T.pack "\xFFFD\x4F69"
        , nameD = "Multibyte ESC, error ESC, character"
        }
    , InlineDecode
        { inputD = BS.pack [0x1b, 0x24, 0x40, 0x1b, 0x24, 0x40]
        , outputD = T.pack "\xFFFD"
        , nameD = "Double multibyte ESC"
        }
    , InlineDecode
        { inputD = BS.pack [0x1b, 0x24, 0x40, 0x1b, 0x24, 0x40, 0x50, 0x50]
        , outputD = T.pack "\xFFFD\x4F69"
        , nameD = "Double multibyte ESC, character"
        }
    , InlineDecode
        { inputD = BS.pack [0x1b, 0x24, 0x40, 0x1b, 0x24, 0x42, 0x50, 0x50]
        , outputD = T.pack "\xFFFD\x4F69"
        , nameD = "Double multibyte ESC #2, character"
        }
    , InlineDecode
        { inputD = BS.pack [0x1b, 0x24, 0x40, 0x1b, 0x24, 0x50, 0x50]
        , outputD = T.pack "\xFFFD\x3070\xFFFD"
        , nameD = "Multibyte ESC, error ESC #2, character"
        }

    , InlineDecode
        { inputD = BS.pack [0x1b, 0x24, 0x40, 0x50, 0x1b, 0x24, 0x40, 0x50, 0x50]
        , outputD = T.pack "\xFFFD\x4F69"
        , nameD = "Multibyte ESC, single byte, multibyte ESC, character"
        }
    , InlineDecode
        { inputD = BS.pack [0x1b, 0x24, 0x40, 0x20, 0x50]
        , outputD = T.pack "\xFFFD\xFFFD"
        , nameD = "Multibyte ESC, lead error byte"
        }
    , InlineDecode
        { inputD = BS.pack [0x1b, 0x24, 0x40, 0x50, 0x20]
        , outputD = T.pack "\xFFFD"
        , nameD = "Multibyte ESC, trail error byte"
        }

    , InlineDecode
        { inputD = BS.pack [0x50, 0x1b]
        , outputD = T.pack "P\xFFFD"
        , nameD = "character, error ESC"
        }
    , InlineDecode
        { inputD = BS.pack [0x50, 0x1b, 0x24]
        , outputD = T.pack "P\xFFFD$"
        , nameD = "character, error ESC #2"
        }
    , InlineDecode
        { inputD = BS.pack [0x50, 0x1b, 0x50]
        , outputD = T.pack "P\xFFFDP"
        , nameD = "character, error ESC #3"
        }
    , InlineDecode
        { inputD = BS.pack [0x50, 0x1b, 0x28, 0x42]
        , outputD = T.pack "P"
        , nameD = "character, ASCII ESC"
        }
    , InlineDecode
        { inputD = BS.pack [0x50, 0x1b, 0x28, 0x4A]
        , outputD = T.pack "P"
        , nameD = "character, Roman ESC"
        }
    , InlineDecode
        { inputD = BS.pack [0x50, 0x1b, 0x28, 0x49]
        , outputD = T.pack "P"
        , nameD = "character, Katakana ESC"
        }
    , InlineDecode
        { inputD = BS.pack [0x50, 0x1b, 0x24, 0x40]
        , outputD = T.pack "P"
        , nameD = "character, Multibyte ESC"
        }
    , InlineDecode
        { inputD = BS.pack [0x50, 0x1b, 0x24, 0x42]
        , outputD = T.pack "P"
        , nameD = "character, Multibyte ESC #2"
        }
    ]