def testExternalVerbUnknownWords(self): soul = tale.soul.Soul() player = tale.player.Player("julie", "f") with self.assertRaises(tale.soul.ParseError) as x: soul.process_verb(player, "sit door1") self.assertEqual("It's not clear what you mean by 'door1'.", str(x.exception)) with self.assertRaises(tale.soul.NonSoulVerb) as x: soul.process_verb(player, "sit door1 zen", external_verbs={"sit"}) parsed = x.exception.parsed self.assertEqual("sit", parsed.verb) self.assertEqual(["door1", "zen"], parsed.args) self.assertEqual(["door1", "zen"], parsed.unrecognized)
def testAdverbs(self): soul = tale.soul.Soul() player = tale.player.Player("julie", "f", "human") # check handling of more than one adverb with self.assertRaises(tale.errors.ParseError) as ex: soul.process_verb(player, "cough sickly and noisily") self.assertEqual("You can't do that both sickly and noisily.", str(ex.exception)) # check handling of adverb prefix where there is 1 unique result verb, (who, player_msg, room_msg, target_msg) = soul.process_verb(player, "cough sic") self.assertEqual("You cough sickly.", player_msg) self.assertEqual("Julie coughs sickly.", room_msg) # check handling of adverb prefix where there are more results with self.assertRaises(tale.errors.ParseError) as ex: soul.process_verb(player, "cough si") self.assertEqual("What adverb did you mean: sickly, sideways, signally, significantly, or silently?", str(ex.exception))
def testMultiTarget(self): soul = tale.soul.Soul() player = tale.player.Player("julie", "f") philip = tale.npc.NPC("philip", "m") kate = tale.npc.NPC("kate", "f", title="Kate") cat = tale.npc.NPC("cat", "n", title="hairy cat") targets = [philip, kate, cat] # peer parsed = tale.soul.ParseResult("peer", who_order=targets) who, player_msg, room_msg, target_msg = soul.process_verb_parsed(player, parsed) self.assertEqual(set(targets), who) self.assertTrue(player_msg.startswith("You peer at ")) self.assertTrue("philip" in player_msg and "hairy cat" in player_msg and "Kate" in player_msg) self.assertTrue(room_msg.startswith("Julie peers at ")) self.assertTrue("philip" in room_msg and "hairy cat" in room_msg and "Kate" in room_msg) self.assertEqual("Julie peers at you.", target_msg) # all/everyone player.move(tale.base.Location("somewhere")) livings = set(targets) livings.add(player) player.location.livings = livings verb, (who, player_msg, room_msg, target_msg) = soul.process_verb(player, "smile confusedly at everyone") self.assertEqual("smile", verb) self.assertEqual(3, len(who)) self.assertEqual(set(targets), set(who), "player should not be in targets") self.assertTrue("philip" in player_msg and "hairy cat" in player_msg and "Kate" in player_msg and not "yourself" in player_msg) self.assertTrue("philip" in room_msg and "hairy cat" in room_msg and "Kate" in room_msg and not "herself" in room_msg) self.assertEqual("Julie smiles confusedly at you.", target_msg)
def testMultiTarget(self): soul = tale.soul.Soul() player = tale.player.Player("julie", "f") philip = tale.npc.NPC("philip", "m") kate = tale.npc.NPC("kate", "f", title="Kate") cat = tale.npc.NPC("cat", "n", title="hairy cat") targets = [philip, kate, cat] # peer parsed = tale.soul.ParseResult("peer", who_order=targets) who, player_msg, room_msg, target_msg = soul.process_verb_parsed(player, parsed) self.assertEqual(set(targets), who) self.assertTrue(player_msg.startswith("You peer at ")) self.assertTrue("philip" in player_msg and "hairy cat" in player_msg and "Kate" in player_msg) self.assertTrue(room_msg.startswith("Julie peers at ")) self.assertTrue("philip" in room_msg and "hairy cat" in room_msg and "Kate" in room_msg) self.assertEqual("Julie peers at you.", target_msg) # all/everyone player.move(tale.base.Location("somewhere")) livings = set(targets) livings.add(player) player.location.livings = livings verb, (who, player_msg, room_msg, target_msg) = soul.process_verb(player, "smile confusedly at everyone") self.assertEqual("smile", verb) self.assertEqual(3, len(who)) self.assertEqual(set(targets), set(who), "player should not be in targets") self.assertTrue("philip" in player_msg and "hairy cat" in player_msg and "Kate" in player_msg and "yourself" not in player_msg) self.assertTrue("philip" in room_msg and "hairy cat" in room_msg and "Kate" in room_msg and "herself" not in room_msg) self.assertEqual("Julie smiles confusedly at you.", target_msg)
def testMessageQuoteParse(self): soul = tale.soul.Soul() player = tale.player.Player("julie", "f") player.move(tale.base.Location("somewhere")) player.location.livings = {tale.npc.NPC("max", "m"), player} # whisper verb, (who, player_msg, room_msg, target_msg) = soul.process_verb(player, "whisper \"hello there\"") self.assertEqual("You whisper 'hello there'.", player_msg) self.assertEqual("Julie whispers 'hello there'.", room_msg) # whisper to a person verb, (who, player_msg, room_msg, target_msg) = soul.process_verb(player, "whisper to max \"hello there\"") self.assertEqual("You whisper 'hello there' to max.", player_msg) self.assertEqual("Julie whispers 'hello there' to max.", room_msg) # whisper to a person with adverb verb, (who, player_msg, room_msg, target_msg) = soul.process_verb(player, "whisper softly to max \"hello there\"") self.assertEqual("You whisper 'hello there' softly to max.", player_msg) self.assertEqual("Julie whispers 'hello there' softly to max.", room_msg)
def testDEUX(self): soul = tale.soul.Soul() player = tale.player.Player("julie", "f") # die parsed = tale.soul.ParseResult("die", adverb="suddenly") who, player_msg, room_msg, target_msg = soul.process_verb_parsed(player, parsed) self.assertEqual("You suddenly fall down and play dead.", player_msg) self.assertEqual("Julie suddenly falls to the ground, dead.", room_msg) # ah parsed = tale.soul.ParseResult("ah", adverb="rudely") who, player_msg, room_msg, target_msg = soul.process_verb_parsed(player, parsed) self.assertEqual("You go 'ah' rudely.", player_msg) self.assertEqual("Julie goes 'ah' rudely.", room_msg) # verb needs a person with self.assertRaises(tale.errors.ParseError) as x: soul.process_verb(player, "touch") self.assertEqual("The verb touch needs a person.", str(x.exception))
def testUnknownVerb(self): soul = tale.soul.Soul() player = tale.player.Player("julie", "f") with self.assertRaises(tale.soul.UnknownVerbException) as ex: parsed = tale.soul.ParseResult("_unknown_verb_") soul.process_verb_parsed(player, parsed) self.assertEqual("_unknown_verb_", str(ex.exception)) self.assertEqual("_unknown_verb_", ex.exception.verb) self.assertEqual(None, ex.exception.words) self.assertEqual(None, ex.exception.qualifier) with self.assertRaises(tale.soul.UnknownVerbException) as ex: soul.process_verb(player, "fail _unknown_verb_ herp derp") self.assertEqual("_unknown_verb_", ex.exception.verb) self.assertEqual("fail", ex.exception.qualifier) self.assertEqual(["_unknown_verb_", "herp", "derp"], ex.exception.words) self.assertTrue(soul.is_verb("bounce")) self.assertFalse(soul.is_verb("_unknown_verb_"))
def testBodypart(self): soul = tale.soul.Soul() player = tale.player.Player("julie", "f") targets = [tale.npc.NPC("max", "m")] parsed = tale.soul.ParseResult("beep", who_order=targets) who, player_msg, room_msg, target_msg = soul.process_verb_parsed(player, parsed) self.assertEqual("You triumphantly beep max on the nose.", player_msg) self.assertEqual("Julie triumphantly beeps max on the nose.", room_msg) self.assertEqual("Julie triumphantly beeps you on the nose.", target_msg) parsed.bodypart = "arm" who, player_msg, room_msg, target_msg = soul.process_verb_parsed(player, parsed) self.assertEqual("You triumphantly beep max on the arm.", player_msg) self.assertEqual("Julie triumphantly beeps max on the arm.", room_msg) self.assertEqual("Julie triumphantly beeps you on the arm.", target_msg) # check handling of more than one bodypart with self.assertRaises(tale.errors.ParseError) as ex: soul.process_verb(player, "kick max side knee") self.assertEqual("You can't do that both in the side and on the knee.", str(ex.exception))
def testQualifierParse(self): soul = tale.soul.Soul() player = tale.player.Player("julie", "f") verb, (who, player_msg, room_msg, target_msg) = soul.process_verb(player, "dont scream") self.assertEqual("don't scream", verb, "expected spell-corrected qualifier") self.assertEqual("You don't scream loudly.", player_msg) self.assertEqual("Julie doesn't scream loudly.", room_msg) self.assertEqual("Julie doesn't scream loudly.", target_msg) verb, (who, player_msg, room_msg, target_msg) = soul.process_verb(player, "don't scream") self.assertEqual("don't scream", verb) self.assertEqual("You don't scream loudly.", player_msg) self.assertEqual("Julie doesn't scream loudly.", room_msg) self.assertEqual("Julie doesn't scream loudly.", target_msg) verb, (who, player_msg, room_msg, target_msg) = soul.process_verb(player, "don't scream \"I have no idea\"") self.assertEqual("don't scream", verb) self.assertEqual("You don't scream 'I have no idea' loudly.", player_msg) self.assertEqual("Julie doesn't scream 'I have no idea' loudly.", room_msg) self.assertEqual("Julie doesn't scream 'I have no idea' loudly.", target_msg) verb, (who, player_msg, room_msg, target_msg) = soul.process_verb(player, "fail sit") self.assertEqual("fail sit", verb) self.assertEqual("You try to sit down, but fail miserably.", player_msg) self.assertEqual("Julie tries to sit down, but fails miserably.", room_msg)
def testExternalVerbs(self): soul = tale.soul.Soul() player = tale.player.Player("julie", "f") with self.assertRaises(tale.soul.UnknownVerbException): soul.process_verb(player, "externalverb") verb, _ = soul.process_verb(player, "sit", external_verbs=set()) self.assertEqual("sit", verb) with self.assertRaises(tale.soul.NonSoulVerb) as x: soul.process_verb(player, "sit", external_verbs={"sit"}) self.assertEqual("sit", str(x.exception)) self.assertEqual("sit", x.exception.parsed.verb) with self.assertRaises(tale.soul.NonSoulVerb) as x: soul.process_verb(player, "externalverb", external_verbs={"externalverb"}) self.assertIsInstance(x.exception.parsed, tale.soul.ParseResult) self.assertEqual("externalverb", x.exception.parsed.verb) with self.assertRaises(tale.soul.NonSoulVerb) as x: soul.process_verb(player, "who who", external_verbs={"who"}) self.assertEqual("who", x.exception.parsed.verb, "who as external verb needs to be processed as normal arg, not as adverb") self.assertEqual(["who"], x.exception.parsed.args, "who as external verb needs to be processed as normal arg, not as adverb")
def testVerbTarget(self): soul = tale.soul.Soul() player = tale.player.Player("julie", "f") player.title = "the great Julie, destroyer of worlds" player.move(tale.base.Location("somewhere")) npc_max = tale.npc.NPC("max", "m") player.location.livings = {npc_max, player} verb, (who, player_msg, room_msg, target_msg) = soul.process_verb(player, "grin") self.assertEqual("grin", verb) self.assertTrue(len(who) == 0) self.assertIsInstance(who, (set, frozenset), "targets must be a set for O(1) lookups") self.assertEqual("You grin evilly.", player_msg) self.assertEqual("The great Julie, destroyer of worlds grins evilly.", room_msg) verb, (who, player_msg, room_msg, target_msg) = soul.process_verb(player, "grin at max") self.assertEqual("grin", verb) self.assertTrue(len(who) == 1) self.assertIsInstance(who, (set, frozenset), "targets must be a set for O(1) lookups") self.assertEqual("max", list(who)[0].name) self.assertEqual("You grin evilly at max.", player_msg) self.assertEqual("The great Julie, destroyer of worlds grins evilly at max.", room_msg) self.assertEqual("The great Julie, destroyer of worlds grins evilly at you.", target_msg) # parsed results parsed = soul.parse(player, "grin at all") self.assertEqual("grin", parsed.verb) self.assertEqual([npc_max], parsed.who_order, "parse('all') must result in only the npc, not the player") who, player_msg, room_msg, target_msg = soul.process_verb_parsed(player, parsed) self.assertTrue(len(who) == 1) self.assertIsInstance(who, (set, frozenset), "targets must be a set for O(1) lookups") self.assertEqual("max", list(who)[0].name) self.assertEqual("You grin evilly at max.", player_msg) parsed = soul.parse(player, "grin at all and me") self.assertEqual("grin", parsed.verb) self.assertEqual([npc_max, player], parsed.who_order, "parse('all and me') must include npc and the player") who, player_msg, room_msg, target_msg = soul.process_verb_parsed(player, parsed) self.assertEqual({npc_max}, who, "player should no longer be part of the remaining targets") self.assertTrue("yourself" in player_msg and "max" in player_msg)
def testUnrecognisedWord(self): soul = tale.soul.Soul() player = tale.player.Player("julie", "f", "human") with self.assertRaises(tale.errors.ParseError): soul.process_verb(player, "cough hubbabubba")