testability-driver-qt-sut-plugin 1.2.1 → 1.3.0

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 (30) hide show
  1. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/application.rb +16 -6
  2. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/behaviour.rb +86 -12
  3. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/configure_behaviour.rb +1 -1
  4. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/events.rb +5 -3
  5. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/file_transfer.rb +15 -0
  6. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/fixture.rb +110 -76
  7. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/gesture.rb +125 -69
  8. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/sut.rb +28 -19
  9. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/synchronization.rb +143 -24
  10. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/widget.rb +25 -10
  11. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/agent.rb +54 -0
  12. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/application.rb +1 -0
  13. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/configure_command.rb +32 -39
  14. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/find_object.rb +8 -19
  15. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/fixture.rb +35 -22
  16. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/group.rb +31 -29
  17. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/infologger_command.rb +23 -32
  18. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/key_sequence.rb +44 -61
  19. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/screen_capture.rb +22 -23
  20. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/tap.rb +39 -28
  21. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/version.rb +14 -24
  22. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/widget.rb +39 -42
  23. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/sut/adapter.rb +93 -120
  24. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/sut/communication.rb +95 -75
  25. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/util/find_object_generator.rb +6 -8
  26. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/util/message_composer.rb +1 -1
  27. data/xml/behaviour/qt.xml +6 -0
  28. data/xml/keymap/win.xml +174 -0
  29. data/xml/template/qt.xml +128 -117
  30. metadata +60 -75
@@ -517,7 +517,7 @@ module MobyBehaviour
517
517
  #
518
518
  # duration
519
519
  # Numeric
520
- # description: Duration of the gesture in seconds. The value may be an interger or a fractional value as a floating point number.
520
+ # description: Duration of the gesture in seconds. The value may be an integer or a fractional value as a floating point number.
521
521
  # example: 1
522
522
  #
523
523
  # mouse_details
@@ -540,59 +540,87 @@ module MobyBehaviour
540
540
  # == exceptions
541
541
  # ArgumentError
542
542
  # description: One of the arguments is not valid
543
- def gesture_points( points, duration, mouse_details = { :press => true, :release => true, :button => :Left, :isDrag => true}, optional_params = {} )
543
+ def gesture_points( points, duration, mouse_details = {}, optional_params = {} )
544
544
 
545
545
  begin
546
546
 
547
- if optional_params[:use_tap_screen].nil?
548
- use_tap_screen = sut_parameters[:use_tap_screen, 'false']
549
- else
550
- use_tap_screen = optional_params[:use_tap_screen].to_s
551
- end
547
+ # verify that "duration" argument type is correct
548
+ duration.check_type [ Fixnum, Float ], 'wrong argument type $1 for duration value (expected $2)'
552
549
 
553
- optional_params[:useTapScreen] = use_tap_screen
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)'
554
555
 
555
- mouse_details[:press] = true unless mouse_details.has_value?(:press)
556
- mouse_details[:release] = true unless mouse_details.has_value?(:release)
557
- mouse_details[:button] = :Left unless mouse_details.has_value?(:button)
558
- mouse_details[:isDrag] = true unless mouse_details.has_value?(:isDrag)
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)'
559
558
 
560
- raise ArgumentError.new( "Invalid button." ) unless @@_valid_buttons.include?(mouse_details[:button])
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
+ )
561
568
 
562
- command = command_params #in qt_behaviour
563
- command.command_name('MouseGesturePoints')
564
- params = {'mouseMove'=>'true'}
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(
565
580
 
566
- params['button'] = @@_buttons_map[mouse_details[:button]]
567
- params['press'] = 'false' unless mouse_details[:press]
568
- params['release'] = 'false' unless mouse_details[:release]
569
- params['isDrag'] = 'true' if mouse_details[:isDrag]
570
- params.merge!(optional_params)
571
-
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?
572
590
 
573
- millis = duration.to_f
574
- millis = millis*1000
575
- speed = millis.to_i
576
- params['speed'] = speed.to_s
577
- command.command_params(params)
578
- point_string = ""
579
- points.each { |point| point_string << point["x"].to_s << "," << point["y"].to_s << "," << (point["interval"]*1000).to_i.to_s << ";"}
580
- command.command_value(point_string)
591
+ }.merge!( optional_params )
581
592
 
