content: {-# LANGUAGE OverloadedStrings #-}
  
  module System.IO.Streams.Tests.Text (tests) where
  
  ------------------------------------------------------------------------------
  import           Control.Monad                  ((>=>))
  import           Data.Text.Encoding.Error
  import qualified System.IO.Streams.Internal     as Streams
  import qualified System.IO.Streams.List         as Streams
  import           System.IO.Streams.Tests.Common
  import qualified System.IO.Streams.Text         as Streams
  import           Test.Framework
  import           Test.Framework.Providers.HUnit
  import           Test.HUnit                     hiding (Test)
  ------------------------------------------------------------------------------
  
  tests :: [Test]
  tests = [ testDecodeOK
          , testStrictDecodeError
          , testEncode
          ]
  
  
  ------------------------------------------------------------------------------
  testEncode :: Test
  testEncode = testCase "text/encodeUtf8" $ do
      is <- Streams.fromList ["\x3BC", "ok", ""]
      Streams.outputToList (Streams.encodeUtf8 >=> Streams.connect is)
          >>= assertEqual "ok encode" ["\xCE\xBC", "ok", ""]
  
  
  ------------------------------------------------------------------------------
  testDecodeOK :: Test
  testDecodeOK = testCase "text/decodeUtf8/wholeChunk" $ do
      Streams.fromList ["\xCE\xBC", "ok", ""]
          >>= Streams.decodeUtf8
          >>= Streams.toList
          >>= assertEqual "ok decode" ["\x3BC", "ok", ""]
  
      Streams.fromList ["\xCE", "\xBC", "ok", "foo\xCE", "\xBC"]
          >>= Streams.decodeUtf8
          >>= Streams.toList
          >>= assertEqual "ok decode 2" ["\x3BC", "ok", "foo", "\x3BC"]
  
      Streams.fromList ["\xE2\xB6", "\x8E"]
          >>= Streams.decodeUtf8
          >>= Streams.toList
          >>= assertEqual "ok decode 3" ["\x2D8E"]
  
      Streams.fromList ["\xF0\x90\x80\x83"]
          >>= Streams.decodeUtf8
          >>= Streams.toList
          >>= assertEqual "ok decode 4" ["\x10003"]
  
      Streams.fromList []
          >>= Streams.decodeUtf8With strictDecode
          >>= Streams.toList
          >>= assertEqual "ok strict empty" []
  
  
  ------------------------------------------------------------------------------
  testStrictDecodeError :: Test
  testStrictDecodeError = testCase "text/decodeUtf8/error" $ do
      expectExceptionH (Streams.fromList ["\x87"] >>=
                        Streams.decodeUtf8With strictDecode >>=
                        Streams.toList)
      expectExceptionH (Streams.fromList ["o\x87\x87"] >>=
                        Streams.decodeUtf8With strictDecode >>=
                        Streams.toList)
  