Exemple #1
0
 def test_ban(self):
     dbfile = pathlib.Path(
         tempfile.gettempdir()) / "tale_test_accdb_{0:f}.sqlite".format(
             time.time())
     actor = Living("normal", gender="f")
     wizard = Living("wizz", gender="f")
     wizard.privileges.add("wizard")
     try:
         accounts = MudAccounts(str(dbfile))
         stats = Stats.from_race("elf", gender='f')
         accounts.create("testname", "s3cr3t", "test@invalid", stats,
                         {"wizard"})
         account = accounts.get("testname")
         self.assertFalse(account.banned)
         with self.assertRaises(ActionRefused):
             accounts.ban("testname", actor)
         with self.assertRaises(LookupError):
             accounts.ban("zerp", wizard)
         accounts.ban("testname", wizard)
         account = accounts.get("testname")
         self.assertTrue(account.banned)
         with self.assertRaises(LookupError):
             accounts.unban("zerp", wizard)
         accounts.unban("testname", wizard)
         account = accounts.get("testname")
         self.assertFalse(account.banned)
     finally:
         dbfile.unlink()
Exemple #2
0
 def test_move(self):
     hall = Location("hall")
     person = Living("person", "m", race="human")
     monster = NPC("dragon", "f", race="dragon")
     monster.aggressive = True
     key = Item("key")
     stone = Item("stone")
     hall.init_inventory([person, key])
     stone.move(hall, person)
     wiretap = Wiretap(hall)
     self.assertTrue(person in hall)
     self.assertTrue(key in hall)
     key.contained_in = person  # hack to force move to actually check the source container
     with self.assertRaises(KeyError):
         key.move(person, person)
     key.contained_in = hall  # put it back as it was
     key.move(person, person)
     self.assertFalse(key in hall)
     self.assertTrue(key in person)
     self.assertEqual([], wiretap.msgs, "item.move() should be silent")
     with self.assertRaises(ActionRefused) as x:
         key.move(monster, person)  # aggressive monster should fail
     self.assertTrue("not a good idea" in str(x.exception))
     monster.aggressive = False
     key.move(monster, person)  # non-aggressive should be ok
Exemple #3
0
 def test_move(self):
     hall = Location("hall")
     attic = Location("attic")
     rat = Living("rat", "n", race="rodent")
     hall.init_inventory([rat])
     wiretap_hall = Wiretap(hall)
     wiretap_attic = Wiretap(attic)
     self.assertTrue(rat in hall.livings)
     self.assertFalse(rat in attic.livings)
     self.assertEqual(hall, rat.location)
     rat.move(attic)
     self.assertTrue(rat in attic.livings)
     self.assertFalse(rat in hall.livings)
     self.assertEqual(attic, rat.location)
     pubsub.sync()
     self.assertEqual([("hall", "Rat leaves.")], wiretap_hall.msgs)
     self.assertEqual([("attic", "Rat arrives.")], wiretap_attic.msgs)
     # now try silent
     wiretap_hall.clear()
     wiretap_attic.clear()
     rat.move(hall, silent=True)
     pubsub.sync()
     self.assertTrue(rat in hall.livings)
     self.assertFalse(rat in attic.livings)
     self.assertEqual(hall, rat.location)
     self.assertEqual([], wiretap_hall.msgs)
     self.assertEqual([], wiretap_attic.msgs)
Exemple #4
0
 def test_lang(self):
     living = Living("julie", "f", race="human")
     self.assertEqual("her", living.objective)
     self.assertEqual("her", living.possessive)
     self.assertEqual("she", living.subjective)
     self.assertEqual("f", living.gender)
     living = Living("max", "m", race="human")
     self.assertEqual("him", living.objective)
     self.assertEqual("his", living.possessive)
     self.assertEqual("he", living.subjective)
     self.assertEqual("m", living.gender)
     living = Living("herp", "n", race="human")
     self.assertEqual("it", living.objective)
     self.assertEqual("its", living.possessive)
     self.assertEqual("it", living.subjective)
     self.assertEqual("n", living.gender)
