packages feed

swarm-0.1.0.0: test/unit/TestInventory.hs

{-# LANGUAGE OverloadedStrings #-}

-- | Swarm unit tests
module TestInventory where

import Control.Lens ((^.))
import Data.Hashable
import Swarm.Game.Display
import Swarm.Game.Entity qualified as E
import Test.Tasty
import Test.Tasty.HUnit

testInventory :: TestTree
testInventory =
  testGroup
    "Inventory"
    [ testCase
        "insert 0 / hash"
        ( assertEqual
            "insertCount 0 x empty has same hash as x"
            (x ^. E.entityHash)
            (hash (E.insertCount 0 x E.empty))
        )
    , testCase
        "insert / hash"
        ( assertEqual
            "insert x empty has same hash as 2*x"
            (2 * (x ^. E.entityHash))
            (hash (E.insert x E.empty))
        )
    , testCase
        "insert / insert"
        ( assertEqual
            "insert x y gives same hash as insert y x"
            (hash (E.insert x (E.insert y E.empty)))
            (hash (E.insert y (E.insert x E.empty)))
        )
    , testCase
        "insert 2 / delete"
        ( assertEqual
            "insert 2, delete 1 gives same hash as insert 1"
            (hash (E.insert x E.empty))
            (hash (E.delete x (E.insertCount 2 x E.empty)))
        )
    , testCase
        "insert 2 / delete 3"
        ( assertEqual
            "insert 2, delete 3 gives hash of x"
            (x ^. E.entityHash)
            (hash (E.deleteCount 3 x (E.insertCount 2 x E.empty)))
        )
    , testCase
        "deleteAll"
        ( assertEqual
            "insert 2 x, insert 2 y, deleteAll x same hash as insert 2 y, insertCount 0 x"
            (hash (E.insertCount 0 x (E.insertCount 2 y E.empty)))
            (hash (E.deleteAll x (E.insertCount 2 y (E.insertCount 2 x E.empty))))
        )
    , testCase
        "union"
        ( assertEqual
            "insert 2 x union insert 3 x same as insert 5 x"
            (hash (E.insertCount 5 x E.empty))
            (hash (E.union (E.insertCount 2 x E.empty) (E.insertCount 3 x E.empty)))
        )
    , testCase
        "difference"
        ( assertEqual
            "{(2,x),(3,y)} difference {(3,x),(1,y)} = {(0,x), (2,y)}"
            ( hash
                ( E.insertCount 2 x (E.insertCount 3 y E.empty)
                    `E.difference` E.insertCount 3 x (E.insertCount 1 y E.empty)
                )
            )
            (hash (E.insertCount 0 x (E.insertCount 2 y E.empty)))
        )
    , testCase
        "subset / yes"
        ( assertBool
            "{(0,x),(3,y),(2,z)} isSubsetOf {(3,y),(4,z)}"
            ( E.insertCount 0 x (E.insertCount 3 y (E.insertCount 2 z E.empty))
                `E.isSubsetOf` E.insertCount 3 y (E.insertCount 4 z E.empty)
            )
        )
    , testCase
        "subset / no"
        ( assertBool
            "{(2,x),(3,y)} isSubsetOf {(1,x),(4,y)}"
            ( not
                ( E.insertCount 2 x (E.insertCount 3 y E.empty)
                    `E.isSubsetOf` E.insertCount 1 x (E.insertCount 4 y E.empty)
                )
            )
        )
    , testCase
        "isEmpty / yes"
        ( assertBool
            "isEmpty {(0,x),(0,y)}"
            (E.isEmpty (E.insertCount 0 x (E.insertCount 0 y E.empty)))
        )
    , testCase
        "isEmpty / no"
        ( assertBool
            "isEmpty {(0,x),(1,y)}"
            (not (E.isEmpty (E.insertCount 0 x (E.insertCount 1 y E.empty))))
        )
    ]
 where
  x = E.mkEntity (defaultEntityDisplay 'X') "fooX" [] [] []
  y = E.mkEntity (defaultEntityDisplay 'Y') "fooY" [] [] []
  z = E.mkEntity (defaultEntityDisplay 'Z') "fooZ" [] [] []