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

Sign up to get free protection for your applications and to get access to all the features.
Files changed (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