Exemple #5
0
    def test_show_inventory(self):
        class Ctx(object):
            class Config(object):
                pass

            config = Config()

        class MoneyDriverDummy(object):
            pass

        ctx = Ctx()
        ctx.config.money_type = "modern"
        ctx.driver = MoneyDriverDummy()
        ctx.driver.moneyfmt = MoneyFormatter(ctx.config.money_type)
        julie = Living("julie", "f", race="human")
        tap = julie.get_wiretap()
        collector = PubsubCollector()
        tap.subscribe(collector)
        item1 = Item("key")
        julie.init_inventory([item1])
        julie.money = 9.23
        julie.show_inventory(julie, ctx)
        pubsub.sync()
        text = " ".join(msg.strip() for msg in collector.messages)
        self.assertEqual(
            "Julie is carrying: key Money in possession: 9 dollars and 23 cents.",
            text)
        ctx.config.money_type = None
        ctx.driver.moneyfmt = None
        collector.clear()
        julie.show_inventory(julie, ctx)
        pubsub.sync()
        text = " ".join(msg.strip() for msg in collector.messages)
        self.assertEqual("Julie is carrying: key", text)
Exemple #6
0
 def test_contains(self):
     orc = Living("orc", "m", race="orc")
     axe = Weapon("axe")
     orc.insert(axe, orc)
     self.assertTrue(axe in orc)
     self.assertTrue(axe in orc.inventory)
     self.assertEqual(1, orc.inventory_size)
     self.assertEqual(1, len(orc.inventory))
Exemple #7
0
 def test_tell(self):
     julie = Living("julie", "f", race="human")
     tap = julie.get_wiretap()
     collector = PubsubCollector()
     tap.subscribe(collector)
     julie.tell("msg1", "msg2")
     julie.tell("msg3", "msg4", ignored_arg=42)
     pubsub.sync()
     self.assertEqual(["msg1 msg2", "msg3 msg4"], collector.messages)
Exemple #8
0
 def test_allowance(self):
     orc = Living("orc", "m", race="half-orc")
     axe = Weapon("axe")
     orc.insert(axe, orc)
     self.assertTrue(axe in orc)
     with self.assertRaises(ActionRefused) as x:
         orc.remove(axe, None)
     self.assertTrue("can't take" in str(x.exception))
     orc.remove(axe, orc)
     self.assertFalse(axe in orc)
Exemple #9
0
 def test_lifecycle(self):
     orc = Living("orc", "m", race="orc")
     axe = Weapon("axe")
     orc.insert(axe, orc)
     self.assertIsNotNone(orc.soul)
     self.assertIsNotNone(orc.location)
     self.assertGreater(orc.inventory_size, 0)
     orc.destroy(Context(TestDriver(), None, None, None))
     self.assertIsNone(orc.soul)
     self.assertIsNone(orc.location)
     self.assertEqual(orc.inventory_size, 0)
Exemple #10
0
 def test_open_hours(self):
     self.shopkeeper.validate_open_hours(current_time=datetime.time(9, 0))
     self.shopkeeper.validate_open_hours(current_time=datetime.time(9, 1))
     self.shopkeeper.validate_open_hours(current_time=datetime.time(13, 0))
     self.shopkeeper.validate_open_hours(current_time=datetime.time(16, 59))
     self.shopkeeper.validate_open_hours(current_time=datetime.time(22, 0))
     self.shopkeeper.validate_open_hours(current_time=datetime.time(23, 59))
     self.shopkeeper.validate_open_hours(current_time=datetime.time(0, 0))
     self.shopkeeper.validate_open_hours(current_time=datetime.time(0, 1))
     self.shopkeeper.validate_open_hours(current_time=datetime.time(2, 59))
     wiz = Living("wizard", "m")
     wiz.privileges.add("wizard")
     self.shopkeeper.validate_open_hours(wiz, current_time=datetime.time(2, 59))
