packages feed

mischief-ecs-0.2.0.0: test/Changes.hs

module Changes where

import Data.Foldable
import Data.Kind
import Data.Text qualified as T
import Mischief.ECS
import Mischief.ECS.App (register, setSystemTicks, setTick, simulateSystem, tick)
import Mischief.ECS.Components
import Mischief.ECS.Components.Spawn (meta)
import Mischief.ECS.Fixed (FixedPlugin, FixedUpdate)
import Mischief.ECS.Relationships.ChildOf
import Mischief.ECS.Relationships.Graph qualified as Graph
import Mischief.ECS.Time qualified as Time
import Utils

main :: IO ()
main = do
  runTests
    [ test1,
      test2,
      test3,
      test4,
      test5
    ]

test1 :: System ()
test1 = simulateSystem $ do
  setTick $ Tick 0

  a <- spawn (Name "A", Comp1)
  b <- spawn (Name "B", Comp1)
  c <- spawn (Name "C", Comp1)

  setSystemTicks (Tick 0) (Tick 1)

  assertqWith
    [q|Name / With Comp1, Changed Name|]
    [(a, Name "A"), (b, Name "B"), (c, Name "C")]

test2 :: System ()
test2 = simulateSystem $ do
  setTick $ Tick 19

  a <- spawn (Name "A", Comp1)
  b <- spawn (Name "B", Comp1)
  c <- spawn (Name "C", Comp1)

  setSystemTicks (Tick 1) (Tick 3)

  assertqWith
    [q|Name / With Comp1, Changed Name (\a b -> a == Tick 19 && b == Tick 1) (\a b -> a == Tick 19 && b == Tick 3)|]
    [(a, Name "A"), (b, Name "B"), (c, Name "C")]

test3 :: System ()
test3 = simulateSystem $ do
  setTick $ Tick 1

  a <- spawn (Name "A", Comp1)
  b <- spawn (Name "B", Comp1)
  c <- spawn (Name "C", Comp1)

  setSystemTicks (Tick 1) (Tick 3)

  assertqWith
    [q|Name / Changed Name (>=) (<)|]
    [(a, Name "A"), (b, Name "B"), (c, Name "C")]

test4 :: System ()
test4 = simulateSystem $ do
  setTick $ Tick 1
  a <- spawn (Name "A", Comp1)
  b <- spawn (Name "B", Comp1)
  c <- spawn (Name "C", Comp1)

  setTick $ Tick 2
  setSystemTicks (Tick 1) (Tick 3)

  assertqWith
    [q|Name / Changed Name (>=) (<)|]
    [(a, Name "A"), (b, Name "B"), (c, Name "C")]

  setSystemTicks (Tick 2) (Tick 3)

  assertqWith
    [q|Name / Changed Name|]
    []

  insert (Name "A") a

  assertqWith
    [q|Name / Changed Name (>=) (<)|]
    [(a, Name "A"), (b, Name "B"), (c, Name "C")]

  setTick $ Tick 3
  setSystemTicks (Tick 3) (Tick 3)

  insert (Comp2, Name "A") a

  assertqWith
    [q|Name / Changed Name (==) (==)|]
    [(a, Name "A")]

test5 :: System ()
test5 = simulateSystem $ do
  setTick $ Tick 1
  a <- spawn (Name "A")
  b <- spawn (Name "B")
  c <- spawn (Name "C")

  setSystemTicks (Tick 1) (Tick 3)

  assertqContainsWith
    [q|Name / Changed Name|]
    [(a, Name "A"), (b, Name "B"), (c, Name "C")]