Add unit tests for contrib Barter system.

This commit is contained in:
Griatch 2016-11-26 22:15:45 +01:00
parent 79f2497902
commit b12a850e93
2 changed files with 96 additions and 12 deletions

View file

@ -165,24 +165,24 @@ class TradeHandler(object):
self.partA_accepted = False self.partA_accepted = False
self.partB_accepted = False self.partB_accepted = False
def msg(self, party, string): def msg_other(self, sender, string):
""" """
Relay a message to the other party. This allows the calling Relay a message to the *other* party without needing to know
command to not have to worry about which party they are in the which party that is. This allows the calling command to not
handler. have to worry about which party they are in the handler.
Args: Args:
party (object): One of partA or B. The method will figure sender (object): One of partA or B. The method will figure
out which is which. out the *other* party to send to.
string (str): Text to send. string (str): Text to send.
""" """
if self.partA == party: if self.partA == sender:
self.partB.msg(string) self.partB.msg(string)
elif self.partB == party: elif self.partB == sender:
self.partA.msg(string) self.partA.msg(string)
else: else:
# no match, relay to oneself # no match, relay to oneself
self.party.msg(string) sender.msg(string) if sender else self.partA.msg(string)
def get_other(self, party): def get_other(self, party):
""" """
@ -225,7 +225,7 @@ class TradeHandler(object):
""" """
if self.partB == partB: if self.partB == partB:
self.finish() self.finish(force=True)
return True return True
return False return False
@ -285,7 +285,7 @@ class TradeHandler(object):
return all_offers[imatch] return all_offers[imatch]
except ValueError: except ValueError:
for offer in all_offers: for offer in all_offers:
if offername in offer.aliases: if offer.aliases.get(offername):
return offer return offer
return None return None
@ -396,7 +396,7 @@ class CmdTradeBase(Command):
self.partB = self.tradehandler.partB self.partB = self.tradehandler.partB
self.other = self.tradehandler.get_other(self.caller) self.other = self.tradehandler.get_other(self.caller)
self.msg_other = self.tradehandler.msg self.msg_other = self.tradehandler.msg_other
self.trade_started = self.tradehandler.trade_started self.trade_started = self.tradehandler.trade_started
self.emote = "" self.emote = ""

View file

