packages feed

redact-0.4.0.0: test/Redact/Monad/Terminal/Mock.hs

{-# LANGUAGE OverloadedStrings #-}

module Redact.Monad.Terminal.Mock (tests) where

-- https://hackage.haskell.org/package/HMock
import Test.HMock ((|->), expect, inSequence, runMockT)

-- https://hackage.haskell.org/package/tasty
import Test.Tasty (TestTree, testGroup)

-- https://hackage.haskell.org/package/tasty-hunit
import Test.Tasty.HUnit (testCase)

-- (redact)
import qualified Redact.Monad.Terminal as RMT
import Redact.Monad.Terminal (resetSGRs)
import Redact.Types (Line(NormalLine, RedactLine), Part(Redact, Stet))

-- (redact:test)
import TestLib

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

testReset :: TestTree
testReset = testCase "reset" . runMockT $ do
    inSequence
      [ expect $ SetSGR resetSGRs |-> ()
      , expect $ PutStrLn "" |-> ()
      ]
    RMT.reset

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

testPutLinesNone :: TestTree
testPutLinesNone = testCase "none" . runMockT $ RMT.putLines redactSGRs []

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

testPutLinesNormalEmpty :: TestTree
testPutLinesNormalEmpty = testCase "normal_empty" . runMockT $ do
    expect $ PutStrLn "" |-> ()
    RMT.putLines redactSGRs [NormalLine []]

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

testPutLinesNormalStet :: TestTree
testPutLinesNormalStet = testCase "normal_stet" . runMockT $ do
    inSequence
      [ expect $ PutStrLn "one" |-> ()
      , expect $ PutStrLn "two" |-> ()
      ]
    RMT.putLines redactSGRs
      [ NormalLine [Stet "one"]
      , NormalLine [Stet "two"]
      ]

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

testPutLinesNormalRedact :: TestTree
testPutLinesNormalRedact = testCase "normal_redact" . runMockT $ do
    inSequence
      [ expect $ SetSGR redactSGRs |-> ()
      , expect $ PutStr "one" |-> ()
      , expect $ SetSGR resetSGRs |-> ()
      , expect $ PutStrLn "" |-> ()
      , expect $ SetSGR redactSGRs |-> ()
      , expect $ PutStr "two" |-> ()
      , expect $ SetSGR resetSGRs |-> ()
      , expect $ PutStrLn "" |-> ()
      ]
    RMT.putLines redactSGRs
      [ NormalLine [Redact "one"]
      , NormalLine [Redact "two"]
      ]

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

testPutLinesNormalMixed :: TestTree
testPutLinesNormalMixed = testCase "normal_mixed" . runMockT $ do
    inSequence
      [ expect $ PutStrLn "one" |-> ()
      , expect $ PutStrLn "" |-> ()
      , expect $ PutStr "two" |-> ()
      , expect $ SetSGR redactSGRs |-> ()
      , expect $ PutStr "three" |-> ()
      , expect $ SetSGR resetSGRs |-> ()
      , expect $ PutStrLn "" |-> ()
      , expect $ SetSGR redactSGRs |-> ()
      , expect $ PutStr "four" |-> ()
      , expect $ SetSGR resetSGRs |-> ()
      , expect $ PutStrLn "" |-> ()
      , expect $ PutStrLn "" |-> ()
      , expect $ SetSGR redactSGRs |-> ()
      , expect $ PutStr "five" |-> ()
      , expect $ SetSGR resetSGRs |-> ()
      , expect $ PutStr "six" |-> ()
      , expect $ SetSGR redactSGRs |-> ()
      , expect $ PutStr "seven" |-> ()
      , expect $ SetSGR resetSGRs |-> ()
      , expect $ PutStrLn "" |-> ()
      ]
    RMT.putLines redactSGRs
      [ NormalLine [Stet "one"]
      , NormalLine []
      , NormalLine [Stet "two", Redact "three"]
      , NormalLine [Redact "four"]
      , NormalLine []
      , NormalLine [Redact "five", Stet "six", Redact "seven"]
      ]

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

testPutLinesRedactStet :: TestTree
testPutLinesRedactStet = testCase "redact_stet" . runMockT $ do
    inSequence
      [ expect $ PutStr "one" |-> ()
      , expect $ SetSGR redactSGRs |-> ()
      , expect $ PutStrLn "" |-> ()
      , expect $ PutStr "two" |-> ()
      , expect $ SetSGR resetSGRs |-> ()
      , expect $ PutStrLn "" |-> ()
      , expect $ PutStrLn "three" |-> ()
      ]
    RMT.putLines redactSGRs
      [ NormalLine [Stet "one"]
      , RedactLine "two"
      , NormalLine [Stet "three"]
      ]

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

testPutLinesRedactRedact :: TestTree
testPutLinesRedactRedact = testCase "redact_redact" . runMockT $ do
    inSequence
      [ expect $ SetSGR redactSGRs |-> ()
      , expect $ PutStrLn "one" |-> ()
      , expect $ PutStr "two" |-> ()
      , expect $ SetSGR resetSGRs |-> ()
      , expect $ PutStrLn "" |-> ()
      , expect $ SetSGR redactSGRs |-> ()
      , expect $ PutStr "three" |-> ()
      , expect $ SetSGR resetSGRs |-> ()
      , expect $ PutStrLn "" |-> ()
      ]
    RMT.putLines redactSGRs
      [ NormalLine [Redact "one"]
      , RedactLine "two"
      , NormalLine [Redact "three"]
      ]

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

testPutLinesRedactMultiple :: TestTree
testPutLinesRedactMultiple = testCase "redact_multiple" . runMockT $ do
    inSequence
      [ expect $ SetSGR redactSGRs |-> ()
      , expect $ PutStrLn "one" |-> ()
      , expect $ PutStrLn "two" |-> ()
      , expect $ PutStrLn "" |-> ()
      , expect $ PutStr "three" |-> ()
      , expect $ SetSGR resetSGRs |-> ()
      , expect $ PutStrLn "" |-> ()
      , expect $ PutStrLn "four" |-> ()
      ]
    RMT.putLines redactSGRs
      [ NormalLine [Redact "one"]
      , RedactLine "two"
      , RedactLine ""
      , RedactLine "three"
      , NormalLine [Stet "four"]
      ]

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

testPutLinesRedactBegin :: TestTree
testPutLinesRedactBegin = testCase "redact_begin" . runMockT $ do
    inSequence
      [ expect $ SetSGR redactSGRs |-> ()
      , expect $ PutStrLn "" |-> ()
      , expect $ PutStr "one" |-> ()
      , expect $ SetSGR resetSGRs |-> ()
      , expect $ PutStrLn "" |-> ()
      , expect $ PutStrLn "two" |-> ()
      ]
    RMT.putLines redactSGRs
      [ RedactLine "one"
      , NormalLine [Stet "two"]
      ]

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

testPutLinesRedactEnd :: TestTree
testPutLinesRedactEnd = testCase "redact_end" . runMockT $ do
    inSequence
      [ expect $ PutStr "one" |-> ()
      , expect $ SetSGR redactSGRs |-> ()
      , expect $ PutStrLn "" |-> ()
      , expect $ PutStr "two" |-> ()
      , expect $ SetSGR resetSGRs |-> ()
      , expect $ PutStrLn "" |-> ()
      ]
    RMT.putLines redactSGRs
      [ NormalLine [Stet "one"]
      , RedactLine "two"
      ]

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

tests :: TestTree
tests = testGroup "Redact.Monad.Terminal:Mock"
    [ testReset
    , testGroup "putLines"
        [ testPutLinesNone
        , testPutLinesNormalEmpty
        , testPutLinesNormalStet
        , testPutLinesNormalRedact
        , testPutLinesNormalMixed
        , testPutLinesRedactStet
        , testPutLinesRedactRedact
        , testPutLinesRedactMultiple
        , testPutLinesRedactBegin
        , testPutLinesRedactEnd
        ]
    ]