testability-driver 1.0.4 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/tdriver-devtools +0 -0
- data/config/sut_setup.rb +32 -0
- data/config/sut_teardown.rb +32 -0
- data/ext/extconf.rb +3 -1
- data/lib/tdriver-devtools/behaviour/old/xml/update +0 -0
- data/lib/tdriver-devtools/behaviour/xml/generate.rb +0 -0
- data/lib/tdriver-devtools/doc/update +0 -0
- data/lib/tdriver-devtools/doc/xslt/update +0 -0
- data/lib/tdriver-devtools/tdriver-devtools.rb +0 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/application_closable_0x3f.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/application_close.feature +15 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/application_environment.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/application_executable_name.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/application_uid.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/created.rid +1 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/find_find.feature +15 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/flash_behaviour_flash.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/flash_behaviour_flash_images.feature +15 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_application.feature +15 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_capture_screen.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_child.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_clear_verify_blocks.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_connect.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_controller_execution_order.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_controller_execution_order_0x3d.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_current_application_id.feature +15 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_disconnect.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_dump_count.feature +15 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_freeze.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_frozen.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_get_application_id.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_get_object.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_get_operator_data.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_get_ui_dump.feature +15 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_get_user_information.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_input.feature +15 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_parameter.feature +15 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_press_key.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_received_data.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_refresh.feature +20 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_refresh_timeout.feature +15 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_refresh_tries.feature +15 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_refresh_ui_dump.feature +20 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_run.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_sent_data.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_state.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_translate.feature +30 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_ui_type.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_ui_version.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_unfreeze.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_update.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_verify_always.feature +20 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_verify_blocks.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_x_path.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_xml_data.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_xml_data_0x3d.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/sut_xml_data_crc.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/switchbox_behaviour_power_down.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/switchbox_behaviour_power_status.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/switchbox_behaviour_power_up.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/switchbox_behaviour_reset.feature +10 -0
- data/lib/tdriver-devtools/tests/feature_tests/output/verification_test_object_exists_0x3f.feature +15 -0
- data/lib/tdriver-devtools/tests/feature_tests/update +0 -0
- data/lib/tdriver/base/behaviour/behaviours/object_composition.rb +4 -4
- data/lib/tdriver/base/behaviour/factory.rb +8 -0
- data/lib/tdriver/base/sut/generic/behaviours/application.rb +24 -3
- data/lib/tdriver/base/sut/generic/behaviours/sut.rb +465 -354
- data/lib/tdriver/base/test_object/adapter.rb +2 -2
- data/lib/tdriver/base/test_object/behaviours/test_object.rb +22 -5
- data/lib/tdriver/base/test_object/cache.rb +1 -1
- data/lib/tdriver/base/test_object/factory.rb +23 -3
- data/lib/tdriver/env.rb +0 -0
- data/lib/tdriver/loader.rb +0 -0
- data/lib/tdriver/matti.rb +0 -0
- data/lib/tdriver/report/error_recovery/tdriver_error_recovery.rb +22 -24
- data/lib/tdriver/report/report.rb +8 -1
- data/lib/tdriver/report/report_api.rb +18 -0
- data/lib/tdriver/report/report_combine.rb +1 -1
- data/lib/tdriver/report/report_creator.rb +5 -1
- data/lib/tdriver/report/report_execution_statistics.rb +105 -78
- data/lib/tdriver/report/report_test_case_run.rb +2 -1
- data/lib/tdriver/report/report_test_run.rb +187 -116
- data/lib/tdriver/report/report_writer.rb +49 -29
- data/lib/tdriver/tdriver.rb +14 -3
- data/lib/tdriver/util/common/exception.rb +53 -0
- data/lib/tdriver/util/common/hash.rb +79 -23
- data/lib/tdriver/util/common/numeric.rb +26 -5
- data/lib/tdriver/util/common/object.rb +44 -15
- data/lib/tdriver/util/common/string.rb +4 -1
- data/lib/tdriver/util/filters/dynamic_attributes.rb +2 -1
- data/lib/tdriver/util/keymap/keymap.rb +81 -0
- data/lib/tdriver/util/loader.rb +4 -1
- data/lib/tdriver/util/logger/logger.rb +17 -9
- data/lib/tdriver/util/other/config.rb +0 -0
- data/lib/tdriver/util/parameter/error.rb +3 -0
- data/lib/tdriver/util/parameter/loader.rb +6 -1
- data/lib/tdriver/util/parameter/parameter.rb +87 -14
- data/lib/tdriver/util/parameter/parameter_new.rb +869 -0
- data/lib/tdriver/util/parameter/parameter_template.rb +2 -2
- data/lib/tdriver/util/parameter/parameter_user_api.rb +27 -3
- data/lib/tdriver/util/parameter/parameter_xml.rb +36 -38
- data/lib/tdriver/version.rb +1 -1
- data/xml/templates/generic.xml +4 -10
- metadata +196 -138
data/lib/tdriver/tdriver.rb
CHANGED
@@ -57,7 +57,7 @@ module TDriver
|
|
57
57
|
# ArgumentError:: SUT type not defined
|
58
58
|
# ArgumentError:: SUT type '%s' not supported
|
59
59
|
# ArgumentError:: Sut id not given
|
60
|
-
# MobyUtil::ParameterFileNotFoundError:: if paramter file
|
60
|
+
# MobyUtil::ParameterFileNotFoundError:: if paramter file (tdriver_parameters.xml in TDriver home directory) is not found
|
61
61
|
# === returns
|
62
62
|
# Object:: Object that SutFactory returns
|
63
63
|
# === example
|
@@ -115,10 +115,18 @@ module TDriver
|
|
115
115
|
end
|
116
116
|
|
117
117
|
# Wrapper for MobyUtil::ParameterUserAPI class with methods e.g. [] and []=, files and load_xml etc.
|
118
|
-
def self.parameter
|
118
|
+
def self.parameter( *arguments )
|
119
119
|
|
120
|
-
|
120
|
+
if arguments.count == 0
|
121
121
|
|
122
|
+
$parameters_api
|
123
|
+
|
124
|
+
else
|
125
|
+
|
126
|
+
$parameters_api[ *arguments ]
|
127
|
+
|
128
|
+
end
|
129
|
+
|
122
130
|
end
|
123
131
|
|
124
132
|
# Wrapper for MobyUtil::Logger class
|
@@ -133,6 +141,9 @@ module TDriver
|
|
133
141
|
|
134
142
|
end # TDriver
|
135
143
|
|
144
|
+
# initialize parameters
|
145
|
+
$parameters.init
|
146
|
+
|
136
147
|
# enable logging engine
|
137
148
|
$logger.enable_logging
|
138
149
|
|
@@ -0,0 +1,53 @@
|
|
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 Testability Driver.
|
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
|
+
class Exception
|
21
|
+
|
22
|
+
# TODO: document me
|
23
|
+
def nested_backtrace
|
24
|
+
|
25
|
+
if backtrace
|
26
|
+
|
27
|
+
_backtrace = backtrace.dup
|
28
|
+
|
29
|
+
begin
|
30
|
+
|
31
|
+
_backtrace[ 0 ] = "#{ _backtrace.first.to_s } raised #{ self.class.name }: #{ message.to_s }"
|
32
|
+
|
33
|
+
_backtrace.unshift( caller.first )
|
34
|
+
|
35
|
+
rescue
|
36
|
+
|
37
|
+
# exception raised, do not alter backtrace
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
else
|
42
|
+
|
43
|
+
# no backtrace available
|
44
|
+
_backtrace = []
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
# return backtrace array
|
49
|
+
_backtrace
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
end # Exception
|
@@ -22,7 +22,9 @@ class Hash
|
|
22
22
|
|
23
23
|
def not_empty( message = "Hash must not be empty", exception = ArgumentError )
|
24
24
|
|
25
|
-
raise exception
|
25
|
+
raise exception, message if empty?
|
26
|
+
|
27
|
+
self
|
26
28
|
|
27
29
|
end
|
28
30
|
|
@@ -30,27 +32,30 @@ class Hash
|
|
30
32
|
def require_key( keys, message = "None of key(s) $1 found from hash" )
|
31
33
|
|
32
34
|
# create array of types
|
33
|
-
keys_array =
|
35
|
+
keys_array = Array( keys )
|
34
36
|
|
35
37
|
found = false
|
36
38
|
|
37
39
|
verbose_keys_list = keys_array.each_with_index.collect{ | key, index |
|
38
40
|
|
39
|
-
|
41
|
+
if has_key?( key )
|
42
|
+
found = true
|
43
|
+
break
|
44
|
+
end
|
40
45
|
|
41
46
|
# result string, separate types if multiple types given
|
42
47
|
"#{ ( ( index > 0 ) ? ( index + 1 < keys_array.count ? ", " : " or " ) : "" ) }#{ key.inspect }"
|
43
48
|
|
44
|
-
}
|
49
|
+
}
|
45
50
|
|
46
51
|
# raise exception if type did not match
|
47
52
|
unless found
|
48
53
|
|
49
54
|
# convert macros
|
50
|
-
[ verbose_keys_list ].each_with_index{ | param, index | message.gsub!( "$#{ index + 1 }", param.to_s ) }
|
55
|
+
[ verbose_keys_list.join ].each_with_index{ | param, index | message.gsub!( "$#{ index + 1 }", param.to_s ) }
|
51
56
|
|
52
57
|
# raise the exception
|
53
|
-
raise ArgumentError
|
58
|
+
raise ArgumentError, message
|
54
59
|
|
55
60
|
end
|
56
61
|
|
@@ -62,27 +67,27 @@ class Hash
|
|
62
67
|
def require_keys( keys, message = "Required key(s) $1 not found from hash" )
|
63
68
|
|
64
69
|
# create array of types
|
65
|
-
keys_array =
|
70
|
+
keys_array = Array( keys )
|
66
71
|
|
67
72
|
found = true
|
68
73
|
|
69
74
|
verbose_keys_list = keys_array.each_with_index.collect{ | key, index |
|
70
75
|
|
71
|
-
found = false unless
|
76
|
+
found = false unless has_key?( key )
|
72
77
|
|
73
78
|
# result string, separate types if multiple types given
|
74
79
|
"#{ ( ( index > 0 ) ? ( index + 1 < keys_array.count ? ", " : " and " ) : "" ) }#{ key.inspect }"
|
75
80
|
|
76
|
-
}
|
81
|
+
}
|
77
82
|
|
78
83
|
# raise exception if type did not match
|
79
84
|
unless found
|
80
85
|
|
81
86
|
# convert macros
|
82
|
-
[ verbose_keys_list ].each_with_index{ | param, index | message.gsub!( "$#{ index + 1 }", param.to_s ) }
|
87
|
+
[ verbose_keys_list.join ].each_with_index{ | param, index | message.gsub!( "$#{ index + 1 }", param.to_s ) }
|
83
88
|
|
84
89
|
# raise the exception
|
85
|
-
raise ArgumentError
|
90
|
+
raise ArgumentError, message
|
86
91
|
|
87
92
|
end
|
88
93
|
|
@@ -93,16 +98,20 @@ class Hash
|
|
93
98
|
# collect given keypairs from hash
|
94
99
|
def collect_keys( *keys )
|
95
100
|
|
96
|
-
Hash[ self.select{ | key, value | true if keys.include?( key ) } ]
|
101
|
+
#Hash[ self.select{ | key, value | true if keys.include?( key ) } ]
|
97
102
|
|
103
|
+
# optimized version, approx 47.9% faster
|
104
|
+
keys.inject( {} ){ | hash, key | hash[ key ] = self[ key ] if has_key?( key ); hash }
|
105
|
+
|
98
106
|
end
|
99
107
|
|
100
108
|
# remove keys from hash, return hash of deleted keys as result
|
101
109
|
def delete_keys!( *keys )
|
102
110
|
|
103
|
-
|
111
|
+
#Hash[ keys.flatten.collect{ | key | [ key, delete( key ) ] if has_key?( key ) }.compact ]
|
104
112
|
|
105
|
-
|
113
|
+
# optimized version, approx 23.4% faster
|
114
|
+
keys.inject( {} ){ | hash, key | hash[ key ] = delete( key ) if has_key?( key ); hash }
|
106
115
|
|
107
116
|
end
|
108
117
|
|
@@ -110,22 +119,17 @@ class Hash
|
|
110
119
|
def delete_keys( *keys )
|
111
120
|
|
112
121
|
# create a duplicate of current hash
|
113
|
-
result = dup
|
122
|
+
result = dup; keys.flatten.each{ | key | result.delete( key ) }; result
|
114
123
|
|
115
|
-
|
116
|
-
|
117
|
-
result
|
124
|
+
# optimized version, approx 5% faster
|
125
|
+
#keys.inject( dup ){ | hash, key | hash.delete( key ); hash }
|
118
126
|
|
119
127
|
end
|
120
128
|
|
121
129
|
# store keys and values to hash if not already defined
|
122
130
|
def default_values( hash )
|
123
131
|
|
124
|
-
hash.each_pair{ | key, value |
|
125
|
-
|
126
|
-
self[ key ] = value unless has_key?( key )
|
127
|
-
|
128
|
-
}
|
132
|
+
hash.each_pair{ | key, value | self[ key ] = value unless has_key?( key ) }
|
129
133
|
|
130
134
|
self
|
131
135
|
|
@@ -142,6 +146,7 @@ class Hash
|
|
142
146
|
|
143
147
|
def strip_dynamic_attributes!
|
144
148
|
|
149
|
+
=begin
|
145
150
|
# remove dynamic attributes from hash and return as result
|
146
151
|
Hash[
|
147
152
|
|
@@ -167,7 +172,58 @@ class Hash
|
|
167
172
|
}
|
168
173
|
|
169
174
|
]
|
175
|
+
=end
|
176
|
+
|
177
|
+
# optimized version, approx 3.2% faster
|
178
|
+
prefix = '__'
|
179
|
+
|
180
|
+
keys.inject( {} ){ | hash, key |
|
181
|
+
|
182
|
+
hash[ key ] = delete( key ) if key.to_s[0..1] == prefix
|
183
|
+
|
184
|
+
hash
|
185
|
+
|
186
|
+
}
|
170
187
|
|
171
188
|
end # strip_dynamic_attributes!
|
172
189
|
|
190
|
+
# TODO: document me
|
191
|
+
def recursive_merge( other )
|
192
|
+
|
193
|
+
self.merge( other ){ | key, old_value, new_value |
|
194
|
+
|
195
|
+
new_value
|
196
|
+
|
197
|
+
if old_value.kind_of?( Hash ) && new_value.kind_of?( Hash )
|
198
|
+
|
199
|
+
# merge hashes, call self recursively
|
200
|
+
old_value.recursive_merge( new_value )
|
201
|
+
|
202
|
+
elsif old_value.kind_of?( Array ) && new_value.kind_of?( Array )
|
203
|
+
|
204
|
+
# concatenate arrays
|
205
|
+
old_value.clone.concat( new_value ).uniq
|
206
|
+
|
207
|
+
else
|
208
|
+
|
209
|
+
# return new value as is
|
210
|
+
new_value
|
211
|
+
|
212
|
+
end
|
213
|
+
|
214
|
+
}
|
215
|
+
|
216
|
+
end # recursive_merge
|
217
|
+
|
218
|
+
# TODO: document me
|
219
|
+
def recursive_merge!( other )
|
220
|
+
|
221
|
+
self.replace(
|
222
|
+
|
223
|
+
recursive_merge( other )
|
224
|
+
|
225
|
+
)
|
226
|
+
|
227
|
+
end # recursive_merge!
|
228
|
+
|
173
229
|
end
|
@@ -49,11 +49,32 @@ class Numeric
|
|
49
49
|
end
|
50
50
|
|
51
51
|
# TODO: document me
|
52
|
-
def
|
52
|
+
def check_range( range, message = "value $1 is out of range ($2)" )
|
53
|
+
|
54
|
+
# check that given argument is type of Range
|
55
|
+
raise TypeError, 'wrong argument type #{ range.class } for range (expected Range)' unless range.kind_of?( Range )
|
56
|
+
|
57
|
+
# check that given argument is type of Range
|
58
|
+
raise TypeError, 'wrong argument type #{ message.class } for exception message (expected String)' unless message.kind_of?( String )
|
59
|
+
|
60
|
+
# replace macros
|
61
|
+
message.gsub!( '$1', self.inspect )
|
62
|
+
|
63
|
+
message.gsub!( '$2', range.inspect )
|
53
64
|
|
54
|
-
|
65
|
+
# raise exception if number is out of range
|
66
|
+
raise RangeError, message unless range.include?( self )
|
67
|
+
|
68
|
+
# return self
|
69
|
+
self
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
# TODO: document me
|
74
|
+
def limit( minimum_value, maximum_value )
|
55
75
|
|
56
|
-
|
76
|
+
# limit current value
|
77
|
+
self.min( minimum_value ).max( maximum_value )
|
57
78
|
|
58
79
|
end
|
59
80
|
|
@@ -66,7 +87,7 @@ class Numeric
|
|
66
87
|
|
67
88
|
else
|
68
89
|
|
69
|
-
raise TypeError,
|
90
|
+
raise TypeError, "wrong type #{ value.class } for value (expected Numeric)"
|
70
91
|
|
71
92
|
end
|
72
93
|
|
@@ -81,7 +102,7 @@ class Numeric
|
|
81
102
|
|
82
103
|
else
|
83
104
|
|
84
|
-
raise TypeError,
|
105
|
+
raise TypeError, "wrong type #{ value.class } for value (expected Numeric)"
|
85
106
|
|
86
107
|
end
|
87
108
|
|
@@ -20,8 +20,23 @@
|
|
20
20
|
# extend Ruby Object class functionality
|
21
21
|
class Object
|
22
22
|
|
23
|
+
# TODO: document me
|
24
|
+
def blank?
|
25
|
+
|
26
|
+
respond_to?( :empty? ) ? empty? : !self
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
def not_blank( message = "Object must not be blank", exception = ArgumentError )
|
31
|
+
|
32
|
+
raise exception, message if blank?
|
33
|
+
|
34
|
+
self
|
35
|
+
|
36
|
+
end
|
37
|
+
|
23
38
|
# define method to class instance
|
24
|
-
def meta_def method_name, &block
|
39
|
+
def meta_def( method_name, &block )
|
25
40
|
|
26
41
|
( class << self; self; end ).instance_eval{ define_method method_name, &block }
|
27
42
|
|
@@ -31,10 +46,10 @@ class Object
|
|
31
46
|
def check_type( types, message = "wrong argument type $1 (expected $2)" )
|
32
47
|
|
33
48
|
# raise exception if message is not type of String
|
34
|
-
raise TypeError
|
49
|
+
raise TypeError, "wrong argument type #{ message.class } for message (expected String)" unless message.kind_of?( String )
|
35
50
|
|
36
51
|
# create array of types
|
37
|
-
type_array =
|
52
|
+
type_array = Array( types )
|
38
53
|
|
39
54
|
# default result value
|
40
55
|
found = false
|
@@ -42,23 +57,29 @@ class Object
|
|
42
57
|
# collect verbose type list
|
43
58
|
verbose_type_list = type_array.each_with_index.collect{ | type, index |
|
44
59
|
|
45
|
-
raise TypeError
|
60
|
+
raise TypeError, "invalid argument type #{ type } for check_type. Did you mean #{ type.class }?" unless type.kind_of?( Class )
|
61
|
+
|
62
|
+
if self.kind_of?( type )
|
63
|
+
|
64
|
+
found = true
|
65
|
+
|
66
|
+
break
|
46
67
|
|
47
|
-
|
68
|
+
end
|
48
69
|
|
49
70
|
# result string, separate types if multiple types given
|
50
71
|
"#{ ( ( index > 0 ) ? ( index + 1 < type_array.count ? ", " : " or " ) : "" ) }#{ type.to_s }"
|
51
72
|
|
52
|
-
}
|
73
|
+
}
|
53
74
|
|
54
75
|
# raise exception if type did not match
|
55
76
|
unless found
|
56
77
|
|
57
78
|
# convert macros
|
58
|
-
[ self.class, verbose_type_list, self.inspect ].each_with_index{ | param, index | message.gsub!( "$#{ index + 1 }", param.to_s ) }
|
79
|
+
[ self.class, verbose_type_list.join, self.inspect ].each_with_index{ | param, index | message.gsub!( "$#{ index + 1 }", param.to_s ) }
|
59
80
|
|
60
81
|
# raise the exception
|
61
|
-
raise TypeError
|
82
|
+
raise TypeError, message
|
62
83
|
|
63
84
|
end
|
64
85
|
|
@@ -69,17 +90,19 @@ class Object
|
|
69
90
|
|
70
91
|
def not_nil( message = "Value must not be nil", exception = ArgumentError )
|
71
92
|
|
72
|
-
raise exception
|
93
|
+
raise exception, message unless self
|
94
|
+
|
95
|
+
self
|
73
96
|
|
74
97
|
end
|
75
98
|
|
76
99
|
def validate( values, message = "Unexpected value $3 for $1 (expected $2)" )
|
77
100
|
|
78
101
|
# raise exception if message is not type of String
|
79
|
-
raise TypeError
|
102
|
+
raise TypeError, "wrong argument type #{ message.class } for message (expected String)" unless message.kind_of?( String )
|
80
103
|
|
81
104
|
# create array of values
|
82
|
-
values_array =
|
105
|
+
values_array = Array( values )
|
83
106
|
|
84
107
|
# default result value
|
85
108
|
found = false
|
@@ -89,21 +112,27 @@ class Object
|
|
89
112
|
|
90
113
|
raise TypeError.new( "Invalid argument type #{ value.class } for value (expected #{ self.class })" ) unless value.kind_of?( self.class )
|
91
114
|
|
92
|
-
|
115
|
+
if self == value
|
116
|
+
|
117
|
+
found = true
|
118
|
+
|
119
|
+
break
|
120
|
+
|
121
|
+
end
|
93
122
|
|
94
123
|
# result string, separate types if multiple types given
|
95
124
|
"#{ ( ( index > 0 ) ? ( index + 1 < values_array.count ? ", " : " or " ) : "" ) }#{ value.inspect }"
|
96
125
|
|
97
|
-
}
|
126
|
+
}
|
98
127
|
|
99
128
|
# raise exception if value was not found
|
100
129
|
unless found
|
101
130
|
|
102
131
|
# convert macros
|
103
|
-
[ self.class, verbose_values_list, self.inspect ].each_with_index{ | param, index | message.gsub!( "$#{ index + 1 }", param.to_s ) }
|
132
|
+
[ self.class, verbose_values_list.join, self.inspect ].each_with_index{ | param, index | message.gsub!( "$#{ index + 1 }", param.to_s ) }
|
104
133
|
|
105
134
|
# raise the exception
|
106
|
-
raise ArgumentError
|
135
|
+
raise ArgumentError, message
|
107
136
|
|
108
137
|
end
|
109
138
|
|