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)