Exemple #11
0
 def test_closed_hours(self):
     with self.assertRaises(ActionRefused):
         self.shopkeeper.validate_open_hours(current_time=datetime.time(6, 30))
     with self.assertRaises(ActionRefused):
         self.shopkeeper.validate_open_hours(current_time=datetime.time(8, 59))
     with self.assertRaises(ActionRefused):
         self.shopkeeper.validate_open_hours(current_time=datetime.time(17, 0))
     with self.assertRaises(ActionRefused):
         self.shopkeeper.validate_open_hours(current_time=datetime.time(21, 59))
     with self.assertRaises(ActionRefused):
         self.shopkeeper.validate_open_hours(current_time=datetime.time(3, 0))
     wiz = Living("wizard", "m")
     wiz.privileges.add("wizard")
     self.shopkeeper.validate_open_hours(wiz, current_time=datetime.time(21, 59))
Exemple #12
0
 def test_look(self):
     player = Player("fritz", "m")
     attic = Location("Attic", "A dark attic.")
     player.look()
     self.assertEqual([
         "[Limbo]\n",
         "The intermediate or transitional place or state. There's only nothingness. "
         "Living beings end up here if they're not in a proper location yet.\n"
     ], player.test_get_output_paragraphs())
     player.move(attic, silent=True)
     player.look(short=True)
     self.assertEqual(["[Attic]\n"], player.test_get_output_paragraphs())
     julie = Living("julie", "f")
     julie.move(attic, silent=True)
     player.look(short=True)
     self.assertEqual(["[Attic]\n", "Present here: julie\n"],
                      player.test_get_output_paragraphs())
Exemple #13
0
    def test_door_pair(self):
        loc1 = Location("room1", "room one")
        loc2 = Location("room2", "room two")
        key = Key("key")
        door_one_two = Door("two",
                            loc2,
                            "door to room two",
                            locked=True,
                            opened=False)
        door_two_one = door_one_two.reverse_door(
            "one",
            loc1,
            "door to room one",
            reverse_open_msg="door one open",
            reverse_close_msg="door one close",
            this_open_msg="door two open",
            this_close_msg="door two close")
        loc1.add_exits([door_one_two])
        loc2.add_exits([door_two_one])
        door_one_two.key_code = 555
        key.key_for(door_one_two)
        pubsub1 = PubsubCollector()
        pubsub2 = PubsubCollector()
        loc1.get_wiretap().subscribe(pubsub1)
        loc2.get_wiretap().subscribe(pubsub2)
        self.assertTrue(door_two_one.locked)
        self.assertFalse(door_two_one.opened)
        lucy = Living("lucy", "f")

        door_two_one.unlock(lucy, item=key)
        self.assertFalse(door_one_two.locked)
        door_two_one.open(lucy)
        self.assertTrue(door_one_two.opened)
        pubsub.sync()
        self.assertEqual(["door one open"], pubsub1.messages)
        self.assertEqual([], pubsub2.messages)
        door_one_two.close(lucy)
        door_one_two.lock(lucy, item=key)
        self.assertTrue(door_two_one.locked)
        self.assertFalse(door_two_one.opened)
        pubsub1.clear()
        pubsub2.clear()
        pubsub.sync()
        self.assertEqual([], pubsub1.messages)
        self.assertEqual(["door two close"], pubsub2.messages)
