1 """Predicates that can be used when searching for nodes.
2
3 Author: David Malcolm <dmalcolm@redhat.com>"""
4 __author__ = 'David Malcolm <dmalcolm@redhat.com>'
5
6 import unittest
7
8 from i18n import TranslatableString
9
14
16 if isRecursive==defaultValue:
17 return ""
18 else:
19 return ", recursive=%s"%isRecursive
20
22 """
23 Convert string to camelCaps
24 """
25 string = str(string)
26
27
28
29 for char in ":;!@#$%^&*()-+=_~`\\/?|[]{}<>,.\t\n\r\"'":
30 string = string.replace(char, " ")
31 words = string.strip().split(" ")
32 for word in words:
33 word.strip
34 result = ""
35 firstWord=True
36 for word in words:
37 lowercaseWord = word.lower()
38 if firstWord:
39 result += lowercaseWord
40 firstWord=False
41 else:
42 result += lowercaseWord.capitalize()
43 return result
44
46 """Abstract base class representing a predicate function on nodes.
47
48 It's more than just a function in that it has data and can describe itself"""
50 """Pure virtual method returning a boolean if the predicate is satisfied by the node"""
51 raise NotImplementedError
52
54 raise NotImplementedError
55
57 """
58 Method to generate a string containing a (hopefully) readable search
59 method call on a node (to be used when generating Python source code in
60 the event recorder)
61 """
62 raise NotImplementedError
63
65 """
66 Method to generate a string containing a (hopefully) readable name
67 for a Node instance variable that would be the result of a search on
68 this predicate (to be used when generating Python source code in the
69 event recorder).
70 """
71 raise NotImplementedError
72
74 """
75 Predicates are considered equal if they are of the same subclass and
76 have the same data
77 """
78
79
80
81
82
83 if type(self)!=type(other):
84 return False
85 else:
86 return self.__dict__ == other.__dict__
87
88
90 """Search subclass that looks for an application by name"""
95
99 return satisfiedByNode
100
102 return '%s application'%self.appName
103
105
106 return "application(%s)"%self.appName
107
110
112 """SubtreePredicate subclass that takes various optional search fields"""
113
114 - def __init__(self, name = None, roleName = None, description= None, label = None, debugName=None):
142
143
163 return satisfiedByNode
164
167
180
191
193 """Predicate subclass that looks simply by name"""
194
199
203 return satisfiedByNode
204
206 return "named %s"%self.name
207
212
214 """Predicate subclass that looks for a top-level window by name"""
219
223 return satisfiedByNode
224
226 return "%s window"%self.windowName
227
230
233
235 """Predicate subclass that looks for top-level windows"""
238
241
243 """Predicate subclass that looks for a top-level dialog by name"""
248
252 return satisfiedByNode
253
255 return '%s dialog'%self.dialogName
256
259
262
264 """Predicate: is this node labelled by another node"""
265 pass
266
268 """Predicate: is this node labelled with the text string (i.e. by another node with that as a name)"""
273
280 return satisfiedByNode
281
283 return 'labelled %s'%self.labelText
284
287
290
292 """Predicate subclass that looks for a menu by name"""
298
300 return '%s menu'%(self.menuName)
301
304
307
309 """Predicate subclass that looks for a menu item by name"""
316
318 return '%s menuitem'%(self.menuItemName)
319
322
324 return makeCamel(self.menuItemName)+"MenuItem"
325
326 -class IsATextEntryNamed(Predicate):
327 """Predicate subclass that looks for a text entry by name"""
328 - def __init__(self, textEntryName):
329 self.textEntryName = TranslatableString(textEntryName)
330 self.debugName = self.describeSearchResult()
331 self.satisfiedByNode = lambda node: node.roleName == 'text' and \
332 stringMatches(self.textEntryName, node.name)
333
335 return '%s textentry'%(self.textEntryName)
336
337 - def makeScriptMethodCall(self, isRecursive):
338 return "textentry(%s%s)"%(self.textEntryName, makeScriptRecursiveArgument(isRecursive, True))
339
341 return makeCamel(self.textEntryName)+"Entry"
342
359
361 """Predicate subclass that looks for a tab by name"""
367
369 return '%s tab'%(self.tabName)
370
373
376
379 self.assertEquals(makeCamel("gnome-terminal"),"gnomeTerminal")
380 self.assertEquals(makeCamel("Evolution - Mail"), "evolutionMail")
381 self.assertEquals(makeCamel('self.assertEquals(makeCamel("Evolution - Mail"), "evolutionMail")'), "selfAssertequalsMakecamelEvolutionMailEvolutionmail")
382
390
391 dn1 = DummyNode('dummy name 1', 'dummy role 1', 'dummy desc 1')
392 dn2 = DummyNode('dummy name 2', 'dummy role 2', 'dummy desc 2')
393
394 dummyApp = DummyNode('dummy', 'application')
395 self.assertTrue(IsAnApplicationNamed(dummyApp.name).satisfiedByNode(dummyApp))
396
397 self.assertTrue(IsNamed(dn1.name).satisfiedByNode(dn1))
398
399 dummyWin = DummyNode('dummy', 'frame')
400 self.assertTrue(IsAWindowNamed(dummyWin.name).satisfiedByNode(dummyWin))
401 self.assertTrue(IsAWindow().satisfiedByNode(dummyWin))
402
403 dummyDlg = DummyNode('dummy', 'dialog')
404 self.assertTrue(IsADialogNamed(dummyDlg.name).satisfiedByNode(dummyDlg))
405
406 dn2.labeller = dn1
407
408 self.assertTrue(IsLabelledAs(dn1.name).satisfiedByNode(dn2))
409
410 dummyMenu = DummyNode('dummy', 'menu')
411 self.assertTrue(IsAMenuNamed(dummyMenu.name).satisfiedByNode(dummyMenu))
412
413 dummyMenuItem = DummyNode('dummy', 'menu item')
414 self.assertTrue(IsAMenuItemNamed(dummyMenuItem.name).satisfiedByNode(dummyMenuItem))
415
416 dummyText = DummyNode('dummy', 'text')
417 self.assertTrue(IsATextEntryNamed(dummyText.name).satisfiedByNode(dummyText))
418
419 dummyButton = DummyNode('dummy', 'push button')
420 self.assertTrue(IsAButtonNamed(dummyButton.name).satisfiedByNode(dummyButton))
421
422 dummyTab = DummyNode('dummy', 'page tab')
423 self.assertTrue(IsATabNamed(dummyTab.name).satisfiedByNode(dummyTab))
424
425 if __name__ == "__main__":
426 unittest.main()
427