[前][次][番号順一覧][スレッド一覧]

ruby-changes:4754

From: ko1@a...
Date: Thu, 1 May 2008 11:03:00 +0900 (JST)
Subject: [ruby-changes:4754] akr - Ruby:r16248 (trunk): split combinational blackbox tests.

akr	2008-05-01 11:02:49 +0900 (Thu, 01 May 2008)

  New Revision: 16248

  Added files:
    trunk/test/ruby/test_integer_comb.rb
  Modified files:
    trunk/test/ruby/test_integer.rb

  Log:
    split combinational blackbox tests.


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/test/ruby/test_integer_comb.rb?revision=16248&view=markup
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/test/ruby/test_integer.rb?r1=16248&r2=16247&diff_format=u

Index: test/ruby/test_integer.rb
===================================================================
--- test/ruby/test_integer.rb	(revision 16247)
+++ test/ruby/test_integer.rb	(revision 16248)
@@ -1,112 +1,6 @@
 require 'test/unit'
 
 class TestInteger < Test::Unit::TestCase
-  VS = [
-    -0x1000000000000000000000000000000000000000000000002,
-    -0x1000000000000000000000000000000000000000000000001,
-    -0x1000000000000000000000000000000000000000000000000,
-    -0xffffffffffffffffffffffffffffffffffffffffffffffff,
-    -0x1000000000000000000000002,
-    -0x1000000000000000000000001,
-    -0x1000000000000000000000000,
-    -0xffffffffffffffffffffffff,
-    -0x10000000000000002,
-    -0x10000000000000001,
-    -0x10000000000000000,
-    -0xffffffffffffffff,
-    -0x4000000000000002,
-    -0x4000000000000001,
-    -0x4000000000000000,
-    -0x3fffffffffffffff,
-    -0x100000002,
-    -0x100000001,
-    -0x100000000,
-    -0xffffffff,
-    -0xc717a08d, # 0xc717a08d * 0x524b2245 = 0x4000000000000001
-    -0x80000002,
-    -0x80000001,
-    -0x80000000,
-    -0x7fffffff,
-    -0x524b2245,
-    -0x40000002,
-    -0x40000001,
-    -0x40000000,
-    -0x3fffffff,
-    -0x10002,
-    -0x10001,
-    -0x10000,
-    -0xffff,
-    -0x8101, # 0x8101 * 0x7f01 = 0x40000001
-    -0x8002,
-    -0x8001,
-    -0x8000,
-    -0x7fff,
-    -0x7f01,
-    -65,
-    -64,
-    -63,
-    -62,
-    -33,
-    -32,
-    -31,
-    -30,
-    -3,
-    -2,
-    -1,
-    0,
-    1,
-    2,
-    3,
-    30,
-    31,
-    32,
-    33,
-    62,
-    63,
-    64,
-    65,
-    0x7f01,
-    0x7ffe,
-    0x7fff,
-    0x8000,
-    0x8001,
-    0x8101,
-    0xfffe,
-    0xffff,
-    0x10000,
-    0x10001,
-    0x3ffffffe,
-    0x3fffffff,
-    0x40000000,
-    0x40000001,
-    0x524b2245,
-    0x7ffffffe,
-    0x7fffffff,
-    0x80000000,
-    0x80000001,
-    0xc717a08d,
-    0xfffffffe,
-    0xffffffff,
-    0x100000000,
-    0x100000001,
-    0x3ffffffffffffffe,
-    0x3fffffffffffffff,
-    0x4000000000000000,
-    0x4000000000000001,
-    0xfffffffffffffffe,
-    0xffffffffffffffff,
-    0x10000000000000000,
-    0x10000000000000001,
-    0xffffffffffffffffffffffff,
-    0x1000000000000000000000000,
-    0x1000000000000000000000001,
-    0xffffffffffffffffffffffffffffffffffffffffffffffff,
-    0x1000000000000000000000000000000000000000000000000,
-    0x1000000000000000000000000000000000000000000000001
-  ]
-
-  #VS.map! {|v| 0x4000000000000000.coerce(v)[0] }
-
   BDSIZE = 0x4000000000000000.coerce(0)[0].size
   def self.bdsize(x)
     ((x + 1) / 8 + BDSIZE) / BDSIZE * BDSIZE
@@ -115,47 +9,7 @@
     self.class.bdsize(x)
   end
 
-  min = -1
-  min *= 2 while min.class == Fixnum
-  FIXNUM_MIN = min/2
-  max = 1
-  max *= 2 while (max-1).class == Fixnum
-  FIXNUM_MAX = max/2-1
-
-  def test_fixnum_range
-    assert_instance_of(Bignum, FIXNUM_MIN-1)
-    assert_instance_of(Fixnum, FIXNUM_MIN)
-    assert_instance_of(Fixnum, FIXNUM_MAX)
-    assert_instance_of(Bignum, FIXNUM_MAX+1)
-  end
-
-  def check_class(n)
-    if FIXNUM_MIN <= n && n <= FIXNUM_MAX
-      assert_instance_of(Fixnum, n)
-    else
-      assert_instance_of(Bignum, n)
-    end
-  end
-
   def test_aref
