{- SPDX-FileCopyrightText: 2020 Serokell <https://serokell.io/>
 -
 - SPDX-License-Identifier: MPL-2.0
 -}

module Test.Utf8.Set where

import GHC.IO.Encoding (char8, latin1, textEncodingName, utf8)

import qualified System.IO as IO

import Test.HUnit (Assertion)
import Test.Tasty.HUnit ((@=?))

import System.IO (hIsTerminalDevice)
import System.IO.Utf8.Internal (EncodingAction (..), chooseBestEnc)

import qualified System.IO.Utf8 as Utf8

import Test.Util (withTmpFileIn)


-- | Check that the encoding was actually set to the right one.
verifyOn :: IO.Handle -> Assertion
verifyOn h = do
  menc <- IO.hGetEncoding h
  act <- chooseBestEnc h hIsTerminalDevice menc

  Utf8.withHandle h $ do
    menc' <- IO.hGetEncoding h
    case act of
      Keep ->
        fmap textEncodingName menc @=? fmap textEncodingName menc'
      ChangeFromTo enc enc' -> do
        fmap textEncodingName menc @=? Just (textEncodingName enc)
        Just enc' @=? fmap textEncodingName menc'

  -- Check that it restores
  menc' <- IO.hGetEncoding h
  fmap textEncodingName menc @=? fmap textEncodingName menc'


-- XXX: This group of tests does not actually work, because there is
--      no way to check that the newly set encoding is transliterating
--      (see the comment in @chooseBestEnc@).

-- unit_term_utf8 :: Assertion
-- unit_term_utf8 = withTerminalIn utf8 verifyOn
--
-- unit_term_char8 :: Assertion
-- unit_term_char8 = withTerminalIn char8 verifyOn
--
-- unit_term_latin1 :: Assertion
-- unit_term_latin1 = withTerminalIn latin1 verifyOn


unit_file_utf8 :: Assertion
unit_file_utf8 = withTmpFileIn utf8 verifyOn

unit_file_char8 :: Assertion
unit_file_char8 = withTmpFileIn char8 verifyOn

unit_file_latin1 :: Assertion
unit_file_latin1 = withTmpFileIn latin1 verifyOn