summaryrefslogtreecommitdiff
path: root/test/ruby/test_bignum.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/ruby/test_bignum.rb')
-rw-r--r--test/ruby/test_bignum.rb115
1 files changed, 88 insertions, 27 deletions
diff --git a/test/ruby/test_bignum.rb b/test/ruby/test_bignum.rb
index a240c8e8af..c366f794b2 100644
--- a/test/ruby/test_bignum.rb
+++ b/test/ruby/test_bignum.rb
@@ -19,19 +19,19 @@ class TestBignum < Test::Unit::TestCase
end
BIGNUM_MIN_BITS = n
- T_ZERO = 0.to_bignum
- T_ONE = 1.to_bignum
- T_MONE = (-1).to_bignum
- T31 = (2**31).to_bignum # 2147483648
- T31P = (T31 - 1).to_bignum # 2147483647
- T32 = (2**32).to_bignum # 4294967296
- T32P = (T32 - 1).to_bignum # 4294967295
- T64 = (2**64).to_bignum # 18446744073709551616
- T64P = (T64 - 1).to_bignum # 18446744073709551615
- T128 = (2**128).to_bignum
- T128P = (T128 - 1).to_bignum
- T1024 = (2**1024).to_bignum
- T1024P = (T1024 - 1).to_bignum
+ T_ZERO = Bug::Integer.to_bignum(0)
+ T_ONE = Bug::Integer.to_bignum(1)
+ T_MONE = Bug::Integer.to_bignum(-1)
+ T31 = Bug::Integer.to_bignum(2**31) # 2147483648
+ T31P = Bug::Integer.to_bignum(T31 - 1) # 2147483647
+ T32 = Bug::Integer.to_bignum(2**32) # 4294967296
+ T32P = Bug::Integer.to_bignum(T32 - 1) # 4294967295
+ T64 = Bug::Integer.to_bignum(2**64) # 18446744073709551616
+ T64P = Bug::Integer.to_bignum(T64 - 1) # 18446744073709551615
+ T128 = Bug::Integer.to_bignum(2**128)
+ T128P = Bug::Integer.to_bignum(T128 - 1)
+ T1024 = Bug::Integer.to_bignum(2**1024)
+ T1024P = Bug::Integer.to_bignum(T1024 - 1)
def setup
@verbose = $VERBOSE
@@ -203,6 +203,15 @@ class TestBignum < Test::Unit::TestCase
assert_equal(00_02, '00_02'.to_i)
end
+ def test_very_big_str_to_inum
+ assert_separately([], "#{<<~"begin;"}\n#{<<~'end;'}")
+ begin;
+ digits = [["3", 700], ["0", 2700], ["1", 1], ["0", 26599]]
+ num = digits.inject(+"") {|s,(c,n)|s << c*n}.to_i
+ assert_equal digits.sum {|c,n|n}, num.to_s.size
+ end;
+ end
+
def test_to_s2
assert_raise(ArgumentError) { T31P.to_s(37) }
assert_equal("9" * 32768, (10**32768-1).to_s)
@@ -467,8 +476,8 @@ class TestBignum < Test::Unit::TestCase
def test_pow
assert_equal(1.0, T32 ** 0.0)
assert_equal(1.0 / T32, T32 ** -1)
- assert_equal(1, assert_warning(/may be too big/) {T32 ** T32}.infinite?)
- assert_equal(1, assert_warning(/may be too big/) {T32 ** (2**30-1)}.infinite?)
+ assert_raise(ArgumentError) { T32 ** T32 }
+ assert_raise(ArgumentError) { T32 ** (2**30-1) }
### rational changes the behavior of Bignum#**
#assert_raise(TypeError) { T32**"foo" }
@@ -596,6 +605,49 @@ class TestBignum < Test::Unit::TestCase
assert_equal(1, (-2**(BIGNUM_MIN_BITS*4))[BIGNUM_MIN_BITS*4])
end
+ def test_aref2
+ x = (0x123456789abcdef << (BIGNUM_MIN_BITS + 32)) | 0x12345678
+ assert_equal(x, x[0, x.bit_length])
+ assert_equal(x >> 10, x[10, x.bit_length])
+ assert_equal(0x45678, x[0, 20])
+ assert_equal(0x6780, x[-4, 16])
+ assert_equal(0x123456, x[x.bit_length - 21, 40])
+ assert_equal(0x6789ab, x[x.bit_length - 41, 24])
+ assert_equal(0, x[-20, 10])
+ assert_equal(0, x[x.bit_length + 10, 10])
+
+ assert_equal(0, x[5, 0])
+ assert_equal(0, (-x)[5, 0])
+
+ assert_equal(x >> 5, x[5, -1])
+ assert_equal(x << 5, x[-5, -1])
+ assert_equal((-x) >> 5, (-x)[5, -1])
+ assert_equal((-x) << 5, (-x)[-5, -1])
+
+ assert_equal(x << 5, x[-5, FIXNUM_MAX])
+ assert_equal(x >> 5, x[5, FIXNUM_MAX])
+ assert_equal(0, x[FIXNUM_MIN, 100])
+ assert_equal(0, (-x)[FIXNUM_MIN, 100])
+
+ y = (x << 160) | 0x1234_0000_0000_0000_1234_0000_0000_0000
+ assert_equal(0xffffedcc00, (-y)[40, 40])
+ assert_equal(0xfffffffedc, (-y)[52, 40])
+ assert_equal(0xffffedcbff, (-y)[104, 40])
+ assert_equal(0xfffff6e5d4, (-y)[y.bit_length - 20, 40])
+ assert_equal(0, (-y)[-20, 10])
+ assert_equal(0xfff, (-y)[y.bit_length + 10, 12])
+
+ z = (1 << (BIGNUM_MIN_BITS * 2)) - 1
+ assert_equal(0x400, (-z)[-10, 20])
+ assert_equal(1, (-z)[0, 20])
+ assert_equal(0, (-z)[10, 20])
+ assert_equal(1, (-z)[0, z.bit_length])
+ assert_equal(0, (-z)[z.bit_length - 10, 10])
+ assert_equal(0x400, (-z)[z.bit_length - 10, 11])
+ assert_equal(0xfff, (-z)[z.bit_length, 12])
+ assert_equal(0xfff00, (-z)[z.bit_length - 8, 20])
+ end
+
def test_hash
assert_nothing_raised { T31P.hash }
end
@@ -632,7 +684,7 @@ class TestBignum < Test::Unit::TestCase
time = Time.now
end_flag = false
num = (65536 ** 65536)
- q = Queue.new
+ q = Thread::Queue.new
thread = Thread.new do
assert_raise(RuntimeError) {
q << true
@@ -644,7 +696,7 @@ class TestBignum < Test::Unit::TestCase
thread.raise
thread.join
time = Time.now - time
- skip "too fast cpu" if end_flag
+ omit "too fast cpu" if end_flag
assert_operator(time, :<, 10)
end
@@ -675,14 +727,14 @@ class TestBignum < Test::Unit::TestCase
return
end
end
- skip "cannot create suitable test case"
+ omit "cannot create suitable test case"
ensure
Signal.trap(:INT, oldtrap) if oldtrap
end
end
def test_too_big_to_s
- if (big = 2**31-1).fixnum?
+ if Bug::Integer.fixnum?(big = 2**31-1)
return
end
assert_raise_with_message(RangeError, /too big to convert/) {(1 << big).to_s}
@@ -765,10 +817,13 @@ class TestBignum < Test::Unit::TestCase
end
def test_digits
- assert_equal([90, 78, 56, 34, 12], 1234567890.to_bignum.digits(100))
+ assert_equal([90, 78, 56, 34, 12], Bug::Integer.to_bignum(1234567890).digits(100))
assert_equal([7215, 2413, 6242], T1024P.digits(10_000).first(3))
assert_equal([11], 11.digits(T1024P))
assert_equal([T1024P - 1, 1], (T1024P + T1024P - 1).digits(T1024P))
+ bug21680 = '[ruby-core:123769] [Bug #21680]'
+ assert_equal([0] * 64 + [1], (2**512).digits(256), bug21680)
+ assert_equal([0] * 128 + [1], (123**128).digits(123), bug21680)
end
def test_digits_for_negative_numbers
@@ -778,13 +833,13 @@ class TestBignum < Test::Unit::TestCase
end
def test_digits_for_invalid_base_numbers
- assert_raise(ArgumentError) { T1024P.to_bignum.digits(0) }
- assert_raise(ArgumentError) { T1024P.to_bignum.digits(-1) }
- assert_raise(ArgumentError) { T1024P.to_bignum.digits(0.to_bignum) }
- assert_raise(ArgumentError) { T1024P.to_bignum.digits(1.to_bignum) }
- assert_raise(ArgumentError) { T1024P.to_bignum.digits(-T1024P) }
- assert_raise(ArgumentError) { 10.digits(0.to_bignum) }
- assert_raise(ArgumentError) { 10.digits(1.to_bignum) }
+ assert_raise(ArgumentError) { Bug::Integer.to_bignum(T1024P).digits(0) }
+ assert_raise(ArgumentError) { Bug::Integer.to_bignum(T1024P).digits(-1) }
+ assert_raise(ArgumentError) { Bug::Integer.to_bignum(T1024P).digits(Bug::Integer.to_bignum(0)) }
+ assert_raise(ArgumentError) { Bug::Integer.to_bignum(T1024P).digits(Bug::Integer.to_bignum(1)) }
+ assert_raise(ArgumentError) { Bug::Integer.to_bignum(T1024P).digits(-T1024P) }
+ assert_raise(ArgumentError) { 10.digits(Bug::Integer.to_bignum(0)) }
+ assert_raise(ArgumentError) { 10.digits(Bug::Integer.to_bignum(1)) }
end
def test_digits_for_non_integral_base_numbers
@@ -812,5 +867,11 @@ class TestBignum < Test::Unit::TestCase
assert_nil(T1024P.infinite?)
assert_nil((-T1024P).infinite?)
end
+
+ def test_gmp_version
+ if RbConfig::CONFIG.fetch('configure_args').include?("'--with-gmp'")
+ assert_kind_of(String, Integer::GMP_VERSION)
+ end
+ end if ENV['GITHUB_WORKFLOW'] == 'Compilations'
end
end