import Codec.Binary.UTF8.String
main = let v = encodeDecodeTest
in putStrLn $ case v of
[] -> "Ok. All passed."
s -> "Encode/decode failures: " ++ show s
--
-- test decode . encode == id for the class of chars we know that to be true of
--
encodeDecodeTest :: [Char]
encodeDecodeTest = filter (\x -> [x] /= decode (encode [x])) legal_codepoints ++
filter (\x -> ['\xfffd'] /= decode (encode [x])) illegal_codepoints
where
legal_codepoints = ['\0'..'\xd7ff'] ++ ['\xe000'..'\xfffd'] ++ ['\x10000'..'\x10ffff']
illegal_codepoints = '\xffff' : '\xfffe' : ['\xd800'..'\xdfff']