MazesOfMonad-1.0: src/MoresmauJP/Rpg/TradeTests.hs
-- | trade hunit tests
-- (c) JP Moresmau 2009
module MoresmauJP.Rpg.TradeTests where
import MoresmauJP.Rpg.Actions
import MoresmauJP.Rpg.Character
import MoresmauJP.Rpg.CharacterTests
import MoresmauJP.Rpg.Items
import MoresmauJP.Rpg.Inventory
import MoresmauJP.Rpg.Trade
import Test.HUnit
tradeTests=TestList [testEmpty,testBuy,testBuyTooDear,testBuyHandPremium,
testSell,testSellTooDear,testSellHandPremium,
testExchange]
testEmpty=TestLabel "Test Empty" (TestCase (do
let jp=createTestChar "JP"
let merchant=createTestChar "Merchant"
assertEqual "Non empty Buy" 0 (length $ listTradeItems jp merchant Buy (Success Standard 1))
assertEqual "Non empty Sell" 0 (length $ listTradeItems jp merchant Sell (Success Standard 1))
assertEqual "Non empty Exchange" 0 (length $ listTradeItems jp merchant Exchange (Success Standard 1))
))
testBuy=TestLabel "Test Buy" (TestCase (do
let jp=(createTestChar "JP"){inventory=(makeEmptyInventory 10 10)}
let Right (i,_)=takeItem mkEmptyInventory sword (Bag 1)
let merchant=(createTestChar "Merchant"){inventory=i}
let buyops=listTradeItems jp merchant Buy (Success Standard 1)
assertEqual "Non single Buy" 1 (length buyops)
assertEqual "Non equal to sword" (ToBuy (Bag 1,sword) 10) (head buyops)
let (jp2,merchant2,dropped)=doTradeOperation (jp,Just (Bag 1)) (merchant,Nothing) (head buyops)
assertEqual "merchant gold not equals to 10" 10 (getGold $ inventory merchant2)
assertEqual "JP does not have the sword!" (Bag 1,sword) (head $ listCarriedItems $ inventory jp2)
assertEqual "Dropped is not null" 0 (length dropped)
))
testBuyTooDear=TestLabel "Test Buy Too Dear" (TestCase (do
let jp=(createTestChar "JP"){inventory=(makeEmptyInventory 10 1)}
let Right (i,_)=takeItem mkEmptyInventory sword (Bag 1)
let merchant=(createTestChar "Merchant"){inventory=i}
assertEqual "Non empty Buy" 0 (length $ listTradeItems jp merchant Buy (Success Standard 1))
))
testBuyHandPremium=TestLabel "Test Buy Hand Premium" (TestCase (do
let jp=(createTestChar "JP"){inventory=(makeEmptyInventory 10 20)}
let Right (i,_)=takeItem mkEmptyInventory sword RightHand
let merchant=(createTestChar "Merchant"){inventory=i}
let buyops=listTradeItems jp merchant Buy (Success Standard 1)
assertEqual "Non single Buy" 1 (length buyops)
assertEqual "Non equal to sword" (ToBuy (RightHand,sword) 14) (head buyops)
))
testSell=TestLabel "Test Sell" (TestCase (do
let Right (i,_)=takeItem mkEmptyInventory sword (Bag 1)
let jp=(createTestChar "JP"){inventory=i}
let merchant=(createTestChar "Merchant"){inventory=(makeEmptyInventory 10 10)}
let sellops=listTradeItems jp merchant Sell (Success Standard 1)
assertEqual "Non single Sell" 1 (length sellops)
assertEqual "Non equal to sword" (ToSell (Bag 1,sword) 10) (head sellops)
))
testSellTooDear=TestLabel "Test Sell Too Dear" (TestCase (do
let Right (i,_)=takeItem mkEmptyInventory sword (Bag 1)
let jp=(createTestChar "JP"){inventory=i}
let merchant=(createTestChar "Merchant"){inventory=(makeEmptyInventory 10 1)}
assertEqual "Non empty Sell" 0 (length $ listTradeItems jp merchant Sell (Success Standard 1))
))
testSellHandPremium=TestLabel "Test Sell Hand Premium" (TestCase (do
let Right (i,_)=takeItem mkEmptyInventory sword RightHand
let jp=(createTestChar "JP"){inventory=i}
let merchant=(createTestChar "Merchant"){inventory=(makeEmptyInventory 10 20)}
let sellops=listTradeItems jp merchant Sell (Success Standard 1)
assertEqual "Non single Sell" 1 (length sellops)
assertEqual "Non equal to sword" (ToSell (RightHand,sword) 14) (head sellops)
))
testExchange=TestLabel "Test Exchange" (TestCase (do
let Right (i,_)=takeItem mkEmptyInventory sword (Bag 1)
let jp=(createTestChar "JP"){inventory=i}
let Right (i2,_)=takeItem mkEmptyInventory sword (Bag 2)
let merchant=(createTestChar "Merchant"){inventory=i2}
let excops=listTradeItems jp merchant Exchange (Success Standard 1)
assertEqual "Non single Exchange" 1 (length excops)
assertEqual "Non equal to sword" (ToExchange (Bag 1,sword) (Bag 2,sword) ) (head excops)
let Right (ijp2,[])=takeItem i dagger (Bag 2)
let Right (im2,[])=takeItem i2 hatchet (Bag 3)
assertEqual "getNpcPosition" (Just RightHand) (getNpcPosition (head excops) im2)
let (jp2,merchant2,dropped)=doTradeOperation (jp{inventory=ijp2},Just (Bag 2)) (merchant{inventory=im2},Just (Bag 3)) (head excops)
assertEqual "JP2 does not have the sword!" (Bag 2,sword) (head $ listCarriedItems $ inventory jp2)
assertEqual "Merchant does not have the sword!" (Bag 3,sword) (head $ listCarriedItems $ inventory merchant2)
assertEqual "dropped is not 2" 2 (length dropped)
assertBool "dropped does not contain dagger" (elem dagger dropped)
assertBool "dropped does not contain hatchet" (elem hatchet dropped)
))