MazesOfMonad-1.0.4: src/MoresmauJP/Rpg/ArenaTests.hs
-- | The "arena" hunit tests
-- (c) JP Moresmau 2009
module MoresmauJP.Rpg.ArenaTests where
import Control.Monad.State
import Control.Monad.Writer
import MoresmauJP.Core.Screen
import MoresmauJP.Rpg.Arena
import MoresmauJP.Rpg.Character
import MoresmauJP.Rpg.CharacterTests
import MoresmauJP.Rpg.Inventory
import MoresmauJP.Rpg.NPC
import MoresmauJP.Rpg.NPCTests
import MoresmauJP.Util.Random
import Test.HUnit
arenaTests=TestList [testStealFailure,testStealFailureExceptional,testStealSuccess,
testStealSuccessGold,testStealSuccessGoldItem,testStealSuccessNothing,
testConvertFailure,testConvertFailureExceptional,testConvertSuccess,
testBribeSuccess,testBribeSuccessAttitude,testBribeFailure,testBribeFailureExceptional,testBribeNoGold,
testPrayerSuccess,testPrayerFailure,testPrayerFailureExceptional,
testPossibleActions]
testStealFailure=TestLabel "Test Steal Failure" (TestCase (do
let jp=createTestChar "JP"
let item=Weapon "Sword" 2 6 1 10
let v1=(createTestNPC "Victim")
let vc1=(npcCharacter v1){inventory=makeFullInventory [(Bag 1,item)] 10 100}
let victim=v1{npcCharacter=vc1}
let arena=Arena jp victim Nothing True [] 0 newFightInfo
let gs=GameState arena Nothing
gs2<- execStateT (evalRandT (runWriterT stealInArena) (mkTestWrapper [12])) gs
let arena2=gsData gs2
assertEqual "status not finished" (Just Finished) (es arena2)
assertEqual "not zero items" 0 (length $ arenaItems arena2)
assertEqual "not item in victim bag" item (snd $ head $ filter (((Bag 1) ==) . fst) $
listCarriedItems $ inventory $ npcCharacter $ arenaOpponent arena2)
assertEqual "attitude is not 8" 8 (npcAttitude $ arenaOpponent arena2)
assertEqual "gold is not 0" 0 (getGold $ inventory $ arenaCharacter arena2)
))
testStealFailureExceptional=TestLabel "Test Steal Failure Exceptional" (TestCase (do
let jp=createTestChar "JP"
let item=Weapon "Sword" 2 6 1 10
let v1=(createTestNPC "Victim")
let vc1=(npcCharacter v1){inventory=makeFullInventory [(Bag 1,item)] 10 100}
let victim=v1{npcCharacter=vc1}
let arena=Arena jp victim Nothing True [] 0 newFightInfo
let gs=GameState arena Nothing
gs2<- execStateT (evalRandT (runWriterT stealInArena) (mkTestWrapper [20])) gs
let arena2=gsData gs2
assertEqual "status finished" Nothing (es arena2)
assertEqual "not zero items" 0 (length $ arenaItems arena2)
assertEqual "not item in victim bag" item (snd $ head $ filter (((Bag 1) ==) . fst) $
listCarriedItems $ inventory $ npcCharacter $ arenaOpponent arena2)
assertEqual "attitude is not 1" 1 (npcAttitude $ arenaOpponent arena2)
assertEqual "gold is not 0" 0 (getGold $ inventory $ arenaCharacter arena2)
))
testStealSuccess=TestLabel "Test Steal Success" (TestCase (do
let jp=createTestChar "JP"
let item=Weapon "Sword" 2 6 1 10
let v1=(createTestNPC "Victim")
let vc1=(npcCharacter v1){inventory=makeFullInventory [(Bag 1,item)] 10 100}
let victim=v1{npcCharacter=vc1}
let arena=Arena jp victim Nothing True [] 0 newFightInfo
let gs=GameState arena Nothing
gs2<- execStateT (evalRandT (runWriterT stealInArena) (mkTestWrapper [8])) gs
let arena2=gsData gs2
assertEqual "status not finished" (Just Finished) (es arena2)
assertEqual "not one item" 1 (length $ arenaItems arena2)
assertEqual "not sword" item (head $ arenaItems arena2)
assertEqual "item in victim bag" 0 (length $ filter (((Bag 1) ==) . fst) $
listCarriedItems $ inventory $ npcCharacter $ arenaOpponent arena2)
assertEqual "attitude is not 10" 10 (npcAttitude $ arenaOpponent arena2)
assertEqual "gold is not 0" 0 (getGold $ inventory $ arenaCharacter arena2)
))
testStealSuccessGold=TestLabel "Test Steal Success Gold" (TestCase (do
let jp=createTestChar "JP"
let v1=(createTestNPC "Victim")
let vc1=(npcCharacter v1){inventory=makeFullInventory [] 10 100}
let victim=v1{npcCharacter=vc1}
let arena=Arena jp victim Nothing True [] 0 newFightInfo
let gs=GameState arena Nothing
gs2<- execStateT (evalRandT (runWriterT stealInArena) (mkTestWrapper [8])) gs
let arena2=gsData gs2
assertEqual "status not finished" (Just Finished) (es arena2)
assertEqual "not zero item" 0 (length $ arenaItems arena2)
assertEqual "attitude is not 10" 10 (npcAttitude $ arenaOpponent arena2)
assertEqual "jp gold is not 5" 5 (getGold $ inventory $ arenaCharacter arena2)
assertEqual "victim gold is not 95" 95 (getGold $ inventory $ npcCharacter $ arenaOpponent arena2)
))
testStealSuccessGoldItem=TestLabel "Test Steal Success Gold+Item" (TestCase (do
let jp=createTestChar "JP"
let item=Weapon "Sword" 2 6 1 10
let v1=(createTestNPC "Victim")
let vc1=(npcCharacter v1){inventory=makeFullInventory [(Bag 1,item)] 10 100}
let victim=v1{npcCharacter=vc1}
let arena=Arena jp victim Nothing True [] 0 newFightInfo
let gs=GameState arena Nothing
gs2<- execStateT (evalRandT (runWriterT stealInArena) (mkTestWrapper [4])) gs
let arena2=gsData gs2
assertEqual "status not finished" (Just Finished) (es arena2)
assertEqual "not one item" 1 (length $ arenaItems arena2)
assertEqual "not sword" item (head $ arenaItems arena2)
assertEqual "item in victim bag" 0 (length $ filter (((Bag 1) ==) . fst) $
listCarriedItems $ inventory $ npcCharacter $ arenaOpponent arena2)
assertEqual "attitude is not 10" 10 (npcAttitude $ arenaOpponent arena2)
assertEqual "jp gold is not 18" 18 (getGold $ inventory $ arenaCharacter arena2)
assertEqual "victim gold is not 82" 82 (getGold $ inventory $ npcCharacter $ arenaOpponent arena2)
))
testStealSuccessNothing=TestLabel "Test Steal Success Nothing" (TestCase (do
let jp=createTestChar "JP"
let v1=(createTestNPC "Victim")
let vc1=(npcCharacter v1){inventory=makeFullInventory [] 10 0}
let victim=v1{npcCharacter=vc1}
let arena=Arena jp victim Nothing True [] 0 newFightInfo
let gs=GameState arena Nothing
gs2<- execStateT (evalRandT (runWriterT stealInArena) (mkTestWrapper [8])) gs
let arena2=gsData gs2
assertEqual "status not finished" (Just Finished) (es arena2)
assertEqual "not zero item" 0 (length $ arenaItems arena2)
assertEqual "attitude is not 10" 10 (npcAttitude $ arenaOpponent arena2)
assertEqual "gold is not 0" 0 (getGold $ inventory $ arenaCharacter arena2)
assertEqual "victim gold is not 0" 0 (getGold $ inventory $ npcCharacter $ arenaOpponent arena2)
))
testConvertFailure=TestLabel "Test Convert Failure" (TestCase (do
let jp=createTestChar "JP"
let item=Weapon "Sword" 2 6 1 10
let v1=(createTestNPC "Victim")
let vc1=(npcCharacter v1){inventory=makeFullInventory [(Bag 1,item)] 10 100}
let victim=v1{npcCharacter=vc1}
let arena=Arena jp victim Nothing True [] 0 newFightInfo
let gs=GameState arena Nothing
gs2<- execStateT (evalRandT (runWriterT convertInArena) (mkTestWrapper [12])) gs
let arena2=gsData gs2
assertEqual "status not finished" (Just Finished) (es arena2)
assertEqual "not zero items" 0 (length $ arenaItems arena2)
assertEqual "not item in victim bag" item (snd $ head $ filter (((Bag 1) ==) . fst) $
listCarriedItems $ inventory $ npcCharacter $ arenaOpponent arena2)
assertEqual "attitude is not 10" 10 (npcAttitude $ arenaOpponent arena2)
assertEqual "gold is not 0" 0 (getGold $ inventory $ arenaCharacter arena2)
))
testConvertFailureExceptional=TestLabel "Test Convert Failure Exceptional" (TestCase (do
let jp=createTestChar "JP"
let item=Weapon "Sword" 2 6 1 10
let v1=(createTestNPC "Victim")
let vc1=(npcCharacter v1){inventory=makeFullInventory [(Bag 1,item)] 10 100}
let victim=v1{npcCharacter=vc1}
let arena=Arena jp victim Nothing True [] 0 newFightInfo
let gs=GameState arena Nothing
gs2<- execStateT (evalRandT (runWriterT convertInArena) (mkTestWrapper [20])) gs
let arena2=gsData gs2
assertEqual "status finished" Nothing (es arena2)
assertEqual "not zero items" 0 (length $ arenaItems arena2)
assertEqual "not item in victim bag" item (snd $ head $ filter (((Bag 1) ==) . fst) $
listCarriedItems $ inventory $ npcCharacter $ arenaOpponent arena2)
assertEqual "attitude is not 1" 1 (npcAttitude $ arenaOpponent arena2)
assertEqual "gold is not 0" 0 (getGold $ inventory $ arenaCharacter arena2)
))
testConvertSuccess=TestLabel "Test Convert Success" (TestCase (do
let jp=createTestChar "JP"
let item=Weapon "Sword" 2 6 1 10
let v1=(createTestNPC "Victim")
let vc1=(npcCharacter v1){inventory=makeFullInventory [(Bag 1,item)] 10 100}
let victim=v1{npcCharacter=vc1}
let arena=Arena jp victim Nothing True [] 0 newFightInfo
let gs=GameState arena Nothing
gs2<- execStateT (evalRandT (runWriterT convertInArena) (mkTestWrapper [8])) gs
let arena2=gsData gs2
assertEqual "status not finished" (Just Finished) (es arena2)
assertEqual "not one item" 1 (length $ arenaItems arena2)
assertEqual "not sword" item (head $ arenaItems arena2)
assertEqual "item in victim bag" 0 (length $ filter (((Bag 1) ==) . fst) $
listCarriedItems $ inventory $ npcCharacter $ arenaOpponent arena2)
assertEqual "attitude is not 12" 12 (npcAttitude $ arenaOpponent arena2)
assertEqual "gold is not 0" 0 (getGold $ inventory $ arenaCharacter arena2)
))
testBribeSuccess=TestLabel "Test Bribe Success" (TestCase (do
let jp=(createTestChar "JP"){inventory=makeFullInventory [] 10 100}
let v1=(createTestNPC "Victim")
let vc1=(npcCharacter v1){inventory=makeFullInventory [] 10 100}
let victim=v1{npcCharacter=vc1}
let arena=Arena jp victim Nothing True [] 0 newFightInfo
let gs=GameState arena Nothing
gs2<- execStateT (evalRandT (runWriterT bribeInArena) (mkTestWrapper [8])) gs
let arena2=gsData gs2
assertEqual "status not finished" (Just Finished) (es arena2)
assertEqual "victim gold is not 196" 196 (getGold $ inventory $ npcCharacter $ arenaOpponent arena2)
assertEqual "gold is not 4" 4 (getGold $ inventory $ arenaCharacter arena2)
))
testBribeSuccessAttitude=TestLabel "Test Bribe Success Attitude" (TestCase (do
let jp=(createTestChar "JP"){inventory=makeFullInventory [] 10 100}
let v1=(createTestNPC "Victim"){npcAttitude=12}
let vc1=(npcCharacter v1){inventory=makeFullInventory [] 10 100}
let victim=v1{npcCharacter=vc1}
let arena=Arena jp victim Nothing True [] 0 newFightInfo
let gs=GameState arena Nothing
gs2<- execStateT (evalRandT (runWriterT bribeInArena) (mkTestWrapper [8])) gs
let arena2=gsData gs2
assertEqual "status not finished" (Just Finished) (es arena2)
assertEqual "victim gold is not 194" 194 (getGold $ inventory $ npcCharacter $ arenaOpponent arena2)
assertEqual "gold is not 6" 6 (getGold $ inventory $ arenaCharacter arena2)
))
testBribeFailure=TestLabel "Test Bribe Failure" (TestCase (do
let jp=(createTestChar "JP"){inventory=makeFullInventory [] 10 100}
let v1=(createTestNPC "Victim")
let vc1=(npcCharacter v1){inventory=makeFullInventory [] 10 100}
let victim=v1{npcCharacter=vc1}
let arena=Arena jp victim Nothing True [] 0 newFightInfo
let gs=GameState arena Nothing
gs2<- execStateT (evalRandT (runWriterT bribeInArena) (mkTestWrapper [12])) gs
let arena2=gsData gs2
assertEqual "status finished" Nothing (es arena2)
assertEqual "victim gold is not 100" 100 (getGold $ inventory $ npcCharacter $ arenaOpponent arena2)
assertEqual "gold is not 100" 100 (getGold $ inventory $ arenaCharacter arena2)
))
testBribeNoGold=TestLabel "Test Bribe No Gold" (TestCase (do
let jp=(createTestChar "JP"){inventory=makeFullInventory [] 10 0}
let v1=(createTestNPC "Victim")
let vc1=(npcCharacter v1){inventory=makeFullInventory [] 10 100}
let victim=v1{npcCharacter=vc1}
let arena=Arena jp victim Nothing True [] 0 newFightInfo
let gs=GameState arena Nothing
gs2<- execStateT (evalRandT (runWriterT bribeInArena) (mkTestWrapper [8])) gs
let arena2=gsData gs2
assertEqual "status finished" Nothing (es arena2)
assertEqual "victim gold is not 100" 100 (getGold $ inventory $ npcCharacter $ arenaOpponent arena2)
assertEqual "gold is not 0" 0 (getGold $ inventory $ arenaCharacter arena2)
))
testBribeFailureExceptional=TestLabel "Test Bribe Failure Exceptional" (TestCase (do
let jp=(createTestChar "JP"){inventory=makeFullInventory [] 10 100}
let v1=(createTestNPC "Victim")
let vc1=(npcCharacter v1){inventory=makeFullInventory [] 10 100}
let victim=v1{npcCharacter=vc1}
let arena=Arena jp victim Nothing True [] 0 newFightInfo
let gs=GameState arena Nothing
gs2<- execStateT (evalRandT (runWriterT bribeInArena) (mkTestWrapper [20])) gs
let arena2=gsData gs2
assertEqual "status finished" Nothing (es arena2)
assertEqual "victim gold is not 100" 100 (getGold $ inventory $ npcCharacter $ arenaOpponent arena2)
assertEqual "gold is not 100" 100 (getGold $ inventory $ arenaCharacter arena2)
assertEqual "attitude is not 1" 1 (npcAttitude $ arenaOpponent arena2)
))
testPrayerSuccess=TestLabel "Test Prayer Success" (TestCase (do
let jp=(createTestChar "JP")
let v1=(createTestNPC "Victim")
let arena=Arena jp v1 Nothing True [] 0 newFightInfo
let gs=GameState arena Nothing
gs2<- execStateT (evalRandT (runWriterT prayerInArena) (mkTestWrapper [8])) gs
let arena2=gsData gs2
assertEqual "status not finished" (Just Finished) (es arena2)
assertEqual "attitude is not 12" 12 (npcAttitude $ arenaOpponent arena2)
))
testPrayerFailure=TestLabel "Test Prayer Failure" (TestCase (do
let jp=(createTestChar "JP"){inventory=makeFullInventory [] 10 100}
let v1=(createTestNPC "Victim")
let vc1=(npcCharacter v1){inventory=makeFullInventory [] 10 100}
let victim=v1{npcCharacter=vc1}
let arena=Arena jp victim Nothing True [] 0 newFightInfo
let gs=GameState arena Nothing
gs2<- execStateT (evalRandT (runWriterT prayerInArena) (mkTestWrapper [12])) gs
let arena2=gsData gs2
assertEqual "status finished" Nothing (es arena2)
assertEqual "attitude is not 10" 10 (npcAttitude $ arenaOpponent arena2)
))
testPrayerFailureExceptional=TestLabel "Test Prayer Failure Exceptional" (TestCase (do
let jp=(createTestChar "JP"){inventory=makeFullInventory [] 10 100}
let v1=(createTestNPC "Victim")
let vc1=(npcCharacter v1){inventory=makeFullInventory [] 10 100}
let victim=v1{npcCharacter=vc1}
let arena=Arena jp victim Nothing True [] 0 newFightInfo
let gs=GameState arena Nothing
gs2<- execStateT (evalRandT (runWriterT prayerInArena) (mkTestWrapper [20])) gs
let arena2=gsData gs2
assertEqual "status finished" Nothing (es arena2)
assertEqual "attitude is not 1" 1 (npcAttitude $ arenaOpponent arena2)
))
testPossibleActions=TestLabel "Test possible action" (TestCase (do
let jp=(createTestChar "JP"){inventory=makeFullInventory [] 10 0}
let v1=(createTestNPC "Victim"){npcType=Animal}
let acts1=getPossibleArenaActions jp v1
assertEqual (show [Melee,Escape]) [Melee,Escape] acts1
let jpM1=jp{spells=[Spell "Feel Better" Physical Recovery Permanent]}
let acts2=getPossibleArenaActions jpM1 v1
assertEqual (show [Melee,Escape]) [Melee,Escape] acts2
let jpM2=jp{spells=[Spell "Greasy Fingers" Dexterity Negative Temporary]}
let acts3=getPossibleArenaActions jpM2 v1
assertEqual (show [Melee,Escape,Magic]) [Melee,Escape,Magic] acts3
let v2=(createTestNPC "Victim"){npcType=Human}
let acts4=getPossibleArenaActions jpM2 v2
assertEqual (show [Melee,Escape,Magic,Prayer]) [Melee,Escape,Magic,Prayer] acts4
let jpG=jpM2{inventory=makeFullInventory [] 10 10}
let acts5=getPossibleArenaActions jpG v2
assertEqual (show [Melee,Escape,Magic,Prayer,Bribe]) [Melee,Escape,Magic,Prayer,Bribe] acts5
))