-    VS.each {|a|
-      100.times {|i|
-        assert_equal((a >> i).odd? ? 1 : 0, a[i], "(#{a})[#{i}]")
-      }
-    }
-    VS.each {|a|
-      VS.each {|b|
-        c = nil
-        assert_nothing_raised("(#{a})[#{b}]") { c = a[b] }
-        check_class(c)
-        if b < 0
-          assert_equal(0, c, "(#{a})[#{b}]")
-        else
-          assert_equal((a >> b).odd? ? 1 : 0, c, "(#{a})[#{b}]")
-        end
-      }
-    }
-
     # assert_equal(1, (1 << 0x40000000)[0x40000000], "[ruby-dev:31271]")
     # assert_equal(0, (-1 << 0x40000001)[0x40000000], "[ruby-dev:31271]")
     big_zero = 0x40000000.coerce(0)[0]
@@ -163,88 +17,7 @@
     assert_equal(1, 0x400000001[big_zero], "[ruby-dev:31271]")
   end
 
-  def test_plus
-    VS.each {|a|
-      VS.each {|b|
-        c = a + b
-        check_class(c)
-        assert_equal(b + a, c, "#{a} + #{b}")
-        assert_equal(a, c - b, "(#{a} + #{b}) - #{b}")
-        assert_equal(a-~b-1, c, "#{a} + #{b}") # Hacker's Delight
-        assert_equal((a^b)+2*(a&b), c, "#{a} + #{b}") # Hacker's Delight
-        assert_equal((a|b)+(a&b), c, "#{a} + #{b}") # Hacker's Delight
-        assert_equal(2*(a|b)-(a^b), c, "#{a} + #{b}") # Hacker's Delight
-      }
-    }
-  end
-
-  def test_minus
-    VS.each {|a|
-      VS.each {|b|
-        c = a - b
-        check_class(c)
-        assert_equal(a, c + b, "(#{a} - #{b}) + #{b}")
-        assert_equal(-b, c - a, "(#{a} - #{b}) - #{a}")
-        assert_equal(a+~b+1, c, "#{a} - #{b}") # Hacker's Delight
-        assert_equal((a^b)-2*(b&~a), c, "#{a} - #{b}") # Hacker's Delight
-        assert_equal((a&~b)-(b&~a), c, "#{a} - #{b}") # Hacker's Delight
-        assert_equal(2*(a&~b)-(a^b), c, "#{a} - #{b}") # Hacker's Delight
-      }
-    }
-  end
-
-  def test_mult
-    VS.each {|a|
-      VS.each {|b|
-        c = a * b
-        check_class(c)
-        assert_equal(b * a, c, "#{a} * #{b}")
-        assert_equal(b, c / a, "(#{a} * #{b}) / #{a}") if a != 0
-        assert_equal(a.abs * b.abs, (a * b).abs, "(#{a} * #{b}).abs")
-        assert_equal((a-100)*(b-100)+(a-100)*100+(b-100)*100+10000, c, "#{a} * #{b}")
-        assert_equal((a+100)*(b+100)-(a+100)*100-(b+100)*100+10000, c, "#{a} * #{b}")
-      }
-    }
-  end
-
-  def test_divmod
-    VS.each {|a|
-      VS.each {|b|
-        if b == 0
-          assert_raise(ZeroDivisionError) { a.divmod(b) }
-        else
-          q, r = a.divmod(b)
-          check_class(q)
-          check_class(r)
-          assert_equal(a, b*q+r)
-          assert(r.abs < b.abs)
-          assert(0 < b ? (0 <= r && r < b) : (b < r && r <= 0))
-          assert_equal(q, a/b)
-          assert_equal(q, a.div(b))
-          assert_equal(r, a%b)
-          assert_equal(r, a.modulo(b))
-        end
-      }
-    }
-  end
-
   def test_pow
-    small_values = VS.find_all {|v| 0 <= v && v < 1000 }
-    VS.each {|a|
-      small_values.each {|b|
-        c = a ** b
-        check_class(c)
-        d = 1
-        b.times { d *= a }
-        assert_equal(d, c, "(#{a}) ** #{b}")
-        if a != 0
-          d = c
-          b.times { d /= a }
-          assert_equal(1, d, "((#{a}) ** #{b}) / #{a} / ...(#{b} times)...")
-        end
-      }
-    }
-
     assert_not_equal(0, begin
                           0**-1
                         rescue
@@ -252,70 +25,7 @@
                         end, "[ruby-dev:32084] [ruby-dev:34547]")
   end
 
-  def test_not
-    VS.each {|a|
-      b = ~a
-      check_class(b)
-      assert_equal(-1 ^ a, b, "~#{a}")
-      assert_equal(-a-1, b, "~#{a}") # Hacker's Delight
-      assert_equal(0, a & b, "#{a} & ~#{a}")
-      assert_equal(-1, a | b, "#{a} | ~#{a}")
-    }
-  end
-
-  def test_or
-    VS.each {|a|
-      VS.each {|b|
-        c = a | b
-        check_class(c)
-        assert_equal(b | a, c, "#{a} | #{b}")
-        assert_equal(a + b - (a&b), c, "#{a} | #{b}")
-        assert_equal((a & ~b) + b, c, "#{a} | #{b}") # Hacker's Delight
-        assert_equal(-1, c | ~a, "(#{a} | #{b}) | ~#{a})")
-      }
-    }
-  end
-
-  def test_and
-    VS.each {|a|
-      VS.each {|b|
-        c = a & b
-        check_class(c)
-        assert_equal(b & a, c, "#{a} & #{b}")
-        assert_equal(a + b - (a|b), c, "#{a} & #{b}")
-        assert_equal((~a | b) - ~a, c, "#{a} & #{b}") # Hacker's Delight
-        assert_equal(0, c & ~a, "(#{a} & #{b}) & ~#{a}")
-      }
-    }
-  end
-
-  def test_xor
-    VS.each {|a|
-      VS.each {|b|
-        c = a ^ b
-        check_class(c)
-        assert_equal(b ^ a, c, "#{a} ^ #{b}")
-        assert_equal((a|b)-(a&b), c, "#{a} ^ #{b}") # Hacker's Delight
-        assert_equal(b, c ^ a, "(#{a} ^ #{b}) ^ #{a}")
-      }
-    }
-  end
-
   def test_lshift
