testability-driver 1.0.3 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (116) hide show
  1. data/lib/tdriver-devtools/behaviour/xml/rdoc_behaviour_xml_generator.rb +2 -2
  2. data/lib/tdriver-devtools/tdriver-devtools.rb +1 -1
  3. data/lib/tdriver-devtools/tests/feature_tests/lib/custom_rdoc_generator.rb +3 -3
  4. data/lib/tdriver/base/behaviour/behaviours/object_behaviour_composition.rb +6 -1
  5. data/lib/tdriver/base/behaviour/behaviours/object_behaviour_description.rb +5 -3
  6. data/lib/tdriver/base/behaviour/behaviours/object_composition.rb +1 -1
  7. data/lib/tdriver/base/behaviour/factory.rb +225 -225
  8. data/lib/tdriver/base/errors.rb +1 -1
  9. data/lib/tdriver/base/state_object.rb +227 -179
  10. data/lib/tdriver/base/sut/controller.rb +2 -2
  11. data/lib/tdriver/base/sut/factory.rb +190 -182
  12. data/lib/tdriver/base/sut/generic/behaviours/application.rb +69 -25
  13. data/lib/tdriver/base/sut/generic/behaviours/controller.rb +1 -1
  14. data/lib/tdriver/base/sut/generic/behaviours/find.rb +4 -4
  15. data/lib/tdriver/base/sut/generic/behaviours/flash_behaviour.rb +3 -3
  16. data/lib/tdriver/base/sut/generic/behaviours/sut.rb +350 -165
  17. data/lib/tdriver/base/sut/generic/behaviours/switchbox_behaviour.rb +9 -9
  18. data/lib/tdriver/base/sut/generic/behaviours/verification.rb +191 -103
  19. data/lib/tdriver/base/sut/generic/commands/application.rb +1 -1
  20. data/lib/tdriver/base/sut/generic/commands/key_sequence.rb +1 -1
  21. data/lib/tdriver/base/sut/generic/commands/screen_capture.rb +1 -1
  22. data/lib/tdriver/base/sut/generic/plugin.rb +1 -1
  23. data/lib/tdriver/base/sut/sut.rb +5 -1
  24. data/lib/tdriver/base/test_object/abstract.rb +136 -151
  25. data/lib/tdriver/base/test_object/adapter.rb +293 -82
  26. data/lib/tdriver/base/test_object/behaviours/syncronization.rb +20 -17
  27. data/lib/tdriver/base/test_object/behaviours/test_object.rb +159 -532
  28. data/lib/tdriver/base/test_object/cache.rb +1 -1
  29. data/lib/tdriver/base/test_object/factory.rb +254 -605
  30. data/lib/tdriver/base/test_object/identificator.rb +1 -1
  31. data/lib/tdriver/base/test_object/loader.rb +1 -1
  32. data/lib/tdriver/base/test_object/verification.rb +17 -17
  33. data/lib/tdriver/loader.rb +20 -9
  34. data/lib/tdriver/report/report.rb +5 -0
  35. data/lib/tdriver/report/report_creator.rb +2 -2
  36. data/lib/tdriver/report/report_cucumber_listener.rb +4 -4
  37. data/lib/tdriver/report/report_cucumber_reporter.rb +4 -4
  38. data/lib/tdriver/report/report_execution_statistics.rb +22 -22
  39. data/lib/tdriver/report/report_grouping.rb +2 -2
  40. data/lib/tdriver/report/report_javascript.rb +11 -4
  41. data/lib/tdriver/report/report_test_case_run.rb +2 -2
  42. data/lib/tdriver/report/report_test_run.rb +5 -5
  43. data/lib/tdriver/report/report_test_unit.rb +74 -26
  44. data/lib/tdriver/report/report_writer.rb +70 -13
  45. data/lib/tdriver/tdriver.rb +17 -8
  46. data/lib/tdriver/util/common/array.rb +1 -1
  47. data/lib/tdriver/util/common/crc16.rb +1 -1
  48. data/lib/tdriver/util/common/environment.rb +1 -1
  49. data/lib/tdriver/util/common/file.rb +18 -9
  50. data/lib/tdriver/util/common/gem.rb +1 -1
  51. data/lib/tdriver/util/common/hash.rb +21 -0
  52. data/lib/tdriver/util/common/kernel.rb +1 -1
  53. data/lib/tdriver/util/common/loader.rb +5 -2
  54. data/lib/tdriver/util/common/numeric.rb +54 -3
  55. data/lib/tdriver/util/common/retryable.rb +30 -12
  56. data/lib/tdriver/util/common/stackable.rb +185 -0
  57. data/lib/tdriver/util/common/string.rb +21 -5
  58. data/lib/tdriver/util/{dbaccess/dbaccess.rb → database/access.rb} +4 -1
  59. data/lib/tdriver/util/{dbaccess/dbconnection.rb → database/connection.rb} +3 -0
  60. data/lib/tdriver/util/{dbaccess → database}/error.rb +0 -1
  61. data/lib/tdriver/util/{dbaccess → database}/loader.rb +5 -6
  62. data/lib/tdriver/util/{dynamic_attribute_filter.rb → filters/dynamic_attributes.rb} +1 -1
  63. data/lib/tdriver/util/hooking/hooking.rb +477 -0
  64. data/lib/tdriver/util/loader.rb +35 -29
  65. data/lib/tdriver/util/localisation/error.rb +0 -1
  66. data/lib/tdriver/util/localisation/loader.rb +1 -4
  67. data/lib/tdriver/util/localisation/localisation.rb +30 -27
  68. data/lib/tdriver/util/{common.rb → logger/loader.rb} +2 -4
  69. data/lib/tdriver/util/logger/logger.rb +574 -0
  70. data/lib/tdriver/util/operator_data/loader.rb +4 -3
  71. data/lib/tdriver/util/operator_data/operator_data.rb +5 -5
  72. data/lib/tdriver/util/parameter/parameter.rb +7 -1
  73. data/lib/tdriver/util/parameter/parameter_hash.rb +1 -1
  74. data/lib/tdriver/util/parameter/parameter_template.rb +1 -1
  75. data/lib/tdriver/util/parameter/parameter_user_api.rb +28 -20
  76. data/lib/tdriver/util/parameter/parameter_xml.rb +1 -1
  77. data/lib/tdriver/util/plugin/abstract.rb +1 -1
  78. data/lib/tdriver/util/plugin/service.rb +1 -1
  79. data/lib/tdriver/util/{localisation.rb → recorder/loader.rb} +4 -3
  80. data/lib/tdriver/util/recorder/recorder.rb +66 -0
  81. data/lib/tdriver/util/recorder/scripter.rb +258 -0
  82. data/lib/tdriver/util/{stats.rb → statistics/statistics.rb} +7 -8
  83. data/lib/tdriver/util/user_data/error.rb +0 -1
  84. data/lib/tdriver/util/user_data/loader.rb +1 -2
  85. data/lib/tdriver/util/user_data/user_data.rb +6 -6
  86. data/lib/tdriver/util/video/camera.rb +67 -0
  87. data/lib/tdriver/util/video/camera_linux.rb +139 -0
  88. data/lib/tdriver/util/video/camera_windows.rb +174 -0
  89. data/lib/tdriver/util/video/loader.rb +31 -0
  90. data/lib/tdriver/util/video/video_utils.rb +139 -0
  91. data/lib/tdriver/util/xml/abstraction.rb +56 -5
  92. data/lib/tdriver/util/xml/builder.rb +2 -5
  93. data/lib/tdriver/util/{parameter.rb → xml/comment.rb} +10 -2
  94. data/lib/tdriver/util/xml/loader.rb +32 -22
  95. data/lib/tdriver/util/xml/nil_node.rb +2 -2
  96. data/lib/tdriver/util/xml/parsers/loader.rb +0 -1
  97. data/lib/tdriver/util/xml/parsers/nokogiri/abstraction.rb +18 -44
  98. data/lib/tdriver/util/xml/parsers/nokogiri/attribute.rb +9 -13
  99. data/lib/tdriver/util/xml/parsers/nokogiri/builder.rb +9 -3
  100. data/lib/tdriver/util/xml/parsers/nokogiri/comment.rb +39 -0
  101. data/lib/tdriver/util/xml/parsers/nokogiri/document.rb +6 -11
  102. data/lib/tdriver/util/xml/parsers/nokogiri/element.rb +2 -122
  103. data/lib/tdriver/util/xml/parsers/nokogiri/loader.rb +26 -16
  104. data/lib/tdriver/util/xml/parsers/nokogiri/node.rb +203 -0
  105. data/lib/tdriver/util/xml/parsers/nokogiri/nodeset.rb +1 -2
  106. data/lib/tdriver/util/xml/parsers/nokogiri/text.rb +2 -20
  107. data/lib/tdriver/util/xml/xml.rb +52 -20
  108. data/lib/tdriver/verify/verify.rb +238 -81
  109. data/xml/behaviours/generic.xml +12 -10
  110. metadata +156 -180
  111. data/lib/tdriver/base/test_object/factory_new.rb +0 -202
  112. data/lib/tdriver/util/hooking.rb +0 -434
  113. data/lib/tdriver/util/logger.rb +0 -506
  114. data/lib/tdriver/util/recorder.rb +0 -297
  115. data/lib/tdriver/util/video_utils.rb +0 -384
  116. data/lib/tdriver/util/xml/nil_element.rb +0 -89
