testability-driver 1.1.0 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/tdriver/base/behaviour/factory.rb +82 -51
- data/lib/tdriver/base/sut/controller.rb +33 -24
- data/lib/tdriver/base/sut/factory.rb +24 -21
- data/lib/tdriver/base/sut/generic/behaviours/application.rb +103 -34
- data/lib/tdriver/base/sut/generic/behaviours/sut.rb +56 -2
- data/lib/tdriver/base/sut/generic/commands/application.rb +248 -4
- data/lib/tdriver/base/sut/generic/plugin.rb +1 -1
- data/lib/tdriver/base/test_object/adapter.rb +67 -16
- data/lib/tdriver/base/test_object/behaviours/test_object.rb +14 -4
- data/lib/tdriver/loader.rb +1 -3
- data/lib/tdriver/report/error_recovery/tdriver_error_recovery.rb +6 -5
- data/lib/tdriver/report/error_recovery/tdriver_error_recovery_settings.rb +9 -1
- data/lib/tdriver/report/report.rb +3 -0
- data/lib/tdriver/report/report_api.rb +29 -23
- data/lib/tdriver/report/report_crash_file_capture.rb +2 -0
- data/lib/tdriver/report/report_creator.rb +74 -46
- data/lib/tdriver/report/report_test_case_run.rb +86 -68
- data/lib/tdriver/report/report_test_run.rb +46 -2
- data/lib/tdriver/report/report_writer.rb +35 -13
- data/lib/tdriver/tdriver.rb +3 -0
- data/lib/tdriver/util/plugin/service.rb +168 -76
- data/lib/tdriver/util/recorder/scripter.rb +76 -40
- data/lib/tdriver/version.rb +1 -1
- data/xml/templates/generic.xml +6 -1
- metadata +2 -2
@@ -679,6 +679,7 @@ module MobyBehaviour
|
|
679
679
|
|
680
680
|
else
|
681
681
|
|
682
|
+
=begin
|
682
683
|
# execute the application control service request
|
683
684
|
execute_command(
|
684
685
|
|
@@ -689,11 +690,30 @@ module MobyBehaviour
|
|
689
690
|
self,
|
690
691
|
target[ :arguments ],
|
691
692
|
target[ :environment ],
|
693
|
+
target[ :working_directory ],
|
692
694
|
target[ :events_to_listen ],
|
693
695
|
target[ :signals_to_listen ]
|
694
696
|
)
|
695
697
|
|
696
698
|
)
|
699
|
+
=end
|
700
|
+
|
701
|
+
# execute the application control service request
|
702
|
+
execute_command(
|
703
|
+
MobyCommand::Application.new(
|
704
|
+
:Run,
|
705
|
+
{
|
706
|
+
:application_name => target[ :name ],
|
707
|
+
:application_uid => target[ :uid ],
|
708
|
+
:sut => self,
|
709
|
+
:arguments => target[ :arguments ],
|
710
|
+
:environment => target[ :environment ],
|
711
|
+
:working_directory => target[ :working_directory ],
|
712
|
+
:events_to_listen => target[ :events_to_listen ],
|
713
|
+
:signals_to_listen => target[ :signals_to_listen ]
|
714
|
+
}
|
715
|
+
)
|
716
|
+
)
|
697
717
|
|
698
718
|
end
|
699
719
|
|
@@ -1374,12 +1394,23 @@ module MobyBehaviour
|
|
1374
1394
|
|
1375
1395
|
else
|
1376
1396
|
|
1397
|
+
=begin
|
1377
1398
|
app_command = MobyCommand::Application.new(
|
1378
1399
|
:State,
|
1379
1400
|
refresh_args[ :FullName ] || refresh_args[ :name ],
|
1380
1401
|
refresh_args[ :id ],
|
1381
1402
|
self
|
1382
1403
|
)
|
1404
|
+
=end
|
1405
|
+
|
1406
|
+
app_command = MobyCommand::Application.new(
|
1407
|
+
:State,
|
1408
|
+
{
|
1409
|
+
:application_name => refresh_args[ :FullName ] || refresh_args[ :name ],
|
1410
|
+
:application_uid => refresh_args[ :id ],
|
1411
|
+
:sut => self
|
1412
|
+
}
|
1413
|
+
)
|
1383
1414
|
|
1384
1415
|
# store in case needed
|
1385
1416
|
app_command.refresh_args( refresh_args )
|
@@ -1410,11 +1441,12 @@ module MobyBehaviour
|
|
1410
1441
|
|
1411
1442
|
end
|
1412
1443
|
|
1413
|
-
fetch_references( @xml_data )
|
1414
|
-
|
1444
|
+
# fetch_references( @xml_data )
|
1445
|
+
@xml_data
|
1415
1446
|
end
|
1416
1447
|
|
1417
1448
|
# TODO: document me
|
1449
|
+
# Usage disable for now.
|
1418
1450
|
def fetch_references( xml )
|
1419
1451
|
|
1420
1452
|
pids = []
|
@@ -1456,6 +1488,7 @@ module MobyBehaviour
|
|
1456
1488
|
|
1457
1489
|
begin
|
1458
1490
|
|
1491
|
+
=begin
|
1459
1492
|
subdata =
|
1460
1493
|
MobyUtil::XML.parse_string(
|
1461
1494
|
execute_command(
|
@@ -1468,6 +1501,7 @@ module MobyBehaviour
|
|
1468
1501
|
nil,
|
1469
1502
|
nil,
|
1470
1503
|
nil,
|
1504
|
+
nil,
|
1471
1505
|
{
|
1472
1506
|
'x_parent_absolute' => x_prev,
|
1473
1507
|
'y_parent_absolute' => y_prev,
|
@@ -1477,6 +1511,26 @@ module MobyBehaviour
|
|
1477
1511
|
)
|
1478
1512
|
)[ 0 ]
|
1479
1513
|
)
|
1514
|
+
=end
|
1515
|
+
|
1516
|
+
subdata =
|
1517
|
+
MobyUtil::XML.parse_string(
|
1518
|
+
execute_command(
|
1519
|
+
MobyCommand::Application.new(
|
1520
|
+
:State,
|
1521
|
+
{
|
1522
|
+
:application_uid => pid,
|
1523
|
+
:sut => self,
|
1524
|
+
:flags => {
|
1525
|
+
'x_parent_absolute' => x_prev,
|
1526
|
+
'y_parent_absolute' => y_prev,
|
1527
|
+
'embedded' => 'true',
|
1528
|
+
'parent_size' => winSize
|
1529
|
+
}
|
1530
|
+
}
|
1531
|
+
)
|
1532
|
+
)[ 0 ]
|
1533
|
+
)
|
1480
1534
|
|
1481
1535
|
child = subdata.root.xpath('//object')[0]
|
1482
1536
|
|
@@ -17,12 +17,244 @@
|
|
17
17
|
##
|
18
18
|
############################################################################
|
19
19
|
|
20
|
-
|
21
20
|
module MobyCommand
|
22
21
|
|
22
|
+
class Application < MobyCommand::CommandData
|
23
|
+
|
24
|
+
=begin
|
25
|
+
attr_reader(
|
26
|
+
|
27
|
+
:command_type,
|
28
|
+
:application_name,
|
29
|
+
:application_uid,
|
30
|
+
:sut,
|
31
|
+
:application_arguments,
|
32
|
+
:events_to_listen,
|
33
|
+
:signals_to_listen,
|
34
|
+
:working_directory,
|
35
|
+
:flags,
|
36
|
+
:start_command,
|
37
|
+
|
38
|
+
:refresh_arguments,
|
39
|
+
:attribute_csv_string
|
40
|
+
|
41
|
+
|
42
|
+
:_arguments,
|
43
|
+
:_environment,
|
44
|
+
:_working_directory,
|
45
|
+
:_events_to_listen,
|
46
|
+
:_start_command,
|
47
|
+
:_application_uid,
|
48
|
+
:_application_name,
|
49
|
+
:_command,
|
50
|
+
:_application_name,
|
51
|
+
:_application_uid,
|
52
|
+
:_flags,
|
53
|
+
:_attribute_csv_string,
|
54
|
+
:_signals_to_listen,
|
55
|
+
:_sut,
|
56
|
+
:_refresh_args
|
57
|
+
|
58
|
+
)
|
59
|
+
=end
|
60
|
+
|
61
|
+
attr_reader :command_arguments
|
62
|
+
|
63
|
+
# TODO: document me
|
64
|
+
def initialize( command, arguments = {} )
|
65
|
+
|
66
|
+
arguments.check_type Hash, "wrong argument type $1 for #{ self.class } arguments (expected $2)"
|
67
|
+
|
68
|
+
# default values
|
69
|
+
arguments.default = nil
|
70
|
+
|
71
|
+
@command_arguments = arguments
|
72
|
+
|
73
|
+
self.command( command )
|
74
|
+
|
75
|
+
# store values from arguments
|
76
|
+
self.name( arguments[ :application_name ] )
|
77
|
+
self.uid( arguments[ :application_uid ] )
|
78
|
+
self.sut( arguments[ :sut ] )
|
79
|
+
self.arguments( arguments[ :arguments ] )
|
80
|
+
self.events_to_listen( arguments[ :events_to_listen ] )
|
81
|
+
self.signals_to_listen( arguments[ :signals_to_listen ] )
|
82
|
+
self.environment( arguments[ :environment ] )
|
83
|
+
self.working_directory( arguments[ :working_directory ] )
|
84
|
+
self.flags( arguments[ :flags ] )
|
85
|
+
self.start_command( arguments[ :start_command ] )
|
86
|
+
self.refresh_args( arguments[ :refresh_arguments ] )
|
87
|
+
self.attribute_filter( arguments[ :attribute_filter ] )
|
88
|
+
|
89
|
+
self
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
# Store the args for possible future use
|
94
|
+
def refresh_args(refresh_args={})
|
95
|
+
@_refresh_args = refresh_args
|
96
|
+
end
|
97
|
+
|
98
|
+
def get_refresh_args
|
99
|
+
@_refresh_args
|
100
|
+
end
|
101
|
+
|
102
|
+
|
103
|
+
# Defines the type of command this Application CommandData object represents
|
104
|
+
# == params
|
105
|
+
# command_type:: Symbol, defines the command to perform on the application
|
106
|
+
# == returns
|
107
|
+
# Application:: This CommandData object
|
108
|
+
# == raises
|
109
|
+
# ArgumentError:: When the supplied command_type is invalid.
|
110
|
+
def command( command_type )
|
111
|
+
|
112
|
+
@_command = command_type
|
113
|
+
|
114
|
+
self
|
115
|
+
|
116
|
+
end
|
117
|
+
|
118
|
+
# Defines the used SUT to be able to access parameters when creating messages
|
119
|
+
# == params
|
120
|
+
# sut:: SUT, creator of the command.
|
121
|
+
# == returns
|
122
|
+
# Application:: This CommandData object
|
123
|
+
# == raises
|
124
|
+
# ArgumentError:: When sut is not nil or a SUT
|
125
|
+
def sut( sut )
|
126
|
+
|
127
|
+
raise ArgumentError.new( "The given sut must be nil or a SUT." ) unless sut == nil || sut.kind_of?( MobyBase::SUT )
|
128
|
+
@_sut = sut
|
129
|
+
self
|
130
|
+
|
131
|
+
end
|
132
|
+
|
133
|
+
# Defines the name of the application this Application CommandData object is associated with
|
134
|
+
# == params
|
135
|
+
# app_name:: String, name of application to perform this command on
|
136
|
+
# == returns
|
137
|
+
# Application:: This CommandData object
|
138
|
+
# == raises
|
139
|
+
# ArgumentError:: When app_name is not nil or a String
|
140
|
+
def name( app_name )
|
141
|
+
|
142
|
+
raise ArgumentError.new( "The given application name must be nil or a String." ) unless app_name == nil || app_name.kind_of?( String )
|
143
|
+
@_application_name = app_name
|
144
|
+
self
|
145
|
+
|
146
|
+
end
|
147
|
+
|
148
|
+
def arguments( arguments )
|
149
|
+
|
150
|
+
raise ArgumentError.new( "The given application arguments must be nil or a String." ) unless arguments == nil || arguments.kind_of?( String )
|
151
|
+
@_arguments = arguments
|
152
|
+
|
153
|
+
end
|
154
|
+
|
155
|
+
def flags( flags )
|
156
|
+
|
157
|
+
raise ArgumentError.new( "The given application flags must be nil or a Hash." ) unless flags == nil || flags.kind_of?( Hash )
|
158
|
+
@_flags = flags
|
159
|
+
|
160
|
+
end
|
161
|
+
|
162
|
+
def environment( environment )
|
163
|
+
|
164
|
+
raise ArgumentError.new( "The given application environment must be nil or a String." ) unless environment == nil || environment.kind_of?( String )
|
165
|
+
@_environment = environment
|
166
|
+
|
167
|
+
end
|
168
|
+
|
169
|
+
def working_directory( working_directory )
|
170
|
+
|
171
|
+
raise ArgumentError.new( "The given application working directory must be nil or a String." ) unless working_directory == nil || working_directory.kind_of?( String )
|
172
|
+
@_working_directory = working_directory
|
173
|
+
|
174
|
+
end
|
175
|
+
|
176
|
+
def events_to_listen( events )
|
177
|
+
|
178
|
+
raise ArgumentError.new( "The events to listen must be nil or a String." ) unless events == nil || events.kind_of?( String )
|
179
|
+
@_events_to_listen = events
|
180
|
+
|
181
|
+
end
|
182
|
+
|
183
|
+
def signals_to_listen( signals )
|
184
|
+
|
185
|
+
raise ArgumentError.new( "The signals to listen must be nil or a String." ) unless signals == nil || signals.kind_of?( String )
|
186
|
+
@_signals_to_listen = signals
|
187
|
+
|
188
|
+
end
|
189
|
+
|
190
|
+
def start_command( start_command )
|
191
|
+
|
192
|
+
raise ArgumentError.new( "The start_command must be nil or a String." ) unless start_command == nil || start_command.kind_of?( String )
|
193
|
+
@_start_command = start_command
|
194
|
+
|
195
|
+
end
|
196
|
+
|
197
|
+
# Defines the uid of the application this Application CommandData object is associated with
|
198
|
+
# == params
|
199
|
+
# app_uid:: FixNum, uid of application to perform this command on
|
200
|
+
# == returns
|
201
|
+
# Application:: This CommandData object
|
202
|
+
# == raises
|
203
|
+
# ArgumentError:: When app_name is not nil or a String
|
204
|
+
def uid( app_uid )
|
205
|
+
|
206
|
+
raise ArgumentError.new( "The given application uid must be nil, a String or an Integer." ) unless app_uid == nil || app_uid.kind_of?( String ) || app_uid.kind_of?( Fixnum )
|
207
|
+
@_application_uid = app_uid
|
208
|
+
@_application_uid = @_application_uid.to_i unless @_application_uid == nil
|
209
|
+
self
|
210
|
+
|
211
|
+
end
|
212
|
+
|
213
|
+
def get_command
|
214
|
+
|
215
|
+
@_command
|
216
|
+
|
217
|
+
end
|
218
|
+
|
219
|
+
def get_application
|
220
|
+
|
221
|
+
@_application_name
|
222
|
+
|
223
|
+
end
|
224
|
+
|
225
|
+
def get_uid
|
226
|
+
|
227
|
+
@_application_uid
|
228
|
+
|
229
|
+
end
|
230
|
+
|
231
|
+
def get_flags
|
232
|
+
|
233
|
+
@_flags
|
234
|
+
|
235
|
+
end
|
236
|
+
|
237
|
+
def attribute_filter(attribute_string)
|
238
|
+
|
239
|
+
@_attribute_csv_string = attribute_string
|
240
|
+
|
241
|
+
end
|
242
|
+
|
243
|
+
def get_attribute_filter
|
244
|
+
|
245
|
+
@_attribute_csv_string
|
246
|
+
|
247
|
+
end
|
248
|
+
|
249
|
+
# enable hooking for performance measurement & debug logging
|
250
|
+
TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
|
251
|
+
|
252
|
+
end
|
253
|
+
|
254
|
+
=begin
|
255
|
+
|
23
256
|
class Application < MobyCommand::CommandData
|
24
257
|
|
25
|
-
#TODO: Team TE review @ Wheels
|
26
258
|
#Application command types
|
27
259
|
#Launch application = :Run
|
28
260
|
#Close application = :Close
|
@@ -38,11 +270,13 @@ module MobyCommand
|
|
38
270
|
# app_uid::
|
39
271
|
# sut:: (optional) SUT, creator of the command. Can be used to access parameters when creating messages.
|
40
272
|
# arguments:: (optional) Arguments given to the application on start up. Comma separated list if more the one.
|
273
|
+
# environment:: (optional) Environment given to the application on start up. Comma separated list if more the one.
|
274
|
+
# working_directory:: (optional) Working directory for the application (not used on Symbian)
|
41
275
|
# == returns
|
42
276
|
# Application:: New CommandData object
|
43
277
|
# == raises
|
44
278
|
# ArgumentError:: When the supplied command_type is invalid.
|
45
|
-
def initialize( command_type = nil, app_name = nil, app_uid = nil, sut = nil, arguments = nil, environment = nil, events_to_listen = nil, signals_to_listen = nil, flags = nil, start_command = nil)
|
279
|
+
def initialize( command_type = nil, app_name = nil, app_uid = nil, sut = nil, arguments = nil, environment = nil, working_directory = nil, events_to_listen = nil, signals_to_listen = nil, flags = nil, start_command = nil)
|
46
280
|
# Set status value to nil (not executed)
|
47
281
|
|
48
282
|
self.command( command_type )
|
@@ -53,9 +287,10 @@ module MobyCommand
|
|
53
287
|
self.events_to_listen( events_to_listen )
|
54
288
|
self.signals_to_listen( signals_to_listen )
|
55
289
|
self.environment( environment )
|
290
|
+
self.working_directory( working_directory )
|
56
291
|
self.flags( flags )
|
57
292
|
self.start_command( start_command )
|
58
|
-
|
293
|
+
self.refresh_args
|
59
294
|
|
60
295
|
@_attribute_csv_string = nil
|
61
296
|
|
@@ -138,6 +373,13 @@ module MobyCommand
|
|
138
373
|
|
139
374
|
end
|
140
375
|
|
376
|
+
def working_directory( working_directory )
|
377
|
+
|
378
|
+
raise ArgumentError.new( "The given application working directory must be nil or a String." ) unless working_directory == nil || working_directory.kind_of?( String )
|
379
|
+
@_working_directory = working_directory
|
380
|
+
|
381
|
+
end
|
382
|
+
|
141
383
|
def events_to_listen( events )
|
142
384
|
|
143
385
|
raise ArgumentError.new( "The events to listen must be nil or a String." ) unless events == nil || events.kind_of?( String )
|
@@ -215,5 +457,7 @@ module MobyCommand
|
|
215
457
|
TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
|
216
458
|
|
217
459
|
end # Application
|
460
|
+
=end
|
218
461
|
|
219
462
|
end # MobyCommand
|
463
|
+
|
@@ -93,7 +93,7 @@ module MobyPlugin
|
|
93
93
|
TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
|
94
94
|
|
95
95
|
# register plugin
|
96
|
-
|
96
|
+
TDriver::PluginService.register_plugin( self )
|
97
97
|
|
98
98
|
end # SUT
|
99
99
|
|
@@ -26,12 +26,9 @@ module TDriver
|
|
26
26
|
|
27
27
|
private
|
28
28
|
|
29
|
-
# special cases: allow partial match when value of type and attribute name matches
|
30
|
-
@@partial_match_allowed = [ 'list_item', 'text' ], [ 'application', 'fullname' ]
|
31
|
-
|
32
29
|
# TODO: document me
|
33
30
|
def xpath_attributes( attributes, element_attributes, object_type )
|
34
|
-
|
31
|
+
|
35
32
|
# collect attributes
|
36
33
|
attributes = attributes.collect{ | key, values |
|
37
34
|
|
@@ -41,20 +38,35 @@ module TDriver
|
|
41
38
|
# concatenate string if it contains single and double quotes, otherwise return as is
|
42
39
|
value = xpath_literal_string( value )
|
43
40
|
|
44
|
-
|
41
|
+
prefix_key = "@#{ key }"
|
42
|
+
|
43
|
+
if @partial_match_allowed.include?( [ object_type, key ] )
|
44
|
+
|
45
|
+
# regexp support is needed also here
|
45
46
|
|
46
47
|
prefix_value = "[contains(.,#{ value })]"
|
47
48
|
attribute_value = "contains(value/.,#{ value })"
|
48
49
|
|
49
50
|
else
|
50
51
|
|
51
|
-
|
52
|
-
|
52
|
+
if value.kind_of?( Regexp )
|
53
|
+
|
54
|
+
prefix_value = "regexp_compare(#{ prefix_key },'#{ value.source }',#{ value.options })"
|
55
|
+
attribute_value = "regexp_compare(value/.,'#{ value.source }',#{ value.options })"
|
56
|
+
|
57
|
+
prefix_key = ""
|
58
|
+
|
59
|
+
else
|
60
|
+
|
61
|
+
prefix_value = "=#{ value }"
|
62
|
+
attribute_value = "value/.=#{ value }"
|
53
63
|
|
64
|
+
end
|
65
|
+
|
54
66
|
end
|
55
67
|
|
56
68
|
# construct xpath
|
57
|
-
"(#{ element_attributes ? "
|
69
|
+
"(#{ element_attributes ? "#{ prefix_key }#{ prefix_value } or " : "" }attributes/attribute[translate(@name,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='#{ key }' and #{ attribute_value }])"
|
58
70
|
|
59
71
|
}.join( ' or ' ) # join attribute alternative values
|
60
72
|
|
@@ -74,14 +86,37 @@ module TDriver
|
|
74
86
|
end
|
75
87
|
|
76
88
|
end # xpath_attributes
|
89
|
+
|
90
|
+
# TODO: document me
|
91
|
+
def initialize_class
|
92
|
+
|
93
|
+
# special cases: allow partial match when value of type and attribute name matches
|
94
|
+
@partial_match_allowed = [ 'list_item', 'text' ], [ 'application', 'fullname' ]
|
95
|
+
|
96
|
+
end
|
77
97
|
|
78
98
|
end # static
|
79
99
|
|
100
|
+
# TODO: document me
|
101
|
+
def self.regexp_compare( nodeset, source, options )
|
102
|
+
|
103
|
+
# rebuild defined regexp, used while matching element content
|
104
|
+
regexp_object = Regexp.new( source.to_s, options.to_i )
|
105
|
+
|
106
|
+
# collect all nodes matching with regexp
|
107
|
+
nodeset.find_all{ | node | node.content =~ regexp_object }
|
108
|
+
|
109
|
+
end
|
110
|
+
|
80
111
|
# TODO: document me
|
81
112
|
def self.xpath_to_object( rules, find_all_children )
|
82
113
|
|
83
114
|
# convert hash keys to downcased string
|
84
|
-
rules = Hash[
|
115
|
+
rules = Hash[
|
116
|
+
rules.collect{ | key, value |
|
117
|
+
[ key.to_s.downcase, value.kind_of?( Regexp ) ? value : value.to_s ]
|
118
|
+
}
|
119
|
+
]
|
85
120
|
|
86
121
|
# xpath container array
|
87
122
|
test_object_xpath_array = []
|
@@ -116,6 +151,8 @@ module TDriver
|
|
116
151
|
# TODO: document me
|
117
152
|
def self.xpath_literal_string( string )
|
118
153
|
|
154
|
+
return string if string.kind_of?( Regexp )
|
155
|
+
|
119
156
|
# make sure that argument is type of string
|
120
157
|
string = string.to_s
|
121
158
|
|
@@ -176,9 +213,11 @@ module TDriver
|
|
176
213
|
# TODO: document me
|
177
214
|
def self.get_objects( source_data, rules, find_all_children )
|
178
215
|
|
216
|
+
rule = xpath_to_object( rules, find_all_children )
|
217
|
+
|
179
218
|
[
|
180
219
|
# perform xpath to source xml data
|
181
|
-
source_data.xpath( rule
|
220
|
+
source_data.xpath( rule, self ),
|
182
221
|
|
183
222
|
# return also created xpath
|
184
223
|
rule
|
@@ -311,7 +350,7 @@ module TDriver
|
|
311
350
|
# retrieve attribute(s) from xml
|
312
351
|
nodeset = source_data.xpath(
|
313
352
|
|
314
|
-
"attributes/attribute[translate(@name,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='#{ attribute_name.downcase }']"
|
353
|
+
"attributes/attribute[translate(@name,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='#{ attribute_name.downcase }']/value"
|
315
354
|
|
316
355
|
)
|
317
356
|
|
@@ -347,7 +386,7 @@ module TDriver
|
|
347
386
|
# Kernel::raise MobyBase::MultipleAttributesFoundError.new( "Multiple attributes found with name '%s'" % name ) if nodeset.count > 1
|
348
387
|
|
349
388
|
# return found attribute
|
350
|
-
nodeset.first.content
|
389
|
+
nodeset.first.content
|
351
390
|
|
352
391
|
end
|
353
392
|
|
@@ -420,12 +459,21 @@ module TDriver
|
|
420
459
|
# skip if child accessor is already created
|
421
460
|
next if test_object.respond_to?( object_type )
|
422
461
|
|
423
|
-
|
424
|
-
|
462
|
+
begin
|
463
|
+
|
464
|
+
# create child accessor method to test object unless already exists
|
465
|
+
test_object.instance_eval(
|
425
466
|
|
426
|
-
|
467
|
+
"def #{ object_type }( rules = {} ); raise TypeError,'parameter <rules> should be hash' unless rules.kind_of?( Hash ); rules[ :type ]=:#{ object_type }; child( rules ); end;"
|
427
468
|
|
428
|
-
|
469
|
+
) unless object_type.empty?
|
470
|
+
|
471
|
+
# in case if object type has some invalid characters, e.g. type is "ns:object"
|
472
|
+
rescue SyntaxError
|
473
|
+
|
474
|
+
warn "warning: unable to create accessor to child test object whose type is #{ object_type.inspect }"
|
475
|
+
|
476
|
+
end
|
429
477
|
|
430
478
|
}
|
431
479
|
|
@@ -605,6 +653,9 @@ module TDriver
|
|
605
653
|
# enable hooking for performance measurement & debug logging
|
606
654
|
TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
|
607
655
|
|
656
|
+
# initialize TDriver::TestObjectAdapter
|
657
|
+
initialize_class
|
658
|
+
|
608
659
|
end # TestObjectAdapter
|
609
660
|
|
610
661
|
end # TDriver
|