Exemple #14
0
 def test_look_brief(self):
     player = Player("fritz", "m")
     attic = Location("Attic", "A dark attic.")
     cellar = Location("Cellar", "A gloomy cellar.")
     julie = Living("julie", "f")
     julie.move(attic, silent=True)
     player.move(attic, silent=True)
     player.brief = 0  # default setting: always long descriptions
     player.look()
     self.assertEqual(["[Attic]\n", "A dark attic.\n", "Julie is here.\n"],
                      player.test_get_output_paragraphs())
     player.look()
     self.assertEqual(["[Attic]\n", "A dark attic.\n", "Julie is here.\n"],
                      player.test_get_output_paragraphs())
     player.look(short=True)  # override
     self.assertEqual(["[Attic]\n", "Present here: julie\n"],
                      player.test_get_output_paragraphs())
     player.brief = 1  # short for known, long for new locations
     player.look()
     self.assertEqual(["[Attic]\n", "Present here: julie\n"],
                      player.test_get_output_paragraphs())
     player.move(cellar, silent=True)
     player.look()
     self.assertEqual(["[Cellar]\n", "A gloomy cellar.\n"],
                      player.test_get_output_paragraphs())
     player.look()
     self.assertEqual(["[Cellar]\n"], player.test_get_output_paragraphs())
     player.brief = 2  # short always
     player.known_locations.clear()
     player.look()
     self.assertEqual(["[Cellar]\n"], player.test_get_output_paragraphs())
     player.move(attic, silent=True)
     player.look()
     self.assertEqual(["[Attic]\n", "Present here: julie\n"],
                      player.test_get_output_paragraphs())
     player.look(short=True)  # override
     self.assertEqual(["[Attic]\n", "Present here: julie\n"],
                      player.test_get_output_paragraphs())
     player.look(short=False)  # override
     self.assertEqual(["[Attic]\n", "A dark attic.\n", "Julie is here.\n"],
                      player.test_get_output_paragraphs())
Exemple #15
0
 def test_socialize(self):
     player = Player("fritz", "m")
     attic = Location("Attic", "A dark attic.")
     julie = Living("julie", "f")
     julie.move(attic)
     player.move(attic)
     parsed = player.parse("wave all")
     self.assertEqual("wave", parsed.verb)
     self.assertEqual(1, parsed.who_count)
     self.assertEqual(julie, parsed.who_1)
     self.assertEqual((julie, None, None), parsed.who_123)
     self.assertEqual(julie, parsed.who_last)
     self.assertEqual([julie], list(parsed.who_info))
     who, playermsg, roommsg, targetmsg = player.soul.process_verb_parsed(
         player, parsed)
     self.assertEqual({julie}, who)
     self.assertEqual("You wave happily at julie.", playermsg)
     with self.assertRaises(tale.errors.UnknownVerbException):
         player.parse("befrotzificate all and me")
     with self.assertRaises(NonSoulVerb) as x:
         player.parse("befrotzificate all and me",
                      external_verbs={"befrotzificate"})
     parsed = x.exception.parsed
     self.assertEqual("befrotzificate", parsed.verb)
     self.assertEqual(2, parsed.who_count)
     self.assertEqual(julie, parsed.who_1)
     self.assertEqual((julie, player, None), parsed.who_123)
     self.assertEqual([julie, player], list(parsed.who_info))
     self.assertEqual(player, parsed.who_last)
     attic.add_exits([Exit("south", "target", "door")])
     try:
         player.parse("push south")
         self.fail(
             "push south should throw a parse error because of the exit that is used"
         )
     except ParseError:
         pass
     with self.assertRaises(NonSoulVerb):
         player.parse("fart south")
     parsed = player.parse("hug julie")
     player.validate_socialize_targets(parsed)
Exemple #16
0
 def test_destroy_loc(self):
     ctx = Context(None, None, None, None)
     loc = Location("loc")
     i = Item("item")
     liv = Living("rat", "n", race="rodent")
     loc.add_exits([Exit("north", "somewhere", "exit to somewhere")])
     player = Player("julie", "f")
     player.privileges = {"wizard"}
     player.create_wiretap(loc)
     loc.init_inventory([i, liv, player])
     self.assertTrue(len(loc.exits) > 0)
     self.assertTrue(len(loc.items) > 0)
     self.assertTrue(len(loc.livings) > 0)
     self.assertEqual(loc, player.location)
     self.assertEqual(loc, liv.location)
     loc.destroy(ctx)
     self.assertTrue(len(loc.exits) == 0)
     self.assertTrue(len(loc.items) == 0)
     self.assertTrue(len(loc.livings) == 0)
     self.assertEqual(_limbo, player.location)
     self.assertEqual(_limbo, liv.location)
