Debugged and added @cpattr and @mvattr. Added unittest cases for all default commands for which they are suitable. Many small bug fixes as part of that.

This commit is contained in:
Griatch 2011-04-21 16:45:18 +00:00
parent 7b43c4a608
commit 6f0d21802b
11 changed files with 328 additions and 155 deletions

View file

@ -74,7 +74,7 @@ class CmdSetObjAlias(MuxCommand):
Adding permanent aliases
Usage:
@alias <obj> = [alias[,alias,alias,...]]
@alias <obj> [= [alias[,alias,alias,...]]]
Assigns aliases to an object so it can be referenced by more
than one name. Assign empty to remove all aliases from object.
@ -91,11 +91,15 @@ class CmdSetObjAlias(MuxCommand):
def func(self):
"Set the aliases."
caller = self.caller
objname, aliases = self.lhs, self.rhslist
if not objname:
caller.msg("Usage: @alias <obj> = <alias>,<alias>,...")
return
if not self.lhs:
string = "Usage: @alias <obj> [= [alias[,alias ...]]]"
self.caller.msg(string)
return
objname = self.lhs
# Find the object to receive aliases
obj = caller.search(objname, global_search=True)
if not obj:
@ -108,10 +112,12 @@ class CmdSetObjAlias(MuxCommand):
else:
caller.msg("No aliases exist for '%s'." % obj.key)
return
if not obj.access(caller, 'edit'):
caller.msg("You don't have permission to do that.")
return
if not aliases or not aliases[0]:
if not self.rhs:
# we have given an empty =, so delete aliases
old_aliases = obj.aliases
if old_aliases:
@ -120,10 +126,10 @@ class CmdSetObjAlias(MuxCommand):
else:
caller.msg("No aliases to clear.")
return
# merge the old and new aliases (if any)
old_aliases = obj.aliases
new_aliases = [str(alias).strip().lower()
for alias in aliases if alias.strip()]
new_aliases = [alias.strip().lower() for alias in self.rhs.split(',') if alias.strip()]
# make the aliases only appear once
old_aliases.extend(new_aliases)
aliases = list(set(old_aliases))
@ -180,8 +186,7 @@ class CmdCopy(ObjManipCommand):
from_obj = caller.search(from_obj_name)
if not from_obj:
return
for objdef in self.rhs_objs:
print objdef.items()
for objdef in self.rhs_objs:
# loop through all possible copy-to targets
to_obj_name = objdef['name']
to_obj_aliases = objdef['aliases']
@ -202,16 +207,18 @@ class CmdCopy(ObjManipCommand):
# we are done, echo to user
caller.msg(string)
# NOT YET INCLUDED IN SET.
class CmdCpAttr(MuxCommand):
class CmdCpAttr(ObjManipCommand):
"""
@cpattr - copy attributes
Usage:
@cpattr <obj>/<attr> = <obj1>/<attr1> [,<obj2>/<attr2>,<obj3>/<attr3>,...]
@cpattr <obj>/<attr> = <obj1> [,<obj2>,<obj3>,...]
@cpattr <attr> = <obj1>/<attr1> [,<obj2>/<attr2>,<obj3>/<attr3>,...]
@cpattr <attr> = <obj1>[,<obj2>,<obj3>,...]
@cpattr[/switch] <obj>/<attr> = <obj1>/<attr1> [,<obj2>/<attr2>,<obj3>/<attr3>,...]
@cpattr[/switch] <obj>/<attr> = <obj1> [,<obj2>,<obj3>,...]
@cpattr[/switch] <attr> = <obj1>/<attr1> [,<obj2>/<attr2>,<obj3>/<attr3>,...]
@cpattr[/switch] <attr> = <obj1>[,<obj2>,<obj3>,...]
Switches:
move - delete the attribute from the source object after copying.
Example:
@cpattr coolness = Anna/chillout, Anna/nicety, Tom/nicety
@ -219,7 +226,8 @@ class CmdCpAttr(MuxCommand):
copies the coolness attribute (defined on yourself), to attributes
on Anna and Tom.
Copy the attribute one object to one or more attributes on another object.
Copy the attribute one object to one or more attributes on another object. If
you don't supply a source object, yourself is used.
"""
key = "@cpattr"
locks = "cmd:perm(cpattr) or perm(Builders)"
@ -233,10 +241,10 @@ class CmdCpAttr(MuxCommand):
if not self.rhs:
string = """Usage:
@cpattr <obj>/<attr> = <obj1>/<attr1> [,<obj2>/<attr2>,<obj3>/<attr3>,...]
@cpattr <obj>/<attr> = <obj1> [,<obj2>,<obj3>,...]
@cpattr <attr> = <obj1>/<attr1> [,<obj2>/<attr2>,<obj3>/<attr3>,...]
@cpattr <attr> = <obj1>[,<obj2>,<obj3>,...]"""
@cpattr[/switch] <obj>/<attr> = <obj1>/<attr1> [,<obj2>/<attr2>,<obj3>/<attr3>,...]
@cpattr[/switch] <obj>/<attr> = <obj1> [,<obj2>,<obj3>,...]
@cpattr[/switch] <attr> = <obj1>/<attr1> [,<obj2>/<attr2>,<obj3>/<attr3>,...]
@cpattr[/switch] <attr> = <obj1>[,<obj2>,<obj3>,...]"""
caller.msg(string)
return
@ -248,19 +256,26 @@ class CmdCpAttr(MuxCommand):
if not from_obj_attrs:
# this means the from_obj_name is actually an attribute name on self.
from_obj_attrs = [from_obj_name]
from_obj = self
from_obj_name = self.name
from_obj = self.caller
from_obj_name = self.caller.name
else:
from_obj = caller.search(from_obj_name)
if not from_obj or not to_objs:
caller.msg("Have to supply both source object and target(s).")
caller.msg("You have to supply both source object and target(s).")
return
srcvalue = from_obj.attr(from_obj_attrs[0])
if not from_obj.has_attribute(from_obj_attrs[0]):
caller.msg("%s doesn't have an attribute %s." % (from_obj_name, from_obj_attrs[0]))
return
srcvalue = from_obj.get_attribute(from_obj_attrs[0])
#copy to all to_obj:ects
string = "Copying %s=%s (with value %s) ..." % (from_obj_name,
from_obj_attrs[0], srcvalue)
for to_obj in to_objs:
if "move" in self.switches:
string = "Moving "
else:
string = "Copying "
string += "%s/%s (with value %s) ..." % (from_obj_name, from_obj_attrs[0], srcvalue)
for to_obj in to_objs:
to_obj_name = to_obj['name']
to_obj_attrs = to_obj['attrs']
to_obj = caller.search(to_obj_name)
@ -274,12 +289,54 @@ class CmdCpAttr(MuxCommand):
# if there are too few attributes given
# on the to_obj, we copy the original name instead.
to_attr = from_attr
to_obj.attr(to_attr, srcvalue)
string += "\nCopied %s.%s -> %s.%s." % (from_obj.name, from_attr,
to_obj_name, to_attr)
to_obj.set_attribute(to_attr, srcvalue)
if "move" in self.switches and not (from_obj == to_obj and from_attr == to_attr):
from_obj.del_attribute(from_attr)
string += "\nMoved %s.%s -> %s.%s." % (from_obj.name, from_attr,
to_obj_name, to_attr)
else:
string += "\nCopied %s.%s -> %s.%s." % (from_obj.name, from_attr,
to_obj_name, to_attr)
caller.msg(string)
class CmdMvAttr(ObjManipCommand):
"""
@mvattr - move attributes
Usage:
@mvattr[/switch] <obj>/<attr> = <obj1>/<attr1> [,<obj2>/<attr2>,<obj3>/<attr3>,...]
@mvattr[/switch] <obj>/<attr> = <obj1> [,<obj2>,<obj3>,...]
@mvattr[/switch] <attr> = <obj1>/<attr1> [,<obj2>/<attr2>,<obj3>/<attr3>,...]
@mvattr[/switch] <attr> = <obj1>[,<obj2>,<obj3>,...]
Switches:
copy - Don't delete the original after moving.
Move an attribute from one object to one or more attributes on another object. If
you don't supply a source object, yourself is used.
"""
key = "@mvattr"
locks = "cmd:perm(mvattr) or perm(Builders)"
help_category = "Building"
def func(self):
"""
Do the moving
"""
if not self.rhs:
string = """Usage:
@mvattr[/switch] <obj>/<attr> = <obj1>/<attr1> [,<obj2>/<attr2>,<obj3>/<attr3>,...]
@mvattr[/switch] <obj>/<attr> = <obj1> [,<obj2>,<obj3>,...]
@mvattr[/switch] <attr> = <obj1>/<attr1> [,<obj2>/<attr2>,<obj3>/<attr3>,...]
@mvattr[/switch] <attr> = <obj1>[,<obj2>,<obj3>,...]"""
self.caller.msg(string)
return
# simply use @cpattr for all the functionality
if "copy" in self.switches:
self.caller.execute_cmd("@cpattr %s" % self.args)
else:
self.caller.execute_cmd("@cpattr/move %s" % self.args)
class CmdCreate(ObjManipCommand):
"""
@ -492,20 +549,21 @@ class CmdDestroy(MuxCommand):
for objname in self.lhslist:
obj = caller.search(objname)
if not obj:
continue
self.caller.msg(" (Objects to destroy must either be local or specified with a unique dbref.)")
return
objname = obj.name
if not obj.access(caller, 'delete'):
string = "You don't have permission to delete %s." % objname
string += "\nYou don't have permission to delete %s." % objname
continue
if obj.player and not 'override' in self.switches:
string = "Object %s is controlled by an active player. Use /override to delete anyway." % objname
string += "\nObject %s is controlled by an active player. Use /override to delete anyway." % objname
continue
# do the deletion
okay = obj.delete()
if not okay:
string = "ERROR: %s NOT deleted, probably because at_obj_delete() returned False." % objname
string += "\nERROR: %s not deleted, probably because at_obj_delete() returned False." % objname
else:
string = "%s was deleted." % objname
string += "\n%s was deleted." % objname
if string:
caller.msg(string.strip())
@ -659,7 +717,7 @@ class CmdLink(MuxCommand):
@link[/switches] <object>
Switch:
twoway - connect two exits. For this to, BOTH <object>
twoway - connect two exits. For this to work, BOTH <object>
and <target> must be exit objects.
If <object> is an exit, set its destination to <target>. Two-way operation
@ -803,7 +861,7 @@ class CmdHome(CmdLink):
if not home:
string = "This object has no home location set!"
else:
string = "%s's home is set to %s(%s)." % (obj, home, home.dbref)
string = "%s's current home is %s(%s)." % (obj, home, home.dbref)
else:
# set a home location
new_home = self.caller.search(self.rhs, global_search=True)
@ -845,79 +903,6 @@ class CmdListCmdSets(MuxCommand):
string = "%s" % obj.cmdset
caller.msg(string)
class CmdMvAttr(ObjManipCommand):
"""
@mvattr - move attributes
Usage:
@mvattr <srcobject>/attr[/attr/attr...] = <targetobject>[/attr/attr/...]
Moves attributes around. If the target object's attribute names are given,
the source attributes will be moved into those attributes instead. The
old attribute(s) will be deleted from the source object (unless source
and target are the same, in which case this is like a copy operation)
"""
key = "@mvattr"
locks = "cmd:perm(mvattr) or perm(Builders)"
help_category = "Building"
def func(self):
"We use the parsed values from ObjManipCommand.parse()."
caller = self.caller
if not self.lhs or not self.rhs:
caller.msg("Usage: @mvattr <src>/attr[/attr/..] = <target>[/attr/attr..]")
return
from_obj_name = self.lhs_objattr[0]['name']
from_obj_attrs = self.lhs_objattr[0]['attrs']
to_obj_name = self.rhs_objattr[0]['name']
to_obj_attrs = self.rhs_objattr[0]['name']
# find from-object
from_obj = caller.search(from_obj_name)
if not from_obj:
return
#find to-object
to_obj = caller.search_for_object(to_obj_name)
if not to_obj:
return
# if we copy on the same object, we have to
# be more careful.
same_object = to_obj == from_obj
#do the moving
string = ""
for inum, from_attr in enumerate(from_obj_attrs):
from_value = from_obj.attr(from_attr)
if not from_value:
string += "\nAttribute '%s' not found on source object %s."
string = string % (from_attr, from_obj.name)
else:
try:
to_attr = to_obj_attrs[inum]
except KeyError:
# too few attributes on the target, so we add the
# source attrname instead
if same_object:
# we can't do that on the same object though,
# it would be just copying to itself.
string += "\nToo few attribute names on target, and "
string += "can't copy same-named attribute to itself."
continue
to_attr = from_attr
# Do the move
to_obj.attr(to_attr, from_value)
from_obj.attr(from_attr, delete=True)
string += "\nMoved %s.%s -> %s.%s." % (from_obj_name, from_attr,
to_obj_name, to_attr)
caller.msg(string)
class CmdName(ObjManipCommand):
"""
cname - change the name and/or aliases of an object
@ -1410,7 +1395,7 @@ class CmdExamine(ObjManipCommand):
If object is not specified, the current location is examined.
"""
key = "@examine"
aliases = ["@ex","ex", "exam"]
aliases = ["@ex","ex", "exam", "examine"]
locks = "cmd:perm(examine) or perm(Builders)"
help_category = "Building"
@ -1617,7 +1602,7 @@ class CmdFind(MuxCommand):
else:
# Not a player/dbref search but a wider search; build a queryset.
results = ObjectDB.objects.filter(db_key__istartswith=searchstring, id__gte=low, id__lte=high)
results = ObjectDB.objects.filter(db_key__istartswith=searchstring, id__gte=low, id__lte=high)
if "room" in switches:
results = results.filter(db_location__isnull=True)
if "exit" in switches:
@ -1625,11 +1610,24 @@ class CmdFind(MuxCommand):
if "char" in switches:
results = results.filter(db_typeclass_path=CHAR_TYPECLASS)
nresults = results.count()
if not nresults:
# no matches on the keys. Try aliases instead.
results = results = ObjectDB.alias_set.related.model.objects.filter(db_key=searchstring)
if "room" in switches:
results = results.filter(db_obj__db_location__isnull=True)
if "exit" in switches:
results = results.filter(db_obj__db_destination__isnull=False)
if "char" in switches:
results = results.filter(db_obj__db_typeclass_path=CHAR_TYPECLASS)
# we have to parse alias -> real object here
results = [result.db_obj for result in results]
nresults = len(results)
restrictions = ""
if self.switches:
restrictions = ", %s" % (",".join(self.switches))
if nresults:
# convert result to typeclasses. Database is not hit until this point!
# convert result to typeclasses.
results = [result.typeclass(result) for result in results]
if nresults > 1:
string = "{w%i Matches{n(#%i-#%i%s):" % (nresults, low, high, restrictions)

