testability-driver 1.2.1 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (125) hide show
  1. data/bin/tdriver-devtools +0 -0
  2. data/ext/native_extensions.c +165 -6
  3. data/lib/tdriver-devtools/behaviour/old/xml/update +0 -0
  4. data/lib/tdriver-devtools/behaviour/xml/generate.rb +0 -0
  5. data/lib/tdriver-devtools/behaviour/xml/rdoc_behaviour_xml_generator.rb +15 -1
  6. data/lib/tdriver-devtools/doc/update +0 -0
  7. data/lib/tdriver-devtools/doc/xslt/template.xsl +24 -14
  8. data/lib/tdriver-devtools/doc/xslt/update +0 -0
  9. data/lib/tdriver-devtools/tdriver-devtools.rb +0 -0
  10. data/lib/tdriver-devtools/tests/feature_tests/update +0 -0
  11. data/lib/tdriver/base/behaviour/{behaviour.rb → abstract.rb} +3 -6
  12. data/lib/tdriver/base/behaviour/behaviours/object_abstract.rb +107 -0
  13. data/lib/tdriver/base/behaviour/behaviours/object_behaviour_composition.rb +2 -2
  14. data/lib/tdriver/base/behaviour/behaviours/object_behaviour_description.rb +47 -37
  15. data/lib/tdriver/base/behaviour/factory.rb +260 -382
  16. data/lib/tdriver/base/behaviour/loader.rb +22 -4
  17. data/lib/tdriver/base/controller/abstraction.rb +56 -0
  18. data/lib/tdriver/base/controller/loader.rb +21 -0
  19. data/lib/tdriver/base/loader.rb +3 -1
  20. data/lib/tdriver/base/sut/controller.rb +91 -74
  21. data/lib/tdriver/base/sut/factory.rb +8 -8
  22. data/lib/tdriver/base/sut/generic/behaviours/agent.rb +77 -0
  23. data/lib/tdriver/base/sut/generic/behaviours/sut.rb +116 -96
  24. data/lib/tdriver/base/sut/generic/commands/agent.rb +43 -0
  25. data/lib/tdriver/base/sut/sut.rb +10 -8
  26. data/lib/tdriver/base/test_object/abstract.rb +25 -24
  27. data/lib/tdriver/base/test_object/adapter.rb +67 -44
  28. data/lib/tdriver/base/test_object/behaviours/test_object.rb +79 -20
  29. data/lib/tdriver/base/test_object/factory.rb +45 -15
  30. data/lib/tdriver/base/test_object/xml/adapter.rb +80 -57
  31. data/lib/tdriver/env.rb +0 -0
  32. data/lib/tdriver/loader.rb +0 -0
  33. data/lib/tdriver/matti.rb +0 -0
  34. data/lib/tdriver/report/error_recovery/tdriver_error_recovery.rb +1 -0
  35. data/lib/tdriver/report/report.rb +2 -1
  36. data/lib/tdriver/report/report_crash_file_capture.rb +12 -0
  37. data/lib/tdriver/report/report_creator.rb +6 -2
  38. data/lib/tdriver/report/report_execution_statistics.rb +27 -11
  39. data/lib/tdriver/report/report_graph_generator.rb +59 -0
  40. data/lib/tdriver/report/report_test_case_run.rb +34 -2
  41. data/lib/tdriver/report/report_writer.rb +12 -0
  42. data/lib/tdriver/tdriver.rb +12 -1
  43. data/lib/tdriver/util/agent/loader.rb +22 -0
  44. data/lib/tdriver/util/agent/service.rb +107 -0
  45. data/lib/tdriver/util/common/crc16.rb +17 -10
  46. data/lib/tdriver/util/common/hash.rb +4 -1
  47. data/lib/tdriver/util/common/kernel.rb +11 -0
  48. data/lib/tdriver/util/common/numeric.rb +48 -0
  49. data/lib/tdriver/util/common/object.rb +5 -2
  50. data/lib/tdriver/util/common/string.rb +8 -1
  51. data/lib/tdriver/util/filters/attribute_filter.rb +121 -0
  52. data/lib/tdriver/util/filters/loader.rb +29 -0
  53. data/lib/tdriver/util/fixture/loader.rb +22 -0
  54. data/lib/tdriver/util/fixture/service.rb +157 -0
  55. data/lib/tdriver/util/loader.rb +8 -2
  56. data/lib/tdriver/util/logger/logger.rb +12 -6
  57. data/lib/tdriver/util/other/config.rb +0 -0
  58. data/lib/tdriver/util/parameter/parameter.rb +221 -152
  59. data/lib/tdriver/util/plugin/error.rb +0 -0
  60. data/lib/tdriver/util/video/camera_linux.rb +36 -22
  61. data/lib/tdriver/util/xml/parsers/nokogiri/abstraction.rb +3 -13
  62. data/lib/tdriver/util/xml/parsers/nokogiri/node.rb +13 -8
  63. data/lib/tdriver/util/xml/parsers/nokogiri/nodeset.rb +51 -9
  64. data/lib/tdriver/util/xml/xml.rb +4 -2
  65. data/lib/tdriver/verify/verify.rb +280 -621
  66. data/lib/tdriver/version.rb +1 -1
  67. data/xml/behaviours/generic.xml +34 -0
  68. data/xml/templates/generic.xml +20 -3
  69. metadata +168 -240
  70. data/lib/tdriver-devtools/tests/feature_tests/output/application_closable_0x3f.feature +0 -10
  71. data/lib/tdriver-devtools/tests/feature_tests/output/application_close.feature +0 -15
  72. data/lib/tdriver-devtools/tests/feature_tests/output/application_environment.feature +0 -10
  73. data/lib/tdriver-devtools/tests/feature_tests/output/application_executable_name.feature +0 -10
  74. data/lib/tdriver-devtools/tests/feature_tests/output/application_uid.feature +0 -10
  75. data/lib/tdriver-devtools/tests/feature_tests/output/created.rid +0 -1
  76. data/lib/tdriver-devtools/tests/feature_tests/output/find_find.feature +0 -15
  77. data/lib/tdriver-devtools/tests/feature_tests/output/flash_behaviour_flash.feature +0 -10
  78. data/lib/tdriver-devtools/tests/feature_tests/output/flash_behaviour_flash_images.feature +0 -15
  79. data/lib/tdriver-devtools/tests/feature_tests/output/sut_application.feature +0 -15
  80. data/lib/tdriver-devtools/tests/feature_tests/output/sut_capture_screen.feature +0 -10
  81. data/lib/tdriver-devtools/tests/feature_tests/output/sut_child.feature +0 -10
  82. data/lib/tdriver-devtools/tests/feature_tests/output/sut_clear_verify_blocks.feature +0 -10
  83. data/lib/tdriver-devtools/tests/feature_tests/output/sut_connect.feature +0 -10
  84. data/lib/tdriver-devtools/tests/feature_tests/output/sut_controller_execution_order.feature +0 -10
  85. data/lib/tdriver-devtools/tests/feature_tests/output/sut_controller_execution_order_0x3d.feature +0 -10
  86. data/lib/tdriver-devtools/tests/feature_tests/output/sut_current_application_id.feature +0 -15
  87. data/lib/tdriver-devtools/tests/feature_tests/output/sut_disconnect.feature +0 -10
  88. data/lib/tdriver-devtools/tests/feature_tests/output/sut_dump_count.feature +0 -15
  89. data/lib/tdriver-devtools/tests/feature_tests/output/sut_freeze.feature +0 -10
  90. data/lib/tdriver-devtools/tests/feature_tests/output/sut_frozen.feature +0 -10
  91. data/lib/tdriver-devtools/tests/feature_tests/output/sut_get_application_id.feature +0 -10
  92. data/lib/tdriver-devtools/tests/feature_tests/output/sut_get_object.feature +0 -10
  93. data/lib/tdriver-devtools/tests/feature_tests/output/sut_get_operator_data.feature +0 -10
  94. data/lib/tdriver-devtools/tests/feature_tests/output/sut_get_ui_dump.feature +0 -15
  95. data/lib/tdriver-devtools/tests/feature_tests/output/sut_get_user_information.feature +0 -10
  96. data/lib/tdriver-devtools/tests/feature_tests/output/sut_input.feature +0 -15
  97. data/lib/tdriver-devtools/tests/feature_tests/output/sut_parameter.feature +0 -15
  98. data/lib/tdriver-devtools/tests/feature_tests/output/sut_press_key.feature +0 -10
  99. data/lib/tdriver-devtools/tests/feature_tests/output/sut_received_data.feature +0 -10
  100. data/lib/tdriver-devtools/tests/feature_tests/output/sut_refresh.feature +0 -20
  101. data/lib/tdriver-devtools/tests/feature_tests/output/sut_refresh_timeout.feature +0 -15
  102. data/lib/tdriver-devtools/tests/feature_tests/output/sut_refresh_tries.feature +0 -15
  103. data/lib/tdriver-devtools/tests/feature_tests/output/sut_refresh_ui_dump.feature +0 -20
  104. data/lib/tdriver-devtools/tests/feature_tests/output/sut_run.feature +0 -10
  105. data/lib/tdriver-devtools/tests/feature_tests/output/sut_sent_data.feature +0 -10
  106. data/lib/tdriver-devtools/tests/feature_tests/output/sut_state.feature +0 -10
  107. data/lib/tdriver-devtools/tests/feature_tests/output/sut_translate.feature +0 -30
  108. data/lib/tdriver-devtools/tests/feature_tests/output/sut_ui_type.feature +0 -10
  109. data/lib/tdriver-devtools/tests/feature_tests/output/sut_ui_version.feature +0 -10
  110. data/lib/tdriver-devtools/tests/feature_tests/output/sut_unfreeze.feature +0 -10
  111. data/lib/tdriver-devtools/tests/feature_tests/output/sut_update.feature +0 -10
  112. data/lib/tdriver-devtools/tests/feature_tests/output/sut_verify_always.feature +0 -20
  113. data/lib/tdriver-devtools/tests/feature_tests/output/sut_verify_blocks.feature +0 -10
  114. data/lib/tdriver-devtools/tests/feature_tests/output/sut_x_path.feature +0 -10
  115. data/lib/tdriver-devtools/tests/feature_tests/output/sut_xml_data.feature +0 -10
  116. data/lib/tdriver-devtools/tests/feature_tests/output/sut_xml_data_0x3d.feature +0 -10
  117. data/lib/tdriver-devtools/tests/feature_tests/output/sut_xml_data_crc.feature +0 -10
  118. data/lib/tdriver-devtools/tests/feature_tests/output/switchbox_behaviour_power_down.feature +0 -10
  119. data/lib/tdriver-devtools/tests/feature_tests/output/switchbox_behaviour_power_status.feature +0 -10
  120. data/lib/tdriver-devtools/tests/feature_tests/output/switchbox_behaviour_power_up.feature +0 -10
  121. data/lib/tdriver-devtools/tests/feature_tests/output/switchbox_behaviour_reset.feature +0 -10
  122. data/lib/tdriver-devtools/tests/feature_tests/output/verification_test_object_exists_0x3f.feature +0 -15
  123. data/lib/tdriver/base/behaviour/factory_new.rb +0 -409
  124. data/lib/tdriver/base/test_object/identificator.rb +0 -518
  125. data/lib/tdriver/util/filters/dynamic_attributes.rb +0 -189
