packages feed

utf8-prelude-0.1.3: Test.hs

import Paths_utf8_prelude

import Data.Maybe

import System.UTF8IO

import Prelude()
import UTF8Prelude

----------------------

writeFile_test :: String
writeFile_test = "writeFile_test.txt"

main :: IO ()
main = do
    do
        s <- do
            readFile_test <- getDataFileName "readFile_test.txt"
            s <- readFile readFile_test 
            let errors = catMaybes $ map checkLine $ lines s
            assert (null errors) "readFile" $ head errors
            return s

        do
            writeFile writeFile_test s
            s' <- readFile writeFile_test 
            assert (s == s') "writeFile" $ showDiff s s'

        do
            withFile writeFile_test WriteMode (\h -> mapM_ (hPutChar h) s)
            s' <- readFile writeFile_test 
            assert (s == s') "hPutChar" $ showDiff s s'

        do
            s' <- withFile writeFile_test ReadMode readFile'
            assert (s == s') "hGetChar" $ showDiff s s'

    do
        putStrLn "Basic putStrLn test:"
        putStrLn_test <- getDataFileName "putStrLn_test.txt"
        s <- readFile putStrLn_test
        mapM_ putStrLn $ map ("  " ++) $ lines s

showDiff :: String -> String -> String
showDiff a b = "Strings from position " ++ show n ++ ": " ++ show (take 10 $ drop n a) ++ " /= " ++ show (take 10 $ drop n b)
 where
    n = max 0 (n' - 4)
    n' = length $ takeWhile (uncurry (==)) $ zip a b

checkLine :: String -> Maybe String
checkLine s = case reads s of
    [(i, [' ',c])]
        | i == fromEnum c -> Nothing
    [(i, ' ':cs)]
        | otherwise -> Just $ "\"\\" ++ show i ++ "\" /= \"" ++ cs ++ "\""
    _  -> Just $ "Fatal error: Invalid line in testfile: " ++ s

assert :: Bool -> String -> String -> IO ()
assert True t _ = putStrLn $ t ++ " test OK."
assert False t s = error $ t ++ " test failed! " ++ s

make_readFile_test :: IO ()
make_readFile_test = writeFile "readFile_test.txt" $ unlines [show i ++ " " ++ [toEnum i] | i<-[33,132..55000]]
-- it fails with [33,132..65535]!

readFile' :: Handle -> IO String
readFile' h = do
    b <- hIsEOF h
    if b
        then return []
        else do
            c <- hGetChar h
            cs <- readFile' h
            return (c:cs)