When describing items in the inventory, both in detail and when producing menus from those items, describe not just the item itself but also *where* in the inventory the item is (either in the backpack, or wielded in either or both of the hands). This uses a new InventoryPosition datatype, and a method to get a list of items in the inventory associated with their inventory position. When *removing* items from the inventory (to wield, drop, or eat them), we want to make sure we remove from the right position, so this also introduces a `removeItemAtPosition` method to make that happen correctly. Finally, some of the tests for this stuff was getting really slow - I narrowed this down to runaway arbitrary generation for message Templates, so I've tweaked the Arbitrary instance for that type to generate smaller values. Change-Id: I24e9948adae24b0ca9bf13955602108ca9079dcc Reviewed-on: https://cl.tvl.fyi/c/depot/+/3228 Reviewed-by: grfn <grfn@gws.fyi> Tested-by: BuildkiteCI
		
			
				
	
	
		
			42 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Haskell
		
	
	
	
	
	
			
		
		
	
	
			42 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Haskell
		
	
	
	
	
	
{-# OPTIONS_GHC -Wno-type-defaults #-}
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
module Xanthous.Entities.CharacterSpec (main, test) where
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
import           Test.Prelude
 | 
						|
import           Data.Vector.Lens (toVectorOf)
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
import           Xanthous.Entities.Character
 | 
						|
import           Xanthous.Util (endoTimes)
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
 | 
						|
main :: IO ()
 | 
						|
main = defaultMain test
 | 
						|
 | 
						|
test :: TestTree
 | 
						|
test = testGroup "Xanthous.Entities.CharacterSpec"
 | 
						|
  [ testGroup "Knuckles"
 | 
						|
    [ testBatch $ monoid @Knuckles mempty
 | 
						|
    , testGroup "damageKnuckles"
 | 
						|
      [ testCase "caps at 5" $
 | 
						|
          let knuckles' = endoTimes 6 damageKnuckles mempty
 | 
						|
          in _knuckleDamage knuckles' @?= 5
 | 
						|
      ]
 | 
						|
    ]
 | 
						|
  , testGroup "Inventory"
 | 
						|
    [ testProperty "items === itemsWithPosition . _2" $ \inv ->
 | 
						|
        inv ^.. items === inv ^.. itemsWithPosition . _2
 | 
						|
    , testGroup "removeItemFromPosition" $
 | 
						|
      let rewield w inv =
 | 
						|
            let (old, inv') = inv & wielded <<.~ w
 | 
						|
            in inv' & backpack <>~ toVectorOf (wieldedItems . wieldedItem) old
 | 
						|
      in [ (Backpack, \item -> backpack %~ (item ^. wieldedItem <|))
 | 
						|
         , (LeftHand, rewield . inLeftHand)
 | 
						|
         , (RightHand, rewield . inRightHand)
 | 
						|
         , (BothHands, rewield . review doubleHanded)
 | 
						|
         ] <&> \(pos, addItem) ->
 | 
						|
           testProperty (show pos) $ \inv item ->
 | 
						|
             let inv' = addItem item inv
 | 
						|
                 inv'' = removeItemFromPosition pos (item ^. wieldedItem) inv'
 | 
						|
             in inv'' ^.. items === inv ^.. items
 | 
						|
    ]
 | 
						|
  ]
 |