{-# LANGUAGE OverloadedStrings #-}
{- ORMOLU_DISABLE -}
module Main where
import Data.Function ((&))
import qualified Data.Text as T
import qualified Data.Text.IO as T
import Data.Functor ((<&>))
import Distribution.Utils.Generic (isAsciiAlphaNum)
import Numeric (showHex)
import Data.Char (ord, isDigit)
import Control.Monad (join)
import DoubleXEncoding
(EncodeOptions(..), doubleXEncode, doubleXEncodeGql, doubleXDecode)
main :: IO ()
main = do
let
getEncoderTest encoder a b = T.putStrLn $
if encoder a /= b
then
"❌ ENCODE ERROR: "
<> a <> " | " <> encoder a <> " /= " <> b
else
if doubleXDecode (encoder a) /= a
then
"❌ DECODE ERROR: "
<> a <> " | " <> doubleXDecode (encoder a) <> " /= " <> a
else
"✅ " <> a <> ": " <> encoder a <> " == " <> b
expectEncode a b =
getEncoderTest doubleXEncode a b
expectEncodeGql a b =
getEncoderTest doubleXEncodeGql a b
expectDecode a b = T.putStrLn $
if doubleXDecode a /= b
then
"❌ DECODE ERROR: "
<> a <> " | " <> doubleXDecode a <> " /= " <> b
else
"✅ " <> a <> ": " <> doubleXDecode a <> " == " <> b
expectEncode "camelCaseId" "camelCaseId"
expectEncode "snake_case_id" "snake_case_id"
expectEncode "__Schema" "__Schema"
expectEncode "0test" "0test"
expectEncode "doxxing" "doxxing"
expectEncode "DOXXING" "DOXXXXXXING"
expectEncode "XXX" "XXXXXXX"
expectEncode ">XXX<" "XXKXXXXXXXXXI"
expectEncode "id with spaces" "idXX0withXX0spaces"
expectEncode "%" "XX5"
expectEncode "id-with.special$chars!" "idXXDwithXXEspecialXX4charsXX1"
expectEncode "id_with_ümläutß" "id_with_XXaaapmmlXXaaaoeutXXaaanp"
expectEncode "Emoji: 😅" "EmojiXXGXX0XXbpgaf"
expectEncode "Multi Byte Emoji: \x1f468\x200D\x1f9b2"
"MultiXX0ByteXX0EmojiXXGXX0XXbpegiXXacaanXXbpjlc"
-- Support characters from the Supplementary Private Use Area-B
expectEncode "\x100000" "XXYbaaaaa"
expectEncode "\x10FFFF" "XXYbapppp"
expectEncodeGql "__Schema" "XXRXXRSchema"
expectEncodeGql "also__middle" "alsoXXRXXRmiddle"
expectEncodeGql "0test" "XXZ0test"
expectDecode "alsoXXZ0middle" "also0middle"
-- https://github.com/minimaxir/big-list-of-naughty-strings
txtFile <- readFile "./tests/blns.txt"
let
blns = T.lines $ T.pack txtFile
blnsFiltered = blns & filter
(\line -> not (T.null line) && not (T.isPrefixOf "#" line))
testEncodeDecode str =
if str /= doubleXDecode (doubleXEncode str)
then
"❌ \""
<> doubleXDecode (doubleXEncode str)
<> "\" /= \""
<> str
<> "\""
else "✅"
testEncodeGqlDecode str =
if str /= doubleXDecode (doubleXEncodeGql str)
then
"❌ \""
<> doubleXDecode (doubleXEncodeGql str)
<> "\" /= \""
<> str
<> "\""
else "✅"
T.putStrLn "\n\n============ ENCODE - DECODE ============"
blnsFiltered <&> testEncodeDecode <&> T.putStr & sequence_
T.putStrLn "\n\n========== ENCODE GQL - DECODE =========="
blnsFiltered <&> testEncodeGqlDecode <&> T.putStr & sequence_
pure ()