about summary refs log tree commit diff
path: root/users/grfn/xanthous/test/Xanthous
diff options
context:
space:
mode:
authorGriffin Smith <grfn@gws.fyi>2021-11-24T22·10-0500
committergrfn <grfn@gws.fyi>2021-11-25T17·31+0000
commit4b11859d046b470a87d73edc8447ed73a3f7a6da (patch)
tree5824920ffba3d90a87ce491055ec333af9e675c4 /users/grfn/xanthous/test/Xanthous
parentbf4d8ab603a754c326d946e1a51c6ff641142e56 (diff)
feat(gs/xanthous): Allow generating creatures with items r/3097
Add an `equippedItems` field to the CreatureType raw, which provides a
chance for generating that creature with an item equipped, which goes
into a new `inventory` field on the creature entity itself. Currently
the creature doesn't actually *use* this equipped item, but it's a step.

This commit also adds a broken-dagger equipped 90% of the time to the
"husk" creature.

Change-Id: I6416c0678ba7bc1b002c5ce6119f7dc97dd86437
Diffstat (limited to 'users/grfn/xanthous/test/Xanthous')
-rw-r--r--users/grfn/xanthous/test/Xanthous/Entities/RawTypesSpec.hs39
-rw-r--r--users/grfn/xanthous/test/Xanthous/Entities/RawsSpec.hs14
-rw-r--r--users/grfn/xanthous/test/Xanthous/Game/StateSpec.hs7
3 files changed, 46 insertions, 14 deletions
diff --git a/users/grfn/xanthous/test/Xanthous/Entities/RawTypesSpec.hs b/users/grfn/xanthous/test/Xanthous/Entities/RawTypesSpec.hs
index f5feb8a506db..e23f7faba3a6 100644
--- a/users/grfn/xanthous/test/Xanthous/Entities/RawTypesSpec.hs
+++ b/users/grfn/xanthous/test/Xanthous/Entities/RawTypesSpec.hs
@@ -1,8 +1,11 @@
+{-# LANGUAGE RecordWildCards #-}
 --------------------------------------------------------------------------------
 module Xanthous.Entities.RawTypesSpec (main, test) where
 --------------------------------------------------------------------------------
 import           Test.Prelude
 --------------------------------------------------------------------------------
+import           Data.Interval (Extended(..), (<=..<=))
+--------------------------------------------------------------------------------
 import           Xanthous.Entities.RawTypes
 --------------------------------------------------------------------------------
 
@@ -12,17 +15,31 @@ main = defaultMain test
 test :: TestTree
 test = testGroup "Xanthous.Entities.RawTypesSpec"
   [ testGroup "CreatureGenerateParams"
-    [ testBatch $ monoid @CreatureGenerateParams mempty
-    , testGroup "canGenerate"
-      [ testProperty "no bounds" $ \level ->
-          let gps = CreatureGenerateParams Nothing Nothing
-          in canGenerate level gps
-      , testProperty "min bound" $ \level minB ->
-          let gps = CreatureGenerateParams (Just minB) Nothing
-          in canGenerate level gps === (level >= minB)
-      , testProperty "max bound" $ \level maxB ->
-          let gps = CreatureGenerateParams Nothing (Just maxB)
-          in canGenerate level gps === (level <= maxB)
+    [ testGroup "Ord laws"
+      [ testProperty "comparability" $ \(a :: CreatureGenerateParams) b ->
+          a <= b || b <= a
+      , testProperty "transitivity" $ \(a :: CreatureGenerateParams) b c ->
+          a <= b && b <= c ==> a <= c
+      , testProperty "reflexivity" $ \(a :: CreatureGenerateParams) ->
+          a <= a
+      , testProperty "antisymmetry" $ \(a :: CreatureGenerateParams) b ->
+          (a <= b && b <= a) == (a == b)
       ]
+    , testGroup "canGenerate" $
+      let makeParams minB maxB =
+            let _levelRange = maybe NegInf Finite minB <=..<= maybe PosInf Finite maxB
+                _equippedItem = Nothing
+            in CreatureGenerateParams {..}
+      in
+        [ testProperty "no bounds" $ \level ->
+            let gps = makeParams Nothing Nothing
+            in canGenerate level gps
+        , testProperty "min bound" $ \level minB ->
+            let gps = makeParams (Just minB) Nothing
+            in canGenerate level gps === (level >= minB)
+        , testProperty "max bound" $ \level maxB ->
+            let gps = makeParams Nothing (Just maxB)
+            in canGenerate level gps === (level <= maxB)
+        ]
     ]
   ]
diff --git a/users/grfn/xanthous/test/Xanthous/Entities/RawsSpec.hs b/users/grfn/xanthous/test/Xanthous/Entities/RawsSpec.hs
index 2e6f35457fc7..b6c80be51be7 100644
--- a/users/grfn/xanthous/test/Xanthous/Entities/RawsSpec.hs
+++ b/users/grfn/xanthous/test/Xanthous/Entities/RawsSpec.hs
@@ -4,6 +4,8 @@ module Xanthous.Entities.RawsSpec (main, test) where
 
 import Test.Prelude
 import Xanthous.Entities.Raws
+import Xanthous.Entities.RawTypes
+       (_Creature, entityName, generateParams, HasEquippedItem (equippedItem))
 
 main :: IO ()
 main = defaultMain test
@@ -12,5 +14,17 @@ test :: TestTree
 test = testGroup "Xanthous.Entities.Raws"
   [ testGroup "raws"
     [ testCase "are all valid" $ raws `deepseq` pure ()
+    , testCase "all CreatureEquippedItems reference existent entity names" $
+      let notFound
+            = raws
+              ^.. folded
+              . _Creature
+              . generateParams
+              . _Just
+              . equippedItem
+              . _Just
+              . entityName
+              . filtered (isNothing . raw)
+      in null notFound @? ("Some entities weren't found: " <> show notFound)
     ]
   ]
diff --git a/users/grfn/xanthous/test/Xanthous/Game/StateSpec.hs b/users/grfn/xanthous/test/Xanthous/Game/StateSpec.hs
index b02abb04b49c..34584f73b2ad 100644
--- a/users/grfn/xanthous/test/Xanthous/Game/StateSpec.hs
+++ b/users/grfn/xanthous/test/Xanthous/Game/StateSpec.hs
@@ -4,9 +4,10 @@ module Xanthous.Game.StateSpec (main, test) where
 import           Test.Prelude
 --------------------------------------------------------------------------------
 import           Xanthous.Game.State
-import           Xanthous.Entities.Raws (raws, entityFromRaw)
-import Control.Monad.Random (evalRandT)
-import System.Random (getStdGen)
+import           Xanthous.Entities.Raws (raws)
+import           Xanthous.Generators.Level.LevelContents (entityFromRaw)
+import           Control.Monad.Random (evalRandT)
+import           System.Random (getStdGen)
 --------------------------------------------------------------------------------
 
 main :: IO ()