cutedriver-qt-sut-plugin 2.0.0.20210120165900

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. checksums.yaml +7 -0
  2. data/env.rb +24 -0
  3. data/installer/extconf.rb +62 -0
  4. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin.rb +23 -0
  5. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/action.rb +157 -0
  6. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/application.rb +312 -0
  7. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/attribute.rb +300 -0
  8. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/behaviour.rb +214 -0
  9. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/configure_behaviour.rb +317 -0
  10. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/cute_cpu.rb +145 -0
  11. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/cute_gpu.rb +147 -0
  12. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/cute_mem.rb +142 -0
  13. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/cute_pwr.rb +146 -0
  14. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/events.rb +192 -0
  15. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/file_transfer.rb +375 -0
  16. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/find.rb +82 -0
  17. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/fixture.rb +214 -0
  18. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/fps.rb +189 -0
  19. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/gesture.rb +1039 -0
  20. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/infologger.rb +767 -0
  21. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/key_press.rb +166 -0
  22. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/locale_db.rb +157 -0
  23. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/method.rb +112 -0
  24. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/multitouch.rb +474 -0
  25. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/os.rb +100 -0
  26. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/qt_api_method.rb +148 -0
  27. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/record.rb +134 -0
  28. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/screen_capture.rb +279 -0
  29. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/settings.rb +302 -0
  30. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/sut.rb +840 -0
  31. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/synchronization.rb +257 -0
  32. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/treewidgetitemcolumn.rb +117 -0
  33. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/type_text.rb +97 -0
  34. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/view_item.rb +97 -0
  35. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/webkit.rb +272 -0
  36. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/widget.rb +877 -0
  37. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/commands/action.rb +30 -0
  38. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/commands/configure_command.rb +38 -0
  39. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/commands/drag.rb +44 -0
  40. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/commands/find_object.rb +67 -0
  41. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/commands/group.rb +44 -0
  42. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/commands/infologger_command.rb +38 -0
  43. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/commands/qt.rb +171 -0
  44. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/commands/tap.rb +54 -0
  45. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/commands/version.rb +34 -0
  46. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/commands/widget.rb +199 -0
  47. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/agent.rb +54 -0
  48. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/application.rb +192 -0
  49. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/configure_command.rb +53 -0
  50. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/find_object.rb +48 -0
  51. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/fixture.rb +65 -0
  52. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/group.rb +57 -0
  53. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/infologger_command.rb +53 -0
  54. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/key_sequence.rb +93 -0
  55. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/screen_capture.rb +53 -0
  56. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/tap.rb +62 -0
  57. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/version.rb +46 -0
  58. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/widget.rb +98 -0
  59. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/plugin.rb +200 -0
  60. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/sut/adapter.rb +466 -0
  61. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/sut/communication.rb +185 -0
  62. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/sut/controller.rb +69 -0
  63. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/util/find_object_generator.rb +287 -0
  64. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/util/fixture_parameter.rb +77 -0
  65. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/util/message_composer.rb +370 -0
  66. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/util/widget.rb +79 -0
  67. data/lib/testability-driver-qt-sut-plugin.rb +24 -0
  68. data/xml/behaviour/qt.xml +845 -0
  69. data/xml/defaults/sut_qt.xml +9 -0
  70. data/xml/keymap/qt.xml +321 -0
  71. data/xml/keymap/win.xml +174 -0
  72. data/xml/template/qt.xml +141 -0
  73. metadata +127 -0