@@ -125,7 +125,7 @@ module TDriver
125
125
  end
126
126
 
127
127
  # enable hooking for performance measurement & debug logging
128
- MobyUtil::Hooking.instance.hook_methods( self ) if defined?( MobyUtil::Hooking )
128
+ TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
129
129
 
130
130
  end # TestObjectCache
131
131
 
@@ -16,419 +16,6 @@
16
16
  ## of this file.
17
17
  ##
18
18
  ############################################################################
19
- module TDriver
20
-
21
- class TestObjectFactory
22
-
23
- attr_reader :test_object_adapter, :timeout, :retry_interval
24
-
25
- # TODO: move to test object adapter
26
- # TODO: This method should be in application test object
27
- def get_layout_direction( sut )
28
-
29
- sut.xml_data.at_xpath('*//object[@type="application"]/attributes/attribute[@name="layoutDirection"]/value/text()').to_s || 'LeftToRight'
30
-
31
- end
32
-
33
- def initialize( options )
34
-
35
- @test_object_adapter = options[ :test_object_adapter ]
36
-
37
- @timeout = options[ :timeout ] || MobyUtil::Parameter[ :application_synchronization_timeout, "20" ].to_i
38
-
39
- @retry_interval = options[ :retry_interval ] || MobyUtil::Parameter[ :application_synchronization_retry_interval, "1" ].to_i
40
-
41
- end
42
-
43
- # Function to set timeout for TestObjectFactory
44
- # This should be used only in unit testing, otherwise should not be used
45
- # sets timeout used in identifying TestObjects to new timeout
46
- #
47
- # == params
48
- # new_timeout:: Fixnum which defines the new timeout
49
- # == raises
50
- # ArgumentError:: if parameter is not kind of Fixnum
51
- def timeout=( value )
52
-
53
- value.check_type( Numeric, "Wrong argument type $1 for timeout value (expected $2)" )
54
-
55
- @timeout = value
56
-
57
- end
58
-
59
- def retry_interval=( value )
60
-
61
- value.check_type( Numeric, "Wrong argument type $1 for timeout retry interval value (expected $2)" )
62
-
63
- @retry_interval = value
64
-
65
- end
66
-
67
- # TODO: document me
68
- def get_test_objects( rules )
69
-
70
- # store rules hash to variable
71
- object_attributes_hash = rules[ :object_attributes_hash ].clone
72
-
73
- # remove test object identification directives for object identification attributes hash (e.g. :__index, :__multiple_objects etc.)
74
- identification_directives = rules[ :identification_directives ]
75
-
76
- #object_attributes_hash.strip_dynamic_attributes!
77
-
78
- # get parent object
79
- parent = rules[ :parent ]
80
-
81
- # retrieve sut object
82
- sut = parent.kind_of?( MobyBase::SUT ) ? parent : parent.sut
83
-
84
- # create application refresh attributes hash
85
- if object_attributes_hash[ :type ] == 'application'
86
-
87
- # collect :name, :id and :applicationUid from object_attributes_hash if found
88
- refresh_arguments = object_attributes_hash.collect_keys( :name, :id, :applicationUid )
89
-
90
- else
91
-
92
- if parent.kind_of?( MobyBase::TestObject )
93
-
94
- # get current application for test object
95
- refresh_arguments = { :id => parent.get_application_id }
96
-
97
- elsif parent.kind_of?( MobyBase::SUT )
98
-
99
- # get current application for sut
100
- refresh_arguments = { :id => sut.current_application_id }
101
-
102
- end
103
-
104
- end
105
-
106
- # set default values
107
- identification_directives.default_values(
108
-
109
- # associated sut
110
- :__sut => sut,
111
-
112
- # new child objects parent object
113
- :__parent => parent,
114
-
115
- # get timeout from rules hash or TestObjectFactory
116
- :__timeout => @timeout,
117
-
118
- # get retry interval from rules hash or TestObjectFactory
119
- :__retry_interval => @retry_interval,
120
-
121
- # determine that are we going to retrieve multiple test objects or just one
122
- :__multiple_objects => false,
123
-
124
- # determine that should all child objects childrens be retrieved
125
- :__find_all_children => true,
126
-
127
- # determine that did user give index value
128
- :__index_given => identification_directives.has_key?( :__index ),
129
-
130
- # determine index of test object to be retrieved
131
- :__index => 0,
132
-
133
- :__refresh_arguments => refresh_arguments,
134
-
135
- # make search params
136
- :__search_params => get_parent_params( parent ).push( make_object_search_params( object_attributes_hash ) ),
137
-
138
- :__xy_sorting => false,
139
-
140
- # test object identificator to be used
141
- :__test_object_identificator => MobyBase::TestObjectIdentificator.new( object_attributes_hash )
142
-
143
- )
144
-
145
- identification_directives[ :__index ].check_type( Fixnum, "Wrong value type $1 for :__index test object identification directive (expected $2)" )
146
-
147
- # add object identification attribute keys to dynamic attributes white list
148
- MobyUtil::DynamicAttributeFilter.instance.add_attributes( object_attributes_hash.keys )
149
-
150
- child_objects = identify_object( object_attributes_hash, identification_directives, rules ).collect{ | test_object_xml |
151
-
152
- # create new test object
153
- make_test_object(
154
-
155
- # sut object to t_o
156
- :sut => identification_directives[ :__sut ],
157
-
158
- # parent object to t_o
159
- :parent => identification_directives[ :__parent ],
160
-
161
- # t_o xml
162
- :xml_object => test_object_xml,
163
-
164
- # test object factory
165
- :test_object_factory => self,
166
-
167
- :object_attributes_hash => object_attributes_hash
168
-
169
- )
170
-
171
- }
172
-
173
- # return test object(s); either one or multiple objects
174
- identification_directives[ :__multiple_objects ] ? child_objects : child_objects.first
175
-
176
- end
177
-
178
- # TODO: document me
179
- def identify_object( object_attributes_hash, identification_directives, rules )
180
-
181
- MobyUtil::Retryable.until(
182
-
183
- # maximum time used for retrying, if timeout exceeds pass last raised exception
184
- :timeout => identification_directives[ :__timeout ],
185
-
186
- # interval used before retrying
187
- :interval => identification_directives[ :__retry_interval ],
188
-
189
- # following exceptions are allowed; Retry until timeout exceeds or other exception type is raised
190
- :exception => [ MobyBase::TestObjectNotFoundError, MobyBase::MultipleTestObjectsIdentifiedError ]
191
-
192
- ){
193
-
194
- # refresh sut
195
- identification_directives[ :__sut ].refresh( identification_directives[ :__refresh_arguments ], identification_directives[ :__search_params ] )
196
-
197
- matches, rule = identification_directives[ :__test_object_identificator ].find_objects(
198
- identification_directives[ :__parent ].xml_data,
199
- identification_directives[ :__find_all_children ]
200
- )
201
-
202
- # raise exception if no matching object(s) found
203
- raise MobyBase::TestObjectNotFoundError.new(
204
-
205
- "Cannot find object with rule:\n%s" % rules[ :object_attributes_hash ].inspect
206
-
207
- ) if matches.empty?
208
-
209
- # raise exception if multiple matches found and only one expected
210
- if ( !identification_directives[ :__multiple_objects ] ) && ( matches.count > 1 && !identification_directives[ :__index_given ] )
211
-
212
- # raise exception (with list of paths to all matching objects) if multiple objects flag is false and more than one match found
213
- raise MobyBase::MultipleTestObjectsIdentifiedError.new(
214
-
215
- "Multiple test objects found with rule: %s\nMatching objects:\n%s\n" % [
216
- rules[ :object_attributes_hash ].inspect,
217
- list_matching_test_objects( matches ).each_with_index.collect{ | object, object_index | "%3s) %s" % [ object_index + 1, object ] }.join( "\n" )
218
- ]
219
- )
220
-
221
- end
222
-
223
- # sort matches
224
- if identification_directives[ :__xy_sorting ] == true
225
-
226
- # sort elements
227
- identification_directives[ :__test_object_identificator ].sort_elements_by_xy_layout!(
228
-
229
- matches,
230
-
231
- get_layout_direction( identification_directives[ :__sut ] )
232
-
233
- )
234
-
235
- end
236
-
237
- # return result
238
- if identification_directives[ :__multiple_objects ] && !identification_directives[ :__index_given ]
239
-
240
- # return multiple test objects
241
- matches.to_a
242
-
243
- else
244
-
245
- # return only one test object
246
- [ matches[ identification_directives[ :__index ] ] ]
247
-
248
- end
249
-
250
- }
251
-
252
- end
253
-
254
- def make_test_object( rules )
255
-
256
- # get test object factory object from hash
257
- test_object_factory = rules[ :test_object_factory ]
258
-
259
- # get sut object from hash
260
- sut = rules[ :sut ]
261
-
262
- # get parent object from hash
263
- parent = rules[ :parent]
264
-
265
- xml_object = rules[ :xml_object ]
266
-
267
- if xml_object.kind_of?( MobyUtil::XML::Element )
268
-
269
- # retrieve test object id from xml
270
- object_id = xml_object.attribute( 'id' ).to_i
271
-
272
- # retrieve test object name from xml
273
- object_name = xml_object.attribute( 'name' ).to_s
274
-
275
- # retrieve test object type from xml
276
- object_type = xml_object.attribute( 'type' ).to_s
277
-
278
- # retrieve test object type from xml
279
- env = ( xml_object.attribute( 'env' ) || MobyUtil::Parameter[ sut.id ][ :env ] ).to_s
280
-
281
- else
282
-
283
- # defaults - refactor this
284
- object_type = ""
285
-
286
- object_name = ""
287
-
288
- object_id = 0
289
-
290
- env = MobyUtil::Parameter[ sut.id ][ :env ].to_s
291
-
292
- end
293
-
294
- # calculate object cache hash key
295
- hash_key = ( ( ( 17 * 37 + object_id ) * 37 + object_type.hash ) * 37 + object_name.hash )
296
-
297
- # (DO NOT!!) remove object type from object attributes hash_rule
298
- #rules[ :object_attributes_hash ].delete( :type )
299
-
300
- # get reference to parent objects child objects cache
301
- parent_cache = rules[ :parent ].instance_variable_get( :@child_object_cache )
302
-
303
- # get cached test object from parents child objects cache if found; if not found from cache pass newly created object as is
304
- if parent_cache.has_object?( hash_key )
305
-
306
- # get test object from cache
307
- test_object = parent_cache[ hash_key ]
308
-
309
- test_object.xml_data = xml_object
310
-
311
- else
312
-
313
- test_object = MobyBase::TestObject.new( test_object_factory, sut, parent, xml_object )
314
-
315
- # apply behaviours to test object
316
- test_object.extend( MobyBehaviour::ObjectBehaviourComposition )
317
-
318
- # apply behaviours to test object
319
- test_object.apply_behaviour!(
320
- :object_type => [ '*', object_type ],
321
- #:sut_type => [ '*', sut.ui_type ],
322
- :input_type => [ '*', sut.input.to_s ],
323
- :env => [ '*', *env.split(";") ],
324
- :version => [ '*', sut.ui_version ]
325
- )
326
-
327
- # create child accessors
328
- TDriver::TestObjectAdapter.create_child_accessors!( xml_object, test_object )
329
-
330
- # set given parent in rules hash as parent object to new child test object
331
- test_object.instance_variable_set( :@parent, parent )
332
-
333
- # add created test object to parents child objects cache
334
- parent_cache.add_object( test_object )
335
-
336
- end
337
-
338
- # update test objects creation attributes (either cached object or just newly created child object)
339
- test_object.instance_variable_set( :@creation_attributes, rules[ :object_attributes_hash ].clone )
340
-
341
- # do not make test object verifications if we are operating on the
342
- # base sut itself (allow run to pass)
343
- unless parent.kind_of?( MobyBase::SUT )
344
-
345
- TDriver::TestObjectVerification.verify_ui_dump( sut ) unless sut.verify_blocks.empty?
346
-
347
- end
348
-
349
- test_object
350
-
351
- end
352
-
353
- def make_object_search_params( creation_attributes )
354
-
355
- if creation_attributes[ :type ] != 'application'
356
-
357
- object_search_params = creation_attributes.clone
358
-
359
- object_search_params[ :className ] = object_search_params.delete( :type ) if creation_attributes.has_key?( :type )
360
- object_search_params[ :objectName ] = object_search_params.delete( :name ) if creation_attributes.has_key?( :name )
361
-
362
- object_search_params
363
-
364
- else
365
-
366
- {}
367
-
368
- end
369
-
370
- end
371
-
372
- def get_parent_params( test_object )
373
-
374
- unless [ 'application', 'sut' ].include?( test_object.type )
375
-
376
- search_params.concat( get_parent_params( test_object.parent ) ) if test_object.parent
377
- search_params.concat( [ { :className => test_object.type, :tasId => test_object.id } ] ) #if test_object
378
-
379
- search_params
380
-
381
- else
382
-
383
- []
384
-
385
- end
386
-
387
- end
388
-
389
- private
390
-
391
- def list_matching_test_objects( matches )
392
-
393
- matches.collect{ | object |
394
-
395
- path = [ object.attribute("type") ]
396
-
397
- while object.attribute("type") != 'application' do
398
-
399
- # object/objects/object/../..
400
- object = object.parent.parent
401
-
402
- path << object.attribute("type")
403
-
404
- end
405
-
406
- path.reverse.join(".")
407
-
408
- }.sort
409
-
410
- end
411
-
412
- end # TestObjectFactory
413
-
414
- end # TDriver
415
-
416
-
417
-
418
-
419
-
420
-
421
-
422
-
423
-
424
-
425
-
426
-
427
-
428
-
429
-
430
-
431
-
432
19
 
