packages feed

atelier-core-0.7.3.0: test/Unit/Atelier/Effects/ConsoleSpec.hs

module Unit.Atelier.Effects.ConsoleSpec (test_Console) where

import Effectful (runPureEff)
import Test.Tasty (TestTree, testGroup)
import Test.Tasty.HUnit (testCase, (@?=))

import Atelier.Effects.Console (runConsoleToList)

import Atelier.Effects.Console qualified as Console


test_Console :: TestTree
test_Console =
    testGroup
        "Console"
        [ testGroup
            "runConsoleToList"
            [ testGroup
                "when nothing is logged"
                [ testCase "returns an empty list" $ do
                    let (_, msgs) = runPureEff $ runConsoleToList $ pure ()
                    msgs @?= []
                ]
            , testGroup
                "when logging once"
                [ testCase "collects a single traced message" $ do
                    let (_, msgs) = runPureEff $ runConsoleToList $ Console.putStr "hello"
                    msgs @?= ["hello"]
                ]
            , testCase "collects multiple logged messages in order" $ do
                let (_, msgs) =
                        runPureEff . runConsoleToList $ do
                            Console.putStr "first"
                            Console.putStr "second"
                            Console.putStr "third"
                msgs @?= ["first", "second", "third"]
            , testCase "returns the result alongside the traced messages" $ do
                let (result, msgs) =
                        runPureEff . runConsoleToList $ do
                            Console.putStr "side effect"
                            pure (42 :: Int)
                result @?= 42
                msgs @?= ["side effect"]
            , testCase "traceLn appends a newline to the message" $ do
                let (_, msgs) = runPureEff $ runConsoleToList $ Console.putStrLn "line"
                msgs @?= ["line\n"]
            ]
        ]