{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE Rank2Types #-}
module Main (main) where
import Data.IORef (IORef, modifyIORef', newIORef, readIORef)
import Data.Text (Text)
import LittleLogger (LogAction (LogAction), Msg (msgSeverity, msgText), Severity (..), SimpleLogAction, WithSimpleLog,
filterActionSeverity, logDebug, logError, logInfo, logWarning, runWithSimpleLogAction)
import Test.Tasty (TestTree, defaultMain, testGroup)
import Test.Tasty.HUnit (testCase, (@?=))
emitLogs :: WithSimpleLog env m => m ()
emitLogs = do
logDebug "debug"
logInfo "info"
logWarning "warning"
logError "error"
refAction :: IORef [(Severity, Text)] -> SimpleLogAction
refAction ref = LogAction (\msg -> modifyIORef' ref (++ [(msgSeverity msg, msgText msg)]))
runWithRefAction :: (SimpleLogAction -> SimpleLogAction) -> (forall env m. WithSimpleLog env m => m ()) -> IO [(Severity, Text)]
runWithRefAction f m = do
ref <- newIORef []
let action = f (refAction ref)
runWithSimpleLogAction action m
readIORef ref
expectedFiltered :: [(Severity, Text)]
expectedFiltered =
[ (Warning, "warning")
, (Error, "error")
]
expectedUnfiltered :: [(Severity, Text)]
expectedUnfiltered =
[ (Debug, "debug")
, (Info, "info")
] ++ expectedFiltered
testUnfiltered :: TestTree
testUnfiltered = testCase "Unfiltered" $ do
actual <- runWithRefAction id emitLogs
actual @?= expectedUnfiltered
testFiltered :: TestTree
testFiltered = testCase "Filtered" $ do
actual <- runWithRefAction (filterActionSeverity Warning) emitLogs
actual @?= expectedFiltered
main :: IO ()
main = defaultMain $ testGroup "LittleLogger" $
[ testUnfiltered
, testFiltered
]