{-# LANGUAGE
CPP #-}
module Main(main) where
import Test.QuickCheck
import Test.QuickCheck.Monadic
import System.Process
import System.IO
import Control.Exception ( evaluate )
#ifdef UNICODE
import System.Posix.Escape.Unicode
#else
import System.Posix.Escape
#endif
echo :: String -> IO String
echo xs = do
(_, Just hOut, _, hProc) <- createProcess $
(shell ("/bin/echo -n " ++ xs)) { std_out = CreatePipe }
out <- hGetContents hOut
_ <- evaluate (length out)
hClose hOut
_ <- waitForProcess hProc
return out
mangled :: String -> String
#ifdef UNICODE
mangled = id
#else
mangled = filter ((< 0x80) . fromEnum)
#endif
prop_escaped :: String -> Property
prop_escaped xs = monadicIO $ do
pre (all (/= '\0') xs)
ys <- run $ echo (escape xs)
assert (mangled xs == ys)
main :: IO ()
main = quickCheck prop_escaped