packages feed

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

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

import Effectful (runPureEff)
import Test.Hspec (Spec, describe, it, shouldBe)

import Atelier.Effects.Console (runConsoleToList)

import Atelier.Effects.Console qualified as Console


spec_Console :: Spec
spec_Console = do
    describe "runConsoleToList" $ do
        describe "when nothing is logged" $ it "returns an empty list" $ do
            let (_, msgs) = runPureEff $ runConsoleToList $ pure ()
            msgs `shouldBe` []

        describe "when logging once" $ it "collects a single traced message" $ do
            let (_, msgs) = runPureEff $ runConsoleToList $ Console.putStr "hello"
            msgs `shouldBe` ["hello"]

        it "collects multiple logged messages in order" $ do
            let (_, msgs) =
                    runPureEff . runConsoleToList $ do
                        Console.putStr "first"
                        Console.putStr "second"
                        Console.putStr "third"
            msgs `shouldBe` ["first", "second", "third"]

        it "returns the result alongside the traced messages" $ do
            let (result, msgs) =
                    runPureEff . runConsoleToList $ do
                        Console.putStr "side effect"
                        pure (42 :: Int)
            result `shouldBe` 42
            msgs `shouldBe` ["side effect"]

        it "traceLn appends a newline to the message" $ do
            let (_, msgs) = runPureEff $ runConsoleToList $ Console.putStrLn "line"
            msgs `shouldBe` ["line\n"]