582
- @sut.execute_command(command)
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)
583
608
 
584
- do_sleep(duration)
609
+ # wait until duration is exceeded
610
+ do_sleep duration.to_f
585
611
 
586
- rescue Exception => e
612
+ rescue
587
613
 
588
- $logger.behaviour "FAIL;Failed drag_to_object with points \"#{points.to_s}\", duration \"#{duration.to_s}\", mouse_details \"#{mouse_details.to_s}\".;#{identity};gesture_points;"
589
- Kernel::raise e
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
590
617
 
591
618
  end
592
619
 
593
- $logger.behaviour "PASS;Operation drag_to_object executed successfully with points \"#{points.to_s}\", duration \"#{duration.to_s}\", mouse_details \"#{mouse_details.to_s}\".;#{identity};gesture_points;"
620
+ $logger.behaviour "PASS;Operation gesture_points executed successfully with points #{ points.inspect }, duration #{ duration.inspect }, mouse_details #{ mouse_details.inspect }.;#{ identity };gesture_points;"
594
621
 
595
622
  self
623
+
596
624
  end
597
625
 
598
626
  # == description
@@ -855,8 +883,7 @@ module MobyBehaviour
855
883
  self
856
884
 
857
885
  end
858
-
859
-
886
+
860
887
  # == nodoc
861
888
  # utility function for getting the x coordinate of the center of the object, should this be private method?
862
889
  def object_center_x
@@ -876,62 +903,89 @@ module MobyBehaviour
876
903
  # to the sut.
877
904
  # gesture_type: :MouseGesture, :MouseGestureTo, :MouseGestureToCoordinates
878
905
  # params = {:direction => :Up, duration => 2, :distance =>100, :isDrag =>false, :isMove =>false }
879
- def do_gesture(params)
906
+ def do_gesture( params )
880
907
 
881
- validate_gesture_params!(params)
908
+ validate_gesture_params!( params )
882
909
 
883
- if attribute('objectType') == 'Embedded' or attribute('objectType') == 'Web'
910
+ object_type = attribute('objectType')
911
+
912
+ if object_type == 'Embedded' or object_type == 'Web'
884
913
  params['obj_x'] = center_x
885
914
  params['obj_y'] = center_y
886
915
  params['useCoordinates'] = 'true'
887
916
  end
888
917
 
889
918
  command = command_params #in qt_behaviour
890
- command.command_name(params[:gesture_type].to_s)
919
+
920
+ command.command_name( params[:gesture_type].to_s )
921
+
891
922
  command.command_params( params )
892
- @sut.execute_command( command )
923
+
924
+ execute_behavior(params, command)
925
+
893
926
  end
894
927
 
895
- def validate_gesture_params!(params)
928
+ def validate_gesture_params!( params )
929
+
896
930
  #direction
897
931
  if params[:gesture_type] == :MouseGesture or params[:gesture_type] == :MouseGestureFromCoordinates
932
+
898
933
  if params[:direction].kind_of?(Integer)
899
- raise ArgumentError.new( "Invalid direction." ) unless 0 <= params[:direction].to_i and params[:direction].to_i <= 360
934
+
935
+ raise ArgumentError.new( "Invalid direction." ) unless 0 <= params[:direction] and params[:direction] <= 360
936
+
900
937
  else
901
- raise ArgumentError.new( "Invalid direction." ) unless @@_valid_directions.include?(params[:direction])
902
- params[:direction] = @@_direction_map[params[:direction]]
938
+
939
+ raise ArgumentError.new( "Invalid direction." ) unless @@_valid_directions.include?(params[:direction])
940
+
941
+ params[:direction] = @@_direction_map[params[:direction]]
942
+
903
943
  end
944
+
904
945
  #distance
905
946
  params[:distance] = params[:distance].to_i unless params[:distance].kind_of?(Integer)
947
+
906
948
  raise ArgumentError.new( "Distance must be an integer and greater than zero." ) unless params[:distance] > 0
