Changeset 439 for EcnlProtoTool/trunk/mruby-2.1.1/test/assert.rb
- Timestamp:
- Jul 9, 2020, 8:51:43 AM (4 years ago)
- Location:
- EcnlProtoTool/trunk/mruby-2.1.1
- Files:
-
- 1 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/mruby-2.1.1/test/assert.rb
r331 r439 1 $undefined = Object.new 1 2 $ok_test = 0 2 3 $ko_test = 0 3 4 $kill_test = 0 5 $warning_test = 0 6 $skip_test = 0 4 7 $asserts = [] 5 8 $test_start = Time.now if Object.const_defined?(:Time) 6 9 7 # Implementation of print due to the reason that there might be no print 8 def t_print(*args) 9 i = 0 10 len = args.size 11 while i < len 12 str = args[i].to_s 13 __t_printstr__ str rescue print str 14 i += 1 10 # For bintest on Ruby 11 unless RUBY_ENGINE == "mruby" 12 def t_print(*args) 13 print(*args) 14 $stdout.flush 15 nil 16 end 17 18 def _str_match?(pattern, str) 19 File.fnmatch?(pattern, str, File::FNM_EXTGLOB|File::FNM_DOTMATCH) 20 end 21 end 22 23 class Array 24 def _assertion_join 25 join("-") 26 end 27 end 28 29 class String 30 def _assertion_indent(indent) 31 indent = indent.to_s 32 off = 0 33 str = self 34 while nl = index("\n", off) 35 nl += 1 36 nl += 1 while slice(nl) == "\n" 37 break if nl >= size 38 str = indent.dup if off == 0 39 str += slice(off, nl - off) + indent 40 off = nl 41 end 42 43 if off == 0 44 str = indent + self 45 else 46 str += slice(off..-1) 47 end 48 49 str 15 50 end 16 51 end … … 20 55 def assertion_string(err, str, iso=nil, e=nil, bt=nil) 21 56 msg = "#{err}#{str}" 22 msg += " [#{iso}]" if iso && iso != '' 23 msg += " => #{e.message}" if e 24 msg += " (mrbgems: #{GEMNAME})" if Object.const_defined?(:GEMNAME) 25 if $mrbtest_assert && $mrbtest_assert.size > 0 26 $mrbtest_assert.each do |idx, str, diff| 27 msg += "\n - Assertion[#{idx}] Failed: #{str}\n#{diff}" 28 end 29 end 30 msg += "\nbacktrace:\n\t#{bt.join("\n\t")}" if bt 57 msg += " [#{iso}]" if iso && !iso.empty? 58 msg += " => #{e}" if e && !e.to_s.empty? 59 msg += " (#{GEMNAME == 'mruby-test' ? 'core' : "mrbgems: #{GEMNAME}"})" 60 if $mrbtest_assert 61 $mrbtest_assert.each do |idx, assert_msg, diff| 62 msg += "\n - Assertion[#{idx}]" 63 msg += " #{assert_msg}." if assert_msg && !assert_msg.empty? 64 msg += "\n#{diff}" if diff && !diff.empty? 65 end 66 end 67 msg += "\nbacktrace:\n #{bt.join("\n ")}" if bt 31 68 msg 32 69 end … … 40 77 # which will be tested by this 41 78 # assertion 42 def assert(str = ' Assertion failed', iso = '')79 def assert(str = 'assert', iso = '') 43 80 t_print(str, (iso != '' ? " [#{iso}]" : ''), ' : ') if $mrbtest_verbose 44 81 begin 82 $mrbtest_child_noassert ||= [0] 83 $mrbtest_child_noassert << 0 84 parent_asserts = $asserts 85 $asserts = [] 86 parent_mrbtest_assert = $mrbtest_assert 45 87 $mrbtest_assert = [] 46 $mrbtest_assert_idx = 0 88 89 if $mrbtest_assert_idx && !$mrbtest_assert_idx.empty? 90 $mrbtest_assert_idx[-1] += 1 91 $mrbtest_assert_idx << 0 92 else 93 $mrbtest_assert_idx = [0] 94 class << $mrbtest_assert_idx 95 alias to_s _assertion_join 96 end 97 end 98 47 99 yield 48 if($mrbtest_assert.size > 0) 49 $asserts.push(assertion_string('Fail: ', str, iso, nil)) 50 $ko_test += 1 51 t_print('F') 100 if $mrbtest_assert.size > 0 101 if $mrbtest_assert.size == $mrbtest_child_noassert[-1] 102 $asserts.push(assertion_string('Skip: ', str, iso)) 103 $mrbtest_child_noassert[-2] += 1 104 $skip_test += 1 105 t_print('?') 106 else 107 $asserts.push(assertion_string('Fail: ', str, iso)) 108 $ko_test += 1 109 t_print('F') 110 end 111 elsif $mrbtest_assert_idx[-1] == 0 112 $asserts.push(assertion_string('Warn: ', str, iso, 'no assertion')) 113 $warning_test += 1 114 t_print('W') 52 115 else 53 116 $ok_test += 1 54 117 t_print('.') 55 118 end 119 rescue MRubyTestSkip => e 120 $asserts.push(assertion_string('Skip: ', str, iso, e)) 121 $skip_test += 1 122 $mrbtest_child_noassert[-2] += 1 123 t_print('?') 56 124 rescue Exception => e 57 125 bt = e.backtrace if $mrbtest_verbose 58 if e.class.to_s == 'MRubyTestSkip' 59 $asserts.push "Skip: #{str} #{iso} #{e.cause}" 60 t_print('?') 126 $asserts.push(assertion_string("#{e.class}: ", str, iso, e, bt)) 127 $kill_test += 1 128 t_print('X') 129 ensure 130 if $mrbtest_assert_idx.size > 1 131 $asserts.each do |mesg| 132 idx = $mrbtest_assert_idx[0..-2]._assertion_join 133 mesg = mesg._assertion_indent(" ") 134 135 # Give `mesg` as a `diff` argument to avoid adding extra periods. 136 parent_mrbtest_assert << [idx, nil, mesg] 137 end 61 138 else 62 $asserts.push(assertion_string("#{e.class}: ", str, iso, e, bt)) 63 $kill_test += 1 64 t_print('X') 65 end 66 ensure 67 $mrbtest_assert = nil 139 parent_asserts.concat $asserts 140 end 141 $asserts = parent_asserts 142 143 $mrbtest_assert = parent_mrbtest_assert 144 $mrbtest_assert_idx.pop 145 $mrbtest_assert_idx = nil if $mrbtest_assert_idx.empty? 146 $mrbtest_child_noassert.pop 147 148 nil 68 149 end 69 150 t_print("\n") if $mrbtest_verbose … … 71 152 72 153 def assertion_diff(exp, act) 73 " Expected: #{exp.inspect}\n" +154 " Expected: #{exp.inspect}\n" \ 74 155 " Actual: #{act.inspect}" 75 156 end 76 157 77 def assert_true(ret, msg = nil, diff = nil) 78 if $mrbtest_assert 79 $mrbtest_assert_idx += 1 80 unless ret 81 msg = "Expected #{ret.inspect} to be true" unless msg 82 diff = assertion_diff(true, ret) unless diff 83 $mrbtest_assert.push([$mrbtest_assert_idx, msg, diff]) 84 end 85 end 86 ret 87 end 88 89 def assert_false(ret, msg = nil, diff = nil) 90 if $mrbtest_assert 91 $mrbtest_assert_idx += 1 92 if ret 93 msg = "Expected #{ret.inspect} to be false" unless msg 94 diff = assertion_diff(false, ret) unless diff 95 96 $mrbtest_assert.push([$mrbtest_assert_idx, msg, diff]) 97 end 98 end 99 !ret 100 end 101 102 def assert_equal(arg1, arg2 = nil, arg3 = nil) 103 if block_given? 104 exp, act, msg = arg1, yield, arg2 105 else 106 exp, act, msg = arg1, arg2, arg3 107 end 108 109 msg = "Expected to be equal" unless msg 110 diff = assertion_diff(exp, act) 111 assert_true(exp == act, msg, diff) 112 end 113 114 def assert_not_equal(arg1, arg2 = nil, arg3 = nil) 115 if block_given? 116 exp, act, msg = arg1, yield, arg2 117 else 118 exp, act, msg = arg1, arg2, arg3 119 end 120 121 msg = "Expected to be not equal" unless msg 122 diff = assertion_diff(exp, act) 123 assert_false(exp == act, msg, diff) 158 def assert_true(obj, msg = nil, diff = nil) 159 if $mrbtest_assert_idx && $mrbtest_assert_idx.size > 0 160 $mrbtest_assert_idx[-1] += 1 161 unless obj == true 162 diff ||= " Expected #{obj.inspect} to be true." 163 $mrbtest_assert.push([$mrbtest_assert_idx.to_s, msg, diff]) 164 end 165 end 166 obj 167 end 168 169 def assert_false(obj, msg = nil, diff = nil) 170 unless obj == false 171 diff ||= " Expected #{obj.inspect} to be false." 172 end 173 assert_true(!obj, msg, diff) 174 end 175 176 def assert_equal(exp, act_or_msg = nil, msg = nil, &block) 177 ret, exp, act, msg = _eval_assertion(:==, exp, act_or_msg, msg, block) 178 unless ret 179 diff = assertion_diff(exp, act) 180 end 181 assert_true(ret, msg, diff) 182 end 183 184 def assert_not_equal(exp, act_or_msg = nil, msg = nil, &block) 185 ret, exp, act, msg = _eval_assertion(:==, exp, act_or_msg, msg, block) 186 if ret 187 diff = " Expected #{act.inspect} to not be equal to #{exp.inspect}." 188 end 189 assert_true(!ret, msg, diff) 190 end 191 192 def assert_same(*args); _assert_same(true, *args) end 193 def assert_not_same(*args); _assert_same(false, *args) end 194 def _assert_same(affirmed, exp, act, msg = nil) 195 unless ret = exp.equal?(act) == affirmed 196 exp_str, act_str = [exp, act].map do |o| 197 "#{o.inspect} (class=#{o.class}, oid=#{o.__id__})" 198 end 199 diff = " Expected #{act_str} to #{'not ' unless affirmed}be the same as #{exp_str}." 200 end 201 assert_true(ret, msg, diff) 124 202 end 125 203 126 204 def assert_nil(obj, msg = nil) 127 msg = "Expected #{obj.inspect} to be nil" unless msg 128 diff = assertion_diff(nil, obj) 129 assert_true(obj.nil?, msg, diff) 130 end 131 132 def assert_include(collection, obj, msg = nil) 133 msg = "Expected #{collection.inspect} to include #{obj.inspect}" unless msg 134 diff = " Collection: #{collection.inspect}\n" + 135 " Object: #{obj.inspect}" 136 assert_true(collection.include?(obj), msg, diff) 137 end 138 139 def assert_not_include(collection, obj, msg = nil) 140 msg = "Expected #{collection.inspect} to not include #{obj.inspect}" unless msg 141 diff = " Collection: #{collection.inspect}\n" + 142 " Object: #{obj.inspect}" 143 assert_false(collection.include?(obj), msg, diff) 144 end 145 146 def assert_raise(*exp) 147 ret = true 148 if $mrbtest_assert 149 $mrbtest_assert_idx += 1 150 msg = exp.last.class == String ? exp.pop : nil 151 msg = msg.to_s + " : " if msg 152 should_raise = false 153 begin 154 yield 155 should_raise = true 156 rescue Exception => e 157 msg = "#{msg}#{exp.inspect} exception expected, not" 158 diff = " Class: <#{e.class}>\n" + 159 " Message: #{e.message}" 160 if not exp.any?{|ex| ex.instance_of?(Module) ? e.kind_of?(ex) : ex == e.class } 161 $mrbtest_assert.push([$mrbtest_assert_idx, msg, diff]) 162 ret = false 163 end 164 end 165 166 exp = exp.first if exp.first 167 if should_raise 168 msg = "#{msg}#{exp.inspect} expected but nothing was raised." 169 $mrbtest_assert.push([$mrbtest_assert_idx, msg, nil]) 170 ret = false 171 end 172 end 173 ret 174 end 175 176 def assert_nothing_raised(*exp) 177 ret = true 178 if $mrbtest_assert 179 $mrbtest_assert_idx += 1 180 msg = exp.last.class == String ? exp.pop : "" 181 begin 182 yield 183 rescue Exception => e 184 msg = "#{msg} exception raised." 185 diff = " Class: <#{e.class}>\n" + 186 " Message: #{e.message}" 187 $mrbtest_assert.push([$mrbtest_assert_idx, msg, diff]) 188 ret = false 189 end 190 end 191 ret 205 unless ret = obj.nil? 206 diff = " Expected #{obj.inspect} to be nil." 207 end 208 assert_true(ret, msg, diff) 209 end 210 211 def assert_not_nil(obj, msg = nil) 212 if ret = obj.nil? 213 diff = " Expected #{obj.inspect} to not be nil." 214 end 215 assert_false(ret, msg, diff) 216 end 217 218 def assert_include(*args); _assert_include(true, *args) end 219 def assert_not_include(*args); _assert_include(false, *args) end 220 def _assert_include(affirmed, collection, obj, msg = nil) 221 unless ret = collection.include?(obj) == affirmed 222 diff = " Expected #{collection.inspect} to #{'not ' unless affirmed}include #{obj.inspect}." 223 end 224 assert_true(ret, msg, diff) 225 end 226 227 def assert_predicate(*args); _assert_predicate(true, *args) end 228 def assert_not_predicate(*args); _assert_predicate(false, *args) end 229 def _assert_predicate(affirmed, obj, op, msg = nil) 230 unless ret = obj.__send__(op) == affirmed 231 diff = " Expected #{obj.inspect} to #{'not ' unless affirmed}be #{op}." 232 end 233 assert_true(ret, msg, diff) 234 end 235 236 def assert_operator(*args); _assert_operator(true, *args) end 237 def assert_not_operator(*args); _assert_operator(false, *args) end 238 def _assert_operator(affirmed, obj1, op, obj2 = $undefined, msg = nil) 239 return _assert_predicate(affirmed, obj1, op, msg) if $undefined.equal?(obj2) 240 unless ret = obj1.__send__(op, obj2) == affirmed 241 diff = " Expected #{obj1.inspect} to #{'not ' unless affirmed}be #{op} #{obj2.inspect}." 242 end 243 assert_true(ret, msg, diff) 244 end 245 246 ## 247 # Fail unless +str+ matches against +pattern+. 248 # 249 # +pattern+ is interpreted as pattern for File.fnmatch?. It may contain the 250 # following metacharacters: 251 # 252 # <code>*</code> :: 253 # Matches any string. 254 # 255 # <code>?</code> :: 256 # Matches any one character. 257 # 258 # <code>[_SET_]</code>, <code>[^_SET_]</code> (<code>[!_SET_]</code>) :: 259 # Matches any one character in _SET_. Behaves like character sets in 260 # Regexp, including set negation (<code>[^a-z]</code>). 261 # 262 # <code>{_A_,_B_}</code> :: 263 # Matches pattern _A_ or pattern _B_. 264 # 265 # <code> \ </code> :: 266 # Escapes the next character. 267 def assert_match(*args); _assert_match(true, *args) end 268 def assert_not_match(*args); _assert_match(false, *args) end 269 def _assert_match(affirmed, pattern, str, msg = nil) 270 unless ret = _str_match?(pattern, str) == affirmed 271 diff = " Expected #{pattern.inspect} to #{'not ' unless affirmed}match #{str.inspect}." 272 end 273 assert_true(ret, msg, diff) 192 274 end 193 275 … … 195 277 # Fails unless +obj+ is a kind of +cls+. 196 278 def assert_kind_of(cls, obj, msg = nil) 197 msg = "Expected #{obj.inspect} to be a kind of #{cls}, not #{obj.class}" unless msg 198 diff = assertion_diff(cls, obj.class) 199 assert_true(obj.kind_of?(cls), msg, diff) 279 unless ret = obj.kind_of?(cls) 280 diff = " Expected #{obj.inspect} to be a kind of #{cls}, not #{obj.class}." 281 end 282 assert_true(ret, msg, diff) 200 283 end 201 284 … … 203 286 # Fails unless +exp+ is equal to +act+ in terms of a Float 204 287 def assert_float(exp, act, msg = nil) 205 msg = "Float #{exp} expected to be equal to float #{act}" unless msg 206 diff = assertion_diff(exp, act) 207 assert_true check_float(exp, act), msg, diff 288 e, a = exp.to_f, act.to_f 289 if e.finite? && a.finite? && (n = (e - a).abs) > Mrbtest::FLOAT_TOLERANCE 290 flunk(msg, " Expected |#{exp} - #{act}| (#{n}) to be <= #{Mrbtest::FLOAT_TOLERANCE}.") 291 elsif (e.infinite? || a.infinite?) && e != a || 292 e.nan? && !a.nan? || !e.nan? && a.nan? 293 flunk(msg, " Expected #{act} to be #{exp}.") 294 else 295 pass 296 end 297 end 298 299 def assert_raise(*exc) 300 msg = (exc.last.is_a? String) ? exc.pop : nil 301 exc = exc.empty? ? StandardError : exc.size == 1 ? exc[0] : exc 302 begin 303 yield 304 rescue *exc => e 305 pass 306 e 307 rescue Exception => e 308 diff = " #{exc} exception expected, not\n" \ 309 " Class: <#{e.class}>\n" \ 310 " Message: <#{e}>" 311 flunk(msg, diff) 312 else 313 diff = " #{exc} expected but nothing was raised." 314 flunk(msg, diff) 315 end 316 end 317 318 def assert_nothing_raised(msg = nil) 319 begin 320 yield 321 rescue Exception => e 322 diff = " Exception raised:\n" \ 323 " Class: <#{e.class}>\n" \ 324 " Message: <#{e}>" 325 flunk(msg, diff) 326 else 327 pass 328 end 329 end 330 331 def assert_raise_with_message(*args, &block) 332 _assert_raise_with_message(:plain, *args, &block) 333 end 334 def assert_raise_with_message_pattern(*args, &block) 335 _assert_raise_with_message(:pattern, *args, &block) 336 end 337 def _assert_raise_with_message(type, exc, exp_msg, msg = nil, &block) 338 e = msg ? assert_raise(exc, msg, &block) : assert_raise(exc, &block) 339 e ? ($mrbtest_assert_idx[-1]-=1) : (return e) 340 341 err_msg = e.message 342 unless ret = type == :pattern ? _str_match?(exp_msg, err_msg) : exp_msg == err_msg 343 diff = " Expected Exception(#{exc}) was raised, but the message doesn't match.\n" 344 if type == :pattern 345 diff += " Expected #{exp_msg.inspect} to match #{err_msg.inspect}." 346 else 347 diff += assertion_diff(exp_msg, err_msg) 348 end 349 end 350 assert_true(ret, msg, diff) 351 end 352 353 def pass 354 assert_true(true) 355 end 356 357 def flunk(msg = "Epic Fail!", diff = "") 358 assert_true(false, msg, diff) 208 359 end 209 360 … … 211 362 # Report the test result and print all assertions 212 363 # which were reported broken. 213 def report ()364 def report 214 365 t_print("\n") 215 366 216 367 $asserts.each do |msg| 217 t_print "#{msg}\n" 218 end 219 220 $total_test = $ok_test+$ko_test+$kill_test 221 t_print("Total: #{$total_test}\n") 222 223 t_print(" OK: #{$ok_test}\n") 224 t_print(" KO: #{$ko_test}\n") 225 t_print("Crash: #{$kill_test}\n") 368 t_print("#{msg}\n") 369 end 370 371 $total_test = $ok_test + $ko_test + $kill_test + $warning_test + $skip_test 372 t_print(" Total: #{$total_test}\n") 373 374 t_print(" OK: #{$ok_test}\n") 375 t_print(" KO: #{$ko_test}\n") 376 t_print(" Crash: #{$kill_test}\n") 377 t_print("Warning: #{$warning_test}\n") 378 t_print(" Skip: #{$skip_test}\n") 226 379 227 380 if Object.const_defined?(:Time) 228 381 t_time = Time.now - $test_start 229 t_print(" Time: #{t_time.round(2)} seconds\n") 230 end 231 end 232 233 ## 234 # Performs fuzzy check for equality on methods returning floats 235 def check_float(a, b) 236 tolerance = Mrbtest::FLOAT_TOLERANCE 237 a = a.to_f 238 b = b.to_f 239 if a.finite? and b.finite? 240 (a-b).abs < tolerance 382 t_print(" Time: #{t_time.round(2)} seconds\n") 383 end 384 385 $ko_test == 0 && $kill_test == 0 386 end 387 388 def _eval_assertion(meth, exp, act_or_msg, msg, block) 389 if block 390 exp, act, msg = exp, block.call, act_or_msg 241 391 else 242 true 243 end 392 exp, act, msg = exp, act_or_msg, msg 393 end 394 return exp.__send__(meth, act), exp, act, msg 244 395 end 245 396 246 397 ## 247 398 # Skip the test 248 class MRubyTestSkip < NotImplementedError 249 attr_accessor :cause 250 def initialize(cause) 251 @cause = cause 252 end 253 end 399 class MRubyTestSkip < NotImplementedError; end 254 400 255 401 def skip(cause = "")
Note:
See TracChangeset
for help on using the changeset viewer.