Ignore:
Timestamp:
Jul 9, 2020, 8:51:43 AM (4 years ago)
Author:
coas-nagasima
Message:

mrubyを2.1.1に更新

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
    12$ok_test = 0
    23$ko_test = 0
    34$kill_test = 0
     5$warning_test = 0
     6$skip_test = 0
    47$asserts  = []
    58$test_start = Time.now if Object.const_defined?(:Time)
    69
    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
     11unless 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
     21end
     22
     23class Array
     24  def _assertion_join
     25    join("-")
     26  end
     27end
     28
     29class 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
    1550  end
    1651end
     
    2055def assertion_string(err, str, iso=nil, e=nil, bt=nil)
    2156  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
    3168  msg
    3269end
     
    4077#       which will be tested by this
    4178#       assertion
    42 def assert(str = 'Assertion failed', iso = '')
     79def assert(str = 'assert', iso = '')
    4380  t_print(str, (iso != '' ? " [#{iso}]" : ''), ' : ') if $mrbtest_verbose
    4481  begin
     82    $mrbtest_child_noassert ||= [0]
     83    $mrbtest_child_noassert << 0
     84    parent_asserts = $asserts
     85    $asserts = []
     86    parent_mrbtest_assert = $mrbtest_assert
    4587    $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
    4799    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')
    52115    else
    53116      $ok_test += 1
    54117      t_print('.')
    55118    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('?')
    56124  rescue Exception => e
    57125    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
    61138    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
    68149  end
    69150  t_print("\n") if $mrbtest_verbose
     
    71152
    72153def assertion_diff(exp, act)
    73   "    Expected: #{exp.inspect}\n" +
     154  "    Expected: #{exp.inspect}\n" \
    74155  "      Actual: #{act.inspect}"
    75156end
    76157
    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)
     158def 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
     167end
     168
     169def 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)
     174end
     175
     176def 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)
     182end
     183
     184def 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)
     190end
     191
     192def assert_same(*args); _assert_same(true, *args) end
     193def assert_not_same(*args); _assert_same(false, *args) end
     194def _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)
    124202end
    125203
    126204def 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)
     209end
     210
     211def 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)
     216end
     217
     218def assert_include(*args); _assert_include(true, *args) end
     219def assert_not_include(*args); _assert_include(false, *args) end
     220def _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)
     225end
     226
     227def assert_predicate(*args); _assert_predicate(true, *args) end
     228def assert_not_predicate(*args); _assert_predicate(false, *args) end
     229def _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)
     234end
     235
     236def assert_operator(*args); _assert_operator(true, *args) end
     237def assert_not_operator(*args); _assert_operator(false, *args) end
     238def _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)
     244end
     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.
     267def assert_match(*args); _assert_match(true, *args) end
     268def assert_not_match(*args); _assert_match(false, *args) end
     269def _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)
    192274end
    193275
     
    195277# Fails unless +obj+ is a kind of +cls+.
    196278def 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)
    200283end
    201284
     
    203286# Fails unless +exp+ is equal to +act+ in terms of a Float
    204287def 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
     297end
     298
     299def 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
     316end
     317
     318def 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
     329end
     330
     331def assert_raise_with_message(*args, &block)
     332  _assert_raise_with_message(:plain, *args, &block)
     333end
     334def assert_raise_with_message_pattern(*args, &block)
     335  _assert_raise_with_message(:pattern, *args, &block)
     336end
     337def _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)
     351end
     352
     353def pass
     354  assert_true(true)
     355end
     356
     357def flunk(msg = "Epic Fail!", diff = "")
     358  assert_true(false, msg, diff)
    208359end
    209360
     
    211362# Report the test result and print all assertions
    212363# which were reported broken.
    213 def report()
     364def report
    214365  t_print("\n")
    215366
    216367  $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")
    226379
    227380  if Object.const_defined?(:Time)
    228381    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
     386end
     387
     388def _eval_assertion(meth, exp, act_or_msg, msg, block)
     389  if block
     390    exp, act, msg = exp, block.call, act_or_msg
    241391  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
    244395end
    245396
    246397##
    247398# Skip the test
    248 class MRubyTestSkip < NotImplementedError
    249   attr_accessor :cause
    250   def initialize(cause)
    251     @cause = cause
    252   end
    253 end
     399class MRubyTestSkip < NotImplementedError; end
    254400
    255401def skip(cause = "")
Note: See TracChangeset for help on using the changeset viewer.