907
- elsif params[:gesture_type] == :MouseGestureToCoordinates or params[:gesture_type] == :MouseGestureFromCoordinates
908
- raise ArgumentError.new("X and Y must be integers.") unless params[:x].kind_of?(Integer) and params[:y].kind_of?(Integer)
949
+
909
950
  elsif params[:gesture_type] == :MouseGestureTo
910
- raise ArgumentError.new("targetId and targetType must be defined.") unless params[:targetId] and params[:targetType]
951
+
952
+ raise ArgumentError.new("targetId and targetType must be defined.") unless params.has_key?(:targetId) and params.has_key?(:targetType)
953
+
911
954
  end
912
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
+
913
962
  #duration/speed
914
- params[:speed] = params[:speed].to_f unless params[:speed].kind_of?(Numeric)
963
+ params[:speed] = params[:speed].to_f unless params[:speed].kind_of?( Numeric )
964
+
915
965
  raise ArgumentError.new( "Duration must be a number and greated than zero, was:" + params[:speed].to_s) unless params[:speed] > 0
916
- duration_secs = params[:speed].to_f
917
- duration_secs = duration_secs*1000
918
- params[:speed] = duration_secs.to_i
966
+
967
+ params[:speed] = ( params[ :speed ].to_f * 1000 ).to_i
919
968
 
920
969
  #mouseMove true always
921
970
  params[:mouseMove] = true
922
971
 
923
972
  params[:button] = :Left unless params[:button]
973
+
924
974
  raise ArgumentError.new( "Invalid button." ) unless @@_valid_buttons.include?(params[:button])
975
+
925
976
  params[:button] = @@_buttons_map[params[:button]]
926
977
 
927
978
  if params[:isMove] == true
979
+
928
980
  params[:press] = 'false'
981
+
929
982
  params[:release] = 'false'
983
+
930
984
  end
931
985
 
932
986
  end
933
987
 
934
- def do_sleep(time)
988
+ def do_sleep( time )
935
989
 
936
990
  if sut_parameters[ :sleep_disabled, nil ] != true
937
991
 
@@ -945,32 +999,34 @@ module MobyBehaviour
945
999
 
946
1000
  else
947
1001
 
948
- # store the biggest value which will then be used in multitouch situations to sleep
1002
+ # store the biggest value which will be used in multitouch situations to sleep
949
1003
  sut_parameters[ :skipped_sleep_time ] = time if time > sut_parameters[ :skipped_sleep_time, 0 ]
950
1004
 
951
1005
  end
952
1006
 
953
1007
  end
954
1008
 
955
- def calculate_speed(distance, speed)
1009
+ def calculate_speed( distance, speed )
956
1010
 
957
- distance = distance.to_f
958
- speed = speed.to_f
959
- duration = distance/speed
960
- duration
1011
+ distance.to_f / speed.to_f
961
1012
 
962
1013
  end
963
1014
 
964
- def distance_to_point(x, y)
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
965
1022
 
966
- x = x.to_i
967
- y = y.to_i
968
- dist_x = x - center_x.to_i
969
- dist_y = y - center_y.to_i
1023
+ Math.hypot( dist_x, dist_y )
970
1024
 
971
- return 0 if dist_y == 0 and dist_x == 0
972
- distance = Math.hypot( dist_x, dist_y )
973
- distance
1025
+ else
1026
+
1027
+ 0
1028
+
1029
+ end
974
1030
 
975
1031
  end
976
1032
 
@@ -323,10 +323,12 @@ module MobyBehaviour
323
323
 
324
324
  if param[ :kill ].nil?
325
325
 
326
- data = {}
327
326
 
328
327
  object_xml_data, unused_rule = @test_object_adapter.get_objects( MobyUtil::XML.parse_string( xml_source ), { :type => 'Response' }, true )
329
328
 
329
+ =begin
330
+ data = {}
331
+
330
332
  object_xml_data.collect{ | element |
331
333
 
332
334
  data.merge!(
@@ -336,13 +338,17 @@ module MobyBehaviour
336
338
  )
337
339
 
338
340
  }
341
+ =end
342
+ object_xml_data.inject( {} ){ | result, element |
343
+
344
+ result.merge!( @test_object_adapter.test_object_attributes( element ) )
339
345
 
340
- data
346
+ }
341
347
 
