1
from zope.interface import implements
2
from twisted.trial import unittest
3
from twisted.internet import defer
5
from imagination import actions, errors, simulacrum, iimagination, containment
6
from imagination.text import english
7
from imagination.templates import basic
8
from imagination.facets import Facet
10
def getTestUI(actor, SELECTION):
12
implements(iimagination.IUI)
13
def presentMenu(self, list, typename=None):
14
self.typename = typename
16
return defer.succeed(SELECTION)
25
self.didPreAction += 1
26
return self.parentClass.preAction(self)
28
def postAction(self, result):
29
self.didPostAction += 1
30
return self.parentClass.postAction(self, result)
37
class NoTargetTestAction(TestAction, actions.NoTargetAction):
38
parentClass = actions.NoTargetAction
39
def __init__(self, player, text, *a, **kw):
40
actions.NoTargetAction.__init__(self, player, *a, **kw)
43
class TargetTestAction(TestAction, actions.TargetAction):
44
parentClass = actions.TargetAction
46
def __init__(self, player, targetName):
47
actions.TargetAction.__init__(self, player, targetName)
49
class ToolTargetTestAction(TestAction, actions.ToolAction):
50
parentClass = actions.ToolAction
51
def __init__(self, player, targetName, toolName=None):
52
actions.ToolAction.__init__(self, player, targetName, toolName)
54
class TestParser(english.Subparser):
55
def parse_test(self, player, text):
56
return [NoTargetTestAction(player, text)]
58
simpleTargetParsers = {'target': TargetTestAction}
59
simpleToolParsers = {'throw': ToolTargetTestAction}
61
class TestActionTarget(Facet):
62
implements(ITargetTestActionTarget)
64
class TargetTestActionTarget(Facet):
65
implements(ITargetTestActionTarget)
67
class TargetTestActionActor(Facet):
68
implements(ITargetTestActionActor)
70
class ToolTargetTestActionActor(Facet):
71
implements(IToolTargetTestActionActor)
73
class ToolTargetTestActionTarget(Facet):
74
implements(IToolTargetTestActionTarget)
76
class ToolTargetTestActionTool(Facet):
77
implements(IToolTargetTestActionTool)
80
# simulacrum.ICollector: containment.Container,
81
ITargetTestActionTarget: TestActionTarget,
85
class ActionTests(unittest.TestCase):
87
self.parserEngine = english.VerbParserEngine()
88
self.parserEngine.registerSubparser(TestParser())
89
self.actor = basic.Actor[
90
INoTargetTestActionActor: Facet,
91
ITargetTestActionActor: TargetTestActionActor,
92
IToolTargetTestActionActor: ToolTargetTestActionActor
95
IToolTargetTestActionTool: ToolTargetTestActionTool
96
].fill(english.INoun, name='ball').new()
98
IToolTargetTestActionTarget: ToolTargetTestActionTarget
99
].fill(english.INoun, name='bob').new()
100
simulacrum.ICollector(self.actor).grab(bob)
101
simulacrum.ICollector(self.actor).grab(self.ball1)
102
parsing = english.IThinker(self.actor)
103
parsing.parseToActions = self.parserEngine.parseToActions
104
self.parse = parsing.parse
107
class SimpleActions(ActionTests):
109
def testNoTargetAction(self):
110
action = self.parse("test")
112
self.failUnless(isinstance(action, NoTargetTestAction))
113
self.assertEquals(action.didPreAction, 1)
114
self.assertEquals(action.didAction, 1)
115
self.assertEquals(action.didPostAction, 1)
117
self.assertIdentical(action.actor, INoTargetTestActionActor(self.actor))
118
self.assertEquals(action.initText, "")
120
def testTargetAction(self):
121
action = self.parse('target ball')
122
self.failUnless(isinstance(action, TargetTestAction))
123
self.assertEquals(action.didPreAction, 1)
124
self.assertEquals(action.didAction, 1)
125
self.assertEquals(action.didPostAction, 1)
127
self.assertIdentical(action.actor, ITargetTestActionActor(self.actor))
128
self.assertEquals(action.targetName, "ball")
130
def testFailingTargetAction(self):
131
self.assertRaises(errors.ActionRefused, self.parse, 'target foo')
132
# self.parse('target foo')
134
def testToolTargetAction(self):
135
action = self.parse('throw ball at bob')
138
class Ambiguity(ActionTests):
140
ActionTests.setUp(self)
142
IToolTargetTestActionTool: ToolTargetTestActionTool
143
].fill(english.INoun, name='ball').new()
144
simulacrum.ICollector(self.actor).grab(self.ball2)
146
def testAmbiguousTarget(self):
147
testui = getTestUI(self.actor, 0)
148
self.actor[iimagination.IUI] = testui
149
action = self.parse('target ball')
150
self.failUnless(isinstance(action, defer.Deferred))
151
self.assertEquals(testui.typename, 'Target')
153
promptBalls = testui.list[:]
155
balls = [ITargetTestActionTarget(self.ball1), ITargetTestActionTarget(self.ball2)]
156
self.assertEquals(promptBalls, balls)
158
action = unittest.deferredResult(action)
160
self.failUnless(isinstance(action, TargetTestAction))
161
self.assertEquals(action.didPreAction, 1)
162
self.assertEquals(action.didPostAction, 1)
163
self.assertEquals(action.didAction, 1)
165
self.assertIdentical(action.actor, ITargetTestActionActor(self.actor))
166
self.assertIdentical(action.target, ITargetTestActionTarget(promptBalls[0]))