packages feed

MazesOfMonad-1.0.2: src/MoresmauJP/Rpg/MazeObjectsTests.hs

-- | Items and Mazes hunit tests
-- (c) JP Moresmau 2009
module MoresmauJP.Rpg.MazeObjectsTests where

import qualified Data.Map as M

import MoresmauJP.Maze1.Maze
import MoresmauJP.Rpg.Character
import MoresmauJP.Rpg.CharacterTests
import MoresmauJP.Rpg.Inventory
import MoresmauJP.Rpg.MazeObjects
import MoresmauJP.Rpg.NPC
import MoresmauJP.Rpg.NPCTests

import MoresmauJP.Util.Random

import System.Random

import Test.HUnit

mazeObjectsTests=TestList [testScrollFill,testKillNPC,testKillNPC2HandBag,testKillNPC2HandHand]

testScrollFill= TestLabel "Test filling scroll" (TestCase (do
	let sc=Scroll "" "" 5
	sc2<-evalRandT (generateScroll sc) (mkTestWrapper [2])
	assertEqual "not proper scroll" (Scroll "Scroll of Feel Better" "Feel Better" 5) sc2
	))
	
testKillNPC=TestLabel "Test kill NPC" (TestCase (do
	std<-getStdGen
	gw0<-(evalRandT (generateGameWorld (2,2)) (ProductionRandom std)) 
	
	let 
		gw=gw0{position=(0,0)}
		jp=createTestChar "JP"
		item=Weapon "Sword" 2 6 1 10
		v1=(createTestNPC "Victim")
		vc1=(npcCharacter v1){inventory=makeFullInventory [(Bag 1,item)] 10 100}
		victim=v1{npcCharacter=vc1}
		mz=MazeObjects M.empty (M.fromList [((0,0),victim)])
		(mz2,jp2,g)=killNPC gw mz jp
		dropped=M.lookup (0,0) (items mz2)
	assertEqual "Gold in JP's pocket is not 100" 100 (getGold $ inventory jp2)
	assertEqual "Gold message is not 100" 100 g
	assertEqual "item not dropped" (Just [item]) dropped
	))
	
testKillNPC2HandBag=TestLabel "Test kill NPC 2 Handed weapon in Bag" (TestCase (do
	std<-getStdGen
	gw0<-(evalRandT (generateGameWorld (2,2)) (ProductionRandom std)) 
	
	let 
		gw=gw0{position=(0,0)}
		jp=createTestChar "JP"
		item=Weapon "2 Handed Sword" 4 12 2 20
		v1=(createTestNPC "Victim")
		vc1=(npcCharacter v1){inventory=makeFullInventory [(Bag 1,item)] 10 100}
		victim=v1{npcCharacter=vc1}
		mz=MazeObjects M.empty (M.fromList [((0,0),victim)])
		(mz2,jp2,g)=killNPC gw mz jp
		dropped=M.lookup (0,0) (items mz2)
	assertEqual "Gold in JP's pocket is not 100" 100 (getGold $ inventory jp2)
	assertEqual "Gold message is not 100" 100 g
	assertEqual "item not dropped" (Just [item]) dropped
	))	
	
testKillNPC2HandHand=TestLabel "Test kill NPC 2 Handed weapon in Hand" (TestCase (do
	std<-getStdGen
	gw0<-(evalRandT (generateGameWorld (2,2)) (ProductionRandom std)) 
	
	let 
		gw=gw0{position=(0,0)}
		jp=createTestChar "JP"
		item=Weapon "2 Handed Sword" 4 12 2 20
		v1=(createTestNPC "Victim")
		inv1=makeFullInventory [] 10 100
		Right (inv2,_)=MoresmauJP.Rpg.Inventory.takeItem inv1 item RightHand
		vc1=(npcCharacter v1){inventory=inv2}
		victim=v1{npcCharacter=vc1}
		mz=MazeObjects M.empty (M.fromList [((0,0),victim)])
		(mz2,jp2,g)=killNPC gw mz jp
		dropped=M.lookup (0,0) (items mz2)
	assertEqual "Gold in JP's pocket is not 100" 100 (getGold $ inventory jp2)
	assertEqual "Gold message is not 100" 100 g
	assertEqual "item not dropped" (Just [item]) dropped
	))