-    small_values = VS.find_all {|v| v < 8000 }
-    VS.each {|a|
-      small_values.each {|b|
-        c = a << b
-        check_class(c)
-        if 0 <= b
-          assert_equal(a, c >> b, "(#{a} << #{b}) >> #{b}")
-          assert_equal(a * 2**b, c, "#{a} << #{b}")
-        end
-        0.upto(c.size*8+10) {|nth|
-          assert_equal(a[nth-b], c[nth], "(#{a} << #{b})[#{nth}]")
-        }
-      }
-    }
     assert_equal(0, 1 << -0x40000000)
     assert_equal(0, 1 << -0x40000001)
     assert_equal(0, 1 << -0x80000000)
@@ -324,20 +34,6 @@
   end
 
   def test_rshift
-    small_values = VS.find_all {|v| -8000 < v }
-    VS.each {|a|
-      small_values.each {|b|
-        c = a >> b
-        check_class(c)
-        if b <= 0
-          assert_equal(a, c << b, "(#{a} >> #{b}) << #{b}")
-          assert_equal(a * 2**(-b), c, "#{a} >> #{b}")
-        end
-        0.upto(c.size*8+10) {|nth|
-          assert_equal(a[nth+b], c[nth], "(#{a} >> #{b})[#{nth}]")
-        }
-      }
-    }
     # assert_equal(bdsize(0x40000001), (1 >> -0x40000001).size)
     assert((1 >> 0x80000000).zero?)
     assert((1 >> 0xffffffff).zero?)
@@ -346,309 +42,6 @@
     # assert_equal((1 << 0x40000001), (1 >> -0x40000001))
   end
 