@ -210,3 +210,87 @@ class TestExtendedRoom(CommandTest):
def test_cmdgametime(self): def test_cmdgametime(self):
self.call(extended_room.CmdGameTime(), "", "It's a summer day, in the morning.") self.call(extended_room.CmdGameTime(), "", "It's a summer day, in the morning.")
# Test the contrib barter system
from evennia import create_object
from evennia.contrib import barter
class TestBarter(CommandTest):
def setUp(self):
super(TestBarter, self).setUp()
self.tradeitem1 = create_object(key="TradeItem1", location=self.char1)
self.tradeitem2 = create_object(key="TradeItem2", location=self.char1)
self.tradeitem3 = create_object(key="TradeItem3", location=self.char2)
def test_tradehandler_base(self):
self.char1.msg = Mock()
self.char2.msg = Mock()
# test all methods of the tradehandler
handler = barter.TradeHandler(self.char1, self.char2)
self.assertEqual(handler.partA, self.char1)
self.assertEqual(handler.partB, self.char2)
handler.msg_other(self.char1, "Want to trade?")
handler.msg_other(self.char2, "Yes!")
handler.msg_other(None, "Talking to myself...")
self.assertEqual(self.char2.msg.mock_calls[0][1][0], "Want to trade?")
self.assertEqual(self.char1.msg.mock_calls[0][1][0], "Yes!")
self.assertEqual(self.char1.msg.mock_calls[1][1][0], "Talking to myself...")
self.assertEqual(handler.get_other(self.char1), self.char2)
def test_tradehandler_joins(self):
handler = barter.TradeHandler(self.char1, self.char2)
self.assertTrue(handler.join(self.char2))
self.assertTrue(handler.unjoin(self.char2))
self.assertFalse(handler.join(self.char1))
self.assertFalse(handler.unjoin(self.char1))
def test_tradehandler_offers(self):
handler = barter.TradeHandler(self.char1, self.char2)
handler.join(self.char2)
handler.offer(self.char1, self.tradeitem1, self.tradeitem2)
self.assertEqual(handler.partA_offers, [self.tradeitem1, self.tradeitem2])
self.assertFalse(handler.partA_accepted)
self.assertFalse(handler.partB_accepted)
handler.offer(self.char2, self.tradeitem3)
self.assertEqual(handler.list(), ([self.tradeitem1, self.tradeitem2], [self.tradeitem3]))
self.assertEqual(handler.search("TradeItem2"), self.tradeitem2)
self.assertEqual(handler.search("TradeItem3"), self.tradeitem3)
self.assertEqual(handler.search("nonexisting"), None)
self.assertFalse(handler.finish()) # should fail since offer not yet accepted
handler.accept(self.char1)
handler.decline(self.char1)
handler.accept(self.char2)
handler.accept(self.char1) # should trigger handler.finish() automatically
self.assertEqual(self.tradeitem1.location, self.char2)
self.assertEqual(self.tradeitem2.location, self.char2)
self.assertEqual(self.tradeitem3.location, self.char1)
def test_cmdtrade(self):
self.call(barter.CmdTrade(), "Char2 : Hey wanna trade?", "You say, \"Hey wanna trade?\"", caller=self.char1)
self.call(barter.CmdTrade(), "Char decline : Nope!", "You say, \"Nope!\"", caller=self.char2)
self.call(barter.CmdTrade(), "Char2 : Hey wanna trade?", "You say, \"Hey wanna trade?\"", caller=self.char1)
self.call(barter.CmdTrade(), "Char accept : Sure!", "You say, \"Sure!\"", caller=self.char2)
self.call(barter.CmdOffer(), "TradeItem3", "Your trade action: You offer TradeItem3",caller=self.char2)
self.call(barter.CmdOffer(), "TradeItem1 : Here's my offer.", "You say, \"Here's my offer.\"\n [You offer TradeItem1]")
self.call(barter.CmdAccept(), "", "Your trade action: You accept the offer. Char2 must now also accept")
self.call(barter.CmdDecline(), "", "Your trade action: You change your mind, declining the current offer.")
self.call(barter.CmdAccept(),": Sounds good.", "You say, \"Sounds good.\"\n"
" [You accept the offer. Char must now also accept.", caller=self.char2)
self.call(barter.CmdDecline(), ":No way!", "You say, \"No way!\"\n [You change your mind, declining the current offer.]", caller=self.char2)
self.call(barter.CmdOffer(), "TradeItem1, TradeItem2 : My final offer!", "You say, \"My final offer!\"\n [You offer TradeItem1 and TradeItem2]")
self.call(barter.CmdAccept(), "", "Your trade action: You accept the offer. Char2 must now also accept.", caller=self.char1)
self.call(barter.CmdStatus(), "", "Offered by Char:", caller=self.char2)
self.tradeitem1.db.desc = "A great offer."
self.call(barter.CmdEvaluate(), "TradeItem1", "A great offer.")
self.call(barter.CmdAccept(), ":Ok then.", "You say, \"Ok then.\"\n [You accept the deal.", caller=self.char2)
self.assertEqual(self.tradeitem1.location, self.char2)
self.assertEqual(self.tradeitem2.location, self.char2)
self.assertEqual(self.tradeitem3.location, self.char1)
def test_cmdtradehelp(self):
self.call(barter.CmdTrade(), "Char2 : Hey wanna trade?", "You say, \"Hey wanna trade?\"", caller=self.char1)
self.call(barter.CmdTradeHelp(), "", "Trading commands\n", caller=self.char1)