packages feed

helic-0.2.0.0: test/Helic/Test/ListTest.hs

module Helic.Test.ListTest where

import qualified Chronos
import Chronos (datetimeToTime)
import Polysemy.Chronos (interpretTimeChronosConstant)
import Polysemy.Conc (
  Events,
  Queue,
  )
import qualified Polysemy.Conc.Queue as Queue
import Polysemy.Error (errorToIOFinal)
import Polysemy.Reader (runReader)
import Polysemy.Tagged (Tagged, untag)
import Polysemy.Test (UnitTest, assertRight, runTestAuto)
import Polysemy.Time (mkDatetime)

import Helic.Data.AgentId (AgentId (AgentId))
import qualified Helic.Data.Event as Event
import Helic.Data.Event (Event (Event, content))
import Helic.Data.InstanceName (InstanceName)
import Helic.Data.ListConfig (ListConfig (ListConfig))
import Helic.Effect.Agent (Agent (Update))
import Helic.Interpreter.Client (interpretClientConst)
import Helic.List (buildList)
import Helic.Net.Api (receiveEvent)

testTime :: Chronos.Time
testTime =
  datetimeToTime (mkDatetime 2030 1 1 12 0 0)

interpretAgent ::
  ∀ id r .
  (Event -> Sem r ()) ->
  InterpreterFor (Tagged id Agent) r
interpretAgent handle sem =
  interpreting (untag sem) \case
    Update e ->
      handle e

handleNet ::
  Members [Events resource Event, Reader InstanceName] r =>
  Event ->
  Sem r ()
handleNet (Event {..}) =
  receiveEvent (Event "test" (AgentId "net") testTime content)

handleLog ::
  Member (Queue Text) r =>
  Event ->
  Sem r ()
handleLog Event {content} =
  Queue.write content

test_listen :: UnitTest
test_listen =
  runTestAuto $
  interpretTimeChronosConstant testTime $
  runReader "test" $
  runReader (ListConfig (Just 8)) do
    events <- traverse (Event.now (AgentId "nvim") . show) ([1..10] :: [Int])
    interpretClientConst events do
      assertRight 873 . fmap length =<< errorToIOFinal buildList