View file

@ -64,10 +64,10 @@ class DefaultCmdSet(CmdSet):
self.add(building.CmdSetAttribute())
self.add(building.CmdName())
self.add(building.CmdDesc())
#self.add(building.CmdCpAttr()) #TODO - need testing/debugging
#self.add(building.CmdMvAttr()) #TODO - need testing/debugging
self.add(building.CmdCpAttr())
self.add(building.CmdMvAttr())
self.add(building.CmdCopy())
self.add(building.CmdFind())
self.add(building.CmdCopy()) #TODO - need testing/debugging
self.add(building.CmdOpen())
self.add(building.CmdLink())
self.add(building.CmdUnLink())

View file

@ -9,14 +9,15 @@ from src.utils import create, utils
from src.commands.default.muxcommand import MuxCommand
from src.server.sessionhandler import SESSIONS
def find_channel(caller, channelname, silent=False):
def find_channel(caller, channelname, silent=False, noaliases=False):
"""
Helper function for searching for a single channel with
some error handling.
"""
channels = Channel.objects.channel_search(channelname)
if not channels:
channels = [chan for chan in Channel.objects.all() if channelname in chan.aliases]
if not noaliases:
channels = [chan for chan in Channel.objects.all() if channelname in chan.aliases]
if channels:
return channels[0]
if not silent:
@ -126,7 +127,7 @@ class CmdDelCom(MuxCommand):
return
ostring = self.args.lower()
channel = find_channel(caller, ostring, silent=True)
channel = find_channel(caller, ostring, silent=True, noaliases=True)
if channel:
# we have given a channel name - unsubscribe
if not channel.has_connection(player):
@ -147,9 +148,12 @@ class CmdDelCom(MuxCommand):
if not channel:
caller.msg("No channel with alias '%s' was found." % ostring)
else:
caller.nicks.delete(ostring, nick_type="channel")
caller.msg("Your alias '%s' for channel %s was cleared." % (ostring, channel.key))
if caller.nicks.has(ostring, nick_type="channel"):
caller.nicks.delete(ostring, nick_type="channel")
caller.msg("Your alias '%s' for channel %s was cleared." % (ostring, channel.key))
else:
caller.msg("You had no such alias defined for this channel.")
class CmdAllCom(MuxCommand):
"""
allcom - operate on all channels

View file

@ -23,6 +23,7 @@ from src.utils import create, ansi
from src.server import session, sessionhandler
from src.locks.lockhandler import LockHandler
from src.server.models import ServerConfig
from src.comms.models import Channel, Msg, PlayerChannelConnection
#------------------------------------------------------------
# Command testing
@ -30,7 +31,6 @@ from src.server.models import ServerConfig
# print all feedback from test commands (can become very verbose!)
VERBOSE = False
NOMANGLE = False
class FakeSession(session.Session):
"""
@ -75,6 +75,9 @@ class CommandTest(TestCase):
Inherit new tests from this.
"""
NOMANGLE = False # mangle command input for extra testing
def setUp(self):
"sets up the testing environment"
ServerConfig.objects.conf("default_home", 2)
@ -107,7 +110,7 @@ class CommandTest(TestCase):
self.obj2 = create.create_object(settings.BASE_OBJECT_TYPECLASS, key="obj2", location=self.room1)
self.exit1 = create.create_object(settings.BASE_EXIT_TYPECLASS, key="exit1", location=self.room1)
self.exit2 = create.create_object(settings.BASE_EXIT_TYPECLASS, key="exit2", location=self.room2)
def get_cmd(self, cmd_class, argument_string=""):
"""
Obtain a cmd instance from a class and an input string
@ -121,13 +124,13 @@ class CommandTest(TestCase):
cmd.obj = self.char1
return cmd
def execute_cmd(self, raw_string, wanted_return_string=None):
def execute_cmd(self, raw_string, wanted_return_string=None, nomangle=False):
"""
Creates the command through faking a normal command call;
This also mangles the input in various ways to test if the command
will be fooled.
"""
if not VERBOSE and not NOMANGLE:
if not nomangle and not VERBOSE and not self.NOMANGLE:
# only mangle if not VERBOSE, to make fewer return lines
test1 = re.sub(r'\s', '', raw_string) # remove all whitespace inside it
test2 = "%s/åäö öäö;-:$£@*~^' 'test" % raw_string # inserting weird characters in call
@ -142,11 +145,21 @@ class CommandTest(TestCase):
except AssertionError, e:
self.fail(e)
self.char1.ndb.return_string = None
class BuildTest(CommandTest):
"""
We need to turn of mangling for build commands since
it creates arbitrary objects that mess up tests later.
"""
NOMANGLE = True
#------------------------------------------------------------
# Default set Command testing
#------------------------------------------------------------
# general.py tests
# # general.py tests
class TestLook(CommandTest):
def test_call(self):
@ -175,9 +188,9 @@ class TestNick(CommandTest):
self.execute_cmd("nickname testalias = testaliasedstring1")
self.execute_cmd("nickname/player testalias = testaliasedstring2")
self.execute_cmd("nickname/object testalias = testaliasedstring3")
self.assertEquals(u"testaliasedstring1", self.char1.nicks.get("testalias"))
self.assertEquals(u"testaliasedstring2", self.char1.nicks.get("testalias",nick_type="player"))
self.assertEquals(u"testaliasedstring3", self.char1.nicks.get("testalias",nick_type="object"))
self.assertEqual(u"testaliasedstring1", self.char1.nicks.get("testalias"))
self.assertEqual(u"testaliasedstring2", self.char1.nicks.get("testalias",nick_type="player"))
self.assertEqual(u"testaliasedstring3", self.char1.nicks.get("testalias",nick_type="object"))
class TestGet(CommandTest):
def test_call(self):
self.obj1.location = self.room1
@ -207,8 +220,7 @@ class TestEncoding(CommandTest):
class TestHelpSystem(CommandTest):
def test_call(self):
global NOMANGLE
NOMANGLE = True
self.NOMANGLE = True
sep = "-"*78 + "\n"
self.execute_cmd("@help/add TestTopic,TestCategory = Test1", )
self.execute_cmd("help TestTopic",sep + "Help topic for Testtopic\nTest1" + "\n" + sep)
@ -218,7 +230,6 @@ class TestHelpSystem(CommandTest):
self.execute_cmd("help TestTopic",sep + "Help topic for Testtopic\nTest1 Test2\n\nTest3")
self.execute_cmd("@help/delete TestTopic","Deleted the help entry")
self.execute_cmd("help TestTopic","No help entry found for 'TestTopic'")
NOMANGLE = False
# system.py command tests
class TestPy(CommandTest):
@ -265,7 +276,7 @@ class TestUserPassword(CommandTest):
class TestPerm(CommandTest):
def test_call(self):
self.execute_cmd("@perm TestChar2 = Builders", "Permission 'Builders' given to")
# cannot test this at the moment, screws up the test suite
# cannot test this here; screws up the test suite
#class TestPuppet(CommandTest):
# def test_call(self):
# self.execute_cmd("@puppet TestChar3", "You now control TestChar3.")
@ -274,10 +285,161 @@ class TestWall(CommandTest):
def test_call(self):
self.execute_cmd("@wall = This is a test message", "TestChar shouts")
# building.py command tests
class TestScript(CommandTest):
class TestObjAlias(BuildTest):
def test_call(self):
self.execute_cmd("@alias obj1 = obj1alias, obj1alias2", "Aliases for")
self.execute_cmd("look obj1alias2", "obj1")
class TestCopy(BuildTest):
def test_call(self):
self.execute_cmd("@copy obj1 = obj1_copy;alias1;alias2", "Copied obj1 to 'obj1_copy'")
self.execute_cmd("look alias2","obj1_copy")
class TestSet(BuildTest):
def test_call(self):
self.execute_cmd("@set obj1/test = value", "Created attribute obj1/test = value")
self.execute_cmd("@set obj1/test", "Attribute obj1/test = value")
self.assertEqual(self.obj1.db.test, u"value")
class TestCpAttr(BuildTest):
def test_call(self):
self.execute_cmd("@set obj1/test = value")
self.execute_cmd("@set me/test2 = value2")
self.execute_cmd("@cpattr obj1/test = obj2/test")
self.execute_cmd("@cpattr test2 = obj2")
self.assertEqual(self.obj2.db.test, u"value")
self.assertEqual(self.obj2.db.test2, u"value2")
class TestMvAttr(BuildTest):
def test_call(self):
self.execute_cmd("@set obj1/test = value")
self.execute_cmd("@mvattr obj1/test = obj2")
self.assertEqual(self.obj2.db.test, u"value")
self.assertEqual(self.obj1.db.test, None)
class TestCreate(BuildTest):
def test_call(self):
self.execute_cmd("@create testobj;alias1;alias2")
self.execute_cmd("look alias1", "testobj")
class TestDebug(BuildTest):
def test_call(self):
self.execute_cmd("@debug/obj obj1")
class TestDesc(BuildTest):
def test_call(self):
self.execute_cmd("@desc obj1 = Test object", "The description was set on")
self.assertEqual(self.obj1.db.desc, u"Test object")
class TestDestroy(BuildTest):
def test_call(self):
self.execute_cmd("@destroy obj1, obj2", "obj1 was deleted.\nobj2 was deleted")
class TestFind(BuildTest):
def test_call(self):
self.execute_cmd("@find obj1", "One Match")
class TestDig(BuildTest):
def test_call(self):
self.execute_cmd("@dig room3;roomalias1;roomalias2 = north;n,south;s")
self.execute_cmd("@find room3", "One Match")
self.execute_cmd("@find roomalias1", "One Match")
self.execute_cmd("@find roomalias2", "One Match")
self.execute_cmd("@find/room roomalias2", "One Match")
self.execute_cmd("@find/exit south", "One Match")
self.execute_cmd("@find/exit n", "One Match")
class TestUnLink(BuildTest):
def test_call(self):
self.execute_cmd("@dig room3;roomalias1, north, south")
self.execute_cmd("@unlink north")
class TestLink(BuildTest):
def test_call(self):
self.execute_cmd("@dig room3;roomalias1, north, south")
self.execute_cmd("@unlink north")
self.execute_cmd("@link north = room3")
class TestHome(BuildTest):
def test_call(self):
self.obj1.db_home = self.obj2.dbobj
self.obj1.save()
self.execute_cmd("@home obj1")
self.assertEqual(self.obj1.db_home, self.obj2.dbobj)
class TestCmdSets(BuildTest):
def test_call(self):
self.execute_cmd("@cmdsets")
self.execute_cmd("@cmdsets obj1")
class TestDesc(BuildTest):
def test_call(self):
self.execute_cmd("@name obj1 = Test object", "Object's name changed to 'Test object'.")
self.assertEqual(self.obj1.key, u"Test object")
class TestOpen(BuildTest):
def test_call(self):
self.execute_cmd("@dig room4;roomalias4")
self.execute_cmd("@open testexit4;aliasexit4 = roomalias4", "Created new Exit")
class TestScript(BuildTest):
def test_call(self):
self.execute_cmd("@typeclass obj1 = src.objects.objects.Character", "obj's type is now")
self.assertEqual(self.obj1.db_typeclass_path, u"src.objects.objects.Character")
class TestScript(BuildTest):
def test_call(self):
self.execute_cmd("@set box1/test = value")
self.execute_cmd("@wipe box1", "Wiped")
self.assertEqual(self.obj1.db.all(), [])
class TestLock(BuildTest):
# lock functionality itseld is tested separately
def test_call(self):
self.char1.permissions = ["TestPerm"]
self.execute_cmd("@lock obj1 = test:perm(TestPerm)")
self.assertEqual(True, self.obj1.access(self.char1, u"test"))
class TestExamine(BuildTest):
def test_call(self):
self.execute_cmd("examine obj1", "------------")
class TestTeleport(BuildTest):
def test_call(self):
self.execute_cmd("@tel obj1 = obj2")
self.assertEqual(self.obj1.location, self.obj2.dbobj)
class TestScript(BuildTest):
def test_call(self):
self.execute_cmd("@script TestChar = examples.bodyfunctions.BodyFunctions", "Script successfully added")
#TODO
# Comms commands
class TestChannelCreate(CommandTest):
def test_call(self):
self.execute_cmd("@ccreate testchannel1;testchan1;testchan1b = This is a test channel")
self.execute_cmd("testchan1 Hello", "[testchannel1] TestChar: Hello")
class TestAddCom(CommandTest):
def test_call(self):
self.execute_cmd("@ccreate testchannel1;testchan1;testchan1b = This is a test channel")
self.execute_cmd("addcom chan1 = testchannel1")
self.execute_cmd("addcom chan2 = testchan1")
self.execute_cmd("delcom testchannel1")
self.execute_cmd("addcom testchannel1" "You now listen to the channel channel.")
class TestDelCom(CommandTest):
def test_call(self):
self.execute_cmd("@ccreate testchannel1;testchan1;testchan1b = This is a test channel")
self.execute_cmd("addcom chan1 = testchan1")
self.execute_cmd("addcom chan2 = testchan1b")
self.execute_cmd("addcom chan3 = testchannel1")
self.execute_cmd("delcom chan1", "Your alias 'chan1' for ")
self.execute_cmd("delcom chan2", "Your alias 'chan2' for ")
self.execute_cmd("delcom testchannel1" "You stop listening to")
class TestAllCom(CommandTest):
def test_call(self):
self.execute_cmd("@ccreate testchannel1;testchan1;testchan1b = This is a test channel")
self.execute_cmd("@ccreate testchannel1;testchan1;testchan1b = This is a test channel")
self.execute_cmd("allcom off")
self.execute_cmd("allcom on")
self.execute_cmd("allcom destroy")
class TestChannels(CommandTest):
def test_call(self):
self.execute_cmd("@ccreate testchannel1;testchan1;testchan1b = This is a test channel")
self.execute_cmd("@cdestroy testchannel1", "Channel 'testchannel1'")
class TestCBoot(CommandTest):
def test_call(self):
self.execute_cmd("@ccreate testchannel1;testchan1;testchan1b = This is a test channel")
self.execute_cmd("@cboot testchannel1 = TestChar", "TestChar boots TestChar from channel.")
class TestCemit(CommandTest):
def test_call(self):
self.execute_cmd("@ccreate testchannel1;testchan1;testchan1b = This is a test channel")
self.execute_cmd("@cemit testchan1 = Testing!", "[testchannel1] Testing!")
class TestCwho(CommandTest):
def test_call(self):
self.execute_cmd("@ccreate testchannel1;testchan1;testchan1b = This is a test channel")
self.execute_cmd("@cwho testchan1b", "Channel subscriptions")
# Unloggedin commands
# these cannot be tested from here.