packages feed

mischief-ecs-0.2.0.0: test/Utils.hs

module Utils where

import Data.List (isSubsequenceOf, sortBy, sortOn)
import GHC.Stack (HasCallStack)
import Mischief.ECS
import Mischief.ECS (App (..), Component, MonadSystem, System)
import Mischief.ECS.App (App (..))
import Mischief.ECS.EntityDef
import Mischief.ECS.World (runSystem)

runTests :: [System ()] -> IO ()
runTests [] = pure ()
runTests (x : xs) = do
  app <- newApp
  sys app x
  runTests xs

sys :: App -> System () -> IO ()
sys app s = runSystem s app.world

assertEq :: (HasCallStack, Eq a, Show a, Applicative m) => a -> a -> m ()
assertEq a b | a == b = pure ()
assertEq a b = error $ "assert eq failed:\n" ++ show a ++ "\n" ++ show b

assertContains :: (HasCallStack, Eq a, Show a, Applicative m) => [a] -> [a] -> m ()
assertContains a b =
  if isSubsequenceOf b a
    then pure ()
    else
      error $ "assert contains failed:\n" ++ show a ++ "\n" ++ show b

assertq :: (HasCallStack, Eq a, Show a, MonadSystem w m) => Query m a -> Query m a -> m ()
assertq a b = do
  a <- sortOn fst <$> query (qentity a)
  b <- sortOn fst <$> query (qentity b)
  assertEq a b

assertqContains :: (HasCallStack, Eq a, Show a, MonadSystem w m) => Query m a -> Query m a -> m ()
assertqContains a b = do
  a <- sortOn fst <$> query (qentity a)
  b <- sortOn fst <$> query (qentity b)
  assertContains a b

assertqWith :: (HasCallStack, Eq a, Show a, MonadSystem w m) => Query m a -> [(Entity, a)] -> m ()
assertqWith a b = do
  a <- sortOn fst <$> query (qentity a)
  assertEq a (sortOn fst b)

assertqContainsWith :: (HasCallStack, Eq a, Show a, MonadSystem w m) => Query m a -> [(Entity, a)] -> m ()
assertqContainsWith a b = do
  a <- sortOn fst <$> query (qentity a)
  assertContains a (sortOn fst b)

newtype Pos = Pos Int deriving (Component, Eq, Show)

newtype Velocity = Velocity Int deriving (Component, Eq, Show)

newtype Likes = Likes Int deriving (Component, Eq, Show)

data Comp1 = Comp1 deriving (Component, Eq, Show)

data Comp2 = Comp2 deriving (Component, Eq, Show)

data Comp3 = Comp3 deriving (Component, Eq, Show)