-  def test_succ
-    VS.each {|a|
-      b = a.succ
-      check_class(b)
-      assert_equal(a+1, b, "(#{a}).succ")
-      assert_equal(a, b.pred, "(#{a}).succ.pred")
-      assert_equal(a, b-1, "(#{a}).succ - 1")
-    }
-  end
-
-  def test_pred
-    VS.each {|a|
-      b = a.pred
-      check_class(b)
-      assert_equal(a-1, b, "(#{a}).pred")
-      assert_equal(a, b.succ, "(#{a}).pred.succ")
-      assert_equal(a, b + 1, "(#{a}).pred + 1")
-    }
-  end
-
-  def test_unary_plus
-    VS.each {|a|
-      b = +a
-      check_class(b)
-      assert_equal(a, b, "+(#{a})")
-    }
-  end
-
-  def test_unary_minus
-    VS.each {|a|
-      b = -a
-      check_class(b)
-      assert_equal(0-a, b, "-(#{a})")
-      assert_equal(~a+1, b, "-(#{a})")
-      assert_equal(0, a+b, "#{a}+(-(#{a}))")
-    }
-  end
-
-  def test_cmp
-    VS.each_with_index {|a, i|
-      VS.each_with_index {|b, j|
-        assert_equal(i <=> j, a <=> b, "#{a} <=> #{b}")
-        assert_equal(i < j, a < b, "#{a} < #{b}")
-        assert_equal(i <= j, a <= b, "#{a} <= #{b}")
-        assert_equal(i > j, a > b, "#{a} > #{b}")
-        assert_equal(i >= j, a >= b, "#{a} >= #{b}")
-      }
-    }
-  end
-
-  def test_eq
-    VS.each_with_index {|a, i|
-      VS.each_with_index {|b, j|
-        c = a == b
-        assert_equal(b == a, c, "#{a} == #{b}")
-        assert_equal(i == j, c, "#{a} == #{b}")
-      }
-    }
-  end
-
-  def test_abs
-    VS.each {|a|
-      b = a.abs
-      check_class(b)
-      if a < 0
-        assert_equal(-a, b, "(#{a}).abs")
-      else
-        assert_equal(a, b, "(#{a}).abs")
-      end
-    }
-  end
-
-  def test_ceil
-    VS.each {|a|
-      b = a.ceil
-      check_class(b)
-      assert_equal(a, b, "(#{a}).ceil")
-    }
-  end
-
-  def test_floor
-    VS.each {|a|
-      b = a.floor
-      check_class(b)
-      assert_equal(a, b, "(#{a}).floor")
-    }
-  end
-
-  def test_round
-    VS.each {|a|
-      b = a.round
-      check_class(b)
-      assert_equal(a, b, "(#{a}).round")
-    }
-  end
-
-  def test_truncate
-    VS.each {|a|
-      b = a.truncate
-      check_class(b)
-      assert_equal(a, b, "(#{a}).truncate")
-    }
-  end
-
-  def test_remainder
-    VS.each {|a|
-      VS.each {|b|
-        if b == 0
-          assert_raise(ZeroDivisionError) { a.divmod(b) }
-        else
-          r = a.remainder(b)
-          check_class(r)
-          if a < 0
-            assert_operator(-b.abs, :<, r, "#{a}.remainder(#{b})")
-            assert_operator(0, :>=, r, "#{a}.remainder(#{b})")
-          elsif 0 < a
-            assert_operator(0, :<=, r, "#{a}.remainder(#{b})")
-            assert_operator(b.abs, :>, r, "#{a}.remainder(#{b})")
-          else
-            assert_equal(0, r, "#{a}.remainder(#{b})")
-          end
-        end
-      }
-    }
-  end
-
-  def test_zero_nonzero
-    VS.each {|a|
-      z = a.zero?
-      n = a.nonzero?
-      if a == 0
-        assert_equal(true, z, "(#{a}).zero?")
-        assert_equal(nil, n, "(#{a}).nonzero?")
-      else
-        assert_equal(false, z, "(#{a}).zero?")
-        assert_equal(a, n, "(#{a}).nonzero?")
-        check_class(n)
-      end
-      assert(z ^ n, "(#{a}).zero? ^ (#{a}).nonzero?")
-    }
-  end
-
-  def test_even_odd
-    VS.each {|a|
-      e = a.even?
-      o = a.odd?
-      assert_equal((a % 2) == 0, e, "(#{a}).even?")
-      assert_equal((a % 2) == 1, o, "(#{a}).odd")
-      assert_equal((a & 1) == 0, e, "(#{a}).even?")
-      assert_equal((a & 1) == 1, o, "(#{a}).odd")
-      assert(e ^ o, "(#{a}).even? ^ (#{a}).odd?")
-    }
-  end
-
-  def test_to_s
-    2.upto(36) {|radix|
-      VS.each {|a|
-        s = a.to_s(radix)
-        b = s.to_i(radix)
-        assert_equal(a, b, "(#{a}).to_s(#{radix}).to_i(#{radix})")
-      }
-    }
-  end
-
-  def test_printf_x
-    VS.reverse_each {|a|
-      s = sprintf("%x", a)
-      if /\A\.\./ =~ s
-        b = -($'.tr('0123456789abcdef', 'fedcba9876543210').to_i(16) + 1)
-      else
-        b = s.to_i(16)
-      end
-      assert_equal(a, b, "sprintf('%x', #{a}) = #{s.inspect}")
-    }
-  end
-
-  def test_printf_x_sign
-    VS.reverse_each {|a|
-      s = sprintf("%+x", a)
-      b = s.to_i(16)
-      assert_equal(a, b, "sprintf('%+x', #{a}) = #{s.inspect}")
-      s = sprintf("% x", a)
-      b = s.to_i(16)
-      assert_equal(a, b, "sprintf('% x', #{a}) = #{s.inspect}")
-    }
-  end
-
-  def test_printf_o
-    VS.reverse_each {|a|
-      s = sprintf("%o", a)
-      if /\A\.\./ =~ s
-        b = -($'.tr('01234567', '76543210').to_i(8) + 1)
-      else
-        b = s.to_i(8)
-      end
-      assert_equal(a, b, "sprintf('%o', #{a}) = #{s.inspect}")
-    }
-  end
-
-  def test_printf_o_sign
-    VS.reverse_each {|a|
-      s = sprintf("%+o", a)
-      b = s.to_i(8)
-      assert_equal(a, b, "sprintf('%+o', #{a}) = #{s.inspect}")
-      s = sprintf("% o", a)
-      b = s.to_i(8)
-      assert_equal(a, b, "sprintf('% o', #{a}) = #{s.inspect}")
-    }
-  end
-
-  def test_printf_b
-    VS.reverse_each {|a|
-      s = sprintf("%b", a)
-      if /\A\.\./ =~ s
-        b = -($'.tr('01', '10').to_i(2) + 1)
-      else
-        b = s.to_i(2)
-      end
-      assert_equal(a, b, "sprintf('%b', #{a}) = #{s.inspect}")
-    }
-  end
-
-  def test_printf_b_sign
-    VS.reverse_each {|a|
-      s = sprintf("%+b", a)
-      b = s.to_i(2)
-      assert_equal(a, b, "sprintf('%+b', #{a}) = #{s.inspect}")
-      s = sprintf("% b", a)
-      b = s.to_i(2)
-      assert_equal(a, b, "sprintf('% b', #{a}) = #{s.inspect}")
-    }
-  end
-
-  def test_printf_diu
-    VS.reverse_each {|a|
-      s = sprintf("%d", a)
-      b = s.to_i
-      assert_equal(a, b, "sprintf('%d', #{a}) = #{s.inspect}")
-      s = sprintf("%i", a)
-      b = s.to_i
-      assert_equal(a, b, "sprintf('%i', #{a}) = #{s.inspect}")
-      s = sprintf("%u", a)
-      b = s.to_i
-      assert_equal(a, b, "sprintf('%u', #{a}) = #{s.inspect}")
-    }
-  end
-
-  def test_marshal
-    VS.reverse_each {|a|
-      s = Marshal.dump(a)
-      b = Marshal.load(s)
-      assert_equal(a, b, "Marshal.load(Marshal.dump(#{a}))")
-    }
-  end
-
-  def test_pack
-    %w[c C s S s! S! i I i! I! l L l! L! q Q n N v V].each {|template|
-      size = [0].pack(template).size
-      mask = (1 << (size * 8)) - 1
-      if /[A-Znv]/ =~ template
-        min = 0
-        max = (1 << (size * 8))-1
-      else
-        min = -(1 << (size * 8 - 1))
-        max = (1 << (size * 8 - 1)) - 1
-      end
-      VS.reverse_each {|a|
-        s = [a].pack(template)
-        b = s.unpack(template)[0]
-        assert_equal(a & mask, b & mask, "[#{a}].pack(#{template.dump}).unpack(#{template.dump}) & #{mask}")
-        if min <= a && a <= max
-          assert_equal(a, b, "[#{a}].pack(#{template.dump}).unpack(#{template.dump})")
-        end
-      }
-    }
-  end
-
-  def test_pack_ber
-    template = "w"
-    VS.reverse_each {|a|
-      if a < 0
-        assert_raise(ArgumentError) { [a].pack(template) }
-      else
-        s = [a].pack(template)
-        b = s.unpack(template)[0]
-        assert_equal(a, b, "[#{a}].pack(#{template.dump}).unpack(#{template.dump})")
-      end
-    }
-  end
-
-  def test_pack_utf8
-    template = "U"
-    VS.reverse_each {|a|
-      if a < 0 || 0x7fffffff < a
-        assert_raise(RangeError) { [a].pack(template) }
-      else
-        s = [a].pack(template)
-        b = s.unpack(template)[0]
-        assert_equal(a, b, "[#{a}].pack(#{template.dump}).unpack(#{template.dump})")
-      end
-    }
-  end
-
   def test_Integer
     assert_raise(ArgumentError) {Integer("0x-1")}
     assert_raise(ArgumentError) {Integer("-0x-1")}
Index: test/ruby/test_integer_comb.rb
===================================================================
--- test/ruby/test_integer_comb.rb	(revision 0)
+++ test/ruby/test_integer_comb.rb	(revision 16248)
@@ -0,0 +1,620 @@
+require 'test/unit'
+
+class TestIntegerComb < Test::Unit::TestCase
+  VS = [
+    -0x1000000000000000000000000000000000000000000000002,
+    -0x1000000000000000000000000000000000000000000000001,
+    -0x1000000000000000000000000000000000000000000000000,
+    -0xffffffffffffffffffffffffffffffffffffffffffffffff,
+    -0x1000000000000000000000002,
+    -0x1000000000000000000000001,
+    -0x1000000000000000000000000,
+    -0xffffffffffffffffffffffff,
+    -0x10000000000000002,
+    -0x10000000000000001,
+    -0x10000000000000000,
+    -0xffffffffffffffff,
+    -0x4000000000000002,
+    -0x4000000000000001,
+    -0x4000000000000000,
+    -0x3fffffffffffffff,
+    -0x100000002,
+    -0x100000001,
+    -0x100000000,
+    -0xffffffff,
+    -0xc717a08d, # 0xc717a08d * 0x524b2245 = 0x4000000000000001
+    -0x80000002,
+    -0x80000001,
+    -0x80000000,
+    -0x7fffffff,
+    -0x524b2245,
+    -0x40000002,
+    -0x40000001,
+    -0x40000000,
+    -0x3fffffff,
+    -0x10002,
+    -0x10001,
+    -0x10000,
+    -0xffff,
+    -0x8101, # 0x8101 * 0x7f01 = 0x40000001
+    -0x8002,
+    -0x8001,
+    -0x8000,
+    -0x7fff,
+    -0x7f01,
+    -65,
+    -64,
+    -63,
+    -62,
+    -33,
+    -32,
+    -31,
+    -30,
+    -3,
+    -2,
+    -1,
+    0,
+    1,
+    2,
+    3,
+    30,
+    31,
+    32,
+    33,
+    62,
+    63,
+    64,
+    65,
+    0x7f01,
+    0x7ffe,
+    0x7fff,
+    0x8000,
+    0x8001,
+    0x8101,
+    0xfffe,
+    0xffff,
+    0x10000,
+    0x10001,
+    0x3ffffffe,
+    0x3fffffff,
+    0x40000000,
+    0x40000001,
+    0x524b2245,
+    0x7ffffffe,
+    0x7fffffff,
+    0x80000000,
+    0x80000001,
+    0xc717a08d,
+    0xfffffffe,
+    0xffffffff,
+    0x100000000,
+    0x100000001,
+    0x3ffffffffffffffe,
+    0x3fffffffffffffff,
+    0x4000000000000000,
+    0x4000000000000001,
+    0xfffffffffffffffe,
+    0xffffffffffffffff,
+    0x10000000000000000,
+    0x10000000000000001,
+    0xffffffffffffffffffffffff,
+    0x1000000000000000000000000,
+    0x1000000000000000000000001,
+    0xffffffffffffffffffffffffffffffffffffffffffffffff,
+    0x1000000000000000000000000000000000000000000000000,
+    0x1000000000000000000000000000000000000000000000001
+  ]
+
+  #VS.map! {|v| 0x4000000000000000.coerce(v)[0] }
+
+  min = -1
+  min *= 2 while min.class == Fixnum
+  FIXNUM_MIN = min/2
+  max = 1
+  max *= 2 while (max-1).class == Fixnum
+  FIXNUM_MAX = max/2-1
+
+  def test_fixnum_range
+    assert_instance_of(Bignum, FIXNUM_MIN-1)
+    assert_instance_of(Fixnum, FIXNUM_MIN)
+    assert_instance_of(Fixnum, FIXNUM_MAX)
+    assert_instance_of(Bignum, FIXNUM_MAX+1)
+  end
+
+  def check_class(n)
+    if FIXNUM_MIN <= n && n <= FIXNUM_MAX
+      assert_instance_of(Fixnum, n)
+    else
+      assert_instance_of(Bignum, n)
+    end
+  end
+
+  def test_aref
+    VS.each {|a|
+      100.times {|i|
+        assert_equal((a >> i).odd? ? 1 : 0, a[i], "(#{a})[#{i}]")
+      }
+    }
+    VS.each {|a|
+      VS.each {|b|
+        c = nil
+        assert_nothing_raised("(#{a})[#{b}]") { c = a[b] }
+        check_class(c)
+        if b < 0
+          assert_equal(0, c, "(#{a})[#{b}]")
+        else
+          assert_equal((a >> b).odd? ? 1 : 0, c, "(#{a})[#{b}]")
+        end
+      }
+    }
+  end
+
+  def test_plus
+    VS.each {|a|
+      VS.each {|b|
+        c = a + b
+        check_class(c)
+        assert_equal(b + a, c, "#{a} + #{b}")
+        assert_equal(a, c - b, "(#{a} + #{b}) - #{b}")
+        assert_equal(a-~b-1, c, "#{a} + #{b}") # Hacker's Delight
+        assert_equal((a^b)+2*(a&b), c, "#{a} + #{b}") # Hacker's Delight
+        assert_equal((a|b)+(a&b), c, "#{a} + #{b}") # Hacker's Delight
+        assert_equal(2*(a|b)-(a^b), c, "#{a} + #{b}") # Hacker's Delight
+      }
+    }
+  end
+
+  def test_minus
+    VS.each {|a|
+      VS.each {|b|
+        c = a - b
+        check_class(c)
+        assert_equal(a, c + b, "(#{a} - #{b}) + #{b}")
+        assert_equal(-b, c - a, "(#{a} - #{b}) - #{a}")
+        assert_equal(a+~b+1, c, "#{a} - #{b}") # Hacker's Delight
+        assert_equal((a^b)-2*(b&~a), c, "#{a} - #{b}") # Hacker's Delight
+        assert_equal((a&~b)-(b&~a), c, "#{a} - #{b}") # Hacker's Delight
+        assert_equal(2*(a&~b)-(a^b), c, "#{a} - #{b}") # Hacker's Delight
+      }
+    }
+  end
+
+  def test_mult
+    VS.each {|a|
+      VS.each {|b|
+        c = a * b
+        check_class(c)
+        assert_equal(b * a, c, "#{a} * #{b}")
+        assert_equal(b, c / a, "(#{a} * #{b}) / #{a}") if a != 0
+        assert_equal(a.abs * b.abs, (a * b).abs, "(#{a} * #{b}).abs")
+        assert_equal((a-100)*(b-100)+(a-100)*100+(b-100)*100+10000, c, "#{a} * #{b}")
+        assert_equal((a+100)*(b+100)-(a+100)*100-(b+100)*100+10000, c, "#{a} * #{b}")
+      }
+    }
+  end
+
+  def test_divmod
+    VS.each {|a|
+      VS.each {|b|
+        if b == 0
+          assert_raise(ZeroDivisionError) { a.divmod(b) }
+        else
+          q, r = a.divmod(b)
+          check_class(q)
+          check_class(r)
+          assert_equal(a, b*q+r)
+          assert(r.abs < b.abs)
+          assert(0 < b ? (0 <= r && r < b) : (b < r && r <= 0))
+          assert_equal(q, a/b)
+          assert_equal(q, a.div(b))
+          assert_equal(r, a%b)
+          assert_equal(r, a.modulo(b))
+        end
+      }
+    }
+  end
+
+  def test_pow
+    small_values = VS.find_all {|v| 0 <= v && v < 1000 }
+    VS.each {|a|
+      small_values.each {|b|
+        c = a ** b
+        check_class(c)
+        d = 1
+        b.times { d *= a }
+        assert_equal(d, c, "(#{a}) ** #{b}")
+        if a != 0
+          d = c
+          b.times { d /= a }
+          assert_equal(1, d, "((#{a}) ** #{b}) / #{a} / ...(#{b} times)...")
+        end
+      }
+    }
+  end
+
+  def test_not
+    VS.each {|a|
+      b = ~a
+      check_class(b)
+      assert_equal(-1 ^ a, b, "~#{a}")
+      assert_equal(-a-1, b, "~#{a}") # Hacker's Delight
+      assert_equal(0, a & b, "#{a} & ~#{a}")
+      assert_equal(-1, a | b, "#{a} | ~#{a}")
+    }
+  end
+
+  def test_or
+    VS.each {|a|
+      VS.each {|b|
+        c = a | b
+        check_class(c)
+        assert_equal(b | a, c, "#{a} | #{b}")
+        assert_equal(a + b - (a&b), c, "#{a} | #{b}")
+        assert_equal((a & ~b) + b, c, "#{a} | #{b}") # Hacker's Delight
+        assert_equal(-1, c | ~a, "(#{a} | #{b}) | ~#{a})")
+      }
+    }
+  end
+
+  def test_and
+    VS.each {|a|
+      VS.each {|b|
+        c = a & b
+        check_class(c)
+        assert_equal(b & a, c, "#{a} & #{b}")
+        assert_equal(a + b - (a|b), c, "#{a} & #{b}")
+        assert_equal((~a | b) - ~a, c, "#{a} & #{b}") # Hacker's Delight
+        assert_equal(0, c & ~a, "(#{a} & #{b}) & ~#{a}")
+      }
+    }
+  end
+
+  def test_xor
+    VS.each {|a|
+      VS.each {|b|
+        c = a ^ b
+        check_class(c)
+        assert_equal(b ^ a, c, "#{a} ^ #{b}")
+        assert_equal((a|b)-(a&b), c, "#{a} ^ #{b}") # Hacker's Delight
+        assert_equal(b, c ^ a, "(#{a} ^ #{b}) ^ #{a}")
+      }
+    }
+  end
+
+  def test_lshift
+    small_values = VS.find_all {|v| v < 8000 }
+    VS.each {|a|
+      small_values.each {|b|
+        c = a << b
+        check_class(c)
+        if 0 <= b
+          assert_equal(a, c >> b, "(#{a} << #{b}) >> #{b}")
+          assert_equal(a * 2**b, c, "#{a} << #{b}")
+        end
+        0.upto(c.size*8+10) {|nth|
+          assert_equal(a[nth-b], c[nth], "(#{a} << #{b})[#{nth}]")
+        }
+      }
+    }
+  end
+
+  def test_rshift
+    small_values = VS.find_all {|v| -8000 < v }
+    VS.each {|a|
+      small_values.each {|b|
+        c = a >> b
+        check_class(c)
+        if b <= 0
+          assert_equal(a, c << b, "(#{a} >> #{b}) << #{b}")
+          assert_equal(a * 2**(-b), c, "#{a} >> #{b}")
+        end
+        0.upto(c.size*8+10) {|nth|
+          assert_equal(a[nth+b], c[nth], "(#{a} >> #{b})[#{nth}]")
+        }
+      }
+    }
+  end
+
+  def test_succ
+    VS.each {|a|
+      b = a.succ
+      check_class(b)
+      assert_equal(a+1, b, "(#{a}).succ")
+      assert_equal(a, b.pred, "(#{a}).succ.pred")
+      assert_equal(a, b-1, "(#{a}).succ - 1")
+    }
+  end
+
+  def test_pred
+    VS.each {|a|
+      b = a.pred
+      check_class(b)
+      assert_equal(a-1, b, "(#{a}).pred")
+      assert_equal(a, b.succ, "(#{a}).pred.succ")
+      assert_equal(a, b + 1, "(#{a}).pred + 1")
+    }
+  end
+
+  def test_unary_plus
+    VS.each {|a|
+      b = +a
+      check_class(b)
+      assert_equal(a, b, "+(#{a})")
+    }
+  end
+
+  def test_unary_minus
+    VS.each {|a|
+      b = -a
+      check_class(b)
+      assert_equal(0-a, b, "-(#{a})")
+      assert_equal(~a+1, b, "-(#{a})")
+      assert_equal(0, a+b, "#{a}+(-(#{a}))")
+    }
+  end
+
+  def test_cmp
+    VS.each_with_index {|a, i|
+      VS.each_with_index {|b, j|
+        assert_equal(i <=> j, a <=> b, "#{a} <=> #{b}")
+        assert_equal(i < j, a < b, "#{a} < #{b}")
+        assert_equal(i <= j, a <= b, "#{a} <= #{b}")
+        assert_equal(i > j, a > b, "#{a} > #{b}")
+        assert_equal(i >= j, a >= b, "#{a} >= #{b}")
+      }
+    }
+  end
+
+  def test_eq
+    VS.each_with_index {|a, i|
+      VS.each_with_index {|b, j|
+        c = a == b
+        assert_equal(b == a, c, "#{a} == #{b}")
+        assert_equal(i == j, c, "#{a} == #{b}")
+      }
+    }
+  end
+
+  def test_abs
+    VS.each {|a|
+      b = a.abs
+      check_class(b)
+      if a < 0
+        assert_equal(-a, b, "(#{a}).abs")
+      else
+        assert_equal(a, b, "(#{a}).abs")
+      end
+    }
+  end
+
+  def test_ceil
+    VS.each {|a|
+      b = a.ceil
+      check_class(b)
+      assert_equal(a, b, "(#{a}).ceil")
+    }
+  end
+
+  def test_floor
+    VS.each {|a|
+      b = a.floor
+      check_class(b)
+      assert_equal(a, b, "(#{a}).floor")
+    }
+  end
+
+  def test_round
+    VS.each {|a|
+      b = a.round
+      check_class(b)
+      assert_equal(a, b, "(#{a}).round")
+    }
+  end
+
+  def test_truncate
+    VS.each {|a|
+      b = a.truncate
+      check_class(b)
+      assert_equal(a, b, "(#{a}).truncate")
+    }
+  end
+
+  def test_remainder
+    VS.each {|a|
+      VS.each {|b|
+        if b == 0
+          assert_raise(ZeroDivisionError) { a.divmod(b) }
+        else
+          r = a.remainder(b)
+          check_class(r)
+          if a < 0
+            assert_operator(-b.abs, :<, r, "#{a}.remainder(#{b})")
+            assert_operator(0, :>=, r, "#{a}.remainder(#{b})")
+          elsif 0 < a
+            assert_operator(0, :<=, r, "#{a}.remainder(#{b})")
+            assert_operator(b.abs, :>, r, "#{a}.remainder(#{b})")
+          else
+            assert_equal(0, r, "#{a}.remainder(#{b})")
+          end
+        end
+      }
+    }
+  end
+
+  def test_zero_nonzero
+    VS.each {|a|
+      z = a.zero?
+      n = a.nonzero?
+      if a == 0
+        assert_equal(true, z, "(#{a}).zero?")
+        assert_equal(nil, n, "(#{a}).nonzero?")
+      else
+        assert_equal(false, z, "(#{a}).zero?")
+        assert_equal(a, n, "(#{a}).nonzero?")
+        check_class(n)
+      end
+      assert(z ^ n, "(#{a}).zero? ^ (#{a}).nonzero?")
+    }
+  end
+
+  def test_even_odd
+    VS.each {|a|
+      e = a.even?
+      o = a.odd?
+      assert_equal((a % 2) == 0, e, "(#{a}).even?")
+      assert_equal((a % 2) == 1, o, "(#{a}).odd")
+      assert_equal((a & 1) == 0, e, "(#{a}).even?")
+      assert_equal((a & 1) == 1, o, "(#{a}).odd")
+      assert(e ^ o, "(#{a}).even? ^ (#{a}).odd?")
+    }
+  end
+
+  def test_to_s
+    2.upto(36) {|radix|
+      VS.each {|a|
+        s = a.to_s(radix)
+        b = s.to_i(radix)
+        assert_equal(a, b, "(#{a}).to_s(#{radix}).to_i(#{radix})")
+      }
+    }
+  end
+
+  def test_printf_x
+    VS.reverse_each {|a|
+      s = sprintf("%x", a)
+      if /\A\.\./ =~ s
+        b = -($'.tr('0123456789abcdef', 'fedcba9876543210').to_i(16) + 1)
+      else
+        b = s.to_i(16)
+      end
+      assert_equal(a, b, "sprintf('%x', #{a}) = #{s.inspect}")
+    }
+  end
+
+  def test_printf_x_sign
+    VS.reverse_each {|a|
+      s = sprintf("%+x", a)
+      b = s.to_i(16)
+      assert_equal(a, b, "sprintf('%+x', #{a}) = #{s.inspect}")
+      s = sprintf("% x", a)
+      b = s.to_i(16)
+      assert_equal(a, b, "sprintf('% x', #{a}) = #{s.inspect}")
+    }
+  end
+
+  def test_printf_o
+    VS.reverse_each {|a|
+      s = sprintf("%o", a)
+      if /\A\.\./ =~ s
+        b = -($'.tr('01234567', '76543210').to_i(8) + 1)
+      else
+        b = s.to_i(8)
+      end
+      assert_equal(a, b, "sprintf('%o', #{a}) = #{s.inspect}")
+    }
+  end
+
+  def test_printf_o_sign
+    VS.reverse_each {|a|
+      s = sprintf("%+o", a)
+      b = s.to_i(8)
+      assert_equal(a, b, "sprintf('%+o', #{a}) = #{s.inspect}")
+      s = sprintf("% o", a)
+      b = s.to_i(8)
+      assert_equal(a, b, "sprintf('% o', #{a}) = #{s.inspect}")
+    }
+  end
+
+  def test_printf_b
+    VS.reverse_each {|a|
+      s = sprintf("%b", a)
+      if /\A\.\./ =~ s
+        b = -($'.tr('01', '10').to_i(2) + 1)
+      else
+        b = s.to_i(2)
+      end
+      assert_equal(a, b, "sprintf('%b', #{a}) = #{s.inspect}")
+    }
+  end
+
+  def test_printf_b_sign
+    VS.reverse_each {|a|
+      s = sprintf("%+b", a)
+      b = s.to_i(2)
+      assert_equal(a, b, "sprintf('%+b', #{a}) = #{s.inspect}")
+      s = sprintf("% b", a)
+      b = s.to_i(2)
+      assert_equal(a, b, "sprintf('% b', #{a}) = #{s.inspect}")
+    }
+  end
+
+  def test_printf_diu
+    VS.reverse_each {|a|
+      s = sprintf("%d", a)
+      b = s.to_i
+      assert_equal(a, b, "sprintf('%d', #{a}) = #{s.inspect}")
+      s = sprintf("%i", a)
+      b = s.to_i
+      assert_equal(a, b, "sprintf('%i', #{a}) = #{s.inspect}")
+      s = sprintf("%u", a)
+      b = s.to_i
+      assert_equal(a, b, "sprintf('%u', #{a}) = #{s.inspect}")
+    }
+  end
+
+  def test_marshal
+    VS.reverse_each {|a|
+      s = Marshal.dump(a)
+      b = Marshal.load(s)
+      assert_equal(a, b, "Marshal.load(Marshal.dump(#{a}))")
+    }
+  end
+
+  def test_pack
+    %w[c C s S s! S! i I i! I! l L l! L! q Q n N v V].each {|template|
+      size = [0].pack(template).size
+      mask = (1 << (size * 8)) - 1
+      if /[A-Znv]/ =~ template
+        min = 0
+        max = (1 << (size * 8))-1
+      else
+        min = -(1 << (size * 8 - 1))
+        max = (1 << (size * 8 - 1)) - 1
+      end
+      VS.reverse_each {|a|
+        s = [a].pack(template)
+        b = s.unpack(template)[0]
+        assert_equal(a & mask, b & mask, "[#{a}].pack(#{template.dump}).unpack(#{template.dump}) & #{mask}")
+        if min <= a && a <= max
+          assert_equal(a, b, "[#{a}].pack(#{template.dump}).unpack(#{template.dump})")
+        end
+      }
+    }
+  end
+
+  def test_pack_ber
+    template = "w"
+    VS.reverse_each {|a|
+      if a < 0
+        assert_raise(ArgumentError) { [a].pack(template) }
+      else
+        s = [a].pack(template)
+        b = s.unpack(template)[0]
+        assert_equal(a, b, "[#{a}].pack(#{template.dump}).unpack(#{template.dump})")
+      end
+    }
+  end
+
+  def test_pack_utf8
+    template = "U"
+    VS.reverse_each {|a|
+      if a < 0 || 0x7fffffff < a
+        assert_raise(RangeError) { [a].pack(template) }
+      else
+        s = [a].pack(template)
+        b = s.unpack(template)[0]
+        assert_equal(a, b, "[#{a}].pack(#{template.dump}).unpack(#{template.dump})")
+      end
+    }
+  end
+end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]