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

View file

@ -210,3 +210,87 @@ class TestExtendedRoom(CommandTest):
def test_cmdgametime(self):
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)