packages feed

polysemy-log-0.2.0.0: test/Polysemy/Log/Test/ConcTest.hs

module Polysemy.Log.Test.ConcTest where

import Data.Time (Day, UTCTime)
import Polysemy.Async (asyncToIOFinal)
import Polysemy.Test (UnitTest, assertEq, runTestAuto)
import qualified Polysemy.Time as Time
import Polysemy.Time (GhcTime, MilliSeconds(MilliSeconds), interpretTimeGhc)

import Polysemy.Log.Atomic (interpretDataLogAtomic)
import Polysemy.Log.Conc (interceptDataLogConc)
import qualified Polysemy.Log.Data.DataLog as DataLog
import Polysemy.Log.Data.DataLog (DataLog)

data Context =
  Context {
    context :: [Text],
    message :: Text
  }
  deriving (Eq, Show)

prog ::
  Members [DataLog Context, GhcTime, AtomicState [Context]] r =>
  Sem r [Context]
prog = do
  DataLog.dataLog (Context [] "1")
  DataLog.local push do
    DataLog.dataLog (Context [] "2")
    DataLog.dataLog (Context [] "3")
  DataLog.dataLog (Context [] "4")
  Time.sleep @UTCTime @Day (MilliSeconds 100)
  atomicGet
  where
    push (Context c m) =
      Context ("context" : c) m

target :: [Context]
target =
  [Context [] "4", Context ["context"] "3", Context ["context"] "2", Context [] "1"]

test_conc :: UnitTest
test_conc =
  runTestAuto do
    msgs <-
      asyncToIOFinal $
      interpretTimeGhc $
      interpretDataLogAtomic @Context $
      interceptDataLogConc @Context 1 $
      prog
    assertEq @_ @IO target msgs