def test_custom_verbs(self): player = Player("julie", "f") player.verbs["xywobble"] = "p1" room = Location("room") chair1 = Item("chair1") chair1.verbs["frobnitz"] = "c1" chair2 = Item("chair2") chair2.verbs["frobnitz"] = "c2" chair_in_inventory = Item("chair3") chair_in_inventory.verbs["kowabooga"] = "c3" room.init_inventory([chair1, player, chair2]) # check inventory NOT affecting player custom verbs, but DOES affect location verbs self.assertEqual({"xywobble": "p1"}, player.verbs) self.assertEqual({"frobnitz": "c2", "xywobble": "p1"}, room.verbs) player.insert(chair_in_inventory, player) self.assertEqual({"xywobble": "p1"}, player.verbs) self.assertEqual({"frobnitz": "c2", "xywobble": "p1", "kowabooga": "c3"}, room.verbs) player.remove(chair_in_inventory, player) self.assertEqual({"frobnitz": "c2", "xywobble": "p1"}, room.verbs) player.insert(chair_in_inventory, player) self.assertEqual({"frobnitz": "c2", "xywobble": "p1", "kowabooga": "c3" }, room.verbs) room2 = Location("room2") self.assertEqual({}, room2.verbs) chair1.move(room2, player) self.assertEqual({"xywobble": "p1", "kowabooga": "c3" }, room.verbs) self.assertEqual({"frobnitz": "c1"}, room2.verbs) chair2.move(room2, player) self.assertEqual({"xywobble": "p1", "kowabooga": "c3"}, room.verbs) self.assertEqual({"frobnitz": "c2"}, room2.verbs) player.move(room2) self.assertEqual({}, room.verbs) self.assertEqual({"frobnitz": "c2", "xywobble": "p1", "kowabooga": "c3"}, room2.verbs)
def test_print_location(self): p = Player("julie", "f") key = Item("key") bag = Container("bag") room = Location("room") bag.insert(key, p) p.insert(bag, p) room.insert(p, p) with self.assertRaises(Exception): p.tell_object_location(None, None) p.tell_object_location(key, None) self.assertEqual(["(It's not clear where key is).\n"], p.test_get_output_paragraphs()) p.tell_object_location(key, None, print_parentheses=False) self.assertEqual(["It's not clear where key is.\n"], p.test_get_output_paragraphs()) p.tell_object_location(key, bag) result = "".join(p.test_get_output_paragraphs()) self.assertTrue("in bag" in result and "in your inventory" in result) p.tell_object_location(key, room) self.assertTrue("in your current location" in "".join( p.test_get_output_paragraphs())) p.tell_object_location(bag, p) self.assertTrue( "in your inventory" in "".join(p.test_get_output_paragraphs())) p.tell_object_location(p, room) self.assertTrue("in your current location" in "".join( p.test_get_output_paragraphs()))
def test_clone(self): item = Item("thing", "description") item.aliases = ["a1", "a2"] item2 = util.clone(item) self.assertNotEqual(item, item2) item2.aliases.append("a3") self.assertNotEqual(item.aliases, item2.aliases) player = Player("julie", "f") player.insert(item, player) player2 = util.clone(player) player2.insert(item2, player2) self.assertNotEqual(player.inventory_size, player2.inventory_size) self.assertNotEqual(player.inventory, player2.inventory) self.assertTrue(item in player) self.assertFalse(item in player2)
def test_destroy_player(self): ctx = Context() loc = Location("loc") player = Player("julie", "f") player.privileges = {"wizard"} player.create_wiretap(loc) player.insert(Item("key"), player) loc.init_inventory([player]) self.assertEqual(loc, player.location) self.assertTrue(len(player.inventory) > 0) self.assertTrue(player in loc.livings) player.destroy(ctx) import gc gc.collect() self.assertTrue(len(player.inventory) == 0) self.assertFalse(player in loc.livings) self.assertIsNone(player.location, "destroyed player should end up nowhere (None)")
def test_destroy_player(self): ctx = Context(None, None, None, None) loc = Location("loc") player = Player("julie", "f") player.privileges = {"wizard"} player.create_wiretap(loc) player.insert(Item("key"), player) loc.init_inventory([player]) self.assertEqual(loc, player.location) self.assertTrue(len(player.inventory) > 0) self.assertTrue(player in loc.livings) player.destroy(ctx) import gc gc.collect() self.assertTrue(len(player.inventory) == 0) self.assertFalse(player in loc.livings) self.assertIsNone(player.location, "destroyed player should end up nowhere (None)")
def test_clone(self): item = Item("thing", "description") item.aliases = ["a1", "a2"] item2 = clone(item) self.assertNotEqual(item, item2) item2.aliases.append("a3") self.assertNotEqual(item.aliases, item2.aliases) player = Player("julie", "f") player.insert(item, player) with self.assertRaises(ValueError): clone(player) # can't clone something with stuff in it player.remove(item, player) player2 = clone(player) player2.insert(item2, player2) self.assertNotEqual(player.inventory_size, player2.inventory_size) self.assertNotEqual(player.inventory, player2.inventory) self.assertFalse(item in player) self.assertFalse(item in player2)
def test_print_location(self): p = Player("julie", "f") key = Item("key") bag = Container("bag") room = Location("room") bag.insert(key, p) p.insert(bag, p) room.insert(p, p) with self.assertRaises(Exception): p.tell_object_location(None, None) p.tell_object_location(key, None) self.assertEqual(["(It's not clear where key is).\n"], p.test_get_output_paragraphs()) p.tell_object_location(key, None, print_parentheses=False) self.assertEqual(["It's not clear where key is.\n"], p.test_get_output_paragraphs()) p.tell_object_location(key, bag) result = "".join(p.test_get_output_paragraphs()) self.assertTrue("in bag" in result and "in your inventory" in result) p.tell_object_location(key, room) self.assertTrue("in your current location" in "".join(p.test_get_output_paragraphs())) p.tell_object_location(bag, p) self.assertTrue("in your inventory" in "".join(p.test_get_output_paragraphs())) p.tell_object_location(p, room) self.assertTrue("in your current location" in "".join(p.test_get_output_paragraphs()))
class TestLocations(unittest.TestCase): def setUp(self): mud_context.driver = TestDriver() mud_context.config = DemoStory()._get_config() self.hall = Location("Main hall", "A very large hall.") self.attic = Location("Attic", "A dark attic.") self.street = Location("Street", "An endless street.") e1 = Exit("up", self.attic, "A ladder leads up.") e2 = Exit( ["door", "east"], self.street, "A heavy wooden door to the east blocks the noises from the street outside." ) self.hall.add_exits([e1, e2]) self.table = Item( "table", "oak table", "a large dark table with a lot of cracks in its surface") self.key = Item("key", "rusty key", "an old rusty key without a label", short_description="Someone forgot a key.") self.magazine = Item("magazine", "university magazine") self.magazine2 = Item("magazine", "university magazine") self.rat = NPC("rat", "n", race="rodent") self.rat2 = NPC("rat", "n", race="rodent") self.fly = NPC("fly", "n", race="insect", short_description="A fly buzzes around your head.") self.julie = NPC("julie", "f", title="attractive Julie", description="She's quite the looker.") self.julie.aliases = {"chick"} self.player = Player("player", "m") self.pencil = Item("pencil", title="fountain pen") self.pencil.aliases = {"pen"} self.bag = Container("bag") self.notebook_in_bag = Item("notebook") self.bag.insert(self.notebook_in_bag, self.player) self.player.insert(self.pencil, self.player) self.player.insert(self.bag, self.player) self.hall.init_inventory([ self.table, self.key, self.magazine, self.magazine2, self.rat, self.rat2, self.julie, self.player, self.fly ]) def test_names(self): loc = Location("The Attic", "A dusty attic.") self.assertEqual("The Attic", loc.name) self.assertEqual("A dusty attic.", loc.description) def test_contains(self): self.assertTrue(self.julie in self.hall) self.assertTrue(self.magazine in self.hall) self.assertFalse(self.pencil in self.hall) self.assertFalse(self.magazine in self.attic) self.assertFalse(self.julie in self.attic) def test_look(self): expected = [ "[Main hall]", "A very large hall.", "A heavy wooden door to the east blocks the noises from the street outside. A ladder leads up.", "Someone forgot a key. You see two university magazines and an oak table. Player, attractive Julie, and two rats are here. A fly buzzes around your head." ] self.assertEqual(expected, strip_text_styles(self.hall.look())) expected = [ "[Main hall]", "A very large hall.", "A heavy wooden door to the east blocks the noises from the street outside. A ladder leads up.", "Someone forgot a key. You see two university magazines and an oak table. Attractive Julie and two rats are here. A fly buzzes around your head." ] self.assertEqual( expected, strip_text_styles(self.hall.look(exclude_living=self.player))) expected = ["[Attic]", "A dark attic."] self.assertEqual(expected, strip_text_styles(self.attic.look())) def test_look_short(self): expected = ["[Attic]"] self.assertEqual(expected, strip_text_styles(self.attic.look(short=True))) expected = [ "[Main hall]", "Exits: door, east, up", "You see: key, two magazines, and table", "Present: fly, julie, player, and two rats" ] self.assertEqual(expected, strip_text_styles(self.hall.look(short=True))) expected = [ "[Main hall]", "Exits: door, east, up", "You see: key, two magazines, and table", "Present: fly, julie, and two rats" ] self.assertEqual( expected, strip_text_styles( self.hall.look(exclude_living=self.player, short=True))) def test_search_living(self): self.assertEqual(None, self.hall.search_living("<notexisting>")) self.assertEqual(None, self.attic.search_living("<notexisting>")) self.assertEqual(self.fly, self.hall.search_living("fly")) self.assertEqual(self.julie, self.hall.search_living("Julie")) self.assertEqual(self.julie, self.hall.search_living("attractive julie")) self.assertEqual(self.julie, self.hall.search_living("chick")) self.assertEqual(None, self.hall.search_living("bloke")) def test_search_item(self): # almost identical to locate_item so only do a few basic tests self.assertEqual(None, self.player.search_item("<notexisting>")) self.assertEqual(self.pencil, self.player.search_item("pencil")) def test_locate_item(self): item, container = self.player.locate_item("<notexisting>") self.assertEqual(None, item) self.assertEqual(None, container) item, container = self.player.locate_item("pencil") self.assertEqual(self.pencil, item) self.assertEqual(self.player, container) item, container = self.player.locate_item("fountain pen") self.assertEqual(self.pencil, item, "need to find the title") item, container = self.player.locate_item("pen") self.assertEqual(self.pencil, item, "need to find the alias") item, container = self.player.locate_item("pencil", include_inventory=False) self.assertEqual(None, item) self.assertEqual(None, container) item, container = self.player.locate_item("key") self.assertEqual(self.key, item) self.assertEqual(self.hall, container) item, container = self.player.locate_item("key", include_location=False) self.assertEqual(None, item) self.assertEqual(None, container) item, container = self.player.locate_item("KEY") self.assertEqual(self.key, item, "should work case-insensitive") self.assertEqual(self.hall, container, "should work case-insensitive") item, container = self.player.locate_item("notebook") self.assertEqual(self.notebook_in_bag, item) self.assertEqual(self.bag, container, "should search in bags in inventory") item, container = self.player.locate_item( "notebook", include_containers_in_inventory=False) self.assertEqual(None, item) self.assertEqual(None, container, "should not search in bags in inventory") def test_tell(self): rat = MsgTraceNPC("rat", "n", "rodent") self.assertTrue(rat._init_called, "init() must be called from __init__") julie = MsgTraceNPC("julie", "f", "human") hall = Location("hall") hall.livings = [rat, julie] hall.tell("roommsg") self.assertEqual(["roommsg"], rat.messages) self.assertEqual(["roommsg"], julie.messages) rat.clearmessages() julie.clearmessages() hall.tell("roommsg", rat, [julie], "juliemsg") self.assertEqual([], rat.messages) self.assertEqual(["juliemsg"], julie.messages) def test_message_nearby_location(self): plaza = Location("plaza") road = Location("road") house = Location("house") attic = Location("attic") plaza.add_exits([ Exit("north", road, "road leads north"), Exit("door", house, "door to a house") ]) road.add_exits([Exit("south", plaza, "plaza to the south")]) house.add_exits([ Exit("door", plaza, "door to the plaza"), Exit("ladder", attic, "dusty attic") ]) attic.add_exits([Exit("ladder", house, "the house")]) wiretap_plaza = Wiretap(plaza) wiretap_road = Wiretap(road) wiretap_house = Wiretap(house) wiretap_attic = Wiretap(attic) plaza.message_nearby_locations("boing") pubsub.sync() self.assertEqual([], wiretap_plaza.msgs, "the plaza doesnt receive tells") self.assertEqual([], wiretap_attic.msgs, "the attic is too far away to receive msgs") self.assertTrue(("road", "boing") in wiretap_road.msgs) self.assertTrue(("road", "The sound is coming from the south.") in wiretap_road.msgs, "road should give sound direction") self.assertTrue(("house", "boing") in wiretap_house.msgs) self.assertTrue( ("house", "You can't hear where the sound is coming from.") in wiretap_house.msgs, "in the house you can't locate the sound direction") def test_nearby(self): plaza = Location("plaza") road = Location("road") house = Location("house") alley = Location("alley") # no exits attic = Location("attic") plaza.add_exits([ Exit("north", road, "road leads north"), Exit("door", house, "door to a house"), Exit("west", alley, "small alleywith no way back") ]) road.add_exits([Exit("south", plaza, "plaza to the south")]) house.add_exits([ Exit("door", plaza, "door to the plaza"), Exit("ladder", attic, "dusty attic") ]) attic.add_exits([Exit("ladder", house, "the house")]) adj = set(plaza.nearby()) self.assertSetEqual({road, house}, adj) adj = set(plaza.nearby(no_traps=False)) self.assertSetEqual({road, house, alley}, adj) def test_verbs(self): room = Location("room") room.verbs["smurf"] = "" self.assertTrue("smurf" in room.verbs) del room.verbs["smurf"] self.assertFalse("smurf" in room.verbs) def test_enter_leave(self): hall = Location("hall") rat1 = NPC("rat1", "n") rat2 = NPC("rat2", "n") julie = NPC("julie", "f") with self.assertRaises(TypeError): hall.insert(12345, julie) self.assertEqual(_limbo, rat1.location) self.assertFalse(rat1 in hall.livings) wiretap = Wiretap(hall) hall.insert(rat1, julie) self.assertEqual(hall, rat1.location) self.assertTrue(rat1 in hall.livings) self.assertEqual([], wiretap.msgs, "insert shouldn't produce arrival messages") hall.insert(rat2, julie) self.assertTrue(rat2 in hall.livings) self.assertEqual([], wiretap.msgs, "insert shouldn't produce arrival messages") # now test leave wiretap.clear() hall.remove(rat1, julie) self.assertFalse(rat1 in hall.livings) self.assertIsNone(rat1.location) self.assertEqual([], wiretap.msgs, "remove shouldn't produce exit message") hall.remove(rat2, julie) self.assertFalse(rat2 in hall.livings) self.assertEqual([], wiretap.msgs, "remove shouldn't produce exit message") # test random leave hall.remove(rat1, julie) hall.remove(12345, julie) def test_custom_verbs(self): player = Player("julie", "f") player.verbs["xywobble"] = "p1" monster = NPC("snake", "f") monster.verbs["snakeverb"] = "s1" room = Location("room") chair1 = Item("chair1") chair1.verbs["frobnitz"] = "c1" chair2 = Item("chair2") chair2.verbs["frobnitz"] = "c2" chair_in_inventory = Item("chair3") chair_in_inventory.verbs["kowabooga"] = "c3" box_in_inventory = Item("box") box_in_inventory.verbs["boxverb"] = "c4" player.init_inventory([box_in_inventory, chair_in_inventory]) exit = Exit("e", "dummy", None, None) exit.verbs["exitverb"] = "c5" room.init_inventory([chair1, player, chair2, monster]) room.add_exits([exit]) custom_verbs = mud_context.driver.current_custom_verbs(player) all_verbs = mud_context.driver.current_verbs(player) self.assertEqual( { "xywobble", "snakeverb", "frobnitz", "kowabooga", "boxverb", "exitverb" }, set(custom_verbs)) self.assertEqual(set(), set(custom_verbs) - set(all_verbs)) def test_notify(self): room = Location("room") room2 = Location("room2") player = Player("julie", "f") room.notify_player_arrived(player, room2) room.notify_player_left(player, room2) room.notify_npc_arrived(player, room2) room.notify_npc_left(player, room2) parsed = ParseResult("verb") room.notify_action(parsed, player)
class TestLocations(unittest.TestCase): def setUp(self): mud_context.driver = DummyDriver() self.hall = Location("Main hall", "A very large hall.") self.attic = Location("Attic", "A dark attic.") self.street = Location("Street", "An endless street.") e1 = Exit("up", self.attic, "A ladder leads up.") e2 = Exit(["door", "east"], self.street, "A heavy wooden door to the east blocks the noises from the street outside.") self.hall.add_exits([e1, e2]) self.table = Item("table", "oak table", "a large dark table with a lot of cracks in its surface") self.key = Item("key", "rusty key", "an old rusty key without a label", short_description="Someone forgot a key.") self.magazine = Item("magazine", "university magazine") self.rat = NPC("rat", "n", race="rodent") self.fly = NPC("fly", "n", race="insect", short_description="A fly buzzes around your head.") self.julie = NPC("julie", "f", title="attractive Julie", description="She's quite the looker.") self.julie.aliases = {"chick"} self.player = Player("player", "m") self.pencil = Item("pencil", title="fountain pen") self.pencil.aliases = {"pen"} self.bag = Container("bag") self.notebook_in_bag = Item("notebook") self.bag.insert(self.notebook_in_bag, self.player) self.player.insert(self.pencil, self.player) self.player.insert(self.bag, self.player) self.hall.init_inventory([self.table, self.key, self.magazine, self.rat, self.julie, self.player, self.fly]) def test_names(self): loc = Location("The Attic", "A dusty attic.") self.assertEqual("The Attic", loc.name) self.assertEqual("A dusty attic.", loc.description) def test_contains(self): self.assertTrue(self.julie in self.hall) self.assertTrue(self.magazine in self.hall) self.assertFalse(self.pencil in self.hall) self.assertFalse(self.magazine in self.attic) self.assertFalse(self.julie in self.attic) def test_look(self): expected = ["[Main hall]", "A very large hall.", "A heavy wooden door to the east blocks the noises from the street outside. A ladder leads up.", "Someone forgot a key. You see a university magazine and an oak table. Player, attractive Julie, and rat are here. A fly buzzes around your head."] self.assertEqual(expected, strip_text_styles(self.hall.look())) expected = ["[Main hall]", "A very large hall.", "A heavy wooden door to the east blocks the noises from the street outside. A ladder leads up.", "Someone forgot a key. You see a university magazine and an oak table. Attractive Julie and rat are here. A fly buzzes around your head."] self.assertEqual(expected, strip_text_styles(self.hall.look(exclude_living=self.player))) expected = ["[Attic]", "A dark attic."] self.assertEqual(expected, strip_text_styles(self.attic.look())) def test_look_short(self): expected = ["[Attic]"] self.assertEqual(expected, strip_text_styles(self.attic.look(short=True))) expected = ["[Main hall]", "Exits: door, east, up", "You see: key, magazine, table", "Present: fly, julie, player, rat"] self.assertEqual(expected, strip_text_styles(self.hall.look(short=True))) expected = ["[Main hall]", "Exits: door, east, up", "You see: key, magazine, table", "Present: fly, julie, rat"] self.assertEqual(expected, strip_text_styles(self.hall.look(exclude_living=self.player, short=True))) def test_search_living(self): self.assertEqual(None, self.hall.search_living("<notexisting>")) self.assertEqual(None, self.attic.search_living("<notexisting>")) self.assertEqual(self.rat, self.hall.search_living("rat")) self.assertEqual(self.julie, self.hall.search_living("Julie")) self.assertEqual(self.julie, self.hall.search_living("attractive julie")) self.assertEqual(self.julie, self.hall.search_living("chick")) self.assertEqual(None, self.hall.search_living("bloke")) def test_search_item(self): # almost identical to locate_item so only do a few basic tests self.assertEqual(None, self.player.search_item("<notexisting>")) self.assertEqual(self.pencil, self.player.search_item("pencil")) def test_locate_item(self): item, container = self.player.locate_item("<notexisting>") self.assertEqual(None, item) self.assertEqual(None, container) item, container = self.player.locate_item("pencil") self.assertEqual(self.pencil, item) self.assertEqual(self.player, container) item, container = self.player.locate_item("fountain pen") self.assertEqual(self.pencil, item, "need to find the title") item, container = self.player.locate_item("pen") self.assertEqual(self.pencil, item, "need to find the alias") item, container = self.player.locate_item("pencil", include_inventory=False) self.assertEqual(None, item) self.assertEqual(None, container) item, container = self.player.locate_item("key") self.assertEqual(self.key, item) self.assertEqual(self.hall, container) item, container = self.player.locate_item("key", include_location=False) self.assertEqual(None, item) self.assertEqual(None, container) item, container = self.player.locate_item("KEY") self.assertEqual(self.key, item, "should work case-insensitive") self.assertEqual(self.hall, container, "should work case-insensitive") item, container = self.player.locate_item("notebook") self.assertEqual(self.notebook_in_bag, item) self.assertEqual(self.bag, container, "should search in bags in inventory") item, container = self.player.locate_item("notebook", include_containers_in_inventory=False) self.assertEqual(None, item) self.assertEqual(None, container, "should not search in bags in inventory") def test_tell(self): rat = MsgTraceNPC("rat", "n", "rodent") self.assertTrue(rat._init_called, "init() must be called from __init__") julie = MsgTraceNPC("julie", "f", "human") hall = Location("hall") hall.livings = [rat, julie] hall.tell("roommsg") self.assertEqual(["roommsg"], rat.messages) self.assertEqual(["roommsg"], julie.messages) rat.clearmessages() julie.clearmessages() hall.tell("roommsg", rat, [julie], "juliemsg") self.assertEqual([], rat.messages) self.assertEqual(["juliemsg"], julie.messages) def test_verbs(self): room = Location("room") room.verbs["smurf"] = "" self.assertTrue("smurf" in room.verbs) del room.verbs["smurf"] self.assertFalse("smurf" in room.verbs) def test_enter_leave(self): hall = Location("hall") rat1 = NPC("rat1", "n") rat2 = NPC("rat2", "n") julie = NPC("julie", "f") with self.assertRaises(TypeError): hall.insert(12345, julie) self.assertEqual(_Limbo, rat1.location) self.assertFalse(rat1 in hall.livings) wiretap = Wiretap(hall) hall.insert(rat1, julie) self.assertEqual(hall, rat1.location) self.assertTrue(rat1 in hall.livings) self.assertEqual([], wiretap.msgs, "insert shouldn't produce arrival messages") hall.insert(rat2, julie) self.assertTrue(rat2 in hall.livings) self.assertEqual([], wiretap.msgs, "insert shouldn't produce arrival messages") # now test leave wiretap.clear() hall.remove(rat1, julie) self.assertFalse(rat1 in hall.livings) self.assertIsNone(rat1.location) self.assertEqual([], wiretap.msgs, "remove shouldn't produce exit message") hall.remove(rat2, julie) self.assertFalse(rat2 in hall.livings) self.assertEqual([], wiretap.msgs, "remove shouldn't produce exit message") # test random leave hall.remove(rat1, julie) hall.remove(12345, julie) def test_custom_verbs(self): player = Player("julie", "f") player.verbs["xywobble"] = "p1" room = Location("room") chair1 = Item("chair1") chair1.verbs["frobnitz"] = "c1" chair2 = Item("chair2") chair2.verbs["frobnitz"] = "c2" chair_in_inventory = Item("chair3") chair_in_inventory.verbs["kowabooga"] = "c3" room.init_inventory([chair1, player, chair2]) # check inventory NOT affecting player custom verbs, but DOES affect location verbs self.assertEqual({"xywobble": "p1"}, player.verbs) self.assertEqual({"frobnitz": "c2", "xywobble": "p1"}, room.verbs) player.insert(chair_in_inventory, player) self.assertEqual({"xywobble": "p1"}, player.verbs) self.assertEqual({"frobnitz": "c2", "xywobble": "p1", "kowabooga": "c3"}, room.verbs) player.remove(chair_in_inventory, player) self.assertEqual({"frobnitz": "c2", "xywobble": "p1"}, room.verbs) player.insert(chair_in_inventory, player) self.assertEqual({"frobnitz": "c2", "xywobble": "p1", "kowabooga": "c3" }, room.verbs) room2 = Location("room2") self.assertEqual({}, room2.verbs) chair1.move(room2, player) self.assertEqual({"xywobble": "p1", "kowabooga": "c3" }, room.verbs) self.assertEqual({"frobnitz": "c1"}, room2.verbs) chair2.move(room2, player) self.assertEqual({"xywobble": "p1", "kowabooga": "c3"}, room.verbs) self.assertEqual({"frobnitz": "c2"}, room2.verbs) player.move(room2) self.assertEqual({}, room.verbs) self.assertEqual({"frobnitz": "c2", "xywobble": "p1", "kowabooga": "c3"}, room2.verbs) def test_notify(self): room = Location("room") room2 = Location("room2") player = Player("julie", "f") room.notify_player_arrived(player, room2) room.notify_player_left(player, room2) room.notify_npc_arrived(player, room2) room.notify_npc_left(player, room2) parsed = ParseResult("verb") room.notify_action(parsed, player)
class TestLocations(unittest.TestCase): def setUp(self): mud_context.driver = TestDriver() mud_context.config = DemoStory()._get_config() self.hall = Location("Main hall", "A very large hall.") self.attic = Location("Attic", "A dark attic.") self.street = Location("Street", "An endless street.") e1 = Exit("up", self.attic, "A ladder leads up.") e2 = Exit(["door", "east"], self.street, "A heavy wooden door to the east blocks the noises from the street outside.") self.hall.add_exits([e1, e2]) self.table = Item("table", "oak table", "a large dark table with a lot of cracks in its surface") self.key = Item("key", "rusty key", "an old rusty key without a label", short_description="Someone forgot a key.") self.magazine = Item("magazine", "university magazine") self.magazine2 = Item("magazine", "university magazine") self.rat = NPC("rat", "n", race="rodent") self.rat2 = NPC("rat", "n", race="rodent") self.fly = NPC("fly", "n", race="insect", short_description="A fly buzzes around your head.") self.julie = NPC("julie", "f", title="attractive Julie", description="She's quite the looker.") self.julie.aliases = {"chick"} self.player = Player("player", "m") self.pencil = Item("pencil", title="fountain pen") self.pencil.aliases = {"pen"} self.bag = Container("bag") self.notebook_in_bag = Item("notebook") self.bag.insert(self.notebook_in_bag, self.player) self.player.insert(self.pencil, self.player) self.player.insert(self.bag, self.player) self.hall.init_inventory([self.table, self.key, self.magazine, self.magazine2, self.rat, self.rat2, self.julie, self.player, self.fly]) def test_names(self): loc = Location("The Attic", "A dusty attic.") self.assertEqual("The Attic", loc.name) self.assertEqual("A dusty attic.", loc.description) def test_contains(self): self.assertTrue(self.julie in self.hall) self.assertTrue(self.magazine in self.hall) self.assertFalse(self.pencil in self.hall) self.assertFalse(self.magazine in self.attic) self.assertFalse(self.julie in self.attic) def test_look(self): expected = ["[Main hall]", "A very large hall.", "A heavy wooden door to the east blocks the noises from the street outside. A ladder leads up.", "Someone forgot a key. You see two university magazines and an oak table. Player, attractive Julie, and two rats are here. A fly buzzes around your head."] self.assertEqual(expected, strip_text_styles(self.hall.look())) expected = ["[Main hall]", "A very large hall.", "A heavy wooden door to the east blocks the noises from the street outside. A ladder leads up.", "Someone forgot a key. You see two university magazines and an oak table. Attractive Julie and two rats are here. A fly buzzes around your head."] self.assertEqual(expected, strip_text_styles(self.hall.look(exclude_living=self.player))) expected = ["[Attic]", "A dark attic."] self.assertEqual(expected, strip_text_styles(self.attic.look())) def test_look_short(self): expected = ["[Attic]"] self.assertEqual(expected, strip_text_styles(self.attic.look(short=True))) expected = ["[Main hall]", "Exits: door, east, up", "You see: key, two magazines, and table", "Present: fly, julie, player, and two rats"] self.assertEqual(expected, strip_text_styles(self.hall.look(short=True))) expected = ["[Main hall]", "Exits: door, east, up", "You see: key, two magazines, and table", "Present: fly, julie, and two rats"] self.assertEqual(expected, strip_text_styles(self.hall.look(exclude_living=self.player, short=True))) def test_search_living(self): self.assertEqual(None, self.hall.search_living("<notexisting>")) self.assertEqual(None, self.attic.search_living("<notexisting>")) self.assertEqual(self.fly, self.hall.search_living("fly")) self.assertEqual(self.julie, self.hall.search_living("Julie")) self.assertEqual(self.julie, self.hall.search_living("attractive julie")) self.assertEqual(self.julie, self.hall.search_living("chick")) self.assertEqual(None, self.hall.search_living("bloke")) def test_search_item(self): # almost identical to locate_item so only do a few basic tests self.assertEqual(None, self.player.search_item("<notexisting>")) self.assertEqual(self.pencil, self.player.search_item("pencil")) def test_locate_item(self): item, container = self.player.locate_item("<notexisting>") self.assertEqual(None, item) self.assertEqual(None, container) item, container = self.player.locate_item("pencil") self.assertEqual(self.pencil, item) self.assertEqual(self.player, container) item, container = self.player.locate_item("fountain pen") self.assertEqual(self.pencil, item, "need to find the title") item, container = self.player.locate_item("pen") self.assertEqual(self.pencil, item, "need to find the alias") item, container = self.player.locate_item("pencil", include_inventory=False) self.assertEqual(None, item) self.assertEqual(None, container) item, container = self.player.locate_item("key") self.assertEqual(self.key, item) self.assertEqual(self.hall, container) item, container = self.player.locate_item("key", include_location=False) self.assertEqual(None, item) self.assertEqual(None, container) item, container = self.player.locate_item("KEY") self.assertEqual(self.key, item, "should work case-insensitive") self.assertEqual(self.hall, container, "should work case-insensitive") item, container = self.player.locate_item("notebook") self.assertEqual(self.notebook_in_bag, item) self.assertEqual(self.bag, container, "should search in bags in inventory") item, container = self.player.locate_item("notebook", include_containers_in_inventory=False) self.assertEqual(None, item) self.assertEqual(None, container, "should not search in bags in inventory") def test_tell(self): rat = MsgTraceNPC("rat", "n", "rodent") self.assertTrue(rat._init_called, "init() must be called from __init__") julie = MsgTraceNPC("julie", "f", "human") hall = Location("hall") hall.livings = [rat, julie] hall.tell("roommsg") self.assertEqual(["roommsg"], rat.messages) self.assertEqual(["roommsg"], julie.messages) rat.clearmessages() julie.clearmessages() hall.tell("roommsg", rat, [julie], "juliemsg") self.assertEqual([], rat.messages) self.assertEqual(["juliemsg"], julie.messages) def test_message_nearby_location(self): plaza = Location("plaza") road = Location("road") house = Location("house") attic = Location("attic") plaza.add_exits([Exit("north", road, "road leads north"), Exit("door", house, "door to a house")]) road.add_exits([Exit("south", plaza, "plaza to the south")]) house.add_exits([Exit("door", plaza, "door to the plaza"), Exit("ladder", attic, "dusty attic")]) attic.add_exits([Exit("ladder", house, "the house")]) wiretap_plaza = Wiretap(plaza) wiretap_road = Wiretap(road) wiretap_house = Wiretap(house) wiretap_attic = Wiretap(attic) plaza.message_nearby_locations("boing") pubsub.sync() self.assertEqual([], wiretap_plaza.msgs, "the plaza doesnt receive tells") self.assertEqual([], wiretap_attic.msgs, "the attic is too far away to receive msgs") self.assertTrue(("road", "boing") in wiretap_road.msgs) self.assertTrue(("road", "The sound is coming from the south.") in wiretap_road.msgs, "road should give sound direction") self.assertTrue(("house", "boing") in wiretap_house.msgs) self.assertTrue(("house", "You can't hear where the sound is coming from.") in wiretap_house.msgs, "in the house you can't locate the sound direction") def test_nearby(self): plaza = Location("plaza") road = Location("road") house = Location("house") alley = Location("alley") # no exits attic = Location("attic") plaza.add_exits([Exit("north", road, "road leads north"), Exit("door", house, "door to a house"), Exit("west", alley, "small alleywith no way back")]) road.add_exits([Exit("south", plaza, "plaza to the south")]) house.add_exits([Exit("door", plaza, "door to the plaza"), Exit("ladder", attic, "dusty attic")]) attic.add_exits([Exit("ladder", house, "the house")]) adj = set(plaza.nearby()) self.assertSetEqual({road, house}, adj) adj = set(plaza.nearby(no_traps=False)) self.assertSetEqual({road, house, alley}, adj) def test_verbs(self): room = Location("room") room.verbs["smurf"] = "" self.assertTrue("smurf" in room.verbs) del room.verbs["smurf"] self.assertFalse("smurf" in room.verbs) def test_enter_leave(self): hall = Location("hall") rat1 = NPC("rat1", "n") rat2 = NPC("rat2", "n") julie = NPC("julie", "f") with self.assertRaises(TypeError): hall.insert(12345, julie) self.assertEqual(_limbo, rat1.location) self.assertFalse(rat1 in hall.livings) wiretap = Wiretap(hall) hall.insert(rat1, julie) self.assertEqual(hall, rat1.location) self.assertTrue(rat1 in hall.livings) self.assertEqual([], wiretap.msgs, "insert shouldn't produce arrival messages") hall.insert(rat2, julie) self.assertTrue(rat2 in hall.livings) self.assertEqual([], wiretap.msgs, "insert shouldn't produce arrival messages") # now test leave wiretap.clear() hall.remove(rat1, julie) self.assertFalse(rat1 in hall.livings) self.assertIsNone(rat1.location) self.assertEqual([], wiretap.msgs, "remove shouldn't produce exit message") hall.remove(rat2, julie) self.assertFalse(rat2 in hall.livings) self.assertEqual([], wiretap.msgs, "remove shouldn't produce exit message") # test random leave hall.remove(rat1, julie) hall.remove(12345, julie) def test_custom_verbs(self): player = Player("julie", "f") player.verbs["xywobble"] = "p1" monster = NPC("snake", "f") monster.verbs["snakeverb"] = "s1" room = Location("room") chair1 = Item("chair1") chair1.verbs["frobnitz"] = "c1" chair2 = Item("chair2") chair2.verbs["frobnitz"] = "c2" chair_in_inventory = Item("chair3") chair_in_inventory.verbs["kowabooga"] = "c3" box_in_inventory = Item("box") box_in_inventory.verbs["boxverb"] = "c4" player.init_inventory([box_in_inventory, chair_in_inventory]) exit = Exit("e", "dummy", None, None) exit.verbs["exitverb"] = "c5" room.init_inventory([chair1, player, chair2, monster]) room.add_exits([exit]) custom_verbs = mud_context.driver.current_custom_verbs(player) all_verbs = mud_context.driver.current_verbs(player) self.assertEqual({"xywobble", "snakeverb", "frobnitz", "kowabooga", "boxverb", "exitverb"}, set(custom_verbs)) self.assertEqual(set(), set(custom_verbs) - set(all_verbs)) def test_notify(self): room = Location("room") room2 = Location("room2") player = Player("julie", "f") room.notify_player_arrived(player, room2) room.notify_player_left(player, room2) room.notify_npc_arrived(player, room2) room.notify_npc_left(player, room2) parsed = ParseResult("verb") room.notify_action(parsed, player)