with-utf8-1.0.0.0: test/Test/Util.hs
{- SPDX-FileCopyrightText: 2020 Serokell <https://serokell.io/>
-
- SPDX-License-Identifier: MPL-2.0
-}
-- | Testing helpers.
module Test.Util
( withTerminalIn
, withTmpFileIn
) where
import Control.Exception.Safe (bracket, finally)
import Control.Monad (void)
import GHC.IO.Encoding (TextEncoding)
import System.IO.Temp (withSystemTempFile)
import System.Posix.IO (closeFd, fdToHandle, handleToFd)
import System.Posix.Terminal (openPseudoTerminal)
import qualified System.IO as IO
-- | Make a new pseudo-terminal with the given encoding.
withTerminalIn :: TextEncoding -> (IO.Handle -> IO r) -> IO r
withTerminalIn enc act = bracket
openPseudoTerminal
(\(fd1, fd2) -> closeFd fd2 `finally` closeFd fd1)
(\(fd, _) -> bracket
(fdToHandle fd)
(void . handleToFd) -- just release the fd from the handle
(\h -> IO.hSetEncoding h enc *> act h)
)
-- | Make a temp file with the given encoding.
withTmpFileIn :: TextEncoding -> (IO.Handle -> IO r) -> IO r
withTmpFileIn enc act = withSystemTempFile "utf8.txt" $ \_ h -> do
IO.hSetEncoding h enc
act h