Exemple #17
0
 def test_wiretap(self):
     attic = Location("Attic", "A dark attic.")
     player = Player("fritz", "m")
     io = ConsoleIo(None)
     io.supports_smartquotes = False
     pc = PlayerConnection(player, io)
     player.set_screen_sizes(0, 100)
     julie = Living("julie", "f")
     julie.move(attic)
     player.move(attic)
     julie.tell("message for julie")
     attic.tell("message for room")
     self.assertEqual(["message for room\n"],
                      player.test_get_output_paragraphs())
     with self.assertRaises(ActionRefused):
         player.create_wiretap(julie)
     player.privileges = {"wizard"}
     player.create_wiretap(julie)
     player.create_wiretap(attic)
     julie.tell("message for julie")
     attic.tell("message for room")
     pubsub.sync()
     output = pc.get_output()
     self.assertTrue(
         "[wiretapped from `Attic': message for room]" in output)
     self.assertTrue(
         "[wiretapped from `julie': message for julie]" in output)
     self.assertTrue(
         "[wiretapped from `julie': message for room]" in output)
     self.assertTrue("message for room " in output)
     # test removing the wiretaps
     player.clear_wiretaps()
     import gc
     gc.collect()
     julie.tell("message for julie")
     attic.tell("message for room")
     self.assertEqual(["message for room\n"],
                      player.test_get_output_paragraphs())
Exemple #18
0
 def test_location(self):
     thingy = Item("thing")
     with self.assertRaises(TypeError):
         thingy.location = "foobar"
     hall = Location("hall")
     thingy.location = hall
     self.assertEqual(hall, thingy.contained_in)
     self.assertEqual(hall, thingy.location)
     person = Living("person", "m", race="human")
     key = Item("key")
     backpack = Container("backpack")
     person.insert(backpack, person)
     self.assertIsNone(key.contained_in)
     self.assertIsNone(key.location)
     self.assertTrue(backpack in person)
     self.assertEqual(person, backpack.contained_in)
     self.assertEqual(_limbo, backpack.location)
     hall.init_inventory([person, key])
     self.assertEqual(hall, key.contained_in)
     self.assertEqual(hall, key.location)
     self.assertEqual(hall, backpack.location)
     key.move(backpack, person)
     self.assertEqual(backpack, key.contained_in)
     self.assertEqual(hall, key.location)
Exemple #19
0
                     descr="""
    This person's engine is running but there is nobody behind the wheel.
    He is a few beers short of a six-pack. Three ice bricks shy of an igloo.
    Not the sharpest knife in the drawer. Anyway you get the idea: it's an idiot.
    """)

rat = WalkingRat(
    "rat",
    "n",
    race="rodent",
    descr=
    "A filthy looking rat. Its whiskers tremble slightly as it peers back at you."
)

ant = Living("ant",
             "n",
             race="insect",
             short_descr="A single ant seems to have lost its way.")

clock = gameclock.clone()
clock.short_description = "On the pavement lies a clock, it seems to be working still."

square.init_inventory([
    cursed_gem, normal_gem, paper, trashcan, pouch, insertonly_box,
    removeonly_box, clock, towncrier, idiot, rat, ant
])


class AlleyOfDoors(Location):
    def notify_player_arrived(self, player: Player,
                              previous_location: Location) -> None:
        if previous_location is self:
Exemple #20
0
 def test_nonitem_insert_fail(self):
     something = MudObject("thing that is not an Item")
     orc = Living("orc", "m", race="half-orc")
     with self.assertRaises(ActionRefused):
         orc.insert(something, orc)