@@ -0,0 +1,214 @@
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 TDriver.
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 MobyBehaviour
21
+
22
+ module QT
23
+
24
+ # == description
25
+ # Fixture specific behaviours
26
+ #
27
+ # == behaviour
28
+ # QtFixture
29
+ #
30
+ # == requires
31
+ # testability-driver-qt-sut-plugin
32
+ #
33
+ # == input_type
34
+ # *
35
+ #
36
+ # == sut_type
37
+ # qt
38
+ #
39
+ # == sut_version
40
+ # *
41
+ #
42
+ # == objects
43
+ # sut;*
44
+ #
45
+ module Fixture
46
+
47
+ include MobyBehaviour::QT::Behaviour
48
+
49
+ # == description
50
+ # Sends a fixture call to the target. The fixture will be executed either
51
+ # inside the application process or the qttasserver process (if used for sut).
52
+ # The fixture will get a pointer to the object to which this call is made to.
53
+ #
54
+ #
55
+ # == arguments
56
+ # fixture_name
57
+ # String
58
+ # description: Name of the fixture. Fixture mapping is in the tdriver_parameters.xml file.
59
+ # example: tasfixture
60
+ #
61
+ # fixture_method
62
+ # String
63
+ # description: Name of the action to be executed in the fixture.
64
+ # example: callApi
65
+ #
66
+ # parameters_hash
67
+ # Hash
68
+ # description: Optional hash of pareters passed on to the fixture.
69
+ # example: {:name => 'John'}
70
+ #
71
+ # == returns
72
+ # QString
73
+ # description: The value returned but the fixture.
74
+ # example: OK
75
+ #
76
+ # == exceptions
77
+ # ArgumentError
78
+ # description: In case the given parameters are not valid.
79
+ #
80
+ def fixture( fixture_name, fixture_method, parameters_hash = {} )
81
+
82
+ # verify that arguments were given in correct format
83
+ fixture_name.check_type String, 'wrong argument type $1 for fixture name (expected $2)'
84
+
85
+ fixture_method.check_type String, 'wrong argument type $1 for fixture method name (expected $2)'
86
+
87
+ parameters_hash.check_type Hash, 'wrong argument type $1 for fixture parameters (expected $2)'
88
+
89
+ result = nil
90
+
91
+ begin
92
+
93
+ # default parameters
94
+ params = { :name => fixture_name, :command_name => fixture_method, :parameters => parameters_hash, :async => false }
95
+
96
+ # for sut send the fixture command to qttasserver (appid nil)
97
+ if sut?
98
+
99
+ params.merge!( :application_id => nil, :object_id => @id, :object_type => :Application )
100
+
101
+ else
102
+
103
+ params.merge!( :application_id => get_application_id, :object_id => @id, :object_type => attribute( 'objectType' ).to_sym )
104
+
105
+ end
106
+
107
+ result = @sut.execute_command( MobyCommand::Fixture.new( params ) )
108
+
109
+ rescue
110
+
111
+ $logger.behaviour "FAIL;Failed when calling fixture with name #{ fixture_name.inspect } method #{ fixture_method.inspect } parameters #{ parameters_hash.inspect }.;#{ @id.to_s };sut;{};fixture;"
112
+
113
+ raise MobyBase::BehaviourError.new( "Fixture", "Failed to execute fixture name #{ fixture_name.inspect } method #{ fixture_method.inspect }" )
114
+
115
+ end
116
+
117
+ $logger.behaviour "PASS;The fixture command was executed successfully with name #{ fixture_name.inspect } method #{ fixture_method.inspect } parameters #{ parameters_hash.inspect }.;#{ @id.to_s };sut;{};fixture;"
118
+
119
+ result
120
+
121
+ end
122
+
123
+ # == description
124
+ # Sends a fixture call to the target. The fixture will be executed either
125
+ # inside the application process or the qttasserver process (if used for sut).
126
+ # The fixture will get a pointer to the object to which this call is made to.
127
+ # This version of the fixture call is asynchronous. This means that no return value
128
+ # is returned.
129
+ #
130
+ #
131
+ # == arguments
132
+ # fixture_name
133
+ # String
134
+ # description: Name of the fixture. Fixture mapping is in the tdriver_parameters.xml file
135
+ # example: tasfixture
136
+ #
137
+ # fixture_method
138
+ # String
139
+ # description: Name of the action to be executed in the fixture
140
+ # example: callApi
141
+ #
142
+ # parameters_hash
143
+ # Hash
144
+ # description: Optional hash of parameters passed on to the fixture
145
+ # example: {:name => 'John'}
146
+ #
147
+ # == returns
148
+ # NilClass
149
+ # description: -
150
+ # example: -
151
+ #
152
+ # == exceptions
153
+ # ArgumentError
154
+ # description: In case the given parameters are not valid.
155
+ #
156
+ def async_fixture( fixture_name, fixture_method, parameters_hash = {} )
157
+
158
+ # verify that arguments were given in correct format
159
+ fixture_name.check_type String, 'wrong argument type $1 for fixture name (expected $2)'
160
+
161
+ fixture_method.check_type String, 'wrong argument type $1 for fixture method name (expected $2)'
162
+
163
+ parameters_hash.check_type Hash, 'wrong argument type $1 for fixture parameters (expected $2)'
164
+
165
+ result = nil
166
+
167
+ begin
168
+
169
+ # default parameters
170
+ params = { :name => fixture_name, :command_name => fixture_method, :parameters => parameters_hash, :async => true }
171
+
172
+ # for sut send the fixture command to qttasserver (appid nil)
173
+ if sut?
174
+
175
+ params.merge!( :application_id => nil, :object_id => @id, :object_type => :Application )
176
+
177
+ else
178
+
179
+ params.merge!( :application_id => get_application_id, :object_id => @id, :object_type => attribute( 'objectType' ).to_sym )
180
+
181
+ end
182
+
183
+ result = @sut.execute_command( MobyCommand::Fixture.new( params ) )
184
+
185
+ rescue
186
+
187
+ $logger.behaviour "FAIL;Failed when calling async_fixture with name #{ fixture_name.inspect } method #{ fixture_method.inspect } parameters #{ parameters_hash.inspect }.;#{ @id.to_s };sut;{};fixture;"
188
+
189
+ raise MobyBase::BehaviourError.new("Fixture", "Failed to execute async_fixture name #{ fixture_name.inspect } method #{ fixture_method.inspect }")
190
+
191
+ end
192
+
193
+ $logger.behaviour "PASS;The fixture command was executed successfully with name #{ fixture_name.inspect } method #{ fixture_method.inspect } parameters #{ parameters_hash.inspect }.;#{ @id.to_s };sut;{};fixture;"
194
+
195
+ result
196
+
197
+ end
198
+
199
+ # == nodoc
200
+ def fixtures
201
+
202
+ # pass call to fixtures service object
203
+ TDriver::FixtureService.new( :target => self )
204
+
205
+ end
206
+
207
+ # enable hooking for performance measurement & debug logging
208
+ TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
209
+
210
+ end # Fixture
211
+
212
+ end # QT
213
+
214
+ end # MobyBehaviour
@@ -0,0 +1,189 @@
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 TDriver.
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 MobyBehaviour
21
+
22
+ module QT
23
+
24
+ # == description
25
+ #
26
+ # == behaviour
27
+ # QtFps
28
+ #
29
+ # == requires
30
+ # testability-driver-qt-sut-plugin
31
+ #
32
+ # == input_type
33
+ # *
34
+ #
35
+ # == sut_type
36
+ # QT
37
+ #
38
+ # == sut_version
39
+ # *
40
+ #
41
+ # == objects
42
+ # *
43
+ #
44
+ module Fps
45
+
46
+ include MobyBehaviour::QT::Behaviour
47
+
48
+ # == description
49
+ # Start collecting frames per second data for the object.
50
+ # Testability driver qttas package provides a fixture for measuring fps of a component.
51
+ # This behaviour is a wrapper for the fixture.
52
+ # The fixture intercepts paint events send to the target of the fps measurement and simply
53
+ # counts how many occur during each second. The way this is done differs a bit depending
54
+ # on the target object. For normal QWidgets the fps values are measured to the target
55
+ # object direclty. QGraphicsItem based objects this is not the case. For QGrapchisItem
56
+ # based objects the system determines the QGraphicsView the item is in and starts to
57
+ # listen to paint evets send to the viewport of the QGraphicsView. If you measure the
58
+ # QGraphicsView object directly the measurement is also done for the viewport.
59
+ #
60
+ # == returns
61
+ # NilClass
62
+ # description: -
63
+ # example: -
64
+ #
65
+ # == exceptions
66
+ # ArgumentError
67
+ # description: In case the given parameters are not valid.
68
+ #
69
+ def start_fps_measurement
70
+
71
+ begin
72
+
73
+ fixture('fps', 'startFps')
74
+
75
+ rescue Exception
76
+
77
+ $logger.behaviour "FAIL;Failed start_fps_measurement.;#{ identity };start_fps_measurement;"
78
+ raise
79
+
80
+ end
81
+
82
+ $logger.behaviour "PASS;Operation start_fps_measurement executed successfully.;#{ identity };start_fps_measurement;"
83
+
84
+ nil
85
+
86
+ end
87
+
88
+ # == description
89
+ # Stop collecting frames per second data for the object.
90
+ #
91
+ # == returns
92
+ # Array
93
+ # description: An Array of fps entries. Each entry is a hash table that contains the value and time stamp {value => 12, time_stamp => 06:49:42.259}
94
+ # example: [{value => 12, time_stamp => 06:49:42.259}, {value => 11, time_stamp => 06:49:43.259}]
95
+ #
96
+ # == exceptions
97
+ # ArgumentError
98
+ # description: In case the given parameters are not valid.
99
+ #
100
+ def stop_fps_measurement
101
+
102
+ begin
103
+
104
+ results = parse_results( fixture('fps', 'stopFps') )
105
+
106
+ rescue Exception
107
+
108
+ $logger.behaviour "FAIL;Failed stop_fps_measurement.;#{ identity };stop_fps_measurement;"
109
+
110
+ raise
111
+
112
+ end
113
+
114
+ $logger.behaviour "PASS;Operation stop_fps_measurement executed successfully.;#{ identity };stop_fps_measurement;"
115
+
116
+ results
117
+
118
+ end
119
+
120
+ # == description
121
+ # Collect the stored fps results from the target. This will not stop the measurement but it will restart it
122
+ # so the results returned will not be included in the next data request. Measuring fps will have a small impact
123
+ # on the software performance and memory consumption so it is recommended that the collection is stopped if no longer
124
+ # needed.
125
+ #
126
+ # == returns
127
+ # Array
128
+ # description: An Array of fps entries. Each entry is a hash table that contains the
129
+ # value and time stamp {value => 12, time_stamp => 06:49:42.259}
130
+ # example: [{value => 12, time_stamp => 06:49:42.259}, {value => 11, time_stamp => 06:49:43.259}]
131
+ #
132
+ # == exceptions
133
+ # ArgumentError
134
+ # description: In case the given parameters are not valid.
135
+ #
136
+ def collect_fps_data
137
+
138
+ begin
139
+
140
+ results = parse_results( fixture('fps', 'collectData') )
141
+
142
+ rescue Exception
143
+
144
+ $logger.behaviour "FAIL;Failed collect_fps_data.;#{ identity };collect_fps_data;"
145
+
146
+ raise
147
+
148
+ end
149
+
150
+ $logger.behaviour "PASS;Operation collect_fps_data executed successfully.;#{ identity };collect_fps_data;"
151
+
152
+ results
153
+
154
+ end
155
+
156
+ private
157
+
158
+ def parse_results( results_xml )
159
+
160
+ state_object = @sut.state_object( results_xml )
161
+
162
+ results = []
163
+
164
+ count = state_object.results.attribute('count').to_i
165
+
166
+ for i in 0...count
167
+
168
+ value = state_object.fps(:id => i.to_s).attribute('frameCount').to_i
169
+
170
+ time_stamp = state_object.fps(:id => i.to_s).attribute('timeStamp')
171
+
172
+ entry = {:value => value, :time_stamp => time_stamp}
173
+
174
+ results.push(entry)
175
+
176
+ end
177
+
178
+ results
179
+
180
+ end
181
+
182
+ # enable hooking for performance measurement & debug logging
183
+ TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
184
+
185
+ end # Fps
186
+
187
+ end # QT
188
+
189
+ end # MobyBase
@@ -0,0 +1,1039 @@
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 TDriver.
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 MobyBehaviour
21
+
22
+ module QT
23
+
24
+ # == description
25
+ # Gesture behaviour methods are used to do different gestures with UI objects. Various methods exist for different speeds, targets and other options.
26
+ #
27
+ # == behaviour
28
+ # QtGesture
29
+ #
30
+ # == requires
31
+ # testability-driver-qt-sut-plugin
32
+ #
33
+ # == input_type
34
+ # *
35
+ #
36
+ # == sut_type
37
+ # QT
38
+ #
39
+ # == sut_version
40
+ # *
41
+ #
42
+ # == objects
43
+ # *
44
+ #
45
+ module Gesture
46
+
47
+ include MobyBehaviour::QT::Behaviour
48
+
49
+ # == description
50
+ # Flick the screen at the location of the object (touch the object and do a flick gesture).
51
+ # Speed and distance of the flick are defined in the tdriver_parameters under the sut used.
52
+ # By default a flick is a fast gesture.
53
+ # For custom values see the gesture method.
54
+ #
55
+ # == arguments
56
+ # direction
57
+ # Symbol
58
+ # description: Direction of the flick. Please see [link="#directions_table"]the directions table[/link] for valid direction symbols.
59
+ # example: :Left
60
+ # Integer
61
+ # description: Direction of the flick as degrees with 0 being up and 90 right.
62
+ # example: 270
63
+ #
64
+ # button
65
+ # Symbol
66
+ # description: The mouse button pressed while the drag is executed can be defined. Please see [link="#buttons_table"]the buttons table[/link] for valid button symbols.
67
+ # example: :Middle
68
+ # default: :Left
69
+ #
70
+ # optional_params
71
+ # Hash
72
+ # description: The only optional argument supported by flick is :use_tap_screen.
73
+ # example: { :use_tap_screen => 'true' }
74
+ # default: { :use_tap_screen => 'false' }
75
+ #
76
+ # == returns
77
+ # NilClass
78
+ # description: Always returns nil
79
+ # example: nil
80
+ #
81
+ # == exceptions
82
+ # ArgumentError
83
+ # description: One of the arguments is not valid
84
+ def flick( direction, button = :Left, optional_params = {} )
85
+
86
+ begin
87
+
88
+ if optional_params[:use_tap_screen].nil?
89
+ use_tap_screen = sut_parameters[ :use_tap_screen, 'false']
90
+ else
91
+ use_tap_screen = optional_params[:use_tap_screen].to_s
92
+ end
93
+
94
+ optional_params[:useTapScreen] = use_tap_screen
95
+
96
+ speed = calculate_speed(sut_parameters[:gesture_flick_distance], sut_parameters[:gesture_flick_speed])
97
+ distance = sut_parameters[:gesture_flick_distance].to_i
98
+
99
+ params = {:gesture_type => :MouseGesture, :direction => direction, :speed => speed, :distance => distance, :isDrag => false, :button => button, :useTapScreen => use_tap_screen}
100
+
101
+ params.merge!(optional_params)
102
+
103
+ do_gesture(params)
104
+ do_sleep(speed)
105
+
106
+ rescue Exception => e
107
+
108
+ $logger.behaviour "FAIL;Failed flick with direction \"#{direction}\", button \"#{button.to_s}\".;#{identity};flick;"
109
+ raise e
110
+ end
111
+
112
+ $logger.behaviour "PASS;Operation flick executed successfully with direction \"#{direction}\", button \"#{button.to_s}\".;#{identity};flick;"
113
+
114
+ self
115
+ end
116
+
117
+ # == description
118
+ # Flick the screen at the location of the object (touch the object and do a flick gesture), ending the flick at the specified coordinates.
119
+ # Speed and distance of the flick are defined in the tdriver_parameters under the sut used.
120
+ # By default a flick is a fast gesture.
121
+ # For custom values see the gesture_to method.
122
+ #
123
+ # == arguments
124
+ # x
125
+ # Integer
126
+ # description: X coordinate of the target point. The coordinate is an absolute screen coordinate, relative to the display top left corner.
127
+ # example: 300
128
+ #
129
+ # y
130
+ # Integer
131
+ # description: Y coordinate of the target point. The coordinate is an absolute screen coordinate, relative to the display top left corner.
132
+ # example: 300
133
+ #
134
+ # button
135
+ # Symbol
136
+ # description: The mouse button pressed while the flick is executed can be defined. Please see [link="#buttons_table"]the buttons table[/link] for valid button symbols.
137
+ # example: :Middle
138
+ # default: :Left
139
+ #
140
+ # optional_params
141
+ # Hash
142
+ # description: The only optional argument supported by flick_to is :use_tap_screen.
143
+ # example: { :use_tap_screen => 'true' }
144
+ # default: { :use_tap_screen => 'false' }
145
+ #
146
+ # == returns
147
+ # NilClass
148
+ # description: Always returns nil
149
+ # example: nil
150
+ #
151
+ # == exceptions
152
+ # ArgumentError
153
+ # description: One of the arguments is not valid
154
+ def flick_to( x, y, button = :Left, optional_params = {})
155
+
156
+ begin
157
+
158
+ if optional_params[:use_tap_screen].nil?
159
+ use_tap_screen = sut_parameters[:use_tap_screen, 'false']
160
+ else
161
+ use_tap_screen = optional_params[:use_tap_screen].to_s
162
+ end
163
+
164
+ optional_params[:useTapScreen] = use_tap_screen
165
+
166
+ speed = calculate_speed( sut_parameters[ :gesture_flick_distance ], sut_parameters[ :gesture_flick_speed ] )
167
+
168
+ do_gesture(
169
+ {
170
+ :gesture_type => :MouseGestureToCoordinates,
171
+ :x => x,
172
+ :y => y,
173
+ :speed => speed,
174
+ :isDrag => false,
175
+ :button => button,
176
+ :useTapScreen => use_tap_screen
177
+ }
178
+ )
179
+
180
+ do_sleep(speed)
181
+
182
+ rescue Exception => e
183
+
184
+ $logger.behaviour "FAIL;Failed flick_to with x \"#{x}\", y \"#{y}\", button \"#{button.to_s}\".;#{identity};drag;"
185
+ raise e
186
+
187
+ end
188
+
189
+ $logger.behaviour "PASS;Operation flick_to executed successfully with x \"#{x}\", y \"#{y}\", button \"#{button.to_s}\".;#{identity};drag;"
190
+
191
+ self
192
+
193
+ end
194
+
195
+
196
+ # == description
197
+ # Perform a gesture with the object
198
+ #
199
+ # == arguments
200
+ # direction
201
+ # Symbol
202
+ # description: Direction of the gesture. Please see [link="#directions_table"]the directions table[/link] for valid direction symbols.
203
+ # example: :Left
204
+ #
205
+ # Integer
206
+ # description: Direction of the gesture as degrees with 0 being up and 90 right.
207
+ # example: 270
208
+ #
209
+ # speed
210
+ # Numeric
211
+ # description: Duration of the gesture in seconds. The value may be an interger or a fractional value as a floating point number.
212
+ # example: 1
213
+ #
214
+ # distance
215
+ # Integer
216
+ # description: Number of pixels that the object is to be moved in the gesture.
217
+ # example: 100
218
+ #
219
+ # optional_params
220
+ # Hash
221
+ # description: This method supports :use_tap_screen, :isDrag and :button optional arguments. The first two can be either true or false, for :button values please see [link="#buttons_table"]the buttons table[/link].
222
+ # example: { :button => :Right }
223
+ # default: { :use_tap_screen => 'false', :isDrag => false, :button => :Left }
224
+ #
225
+ # == tables
226
+ # directions_table
227
+ # title: Direction symbols table
228
+ # |Symbol|
229
+ # |:Left|
230
+ # |:Right|
231
+ # |:Up|
232
+ # |:Down|
233
+ #
234
+ # buttons_table
235
+ # title: Mouse button symbols table
236
+ # |Symbol|Description|
237
+ # |:Left|Simulate left mouse button|
238
+ # |:Middle|Simulate middle mouse button|
239
+ # |:Right|Simulate right mouse button|
240
+ # |:NoButton|Do not simulate any mouse button|
241
+ #
242
+ # == returns
243
+ # NilClass
244
+ # description: Always returns nil
245
+ # example: nil
246
+ #
247
+ # == exceptions
248
+ # ArgumentError
249
+ # description: One of the arguments is not valid
250
+ def gesture( direction, speed, distance, optional_params = {:button => :Left, :isDrag => false})
251
+
252
+ begin
253
+
254
+ if optional_params[:use_tap_screen].nil?
255
+ use_tap_screen = sut_parameters[ :use_tap_screen, 'false']
256
+ else
257
+ use_tap_screen = optional_params[:use_tap_screen].to_s
258
+ end
259
+
260
+ optional_params[:useTapScreen] = use_tap_screen
261
+ optional_params['x_off'] = sut_parameters[:tap_x_offset , '0' ],
262
+ optional_params['y_off'] = sut_parameters[:tap_y_offset , '0' ]
263
+
264
+ #do_gesture(direction, speed, distance, isDrag, button)
265
+ params = {
266
+ :gesture_type => :MouseGesture,
267
+ :direction => direction,
268
+ :speed => speed,
269
+ :distance => distance
270
+ }
271
+ params.merge!(optional_params)
272
+ do_gesture(params)
273
+ do_sleep(speed)
274
+
275
+ rescue Exception => e
276
+
277
+ $logger.behaviour "FAIL;Failed gesture with direction \"#{direction}\", speed \"#{speed.to_s}\", distance \"#{distance.to_s}\".;#{identity};gesture;"
278
+ raise e
279
+ end
280
+
281
+ $logger.behaviour "PASS;Operation gesture executed successfully with direction \"#{direction}\", speed \"#{speed.to_s}\", distance \"#{distance.to_s}\".;#{identity};gesture;"
282
+
283
+ self
284
+ end
285
+
286
+ # == description
287
+ # Perform a gesture with the object, ending the gesture at the specified point.
288
+ #
289
+ # == arguments
290
+ # x
291
+ # Integer
292
+ # description: X coordinate of the target point. The coordinate is an absolute screen coordinate, relative to the display top left corner.
293
+ # example: 300
294
+ #
295
+ # y
296
+ # Integer
297
+ # description: Y coordinate of the target point. The coordinate is an absolute screen coordinate, relative to the display top left corner.
298
+ # example: 300
299
+ #
300
+ # speed
301
+ # Numeric
302
+ # description: Duration of the gesture in seconds. The value may be an interger or a fractional value as a floating point number.
303
+ # example: 1
304
+ #
305
+ # optional_params
306
+ # Hash
307
+ # description: This method supports :use_tap_screen, :isDrag and :button optional arguments. The first two can be either true or false, for :button values please see [link="#buttons_table"]the buttons table[/link].
308
+ # example: { :button => :Right }
309
+ # default: { :use_tap_screen => 'false', :isDrag => false, :button => :Left }
310
+ #
311
+ # == returns
312
+ # NilClass
313
+ # description: Always returns nil
314
+ # example: nil
315
+ #
316
+ # == exceptions
317
+ # ArgumentError
318
+ # description: One of the arguments is not valid
319
+ def gesture_to(x, y, speed, optional_params = {:button => :Left, :isDrag => false})
320
+
321
+ begin
322
+
323
+ if optional_params[:use_tap_screen].nil?
324
+ use_tap_screen = sut_parameters[ :use_tap_screen, 'false']
325
+ else
326
+ use_tap_screen = optional_params[:use_tap_screen].to_s
327
+ end
328
+
329
+ optional_params[:useTapScreen] = use_tap_screen
330
+
331
+ params = {:gesture_type => :MouseGestureToCoordinates, :speed => speed}
332
+ if attribute('objectType') == 'Web'
333
+ elemens_xml_data, unused_rule = @test_object_adapter.get_objects( @sut.xml_data, { :id => attribute('webFrame')}, true )
334
+ object_xml_data = elemens_xml_data[0]
335
+ object_attributes = @test_object_adapter.test_object_attributes(object_xml_data, ['x_absolute', 'y_absolute'])
336
+ frame_x_absolute = object_attributes['x_absolute'].to_i
337
+ frame_y_absolute = object_attributes['y_absolute'].to_i
338
+ new_params = {:x=>(frame_x_absolute + x.to_i + (attribute('width' ).to_i/2)),
339
+ :y=>(frame_y_absolute + y.to_i + (attribute('height').to_i/2))}
340
+ params.merge!(new_params)
341
+ else
342
+ new_params = {:x=>x, :y=>y}
343
+ params.merge!(new_params)
344
+ end
345
+
346
+
347
+ params.merge!(optional_params)
348
+ do_gesture(params)
349
+ do_sleep(speed)
350
+
351
+ rescue Exception => e
352
+
353
+ $logger.behaviour "FAIL;Failed gesture_to with x \"#{x}\", y \"#{y}\", speed \"#{speed.to_s}\", button \".;#{identity};gesture;"
354
+ raise e
355
+ end
356
+
357
+ $logger.behaviour "PASS;Operation gesture_to executed successfully with x \"#{x}\", y \"#{y}\", speed \"#{speed.to_s}\".;#{identity};gesture;"
358
+ self
359
+ end
360
+
361
+ # == description
362
+ # Perform a gesture with the object, starting the gesture at the specified point inside it.
363
+ #
364
+ # == arguments
365
+ # x
366
+ # Integer
367
+ # description: X coordinate of the start point. The coordinate is relative to the object top left corner.
368
+ # example: 20
369
+ #
370
+ # y
371
+ # Integer
372
+ # description: Y coordinate of the start point. The coordinate is relative to the object top left corner.
373
+ # example: 15
374
+ #
375
+ # speed
376
+ # Numeric
377
+ # description: Duration of the gesture in seconds. The value may be an interger or a fractional value as a floating point number.
378
+ # example: 1
379
+ #
380
+ # direction
381
+ # Symbol
382
+ # description: Direction of the gesture. Please see this table for valid direction symbols.
383
+ # example: :Left
384
+ #
385
+ # Integer
386
+ # description: Direction of the gesture as degrees with 0 being up and 90 right.
387
+ # example: 270
388
+ #
389
+ # distance
390
+ # Integer
391
+ # description: Number of pixels that the object is to be moved in the gesture.
392
+ # example: 100
393
+ #
394
+ # optional_params
395
+ # Hash
396
+ # description: This method supports :use_tap_screen, :isDrag and :button optional arguments. The first two can be either true or false, for :button values please see [link="#buttons_table"]the buttons table[/link].
397
+ # example: { :button => :Right }
398
+ # default: { :use_tap_screen => 'false', :isDrag => false, :button => :Left }
399
+ #
400
+ # == returns
401
+ # NilClass
402
+ # description: Always returns nil
403
+ # example: nil
404
+ #
405
+ # == exceptions
406
+ # ArgumentError
407
+ # description: One of the arguments is not valid, or the initial point is outside the target object.
408
+ #
409
+ def gesture_from(x, y, speed, distance, direction, optional_params = {:button => :Left, :isDrag => false})
410
+
411
+ begin
412
+
413
+ raise ArgumentError.new( "Coordinate x:#{x} x_abs:#{x} outside object." ) unless ( x <= attribute( 'width' ).to_i and x >= 0 )
414
+ raise ArgumentError.new( "Coordinate y:#{y} y_abs:#{y} outside object." ) unless ( y <= attribute( 'height' ).to_i and y >= 0 )
415
+
416
+ x_absolute = attribute('x_absolute').to_i + x.to_i
417
+ y_absolute = attribute('y_absolute').to_i + y.to_i
418
+
419
+ params = {:gesture_type => :MouseGestureFromCoordinates, :x => x_absolute, :y => y_absolute, :speed => speed, :distance => distance, :direction => direction}
420
+
421
+ params.merge!(optional_params)
422
+ do_gesture(params)
423
+ do_sleep(speed)
424
+
425
+ rescue Exception => e
426
+ $logger.behaviour "FAIL;Failed gesture_from with x \"#{x}\", y \"#{y}\", speed \"#{speed.to_s}\", distance \"#{distance.to_s}\", button \".;#{identity};gesture;"
427
+ raise e
428
+ end
429
+ $logger.behaviour "PASS;Operation gesture_from executed successfully with x \"#{x}\", y \"#{y}\", speed \"#{speed.to_s}\", distance \"#{distance.to_s}\".;#{identity};gesture;"
430
+ self
431
+ end
432
+
433
+ # == description
434
+ # Perform a gesture with the object, ending the gesture at the center of another object.
435
+ #
436
+ # == arguments
437
+ # target_object
438
+ # TestObject
439
+ # description: The object where the gesture should end.
440
+ # example: @app.Node
441
+ #
442
+ # duration
443
+ # Numeric
444
+ # description: Duration of the gesture in seconds. The value may be an interger or a fractional value as a floating point number.
445
+ # example: 1
446
+ #
447
+ # optional_params
448
+ # Hash
449
+ # description: This method supports :use_tap_screen, :isDrag and :button optional arguments. The first two can be either true or false, for :button values please see [link="#buttons_table"]the buttons table[/link].
450
+ # example: { :button => :Right }
451
+ # default: { :use_tap_screen => 'false', :isDrag => false, :button => :Left }
452
+ #
453
+ # == returns
454
+ # NilClass
455
+ # description: Always returns nil
456
+ # example: nil
457
+ #
458
+ # == exceptions
459
+ # ArgumentError
460
+ # description: One of the arguments is not valid
461
+ def gesture_to_object(target_object, duration, optional_params = {:button => :Left, :isDrag => false})
462
+
463
+ if attribute('objectType') == 'Web'
464
+ elemens_xml_data, unused_rule = @test_object_adapter.get_objects( @sut.xml_data, { :id => attribute('webFrame')}, true )
465
+ object_xml_data = elemens_xml_data[0]
466
+ object_attributes = @test_object_adapter.test_object_attributes(object_xml_data, ['x', 'y'])
467
+ frame_x = object_attributes['x'].to_i
468
+ frame_y = object_attributes['y'].to_i
469
+ puts "x " + frame_x.to_s + " y " + frame_y.to_s
470
+
471
+
472
+ gesture_to(target_object.attribute('x').to_i + (target_object.attribute('width' ).to_i/2) - (attribute('width' ).to_i/2 ) - frame_x,
473
+ target_object.attribute('y').to_i + (target_object.attribute('height').to_i/2) - (attribute('height').to_i/2 ) - frame_y,
474
+ duration, optional_params)
475
+ nil
476
+ return
477
+ end
478
+
479
+ begin
480
+
481
+ if optional_params[:use_tap_screen].nil?
482
+ use_tap_screen = sut_parameters[ :use_tap_screen, 'false']
483
+ else
484
+ use_tap_screen = optional_params[:use_tap_screen].to_s
485
+ end
486
+
487
+ optional_params[:useTapScreen] = use_tap_screen
488
+
489
+ params = {:gesture_type => :MouseGestureTo, :speed => duration}
490
+ params[:targetId] = target_object.id
491
+ params[:targetType] = target_object.attribute('objectType')
492
+ params.merge!(optional_params)
493
+ do_gesture(params)
494
+ do_sleep(duration)
495
+
496
+ rescue Exception => e
497
+
498
+ $logger.behaviour "FAIL;Failed gesture_to_object with button.;#{identity};drag;"
499
+ raise e
500
+
501
+ end
502
+
503
+ $logger.behaviour "PASS;Operation gesture_to_object executed successfully with button.;#{identity};drag;"
504
+
505
+ self
506
+
507
+ end
508
+
509
+ # == description
510
+ # Perform a gesture following a track of points.
511
+ #
512
+ # == arguments
513
+ # points
514
+ # Array
515
+ # description: Each element of this Array defines a point of the gesture as a Hash. Three keys with Integer values are defined for a point: the coordinate as "x" and "y" keys and "interval" as seconds (Note that this is likely a very short time, i.e. fraction of a second).
516
+ # example: [{"x" => 200,"y" => 100, "interval" => 0.15},{"x" => 200,"y" => 110, "interval" => 0.30}]
517
+ #
518
+ # duration
519
+ # Numeric
520
+ # description: Duration of the gesture in seconds. The value may be an integer or a fractional value as a floating point number.
521
+ # example: 1
522
+ #
523
+ # mouse_details
524
+ # Hash
525
+ # description: Mouse usage details can be defined by setting the :press, :release and :isDrag keys to true or false. Valid values for the :button key are described in [link="#buttons_table"]the buttons table[/link].
526
+ # example: { :press => true, :release => true, :button => :Right, :isDrag => false}
527
+ # default: { :press => true, :release => true, :button => :Left, :isDrag => true}
528
+ #
529
+ # optional_params
530
+ # Hash
531
+ # description: This method only supports the :use_tap_screen optional parameter.
532
+ # example: { :use_tap_screen => true }
533
+ # default: { :use_tap_screen => false }
534
+ #
535
+ # == returns
536
+ # NilClass
537
+ # description: Always returns nil
538
+ # example: nil
539
+ #
540
+ # == exceptions
541
+ # ArgumentError
542
+ # description: One of the arguments is not valid
543
+ def gesture_points( points, duration, mouse_details = {}, optional_params = {} )
544
+
545
+ begin
546
+
547
+ # verify that "duration" argument type is correct
548
+ duration.check_type [ Fixnum, Float ], 'wrong argument type $1 for duration value (expected $2)'
549
+
550
+ # verify that "points" argument type is correct
551
+ points.check_type Array, 'wrong argument type $1 for gesture points array (expected $2)'
552
+
553
+ # verify that "mouse_details" argument type is correct
554
+ mouse_details.check_type Hash, 'wrong argument type $1 for mouse details hash (expected $2)'
555
+
556
+ # verify that "optional_params" argument type is correct
557
+ optional_params.check_type Hash, 'wrong argument type $1 for optional parameters hash (expected $2)'
558
+
559
+ # set default values unless given by caller
560
+ mouse_details.default_values(
561
+
562
+ :press => true,
563
+ :release => true,
564
+ :button => :Left,
565
+ :isDrag => true
566
+
567
+ )
568
+
569
+ # verify that given button is valid
570
+ mouse_details[ :button ].validate @@_valid_buttons, 'unsupported button $3 for gesture points (expected $2)'
571
+
572
+ # initialize command parameters class
573
+ command = command_params # in qt_behaviour
574
+
575
+ # set command name
576
+ command.command_name( 'MouseGesturePoints' )
577
+
578
+ # set command parameters
579
+ command.command_params(
580
+
581
+ {
582
+
583
+ 'mouseMove' => true,
584
+ 'button' => @@_buttons_map[ mouse_details[ :button ] ],
585
+ 'press' => mouse_details[ :press ].true?,
586
+ 'release' => mouse_details[ :release ].true?,
587
+ 'isDrag' => mouse_details[ :isDrag ].true?,
588
+ 'speed' => ( duration.to_f * 1000 ).to_i,
589
+ 'useTapScreen' => ( optional_params.delete( :use_tap_screen ) || sut_parameters[ :use_tap_screen, false ] ).true?
590
+
591
+ }.merge!( optional_params )
592
+
593
+ )
594
+
595
+ # collect points as string
596
+ command.command_value(
597
+
598
+ points.inject(""){ | result, point |
599
+
600
+ result << "#{ point['x'].to_s },#{ point['y'].to_s },#{ (point['interval']*1000).to_i.to_s };"
601
+
602
+ }
603
+
604
+ )
605
+
606
+ # execute the command
607
+ execute_behavior(optional_params, command)
608
+
609
+ # wait until duration is exceeded
610
+ do_sleep duration.to_f
611
+
612
+ rescue
613
+
614
+ $logger.behaviour "FAIL;Failed gesture_points with points #{ points.inspect }, duration #{ duration.inspect }, mouse_details #{ mouse_details.inspect }.;#{ identity };gesture_points;"
615
+
616
+ raise
617
+
618
+ end
619
+
620
+ $logger.behaviour "PASS;Operation gesture_points executed successfully with points #{ points.inspect }, duration #{ duration.inspect }, mouse_details #{ mouse_details.inspect }.;#{ identity };gesture_points;"
621
+
622
+ self
623
+
624
+ end
625
+
626
+ # == description
627
+ # Drag the object for the given distance.
628
+ # By default a drag is a slow gesture.
629
+ #
630
+ # == arguments
631
+ # direction
632
+ # Symbol
633
+ # description: Direction of the drag. Please see [link="#directions_table"]the directions table[/link] for valid direction symbols.
634
+ # example: :Left
635
+ #
636
+ # Integer
637
+ # description: Direction of the drag as degrees with 0 being up and 90 right.
638
+ # example: 270
639
+ #
640
+ # distance
641
+ # Integer
642
+ # description: Number of pixels that the object is to be dragged.
643
+ # example: 100
644
+ #
645
+ # button
646
+ # Symbol
647
+ # description: The mouse button pressed while the drag is executed can be defined. Please see [link="#buttons_table"]the buttons table[/link] for valid button symbols.
648
+ # example: :Right
649
+ # default: :Left
650
+ #
651
+ # optional_params
652
+ # Hash
653
+ # description: The only optional argument supported by drag is :use_tap_screen.
654
+ # example: { :use_tap_screen => 'true' }
655
+ # default: { :use_tap_screen => 'false' }
656
+ #
657
+ # == returns
658
+ # NilClass
659
+ # description: Always returns nil
660
+ # example: nil
661
+ #
662
+ # == exceptions
663
+ # ArgumentError
664
+ # description: One of the arguments is not valid
665
+ def drag(direction, distance, button = :Left, optional_params = {})
666
+
667
+ begin
668
+
669
+ if optional_params[:use_tap_screen].nil?
670
+ use_tap_screen = sut_parameters[:use_tap_screen, 'false']
671
+ else
672
+ use_tap_screen = optional_params[:use_tap_screen].to_s
673
+ end
674
+
675
+ optional_params[:useTapScreen] = use_tap_screen
676
+
677
+ speed = calculate_speed( distance, sut_parameters[ :gesture_drag_speed ] )
678
+
679
+ params = {:gesture_type => :MouseGesture, :direction => direction, :speed => speed, :distance => distance, :isDrag => true, :button => button}
680
+ params.merge!(optional_params)
681
+ do_gesture(params)
682
+ do_sleep( speed )
683
+
684
+ rescue Exception => e
685
+
686
+ $logger.behaviour "FAIL;Failed drag with direction \"#{direction}\", distance \"#{distance}\", button \"#{button.to_s}\".;#{identity};drag;"
687
+ raise e
688
+
689
+ end
690
+
691
+ $logger.behaviour "PASS;Operation drag executed successfully with direction \"#{direction}\", distance \"#{distance}\", button \"#{button.to_s}\".;#{identity};drag;"
692
+
693
+ self
694
+ end
695
+
696
+ # == description
697
+ # Drag the object to the given coordinates.
698
+ # By default a drag is a slow gesture.
699
+ #
700
+ # == arguments
701
+ # x
702
+ # Integer
703
+ # description: X coordinate of the target point. The coordinate is an absolute screen coordinate, relative to the display top left corner.
704
+ # example: 300
705
+ #
706
+ # y
707
+ # Integer
708
+ # description: Y coordinate of the target point. The coordinate is an absolute screen coordinate, relative to the display top left corner.
709
+ # example: 300
710
+ #
711
+ # button
712
+ # Symbol
713
+ # description: The mouse button pressed while the drag is executed can be defined. Please see [link="#buttons_table"]the buttons table[/link] for valid button symbols.
714
+ # example: :Right
715
+ # default: :Left
716
+ #
717
+ # optional_params
718
+ # Hash
719
+ # description: The only optional argument supported by drag_to is :use_tap_screen.
720
+ # example: { :use_tap_screen => 'true' }
721
+ # default: { :use_tap_screen => 'false' }
722
+ #
723
+ # == returns
724
+ # NilClass
725
+ # description: Always returns nil
726
+ # example: nil
727
+ #
728
+ # == exceptions
729
+ # ArgumentError
730
+ # description: One of the arguments is not valid
731
+ def drag_to( x, y, button = :Left, optional_params= {} )
732
+
733
+ begin
734
+ optional_params.merge!({ :isDrag => true, :button=>button})
735
+ distance = distance_to_point(x,y)
736
+ speed = calculate_speed(distance, sut_parameters[:gesture_drag_speed])
737
+ gesture_to(x, y, speed, optional_params )
738
+
739
+ rescue Exception => e
740
+ $logger.behaviour "FAIL;Failed drag_to with x \"#{x}\", y \"#{y}\", button \"#{button.to_s}\".;#{identity};drag;"
741
+ raise e
742
+ end
743
+
744
+ $logger.behaviour "PASS;Operation drag_to executed successfully with x \"#{x}\", y \"#{y}\", button \"#{button.to_s}\".;#{identity};drag;"
745
+
746
+ self
747
+
748
+ end
749
+
750
+ # == description
751
+ # Drag the object to the center of another object.
752
+ # By default a drag is a slow gesture.
753
+ #
754
+ # == arguments
755
+ # target_object
756
+ # TestObject
757
+ # description: The object that this object should be dragged to.
758
+ # example: @app.Node
759
+ #
760
+ # button
761
+ # Symbol
762
+ # description: The mouse button pressed while the drag is executed can be defined. Please see [link="#buttons_table"]the buttons table[/link] for valid button symbols.
763
+ # example: :Right
764
+ # default: :Left
765
+ #
766
+ # optional_params
767
+ # Hash
768
+ # description: The only optional argument supported by drag_to_object is :use_tap_screen.
769
+ # example: { :use_tap_screen => 'true' }
770
+ # default: { :use_tap_screen => 'false' }
771
+ #
772
+ # == returns
773
+ # NilClass
774
+ # description: Always returns nil
775
+ # example: nil
776
+ #
777
+ # == exceptions
778
+ # ArgumentError
779
+ # description: One of the arguments is not valid
780
+ def drag_to_object(target_object, button = :Left, optional_params = {})
781
+
782
+ begin
783
+
784
+ if optional_params[:use_tap_screen].nil?
785
+ use_tap_screen = sut_parameters[:use_tap_screen, 'false']
786
+ else
787
+ use_tap_screen = optional_params[:use_tap_screen].to_s
788
+ end
789
+
790
+ optional_params[:useTapScreen] = use_tap_screen
791
+
792
+ distance = distance_to_point(target_object.object_center_x, target_object.object_center_y)
793
+ #no drag needed, maybe even attempting to drag to it self
794
+ return if distance == 0
795
+
796
+ speed = calculate_speed(distance, sut_parameters[:gesture_drag_speed])
797
+ params = {:gesture_type => :MouseGestureTo, :speed => speed, :isDrag => true, :button => button}
798
+ params[:targetId] = target_object.id
799
+ params[:targetType] = target_object.attribute('objectType')
800
+ params.merge!(optional_params)
801
+ do_gesture(params)
802
+ do_sleep(speed)
803
+
804
+ rescue Exception => e
805
+
806
+ $logger.behaviour "FAIL;Failed drag_to_object with button \"#{button.to_s}\".;#{identity};drag;"
807
+ raise e
808
+
809
+ end
810
+
811
+ $logger.behaviour "PASS;Operation drag_to_object executed successfully with button \"#{button.to_s}\".;#{identity};drag;"
812
+
813
+ self
814
+
815
+ end
816
+
817
+ # == description
818
+ # Perform a pointer move starting at the object
819
+ #
820
+ # == arguments
821
+ # direction
822
+ # Symbol
823
+ # description: Direction of the move. Please see [link="#directions_table"]the directions table[/link] for valid direction symbols.
824
+ # example: :Left
825
+ #
826
+ # Integer
827
+ # description: Direction of the move as degrees with 0 being up and 90 right.
828
+ # example: 270
829
+ #
830
+ # distance
831
+ # Integer
832
+ # description: Number of pixels to be moved.
833
+ # example: 100
834
+ #
835
+ # button
836
+ # Symbol
837
+ # description: The mouse button used with the move can be defined. Please see [link="#buttons_table"]the buttons table[/link] for valid button symbols.
838
+ # example: :Right
839
+ # default: :Left
840
+ #
841
+ # optional_params
842
+ # Hash
843
+ # description: The only optional argument supported by drag_to_object is :use_tap_screen.
844
+ # example: {:use_tap_screen => 'true'}
845
+ # default: {:use_tap_screen => 'false'}
846
+ #
847
+ # == returns
848
+ # NilClass
849
+ # description: Always returns nil
850
+ # example: nil
851
+ #
852
+ # == exceptions
853
+ # ArgumentError
854
+ # description: One of the arguments is not valid
855
+ def move(direction, distance, button = :Left, optional_params = {})
856
+
857
+ begin
858
+
859
+ if optional_params[:use_tap_screen].nil?
860
+ use_tap_screen = sut_parameters[:use_tap_screen, 'false']
861
+ else
862
+ use_tap_screen = optional_params[:use_tap_screen].to_s
863
+ end
864
+
865
+ optional_params[:use_tap_screen].to_s
866
+ optional_params[:useTapScreen] = use_tap_screen
867
+
868
+ speed = calculate_speed( distance, sut_parameters[ :gesture_drag_speed ] )
869
+ params = {:gesture_type => :MouseGesture, :direction => direction, :speed => speed, :distance => distance, :isDrag => false, :button => button, :isMove => true}
870
+ params.merge!(optional_params)
871
+ do_gesture(params)
872
+ do_sleep( speed )
873
+
874
+ rescue Exception => e
875
+
876
+ $logger.behaviour "FAIL;Failed move with direction \"#{direction}\", distance \"#{distance}\",.;#{identity};move;"
877
+ raise e
878
+
879
+ end
880
+
881
+ $logger.behaviour "PASS;Operation move executed successfully with direction \"#{direction}\", distance \"#{distance}\",.;#{identity};move;"
882
+
883
+ self
884
+
885
+ end
886
+
887
+ # == nodoc
888
+ # utility function for getting the x coordinate of the center of the object, should this be private method?
889
+ def object_center_x
890
+ center_x
891
+ end
892
+
893
+ # == nodoc
894
+ # utility function for getting the y coordinate of the center of the object, should this be private method?
895
+ def object_center_y
896
+ center_y
897
+ end
898
+
899
+ private
900
+
901
+ # Performs the actual gesture operation.
902
+ # Verifies that the parameters are correct and send the command
903
+ # to the sut.
904
+ # gesture_type: :MouseGesture, :MouseGestureTo, :MouseGestureToCoordinates
905
+ # params = {:direction => :Up, duration => 2, :distance =>100, :isDrag =>false, :isMove =>false }
906
+ def do_gesture( params )
907
+
908
+ validate_gesture_params!( params )
909
+
910
+ object_type = attribute('objectType')
911
+
912
+ if object_type == 'Embedded' or object_type == 'Web'
913
+ params['obj_x'] = center_x
914
+ params['obj_y'] = center_y
915
+ params['useCoordinates'] = 'true'
916
+ end
917
+
918
+ command = command_params #in qt_behaviour
919
+
920
+ command.command_name( params[:gesture_type].to_s )
921
+
922
+ command.command_params( params )
923
+
924
+ execute_behavior(params, command)
925
+
926
+ end
927
+
928
+ def validate_gesture_params!( params )
929
+
930
+ #direction
931
+ if params[:gesture_type] == :MouseGesture or params[:gesture_type] == :MouseGestureFromCoordinates
932
+
933
+ if params[:direction].kind_of?(Integer)
934
+
935
+ raise ArgumentError.new( "Invalid direction." ) unless 0 <= params[:direction] and params[:direction] <= 360
936
+
937
+ else
938
+
939
+ raise ArgumentError.new( "Invalid direction." ) unless @@_valid_directions.include?(params[:direction])
940
+
941
+ params[:direction] = @@_direction_map[params[:direction]]
942
+
943
+ end
944
+
945
+ #distance
946
+ params[:distance] = params[:distance].to_i unless params[:distance].kind_of?(Integer)
947
+
948
+ raise ArgumentError.new( "Distance must be an integer and greater than zero." ) unless params[:distance] > 0
949
+
950
+ elsif params[:gesture_type] == :MouseGestureTo
951
+
952
+ raise ArgumentError.new("targetId and targetType must be defined.") unless params.has_key?(:targetId) and params.has_key?(:targetType)
953
+
954
+ end
955
+
956
+ if params[:gesture_type] == :MouseGestureToCoordinates or params[:gesture_type] == :MouseGestureFromCoordinates
957
+
958
+ raise ArgumentError.new("X and Y must be integers.") unless params[:x].kind_of?(Integer) and params[:y].kind_of?(Integer)
959
+
960
+ end
961
+
962
+ #duration/speed
963
+ params[:speed] = params[:speed].to_f unless params[:speed].kind_of?( Numeric )
964
+
965
+ raise ArgumentError.new( "Duration must be a number and greated than zero, was:" + params[:speed].to_s) unless params[:speed] > 0
966
+
967
+ params[:speed] = ( params[ :speed ].to_f * 1000 ).to_i
968
+
969
+ #mouseMove true always
970
+ params[:mouseMove] = true
971
+
972
+ params[:button] = :Left unless params[:button]
973
+
974
+ raise ArgumentError.new( "Invalid button." ) unless @@_valid_buttons.include?(params[:button])
975
+
976
+ params[:button] = @@_buttons_map[params[:button]]
977
+
978
+ if params[:isMove] == true
979
+
980
+ params[:press] = 'false'
981
+
982
+ params[:release] = 'false'
983
+
984
+ end
985
+
986
+ end
987
+
988
+ def do_sleep( time )
989
+
990
+ if sut_parameters[ :sleep_disabled, nil ] != true
991
+
992
+ time = time.to_f * 1.3
993
+
994
+ #for flicks the duration of the gesture is short but animation (scroll etc..) may not
995
+ #so wait at least one second
996
+ time = 1 if time < 1
997
+
998
+ sleep time
999
+
1000
+ else
1001
+
1002
+ # store the biggest value which will be used in multitouch situations to sleep
1003
+ sut_parameters[ :skipped_sleep_time ] = time if time > sut_parameters[ :skipped_sleep_time, 0 ]
1004
+
1005
+ end
1006
+
1007
+ end
1008
+
1009
+ def calculate_speed( distance, speed )
1010
+
1011
+ distance.to_f / speed.to_f
1012
+
1013
+ end
1014
+
1015
+ def distance_to_point( x, y )
1016
+
1017
+ dist_x = x.to_i - center_x.to_i
1018
+
1019
+ dist_y = y.to_i - center_y.to_i
1020
+
1021
+ unless dist_y == 0 && dist_x == 0
1022
+
1023
+ Math.hypot( dist_x, dist_y )
1024
+
1025
+ else
1026
+
1027
+ 0
1028
+
1029
+ end
1030
+
1031
+ end
1032
+
1033
+ # enable hooking for performance measurement & debug logging
1034
+ TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
1035
+
1036
+ end
1037
+
1038
+ end
1039
+ end