433
20
  module MobyBase
434
21
 
@@ -446,14 +33,13 @@ module MobyBase
446
33
  def initialize
447
34
 
448
35
  # get timeout from parameters, use default value if parameter not found
449
- @timeout = MobyUtil::Parameter[ :application_synchronization_timeout, "20" ].to_i
36
+ @timeout = $parameters[ :application_synchronization_timeout, "20" ].to_f
450
37
 
451
38
  # get timeout retry interval from parameters, use default value if parameter not found
452
- @_retry_interval = MobyUtil::Parameter[ :application_synchronization_retry_interval, "1" ].to_i
39
+ @_retry_interval = $parameters[ :application_synchronization_retry_interval, "1" ].to_f
453
40
 
454
41
  end
455
42
 
456
- #TODO: Team TE review @ Wheels
457
43
  # Function to set timeout for TestObjectFactory
458
44
  # This should be used only in unit testing, otherwise should not be used
459
45
  # sets timeout used in identifying TestObjects to new timeout
@@ -471,63 +57,93 @@ module MobyBase
471
57
  end
472
58
 
473
59
  # TODO: document me
474
- def identify_object( object_attributes_hash, identification_directives, rules )
60
+ def identify_object( rules )
475
61
 
62
+ # retrieve test object identification directives; e.g. :__index, :__xy_sorting etc
63
+ directives = rules[ :identification_directives ]
64
+
65
+ # retrieve sut object
66
+ sut = rules[ :parent ].instance_variable_get( :@sut )
67
+
68
+ # search parameters for find_objects feature
69
+ search_parameters = make_object_search_params( rules[ :parent ], rules[ :object_attributes_hash ] )
70
+
71
+ # default rules
72
+ directives.default_values(
73
+
74
+ # get timeout from rules hash or TestObjectFactory
75
+ :__timeout => @timeout,
76
+
77
+ # get retry interval from rules hash or TestObjectFactory
78
+ :__retry_interval => @_retry_interval,
79
+
80
+ # determine that are we going to retrieve multiple test objects or just one
81
+ :__multiple_objects => false,
82
+
83
+ # determine that should all child objects childrens be retrieved
84
+ :__find_all_children => true,
85
+
86
+ # determine that did user give index value
87
+ :__index_given => directives.has_key?( :__index ),
88
+
89
+ # use sorting if index given
90
+ :__xy_sorting => directives.has_key?( :__index ),
91
+
92
+ # determine index of test object to be retrieved
93
+ :__index => 0
94
+
95
+ )
96
+
97
+ # identify objects until desired matches found or timeout exceeds
476
98
  MobyUtil::Retryable.until(
477
99
 
478
100
  # maximum time used for retrying, if timeout exceeds pass last raised exception
479
- :timeout => identification_directives[ :__timeout ],
101
+ :timeout => directives[ :__timeout ],
480
102
 
481
103
  # interval used before retrying
482
- :interval => identification_directives[ :__retry_interval ],
104
+ :interval => directives[ :__retry_interval ],
483
105
 
484
106
  # following exceptions are allowed; Retry until timeout exceeds or other exception type is raised
485
- :exception => [ MobyBase::TestObjectNotFoundError, MobyBase::MultipleTestObjectsIdentifiedError ]
107
+ :exception => [ MobyBase::TestObjectNotFoundError, MobyBase::MultipleTestObjectsIdentifiedError ]
486
108
 
487
109
  ){
488
110
 
489
111
  # refresh sut
490
- identification_directives[ :__sut ].refresh( identification_directives[ :__refresh_arguments ], identification_directives[ :__search_params ] )
491
-
492
- matches, rule = identification_directives[ :__test_object_identificator ].find_objects(
493
- identification_directives[ :__parent ].xml_data,
494
- identification_directives[ :__find_all_children ]
495
- )
112
+ sut.refresh( directives[ :__refresh_arguments ], search_parameters )
496
113
 
497
- # raise exception if no matching object(s) found
498
- raise MobyBase::TestObjectNotFoundError.new(
114
+ # retrieve objects from xml
115
+ matches, rule = TDriver::TestObjectAdapter.get_objects(
499
116
 
500
- "Cannot find object with rule:\n%s" % rules[ :object_attributes_hash ].inspect
117
+ rules[ :parent ].xml_data,
118
+ rules[ :object_attributes_hash ],
119
+ directives[ :__find_all_children ]
501
120
 
502
- ) if matches.empty?
121
+ )
122
+
123
+ # raise exception if no matching object(s) found
124
+ raise MobyBase::TestObjectNotFoundError, "Cannot find object with rule:\n#{ rules[ :object_attributes_hash ].inspect }" if matches.empty?
503
125
 
504
126
  # raise exception if multiple matches found and only one expected
505
- if ( !identification_directives[ :__multiple_objects ] ) && ( matches.count > 1 && !identification_directives[ :__index_given ] )
127
+ if ( !directives[ :__multiple_objects ] ) && ( matches.count > 1 && !directives[ :__index_given ] )
506
128
 
507
129
  # raise exception (with list of paths to all matching objects) if multiple objects flag is false and more than one match found
508
- raise MobyBase::MultipleTestObjectsIdentifiedError.new(
509
-
510
- "Multiple test objects found with rule: %s\nMatching objects:\n%s\n" % [
511
- rules[ :object_attributes_hash ].inspect,
512
- list_matching_test_objects( matches ).each_with_index.collect{ | object, object_index | "%3s) %s" % [ object_index + 1, object ] }.join( "\n" )
513
- ]
514
- )
130
+ raise MobyBase::MultipleTestObjectsIdentifiedError, "Multiple test objects found with rule: #{ rules[ :object_attributes_hash ].inspect }\nMatching objects:\n#{ list_matching_test_objects_as_list( matches ) }\n"
515
131
 
516
132
  end
517
133
 
518
- # sort matches
519
- if identification_directives[ :__xy_sorting ] == true
520
-
134
+ # sort matches if enabled
135
+ if directives[ :__xy_sorting ] == true
136
+
521
137
  # sort elements
522
138
  TDriver::TestObjectAdapter.sort_elements(
523
139
  matches,
524
- TDriver::TestObjectAdapter.application_layout_direction( identification_directives[ :__sut ] )
140
+ TDriver::TestObjectAdapter.application_layout_direction( sut )
525
141
  )
526
142
 
527
143
  end
528
144
 
529
- # return result
530
- if identification_directives[ :__multiple_objects ] && !identification_directives[ :__index_given ]
145
+ # return result; one or multiple xml elements
146
+ if directives[ :__multiple_objects ] && !directives[ :__index_given ]
531
147
 
532
148
  # return multiple test objects
533
149
  matches.to_a
@@ -535,7 +151,7 @@ module MobyBase
535
151
  else
536
152
 
537
153
  # return only one test object
538
- [ matches[ identification_directives[ :__index ] ] ]
154
+ [ matches[ directives[ :__index ] ] ]
539
155
 
540
156
  end
541
157
 
@@ -575,92 +191,107 @@ module MobyBase
575
191
  value.check_type( type, "Wrong variable type $1 for #{ key.inspect } test object identification directive (expected $2)" ) unless type.nil?
576
192
 
577
193
  }