342
348
  else
343
349
 
344
350
  # Killed processes have no relevant data.
345
- data = {
351
+ {
346
352
  :status => "KILLED",
347
353
  :output => xml_source
348
354
  }
@@ -356,9 +362,9 @@ module MobyBehaviour
356
362
  # launches application in symbian device based on UID and return launched application if succesfull.
357
363
  #
358
364
  # == arguments
359
- # hash_application
365
+ # target_application_hash
360
366
  # Hash
361
- # description: Hash defining required expected attributes of the application
367
+ # description: Hash defining expected attributes of the application
362
368
  # example: { :UID => '' }
363
369
  #
364
370
  # == returns
@@ -370,30 +376,33 @@ module MobyBehaviour
370
376
  # TypeError
371
377
  # description: Wrong argument type %s for attributes (expected Hash)
372
378
  #
373
- def launch_with_uid( hash_uid = {} )
379
+ def launch_with_uid( target_application_hash = {} )
374
380
 
375
381
  begin
376
382
 
377
- raise TypeError.new( "Input parameter not of Type: Hash.\nIt is: #{ hash_uid.class }" ) unless hash_uid.kind_of?( Hash )
378
- the_uid = "failed with uid:" + hash_uid[:UID].to_s
379
- fullname = @sut.fixture("launch","launch_with_uid",hash_uid)
383
+ target_application_hash.check_type Hash, 'wrong argument type $1 for application attributes (expected: $2)'
384
+
385
+ the_uid = "failed with uid:" + target_application_hash[ :UID ].to_s
386
+
387
+ fullname = @sut.fixture( "launch", "launch_with_uid", target_application_hash )
380
388
 
381
- if(fullname == the_uid)
382
- raise fullname
383
- end
384
- full_shortname = fullname.rpartition('\\')[-1]
385
- shortname = full_shortname.rpartition('.')[0]
386
- app_child = @sut.application(:name=>shortname)
389
+ raise fullname if fullname == the_uid
390
+
391
+ full_shortname = fullname.rpartition( '\\' )[ -1 ]
392
+
393
+ shortname = full_shortname.rpartition( '.' )[ 0 ]
394
+
395
+ app_child = @sut.application( :name => shortname )
387
396
 
388
- rescue Exception
397
+ rescue
389
398
 
390
- $logger.behaviour "FAIL;Failed to find application.;#{id.to_s};sut;{};application;" << (hash_uid.kind_of?( Hash ) ? hash_uid.inspect : hash_uid.class.to_s)
399
+ $logger.behaviour "FAIL;Failed to find application.;#{ id.to_s };sut;{};application;#{ target_application_hash.inspect }"
391
400
 
392
401
  raise
393
402
 
394
403
  end
395
404
 
396
- $logger.behaviour "PASS;Application found.;#{id.to_s};sut;{};application;" << hash_uid.inspect
405
+ $logger.behaviour "PASS;Application found.;#{ id.to_s };sut;{};application;#{ target_application_hash.inspect }"
397
406
 
398
407
  app_child
399
408
 
@@ -655,7 +664,7 @@ module MobyBehaviour
655
664
  # [b]NOTE:[/b] Currently only supported on Symbian platform.
656
665
  #
657
666
  # == arguments
658
- # load
667
+ # cpu_load
659
668
  # Integer
660
669
  # description: Requested CPU load in percentage.
661
670
  # example: 50
@@ -48,8 +48,15 @@ module MobyBehaviour
48
48
 
49
49
  class SignalNotEmittedException < RuntimeError
50
50
 
51
+ end
52
+
53
+ class EventNotReceivedException < RuntimeError
54
+
51
55
  end
52
56
 
57
+ class EventsEnabledException < RuntimeError
58
+ end
59
+
53
60
  # == description
54
61
  # Synchronizes script execution to a signal. Test script execution is stopped until the expected signal is emitted or the timeout occurs.
55
62
  # If no signals of the given type are found before the timeout an error is raised.\n
@@ -65,7 +72,11 @@ module MobyBehaviour
65
72
  # String
66
73
  # description: Name of the signal that is to be emitted.
67
74
  # example: "clicked()"
68
- #
75
+ #
76
+ # params
77
+ # Hash
78
+ # description: Optional parameters for wait for signal
79
+ # example: "{:retry_timeout => 10, :retry_interval => 0.1}"
69
80
  # &block
70
81
  # Proc
71
82
  # description: Optional code block to be executed while listening signals
@@ -83,47 +94,155 @@ module MobyBehaviour
83
94
  # ArgumentError
84
95
  # description: signal_name was not a valid String or signal_timeout was not a non negative Integer
85
96
  #
86
- def wait_for_signal( signal_timeout, signal_name, &block )
97
+ def wait_for_signal( signal_timeout, signal_name, params = nil, &block )
98
+
99
+ signal_timeout.check_type Integer, 'wrong argument type $1 for signal timeout (expected $2)'
100
+ #raise ArgumentError.new("The timeout argument was of wrong type: expected 'Integer' was '%s'" % signal_timeout.class ) unless signal_timeout.kind_of?( Integer )
87
101
 
88
- Kernel::raise ArgumentError.new("The timeout argument was of wrong type: expected 'Integer' was '%s'" % signal_timeout.class ) unless signal_timeout.kind_of?( Integer )
102
+ signal_timeout.not_negative 'signal timeout value $1 cannot be negative'
103
+ #raise ArgumentError.new("The timeout argument had a value of '%s', it must be a non negative Integer.'" % signal_timeout ) unless signal_timeout >= 0
89
104
 
90
- Kernel::raise ArgumentError.new("The timeout argument had a value of '%s', it must be a non negative Integer.'" % signal_timeout ) unless signal_timeout >= 0
91
105
 
92
- Kernel::raise ArgumentError.new("The signal name argument was of wrong type: expected 'String' was '%s'" % signal_name.class ) unless signal_name.kind_of?( String )
106
+ signal_name.check_type String, 'wrong argument type $1 for signal name (expected $2)'
107
+ #raise ArgumentError.new("The signal name argument was of wrong type: expected 'String' was '%s'" % signal_name.class ) unless signal_name.kind_of?( String )
108
+
109
+ signal_name.not_empty 'signal name cannot be empty'
110
+ #raise ArgumentError.new("The signal name argument must not be an empty String.") unless !signal_name.empty?
111
+
112
+ params.check_type [ Hash, NilClass ], 'wrong argument type $1 for signal parameters (expected $2)'
93
113
 
94
- Kernel::raise ArgumentError.new("The signal name argument must not be an empty String.") unless !signal_name.empty?
95
-
96
114
  # enable signal listening
97
115
  self.fixture( 'signal', 'enable_signal', :signal => signal_name )
98
116
 
99
- # execute code block if any given
100
- block.call if block_given?
117
+ # execute code block if any given
118
+ begin
119
+
120
+ if params.kind_of?( Hash ) && params.has_key?( :retry_timeout )
121
+
122
+ MobyUtil::Retryable.until( :timeout => params[:retry_timeout], :interval => params[:retry_interval], :exception => SignalNotEmittedException) {
123
+
124
+ do_wait_signal(signal_timeout, signal_name, &block)
125
+
126
+ }
127
+
128
+ else
129
+
130
+ do_wait_signal(signal_timeout, signal_name, &block)
131
+
132
+ end
133
+
134
+ ensure
135
+
136
+ self.fixture( "signal", "remove_signals" )
137
+
138
+ end
139
+
140
+ nil
141
+
142
+ end # wait_for_signal
143
+
144
+ # == description
145
+ # Ensure that an event is fired into the target element
146
+ #
147
+ # [b]NOTE:[/b] Limitations:
148
+ # enable_events can not be enabled. multitouch operations are not supported.
149
+ #
150
+ # == arguments
151
+ # params
152
+ # Hash
153
+ # description: Arguments hash, see below
154
+ # example: Optional paramaters, see table params below.
155
+ #
156
+ #
157
+ # &block
158
+ # Proc
159
+ # description: Code block that triggers the event
160
+ # example: @app.Button.tap
161
+ #
162
+ # == tables
163
+ # params
164
+ # title: Hash argument params
165
+ # description: Valid keys for argument tap_params as hash
166
+ # |Key|Description|Type|Example|Default|
167
+ # |:retry_interval|Time between retries if the event is not received|Float|2|1|
168
+ # |:retry_timeout|Timeout for retry cycle|Integer|5|30|
169
+ # |:sleep_time|Sleep time before fetching events from client|Foat|0.4|0.2|
170
+ #
171
+ # == returns
172
+ # NilClass
173
+ # description: -
174
+ # example: -
175
+ #
176
+ # == exceptions
177
+ # EventsEnabledException
178
+ # description: enable_events is enabled. Event monitoring can not be enabled at the same time
179
+ #
180
+ # EventNotReceivedException
181
+ # description: Target object did not received any events defined
182
+ #
183
+ def ensure_event(params = nil, &block)
184
+
185
+ raise EventsEnabledException.new("enable_events is used - ensure_events can not be Used at the same time.") if @@_events_enabled
186
+ raise ArgumentError.new("Must be called to TestObject" ) unless self.kind_of? MobyBase::TestObject
187
+
188
+ retry_timeout = (params.nil? || params[:retry_timeout].nil?) ? 30 : params[:retry_timeout]
189
+ retry_interval = (params.nil? || params[:retry_interval].nil?) ? 1 : params[:retry_interval]
190
+ sleep_time = (params.nil? || params[:sleep_time].nil?) ? 0.2 : params[:sleep_time]
191
+
192
+ events = ['MouseButtonPress,TouchBegin,GraphicsSceneMousePress,KeyPress']
193
+ if params && params[:events]
194
+ events = params[:events]
195
+ end
196
+ app = self.get_application
197
+ begin
198
+ app.enable_events(events, {"track_id" => self.id.to_s})
199
+
200
+ MobyUtil::Retryable.until(:timeout => retry_timeout,:interval => retry_interval, :exception => EventNotReceivedException) {
201
+ block.call if block_given?
202
+ sleep sleep_time
203
+ ev = app.get_events
204
+ begin
205
+ @sut.state_object(ev).events.attribute('trackedFound')
206
+ rescue MobyBase::AttributeNotFoundError
207
+ $stderr.puts "Warning: Operation not received by object #{self.id} : #{self.name}. Retrying"
208
+ raise EventNotReceivedException.new("No event received during call")
209
+ end
210
+ }
211
+ ensure
212
+ app.disable_events
213
+ end
214
+ end
215
+
216
+ private
217
+
218
+ def do_wait_signal(signal_timeout, signal_name, &block)
101
219
 
102
220
  timeout_deadline = ( Time.now + signal_timeout )
103
221
 
104
222
  signal_found = false
105
-
223
+
224
+ block.call if block_given?
225
+
106
226
  while( Time.now < timeout_deadline && !signal_found )
107
227
 
108
228
  begin
229
+
230
+ result = self.fixture( 'signal', 'get_signal' )
231
+
232
+ signals_xml = MobyUtil::XML.parse_string( result )
233
+
234
+ _signal_found_xml, unused_rule = @test_object_adapter.get_objects( signals_xml, { :type => 'QtSignal', :name => signal_name }, true )
109
235
 
110
- signals_xml = MobyUtil::XML.parse_string( self.fixture( 'signal', 'get_signal' ) )
111
- _signal_found_xml, unused_rule = @test_object_adapter.get_objects( signals_xml, { :type => 'QtSignal', :name => signal_name}, true )
112
- signal_found = true unless _signal_found_xml.empty?
113
-
236
+ signal_found = true unless _signal_found_xml.empty?
237
+
114
238
  end # begin
115
-
239
+
116
240
  end # while
117
-
118
- # disable signal listening
119
- self.fixture( "signal", "remove_signals" )
120
-
121
- Kernel::raise SignalNotEmittedException.new("The signal %s was not emitted within %s seconds." % [ signal_name, signal_timeout ] ) unless signal_found
122
-
123
- nil
124
241
 
125
- end # wait_for_signal
126
-
242
+ raise SignalNotEmittedException, "The signal #{ signal_name } was not emitted within #{ signal_timeout } seconds." unless signal_found
243
+
244
+ end
245
+
127
246
  # enable hooking for performance measurement & debug logging
128
247
  TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
129
248