@@ -1,518 +0,0 @@
1
- ############################################################################
2
- ##
3
- ## Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4
- ## All rights reserved.
5
- ## Contact: Nokia Corporation (testabilitydriver@nokia.com)
6
- ##
7
- ## This file is part of Testability Driver.
8
- ##
9
- ## If you have questions regarding the use of this file, please contact
10
- ## Nokia at testabilitydriver@nokia.com .
11
- ##
12
- ## This library is free software; you can redistribute it and/or
13
- ## modify it under the terms of the GNU Lesser General Public
14
- ## License version 2.1 as published by the Free Software Foundation
15
- ## and appearing in the file LICENSE.LGPL included in the packaging
16
- ## of this file.
17
- ##
18
- ############################################################################
19
-
20
- module MobyBase
21
-
22
- # Class to represent TestObjectIdentificator
23
- # TestObjectIdentificator identifies TestObject representation from a TasMessage xml document.
24
- class TestObjectIdentificator
25
-
26
- attr_accessor :dynamic_attributes
27
-
28
- @@required_attributes = [ :type, :id, :name, :parent ]
29
-
30
- # special cases: allow partial match when value of :type and attribute name matches
31
- @@partial_match_allowed = [ [ :list_item, :Text ], [ 'list_item', :Text ], [ :application, :FullName ], ['application', :FullName ] ]
32
-
33
- # Creating new TestObjectIdentificator gets one argument as a Hash
34
- # The hash contains rules with which xml fragments are identified within the scope.
35
- # The scope can be either whole UI dump, or a TestObject containing child objects
36
- #
37
- # Usage: @test_object_identificator.new (:type => :softkey, :Text => Options)
38
- # ==> tries to find 'softkey' TestObject, which has an attribute 'Text' with value 'Options'
39
- # Usage: @test_object_identificator.new (:type => :list)
40
- # ==> tries to identify the only list currently seen in the scope
41
- #
42
- # == params
43
- # hash_rules:: hash containing rules to identify.
44
- # NOTE: the hash_rule MUST contain either mapping from
45
- # :type => <some_type> OR
46
- # :id => <some id>
47
- # == return
48
- # TestObjectIdentificator:: set with specific rules
49
- # == raises
50
- # ArgumentError:: if hash_rules does not contain either :type or :id
51
- def initialize( hash_rules = {} )
52
-
53
- # Relaxing conditoins of search, no need for mandatory :name, :type or :id rule
54
- #Kernel::raise ArgumentError.new('Cannot create a TestObjectIdentifier without :name, :type or :id rule') unless ( hash_rules.has_key?( :type ) or hash_rules.has_key?( :id ) or hash_rules.has_key?( :name ) )
55
-
56
- # ensure that each attribute keys used for object identification are type of Symbol
57
- @_attributes_used_to_identify_object = Hash[ hash_rules.collect{ | key, value | [ key.to_sym, value ] } ]
58
-
59
- @dynamic_attributes = Hash[ hash_rules.select{ | key, value | key.to_s =~ /^__/ } ]
60
-
61
- @insignificant_attributes = @@required_attributes + [ :__index ] + [ :__xy_sorting ] + [ :__fname ] + [ :__plurality ] + [ :__numerus ] + [ :__lengthvariant ]
62
-
63
- end
64
-
65
- # TODO: Documentation
66
- def find_objects( from_xml_element, find_all_children )
67
-
68
- [ from_xml_element.xpath( rule = xpath_to_identify( find_all_children ) ), rule ]
69
-
70
- end
71
-
72
- # getter to return the rules used in identification
73
- # == returns
74
- # Hash:: Hash object containing the rules
75
- def get_identification_rules
76
-
77
- @_attributes_used_to_identify_object
78
-
79
- end
80
-
81
- # Sort XML nodeset of test objects with layout direction
82
- def sort_elements_by_xy_layout!( nodeset, layout_direction = "LeftToRight" )
83
-
84
- attribute_pattern = "./attributes/attribute[@name='%s']/value/text()"
85
-
86
- # collect only nodes that has x_absolute and y_absolute attributes
87
- nodeset.collect!{ | node |
88
-
89
- node unless node.at_xpath( attribute_pattern % 'x_absolute' ).to_s.empty? || node.at_xpath( attribute_pattern % 'y_absolute' ).to_s.empty?
90
-
91
- }.compact!.sort!{ | element_a, element_b |
92
-
93
- element_a_x = element_a.at_xpath( attribute_pattern % 'x_absolute' ).content.to_i
94
- element_a_y = element_a.at_xpath( attribute_pattern % 'y_absolute' ).content.to_i
95
-
96
- element_b_x = element_b.at_xpath( attribute_pattern % 'x_absolute' ).content.to_i
97
- element_b_y = element_b.at_xpath( attribute_pattern % 'y_absolute' ).content.to_i
98
-
99
- if ( layout_direction =~ /LeftToRight/i )
100
-
101
- ( element_a_y == element_b_y ) ? ( element_a_x <=> element_b_x ) : ( element_a_y <=> element_b_y )
102
-
103
- elsif ( layout_direction =~ /RightToLeft/i )
104
-
105
- ( element_a_y == element_b_y ) ? ( element_b_x <=> element_a_x ) : ( element_a_y <=> element_b_y )
106
-
107
- else
108
-
109
- Kernel::raise ArgumentError.new( "Unexpected layout direction: %s" % layout_direction )
110
-
111
- end
112
-
113
- }
114
-
115
- end
116
-
117
- private
118
-
119
-
120
- # function create x_path that included required attributes type, id and/or name
121
- # == returns
122
- # String:: x_path containing required attributes
123
- def create_xpath_from_required_attributes
124
-
125
- return "@*" if @_attributes_used_to_identify_object[ :type ].to_s == "any"
126
-
127
- xpath = ""
128
-
129
- pattern = "@%s=%s or attributes/attribute[translate(@name,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')=%s]/value=%s"
130
-
131
- @_attributes_used_to_identify_object.each_pair{ | attribute_name, attribute_value |
132
-
133
- next unless @@required_attributes.include?( attribute_name )
134
-
135
- xpath << ' and ' unless xpath.empty?
136
-
137
- xpath << '('
138
-
139
- if attribute_value.kind_of?( Array )
140
-
141
- # multiple (optional) attributes for object identification
142
- attribute_value.each_with_index{ | attribute_value_option, index |
143
-
144
- xpath << ' or ' unless index.zero?
145
-
146
- a_v_o = convertToXPathLiteral( attribute_value_option )
147
-
148
- xpath << pattern % [
149
- attribute_name,
150
- a_v_o,
151
- convertToXPathLiteral( attribute_name.to_s.downcase),
152
- a_v_o
153
- ]
154
-
155
- }
156
-
157
- else
158
-
159
- a_v = convertToXPathLiteral( attribute_value )
160
-
161
- # one attribute used for object identification
162
- xpath << "%s" % [
163
- pattern % [
164
- attribute_name,
165
- a_v,
166
- convertToXPathLiteral( attribute_name.to_s.downcase),
167
- a_v
168
- ]
169
- ]
170
-
171
- end
172
-
173
- xpath << ')'
174
-
175
- }
176
-
177
- xpath
178
-
179
- end
180
-
181
- # Private function to define rule for a given MobyUtil::XML::Element element.
182
- # Uses xml_elements namespace in the rule.
183
- # Uses private instance variable to define the actual rule. Instance variable is set in constructor
184
- # == params
185
- # xml_element:: MobyUtil::XML::Element element frow which objects are being identified
186
- # == returns
187
- # Array (<String>, Array(<String>) ):: returns array of two element as defined below
188
- # String:: Rule to be used in xpath
189
- def xpath_to_identify( get_all_children = true )
190
-
191
- xpath = create_xpath_from_required_attributes
192
-
193
- pattern = "attributes/attribute[translate(@name,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')=%s]/"
194
-
195
- @_attributes_used_to_identify_object.each_pair do | attribute_key, attribute_value |
196
-
197
- # Relaxing conditions, no need for mandatory :name, :type, :parent, :id or :__index. See class instance constructor.
198
- next if @insignificant_attributes.include?( attribute_key )
199
-
200
- xpath << ' and ' unless xpath.empty?
201
-
202
- xpath << pattern % convertToXPathLiteral( attribute_key.to_s.downcase )
203
-
204
- # convert single value to array, due to value can contain multiple values and no use to have duplicate code for processing
205
- attribute_value = [ attribute_value ] unless attribute_value.kind_of?( Array )
206
-
207
- attribute_value.each_with_index do | value, index |
208
-
209
- xpath << " or " unless index.zero?
210
-
211
- # allow partial match when value of :type and attribute name matches. see class instance constructor.
212
- if @@partial_match_allowed.include?( [ @_attributes_used_to_identify_object[ :type ], attribute_key ] )
213
-
214
- xpath << "value[contains(.,%s)]" % convertToXPathLiteral( value )
215
-
216
- else
217
-
218
- xpath << "value=%s" % convertToXPathLiteral( value )
219
-
220
-
221
- end
222
- end
223
-
224
- end
225
-
226
- ( get_all_children ? "*//object[%s]" : "objects[1]/object[%s]" ) % xpath
227
-
228
- end
229
-
230
- # TODO: This method needs to refactored
231
- # function to deal with case where string literals in XPath expressions contains single or double quotes
232
- # If string literal value contain only one type - double or single, then delimit with the other.
233
- # E.g. "'" or '"'
234
- # If value contains both then you can not do it directly in a string literal but need to construct the string using
235
- # concat("'",'"')
236
- def convertToXPathLiteral( value )
237
-
238
- # convert to string if needed
239
- value_string = value.kind_of?( String ) ? value : value.to_s
240
-
241
- if !value_string.include?("\'")
242
-
243
- # return value
244
- "\'%s\'" % value_string
245
-
246
- elsif !value_string.include?("\"")
247
-
248
- # return value
249
- "\"%s\"" % value_string
250
-
251
- else
252
-
253
- result = ""
254
-
255
- substrings = value_string.split( "\"" )
256
-
257
- substrings.each_with_index do | s, i |
258
-
259
- needComma = true if i > 0
260
-
261
- unless s.empty?
262
-
263
- result << ", " if i > 0
264
-
265
- result << "\"%s\"" % s
266
-
267
- needComma = true
268
-
269
- end
270
-
271
- # other than last one
272
- if i < substrings.length - 1
273
-
274
- result << ", " if needComma
275
-
276
- result << "'\"'"
277
-
278
- end
279
-
280
- end
281
-
282
- # return value
283
- "concat(%s)" % result
284
-
285
- end
286
-
287
- end
288
-
289
- public # deprecated
290
-
291
- # function create x_path that included required attributes type, id and/or name
292
- # == returns
293
- # String:: x_path containing required attributes
294
- def create_x_path_from_required_attributes
295
-
296
- return "@*" if @_attributes_used_to_identify_object[ :type ].to_s == "any"
297
-
298
- xpath = ""
299
-
300
- pattern = "@%s=%s or attributes/attribute[translate(@name,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')=%s]/value=%s"
301
-
302
- @_attributes_used_to_identify_object.each_pair{ | attribute_name, attribute_value |
303
-
304
- next unless @@required_attributes.include?( attribute_name )
305
-
306
- xpath << ' and ' unless xpath.empty?
307
-
308
- xpath << '('
309
-
310
- if attribute_value.kind_of?( Array )
311
-
312
- # multiple (optional) attributes for object identification
313
- attribute_value.each_with_index{ | attribute_value_option, index |
314
-
315
- xpath << ' or ' unless index.zero?
316
-
317
- xpath << pattern % [
318
- attribute_name,
319
- convertToXPathLiteral( attribute_value_option),
320
- convertToXPathLiteral( attribute_name.to_s.downcase),
321
- convertToXPathLiteral( attribute_value_option)
322
- ]
323
-
324
- }
325
-
326
- else
327
-
328
- # one attribute used for object identification
329
- xpath << "%s" % [
330
- pattern % [
331
- attribute_name,
332
- convertToXPathLiteral( attribute_value),
333
- convertToXPathLiteral( attribute_name.to_s.downcase),
334
- convertToXPathLiteral( attribute_value)
335
- ]
336
- ]
337
-
338
- end
339
-
340
- xpath << ')'
341
-
342
- }
343
-
344
- xpath
345
-
346
- end
347
-
348
- # Private function to define rule for a given MobyUtil::XML::Element element.
349
- # Uses xml_elements namespace in the rule.
350
- # Uses private instance variable to define the actual rule. Instance variable is set in constructor
351
- # == params
352
- # xml_element:: MobyUtil::XML::Element element frow which objects are being identified
353
- # == returns
354
- # Array (<String>, Array(<String>) ):: returns array of two element as defined below
355
- # String:: Rule to be used in xpath
356
- def get_xpath_to_identify( from_xml_element, namespace = nil, get_all_children= true )
357
-
358
- xpath = create_x_path_from_required_attributes
359
- pattern = "attributes/attribute[translate(@name,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')=%s]/"
360
-
361
- @_attributes_used_to_identify_object.each_pair do | attribute_key, attribute_value |
362
-
363
- # Relaxing conditions, no need for mandatory :name, :type, :parent, :id or :__index. See class instance constructor.
364
- next if @insignificant_attributes.include?( attribute_key )
365
-
366
- xpath << ' and ' unless xpath.empty?
367
-
368
- xpath << pattern % convertToXPathLiteral( attribute_key.to_s.downcase )
369
-
370
- # convert single value to array, due to value can contain multiple values and no use to have duplicate code for processing
371
- attribute_value = [ attribute_value ] unless attribute_value.kind_of?( Array )
372
-
373
- attribute_value.each_with_index do | value, index |
374
-
375
- xpath << " or " unless index.zero?
376
-
377
- # allow partial match when value of :type and attribute name matches. see class instance constructor.
378
- if @@partial_match_allowed.include?( [ @_attributes_used_to_identify_object[ :type ], attribute_key ] )
379
-
380
- xpath << "value[contains(.,%s)]" % convertToXPathLiteral( value )
381
-
382
- else
383
-
384
- xpath << "value=%s" % convertToXPathLiteral( value )
385
-
386
-
387
- end
388
- end
389
-
390
- end
391
-
392
- ( get_all_children ? "*//object[%s]" : "objects[1]/object[%s]" ) % xpath
393
-
394
- end
395
-
396
- =begin
397
- ## Returns array of element nodes
398
- def sort_elements_by_xy_layout( element_set, layout_direction = "LeftToRight" )
399
-
400
- # MobyUtil::XML::NodeSet and Elements
401
- # Take out all test_objects with no x_absolute or y_absolute
402
- to_delete = []
403
- element_set.each do |node|
404
- begin
405
- node.xpath("./attributes/attribute[@name = 'x_absolute']/value").first.content
406
- node.xpath("./attributes/attribute[@name = 'y_absolute']/value").first.content
407
- rescue
408
- to_delete << node
409
- end
410
- end
411
- to_delete.each do |node|
412
- element_set.delete(node)
413
- end
414
- # Sort remaining by layout direction and up to down
415
- # Requires .to_a to return an array of MobyUtil::XML::Elements
416
- element_set.to_a.sort!{ |a, b|
417
- element_a_x = a.xpath("./attributes/attribute[@name = 'x_absolute']/value").first.content.to_i
418
- element_a_y = a.xpath("./attributes/attribute[@name = 'y_absolute']/value").first.content.to_i
419
- element_b_x = b.xpath("./attributes/attribute[@name = 'x_absolute']/value").first.content.to_i
420
- element_b_y = b.xpath("./attributes/attribute[@name = 'y_absolute']/value").first.content.to_i
421
- if ( layout_direction.downcase == "LeftToRight".downcase )
422
- ( element_a_y == element_b_y ) ? ( element_a_x <=> element_b_x ) : ( element_a_y <=> element_b_y )
423
- elsif ( layout_direction.downcase == "RightToLeft".downcase )
424
- ( element_a_y == element_b_y ) ? ( element_b_x <=> element_a_x ) : ( element_a_y <=> element_b_y )
425
- else
426
- Kernel::raise ArgumentError.new("Unexpected layout direction: " + layout_direction)
427
- end
428
- }
429
- end
430
- =end
431
-
432
- # Function to identify an object from tasMessage xml content
433
- #
434
- # == params
435
- # from_xml_element: MobyUtil::XML::Element XML element for TestObject object containing the information from which a child test object is to be identified
436
- # == return
437
- # MobyUtil::XML::Element:: found XML fragment, if any
438
- # == raise
439
- # MultipleTestObjectsIdentifiedError:: if multiple test objects are identified
440
- # TestObjectNotFoundError:: if no TestObject can be identified
441
- # ArgumentError:: if 'from_xml_element' is not of type MobyUtil::XML::Element
442
- def find_object_data( from_xml_element, layout_direction = nil )
443
-
444
- from_xml_element.check_type( MobyUtil::XML::Element, "Wrong argument type $1 for XML element (expected $2)" )
445
-
446
- #Kernel::raise ArgumentError.new( "Wrong argument type %s for argument 'xml_element' (expected MobyUtil::XML::Element)" % from_xml_element.class ) unless from_xml_element.kind_of?( MobyUtil::XML::Element )
447
-
448
- xpath = get_xpath_to_identify( from_xml_element )
449
-
450
- element_set = from_xml_element.xpath( xpath )
451
-
452
- if @_attributes_used_to_identify_object[ :__xy_sorting ] == "true"
453
- begin
454
- #layout_direction = parent_test_object.sut.application( :id => parent_test_object.get_application_id ).attribute("layoutDirection")
455
- element_set = sort_elements_by_xy_layout( element_set, layout_direction )
456
- rescue MobyBase::AttributeNotFoundError
457
- element_set = sort_elements_by_xy_layout( element_set)
458
- end
459
- end
460
-
461
- ret, size = ( (size = element_set.size).zero? ) ? [ nil, 0 ] : [ element_set[ ( ( index = @_attributes_used_to_identify_object[ :__index ] ) || 0 ).to_i ], ( index.nil? ? size : 1 ) ]
462
-
463
- Kernel::raise MobyBase::MultipleTestObjectsIdentifiedError.new( "Multiple test objects found with rule:\n#{ xpath }" ) if ( size > 1 )
464
-
465
- Kernel::raise MobyBase::TestObjectNotFoundError.new( "Cannot find object with rule:\n%s" % [ xpath ] ) if ( size.zero? || ret.nil? )
466
-
467
- ret
468
-
469
- end
470
-
471
- # Function to identify all object from tasMessage xml content
472
- #
473
- # == params
474
- # from_xml_element: MobyUtil::XML::Element XML element for TestObject object containing the information from which a children test object is to be identified
475
- # find_all_children:: Boolean specifying whether all children under the test node or just immediate children should be retreived.
476
- # == return
477
- # MobyUtil::XML::Element:: found XML fragment, if any
478
- # == raise
479
- # TestObjectNotFoundError:: if no TestObject can be identified
480
- # ArgumentError:: if 'from_xml_element' is not of type MobyUtil::XML::Element
481
- def find_multiple_object_data( from_xml_element, find_all_children, layout_direction = nil )
482
-
483
- from_xml_element.check_type( MobyUtil::XML::Element, "Wrong argument type $1 for XML element (expected $2)" )
484
-
485
- #Kernel::raise ArgumentError.new( "Wrong argument type %s for argument 'xml_element' (expected MobyUtil::XML::Element)" % from_xml_element.class ) unless from_xml_element.kind_of?( MobyUtil::XML::Element )
486
-
487
- element_set = from_xml_element.xpath( xpath = get_xpath_to_identify( from_xml_element ,nil,find_all_children) )
488
- ret = Array.new
489
-
490
- if @_attributes_used_to_identify_object[ :__xy_sorting ] == "true"
491
- begin
492
- #layout_direction = parent_test_object.sut.application( :id => parent_test_object.get_application_id ).attribute("layoutDirection")
493
- element_set = sort_elements_by_xy_layout( element_set, layout_direction )
494
- rescue MobyBase::AttributeNotFoundError
495
- element_set = sort_elements_by_xy_layout( element_set)
496
- end
497
- end
498
-
499
- if @_attributes_used_to_identify_object.has_key?( :__index ) && element_set.size > 1
500
- ret << element_set[ @_attributes_used_to_identify_object[ :__index ].to_i ]
501
- size = 1
502
- else
503
- ret = element_set
504
- size = element_set.size
505
- end
506
-
507
- Kernel::raise MobyBase::TestObjectNotFoundError.new( "Cannot find object with rule:\n#{ xpath }" ) if ( size == 0 or ret == nil)
508
-
509
- ret
510
-
511
- end
512
-
513
- # enable hooking for performance measurement & debug logging
514
- TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
515
-
516
- end # TestObjectIdentificator
517
-
518
- end # MobyBase