578
-
579
- # get parent object
580
- parent = rules[ :parent ]
581
-
582
- # retrieve sut object
583
- sut = parent.kind_of?( MobyBase::SUT ) ? parent : parent.sut
584
-
585
- # create application refresh attributes hash
586
- if object_attributes_hash[ :type ] == 'application'
194
+
195
+ # do not create refresh arguments hash if already exists
196
+ unless identification_directives.has_key?( :__refresh_arguments )
197
+
198
+ # create application refresh attributes hash
199
+ if object_attributes_hash[ :type ] == 'application'
587
200
 
588
- # collect :name, :id and :applicationUid from object_attributes_hash if found
589
- refresh_arguments = object_attributes_hash.collect_keys( :name, :id, :applicationUid )
201
+ # collect :name, :id and :applicationUid from object_attributes_hash if found
202
+ identification_directives[ :__refresh_arguments ] = object_attributes_hash.collect_keys( :name, :id, :applicationUid )
590
203
 
591
- else
592
-
593
- if parent.kind_of?( MobyBase::TestObject )
204
+ else
205
+
206
+ if rules[ :parent ].kind_of?( MobyBase::TestObject )
594
207
 
595
- # get current application for test object
596
- refresh_arguments = { :id => parent.get_application_id }
208
+ # get current application for test object
209
+ identification_directives[ :__refresh_arguments ] = { :id => rules[ :parent ].get_application_id }
597
210
 
598
- elsif parent.kind_of?( MobyBase::SUT )
599
-
600
- # get current application for sut
601
- refresh_arguments = { :id => sut.current_application_id }
211
+ elsif rules[ :parent ].kind_of?( MobyBase::SUT )
212
+
213
+ # get current application for sut
214
+ identification_directives[ :__refresh_arguments ] = { :id => rules[ :parent ].current_application_id }
602
215
 
216
+ end
217
+
603
218
  end
604
-
219
+
605
220
  end
606
-
607
- # set default values
608
- identification_directives.default_values(
609
221
 
610
- # associated sut
611
- :__sut => sut,
222
+ # add object identification attribute keys to dynamic attributes white list
223
+ MobyUtil::DynamicAttributeFilter.instance.add_attributes( object_attributes_hash.keys )
612
224
 
613
- # new child objects parent object
614
- :__parent => parent,
225
+ child_objects = identify_object( rules ).collect{ | test_object_xml |
226
+
227
+ # create parent application test object if none defined in rules; most likely the call is originated from SUT#child, but not by using SUT#application
228
+ unless identification_directives.has_key?( :__parent_application ) || rules.has_key?( :parent_application )
229
+
230
+ # retrieve application test object xml element
231
+ application_test_object_xml = TDriver::TestObjectAdapter.retrieve_parent_application( test_object_xml )
232
+
233
+ unless application_test_object_xml.nil?
234
+
235
+ # retrieve sut object
236
+ sut = rules[ :parent ].instance_variable_get( :@sut )
237
+
238
+ # retrieve test object id from xml
239
+ object_id = TDriver::TestObjectAdapter.test_object_element_attribute( application_test_object_xml, 'id' ){ nil }.to_i
240
+
241
+ # retrieve test object name from xml
242
+ object_name = TDriver::TestObjectAdapter.test_object_element_attribute( application_test_object_xml, 'name' ){ nil }.to_s
243
+
244
+ # retrieve test object type from xml
245
+ object_type = TDriver::TestObjectAdapter.test_object_element_attribute( application_test_object_xml, 'type' ){ nil }.to_s
246
+
247
+ # calculate object cache hash key
248
+ hash_key = TDriver::TestObjectAdapter.test_object_hash( object_id, object_type, object_name )
249
+
250
+ parent_cache = sut.instance_variable_get( :@child_object_cache )
615
251
 
616
- # get timeout from rules hash or TestObjectFactory
617
- :__timeout => @timeout,
618
-
619
- # get retry interval from rules hash or TestObjectFactory
620
- :__retry_interval => @_retry_interval,
621
-
622
- # determine that are we going to retrieve multiple test objects or just one
623
- :__multiple_objects => false,
252
+ # get cached test object from parents child objects cache if found; if not found from cache pass newly created object as is
253
+ if parent_cache.has_object?( hash_key )
254
+
255
+ rules[ :parent_application ] = parent_cache[ hash_key ]
256
+
257
+ else
258
+
259
+ # create application test object
260
+ rules[ :parent_application ] = make_test_object(
261
+
262
+ :parent => sut,
263
+ :parent_application => nil,
264
+ :xml_object => application_test_object_xml
265
+
266
+ )
267
+
268
+ end
624
269
 
625
- # determine that should all child objects childrens be retrieved
626
- :__find_all_children => true,
270
+ else
627
271
 
628
- # determine that did user give index value
629
- :__index_given => identification_directives.has_key?( :__index ),
272
+ # could not retrieve parent application object
273
+ rules[ :parent_application ] = nil
274
+
275
+ end
630
276
 
631
- # determine index of test object to be retrieved
632
- :__index => 0,
633
-
634
- :__refresh_arguments => refresh_arguments,
277
+ # store application test object to new test object
278
+ rules[ :parent_application ].instance_variable_set( :@parent_application, rules[ :parent_application ] )
279
+
280
+ end
635
281
 
636
- # make search params
637
- :__search_params => get_parent_params( parent ).push( make_object_search_params( object_attributes_hash ) ),
638
-
639
- # test object identificator to be used
640
- :__test_object_identificator => MobyBase::TestObjectIdentificator.new( object_attributes_hash )
641
-
642
- )
643
-
644
- # add object identification attribute keys to dynamic attributes white list
645
- MobyUtil::DynamicAttributeFilter.instance.add_attributes( object_attributes_hash.keys )
646
-
647
- child_objects = identify_object( object_attributes_hash, identification_directives, rules ).collect{ | test_object_xml |
648
-
649
282
  # create new test object
650
283
  make_test_object(
651
284
 
652
- # sut object to t_o
653
- :sut => identification_directives[ :__sut ],
654
-
655
- # parent object to t_o
656
- :parent => identification_directives[ :__parent ],
285
+ # test objects parent test object
286
+ :parent => rules[ :parent ],
657
287
 
658
- # t_o xml
659
- :xml_object => test_object_xml,
288
+ # test objects parent application
289
+ :parent_application => rules[ :parent_application ],
660
290
 
661
- # test object factory
662
- :test_object_factory => self,
291
+ # xml element to test object
292
+ :xml_object => test_object_xml,
663
293
 
294
+ # object identification attributes
664
295
  :object_attributes_hash => object_attributes_hash
665
296
 
666
297
  )
@@ -672,85 +303,16 @@ module MobyBase
672
303
 
673
304
  end
674
305
 
675
- def make_object_search_params( creation_attributes )
676
-
677
- if creation_attributes[ :type ] != 'application'
678
-
679
- object_search_params = creation_attributes.clone
680
-
681
- object_search_params[ :className ] = object_search_params.delete( :type ) if creation_attributes.has_key?( :type )
682
- object_search_params[ :objectName ] = object_search_params.delete( :name ) if creation_attributes.has_key?( :name )
683
-
684
- object_search_params
685
-
686
- else
687
-
688
- {}
689
-
690
- end
691
-
692
- end
693
-
694
- def get_parent_params( test_object )
695
-
696
- unless [ 'application', 'sut' ].include?( test_object.type )
697
-
698
- search_params = []
699
-
700
- search_params.concat( get_parent_params( test_object.parent ) ) if test_object.parent
701
- search_params.concat( [ :className => test_object.type, :tasId => test_object.id ] ) #if test_object
702
-
703
- search_params
704
-
705
- else
706
-
707
- []
708
-
709
- end
710
-
711
- end
712
-
713
- private
714
-
715
- def list_matching_test_objects( matches )
716
-
717
- matches.collect{ | object |
718
-
719
- path = [ object.attribute( 'type' ) ]
720
-
721
- while object.attribute( 'type' ) != 'application' do
722
-
723
- # object/objects/object/../..
724
- object = object.parent.parent
725
-
726
- path << object.attribute( 'type' )
727
-
728
- end
729
-
730
- path.reverse.join( '.' )
731
-
732
- }.sort
733
-
734
- end
735
-
736
- # TODO: parent application test object should be passed to get_test_objects
737
- def get_layout_direction( sut )
738
-
739
- sut.xml_data.at_xpath('*//object[@type="application"]/attributes/attribute[@name="layoutDirection"]/value/text()').to_s || 'LeftToRight'
740
-
741
- end
742
-
306
+ # TODO: document me
743
307
  def make_test_object( rules )
744
-
745
- # get test object factory object from hash
746
- test_object_factory = rules[ :test_object_factory ]
747
-
748
- # get sut object from hash
749
- sut = rules[ :sut ]
750
-
308
+
751
309
  # get parent object from hash
752
- parent = rules[ :parent]
310
+ parent = rules[ :parent ]
311
+
312
+ # retrieve sut object
313
+ sut = parent.instance_variable_get( :@sut )
753
314
 
315
+ # xml object element
754
316
  xml_object = rules[ :xml_object ]
755
317
 
756
318
  # retrieve attributes
@@ -768,8 +330,8 @@ module MobyBase
768
330
  object_type = TDriver::TestObjectAdapter.test_object_element_attribute( xml_object, 'type' ){ nil }.to_s
769
331
 
770
332
  # retrieve test object type from xml
771
- env = TDriver::TestObjectAdapter.test_object_element_attribute( xml_object, 'env' ){ MobyUtil::Parameter[ sut.id ][ :env ] }.to_s
772
-
333
+ env = TDriver::TestObjectAdapter.test_object_element_attribute( xml_object, 'env' ){ $parameters[ sut.id ][ :env ] }.to_s
334
+
773
335
  else
774
336
 
775
337
  # defaults - refactor this
@@ -779,10 +341,10 @@ module MobyBase
779
341
 
780
342
  object_id = 0
781
343
 
782
- env = MobyUtil::Parameter[ sut.id ][ :env ].to_s
344
+ env = $parameters[ sut.id ][ :env ].to_s
783
345
 
784
346
  end
785
-
347
+
786
348
  # calculate object cache hash key
787
349
  hash_key = TDriver::TestObjectAdapter.test_object_hash( object_id, object_type, object_name )
788
350
 
@@ -799,28 +361,34 @@ module MobyBase
799
361
  test_object.xml_data = xml_object
800
362
 
801
363
  else
802
-
364
+
803
365
  # create test object
804
- test_object = MobyBase::TestObject.new( test_object_factory, sut, parent, xml_object )
366
+ test_object = MobyBase::TestObject.new( self, sut, parent, xml_object )
805
367
 
806
- # apply behaviours to test object
807
- test_object.extend( MobyBehaviour::ObjectBehaviourComposition )
368
+ #test_object.instance_variable_set( :@object_behaviours, [] )
369
+
370
+ # apply all test object related behaviours unless object type is 'application'
371
+ object_type << ';*' unless object_type == 'application'
808
372
 
809
373
  # apply behaviours to test object
810
- test_object.apply_behaviour!(
811
- :object_type => [ '*', object_type ],
812
- #:sut_type => [ '*', sut.ui_type ],
813
- :input_type => [ '*', sut.input.to_s ],
814
- :env => [ '*', *env.split(";") ],
815
- :version => [ '*', sut.ui_version ]
816
- )
374
+ MobyBase::BehaviourFactory.instance.apply_behaviour!(
375
+
376
+ :object => test_object,
377
+ :object_type => [ *object_type.split(';') ],
378
+ :input_type => [ '*', sut.input.to_s ],
379
+ :env => [ '*', *env.to_s.split(";") ],
380
+ :version => [ '*', sut.ui_version.to_s ]
817
381
 
382
+ )
818
383
  # create child accessors
819
384
  TDriver::TestObjectAdapter.create_child_accessors!( xml_object, test_object )
820
385
 
821
- # set given parent in rules hash as parent object to new child test object
386
+ # set given parent in rules hash as parent object for new child test object
822
387
  test_object.instance_variable_set( :@parent, parent )
823
388
 
389
+ # set given application test object in rules hash as parent application for new child test object
390
+ test_object.instance_variable_set( :@parent_application, rules[ :parent_application ] )
391
+
824
392
  # add created test object to parents child objects cache
825
393
  parent_cache.add_object( test_object )
826
394
 
@@ -845,6 +413,88 @@ module MobyBase
845
413
 
846
414
  end
847
415
 
416
+ # create test object search parameters for find_objects service
417
+ def make_object_search_params( test_object, creation_attributes )
418
+
419
+ result = get_parent_params( test_object ).push( get_object_params( creation_attributes ) )
420
+
421
+ # TODO: review find_objects controller
422
+ # workaround? return empty hash if no search params were
423
+ result == [{}] ? {} : result
424
+
425
+ end
426
+
427
+ private
428
+
429
+ # TODO: document me
430
+ def get_object_params( creation_attributes )
431
+
432
+ if creation_attributes[ :type ] != 'application'
433
+
434
+ object_search_params = creation_attributes.clone
435
+
436
+ object_search_params[ :className ] = object_search_params.delete( :type ) if creation_attributes.has_key?( :type )
437
+ object_search_params[ :objectName ] = object_search_params.delete( :name ) if creation_attributes.has_key?( :name )
438
+
439
+ object_search_params
440
+
441
+ else
442
+
443
+ {}
444
+
445
+ end
446
+
447
+ end
448
+
449
+ # TODO: document me
450
+ def get_parent_params( test_object )
451
+
452
+ unless [ 'application', 'sut' ].include?( test_object.type )
453
+
454
+ search_params = []
455
+
456
+ search_params.concat( get_parent_params( test_object.parent ) ) if test_object.parent
457
+ search_params.concat( [ :className => test_object.type, :tasId => test_object.id ] ) #if test_object
458
+
459
+ search_params
460
+
461
+ else
462
+
463
+ []
464
+
465
+ end
466
+
467
+ end
468
+
469
+ # TODO: document me
470
+ def list_matching_test_objects( matches )
471
+
472
+ matches.collect{ | object |
473
+
474
+ path = [ object.attribute( 'type' ) ]
475
+
476
+ while object.attribute( 'type' ) != 'application' do
477
+
478
+ # object/objects/object/../..
479
+ object = object.parent.parent
480
+
481
+ path << object.attribute( 'type' )
482
+
483
+ end
484
+
485
+ path.reverse.join( '.' )
486
+
487
+ }.sort
488
+
489
+ end
490
+
491
+ # TODO: document me
492
+ def list_matching_test_objects_as_list( matches )
493
+
494
+ list_matching_test_objects( matches ).each_with_index.collect{ | object, object_index | "%3s) %s" % [ object_index + 1, object ] }.join( "\n" )
495
+
496
+ end
497
+
848
498
  public # deprecated methods
849
499
 
850
500
  def set_timeout( new_timeout )
@@ -868,9 +518,8 @@ module MobyBase
868
518
  end
869
519
 
870
520
  # enable hoo./base/test_object/factory.rb:king for performance measurement & debug logging
871
- MobyUtil::Hooking.instance.hook_methods( self ) if defined?( MobyUtil::Hooking )
521
+ TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
872
522
 
873
523
  end # TestObjectFactory
874
524
 
875
525
  end # MobyBase
876
-