1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/spec/ruby/optional/capi/integer_spec.rb
2020-06-27 15:51:37 +02:00

290 lines
11 KiB
Ruby

# -*- encoding: binary -*-
require_relative 'spec_helper'
load_extension("integer")
describe "CApiIntegerSpecs" do
before :each do
@s = CApiIntegerSpecs.new
end
describe "rb_integer_pack" do
it "converts zero" do
words = "\000" * 9
result = @s.rb_integer_pack(0, words, 1, 9, 0,
CApiIntegerSpecs::BIG_ENDIAN|CApiIntegerSpecs::PACK_2COMP)
result.should == 0
words.should == "\x00\x00\x00\x00\x00\x00\x00\x00\x00"
end
describe "without two's complement flag" do
before :each do
@value = 0x9876_abcd_4532_ef01_0123_4567_89ab_cdef
@words = "\000" * 16
end
describe "with big endian output" do
it "converts a positive number" do
result = @s.rb_integer_pack(@value, @words, 2, 8, 0,
CApiIntegerSpecs::BIG_ENDIAN)
result.should == 1
@words.should == "\x98\x76\xAB\xCD\x45\x32\xEF\x01\x01\x23\x45\x67\x89\xAB\xCD\xEF"
end
it "converts a negative number" do
result = @s.rb_integer_pack(-@value, @words, 2, 8, 0,
CApiIntegerSpecs::BIG_ENDIAN)
result.should == -1
@words.should == "\x98\x76\xAB\xCD\x45\x32\xEF\x01\x01\x23\x45\x67\x89\xAB\xCD\xEF"
end
it "converts a negative number exactly -2**(numwords*wordsize*8)" do
result = @s.rb_integer_pack(-2**(2*8*8), @words, 2, 8, 0,
CApiIntegerSpecs::BIG_ENDIAN)
result.should == -2
@words.should == "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
end
end
describe "with little endian output" do
it "converts a positive number" do
result = @s.rb_integer_pack(@value, @words, 2, 8, 0,
CApiIntegerSpecs::LITTLE_ENDIAN)
result.should == 1
@words.should == "\xEF\xCD\xAB\x89\x67\x45\x23\x01\x01\xEF\x32\x45\xCD\xAB\x76\x98"
end
it "converts a negative number" do
result = @s.rb_integer_pack(-@value, @words, 2, 8, 0,
CApiIntegerSpecs::LITTLE_ENDIAN)
result.should == -1
@words.should == "\xEF\xCD\xAB\x89\x67\x45\x23\x01\x01\xEF\x32\x45\xCD\xAB\x76\x98"
end
it "converts a negative number exactly -2**(numwords*wordsize*8)" do
result = @s.rb_integer_pack(-2**(2*8*8), @words, 2, 8, 0,
CApiIntegerSpecs::LITTLE_ENDIAN)
result.should == -2
@words.should == "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
end
end
end
describe "with two's complement flag" do
describe "with input less than 64 bits" do
before :each do
@value = 0x0123_4567_89ab_cdef
@words = "\000" * 8
end
describe "with big endian output" do
it "converts a positive number" do
result = @s.rb_integer_pack(@value, @words, 1, 8, 0,
CApiIntegerSpecs::BIG_ENDIAN|CApiIntegerSpecs::PACK_2COMP)
result.should == 1
@words.should == "\x01\x23\x45\x67\x89\xAB\xCD\xEF"
end
it "converts a negative number" do
result = @s.rb_integer_pack(-@value, @words, 1, 8, 0,
CApiIntegerSpecs::BIG_ENDIAN|CApiIntegerSpecs::PACK_2COMP)
result.should == -1
@words.should == "\xFE\xDC\xBA\x98\x76\x54\x32\x11"
end
end
describe "with little endian output" do
it "converts a positive number" do
result = @s.rb_integer_pack(@value, @words, 1, 8, 0,
CApiIntegerSpecs::LITTLE_ENDIAN|CApiIntegerSpecs::PACK_2COMP)
result.should == 1
@words.should == "\xEF\xCD\xAB\x89\x67\x45\x23\x01"
end
it "converts a negative number" do
result = @s.rb_integer_pack(-@value, @words, 1, 8, 0,
CApiIntegerSpecs::LITTLE_ENDIAN|CApiIntegerSpecs::PACK_2COMP)
result.should == -1
@words.should == "\x11\x32\x54\x76\x98\xBA\xDC\xFE"
end
end
describe "with native endian output" do
big_endian do
it "converts a positive number" do
result = @s.rb_integer_pack(@value, @words, 1, 8, 0,
CApiIntegerSpecs::NATIVE|CApiIntegerSpecs::PACK_2COMP)
result.should == 1
@words.should == "\x01\x23\x45\x67\x89\xAB\xCD\xEF"
end
it "converts a negative number" do
result = @s.rb_integer_pack(-@value, @words, 1, 8, 0,
CApiIntegerSpecs::NATIVE|CApiIntegerSpecs::PACK_2COMP)
result.should == -1
@words.should == "\xFE\xDC\xBA\x98\x76\x54\x32\x11"
end
end
little_endian do
it "converts a positive number" do
result = @s.rb_integer_pack(@value, @words, 1, 8, 0,
CApiIntegerSpecs::NATIVE|CApiIntegerSpecs::PACK_2COMP)
result.should == 1
@words.should == "\xEF\xCD\xAB\x89\x67\x45\x23\x01"
end
it "converts a negative number" do
result = @s.rb_integer_pack(-@value, @words, 1, 8, 0,
CApiIntegerSpecs::NATIVE|CApiIntegerSpecs::PACK_2COMP)
result.should == -1
@words.should == "\x11\x32\x54\x76\x98\xBA\xDC\xFE"
end
end
end
end
describe "with input greater than 64 bits" do
before :each do
@value = 0x9876_abcd_4532_ef01_0123_4567_89ab_cdef
@words = "\000" * 16
end
describe "with big endian output" do
it "converts a positive number" do
result = @s.rb_integer_pack(@value, @words, 2, 8, 0,
CApiIntegerSpecs::BIG_ENDIAN|CApiIntegerSpecs::PACK_2COMP)
result.should == 1
@words.should == "\x98\x76\xAB\xCD\x45\x32\xEF\x01\x01\x23\x45\x67\x89\xAB\xCD\xEF"
end
it "converts a negative number" do
result = @s.rb_integer_pack(-@value, @words, 2, 8, 0,
CApiIntegerSpecs::BIG_ENDIAN|CApiIntegerSpecs::PACK_2COMP)
result.should == -1
@words.should == "\x67\x89\x54\x32\xBA\xCD\x10\xFE\xFE\xDC\xBA\x98\x76\x54\x32\x11"
end
describe "with overflow" do
before :each do
@words = "\000" * 9
end
it "converts a positive number" do
result = @s.rb_integer_pack(@value, @words, 1, 9, 0,
CApiIntegerSpecs::BIG_ENDIAN|CApiIntegerSpecs::PACK_2COMP)
result.should == 2
@words.should == "\x01\x01\x23\x45\x67\x89\xAB\xCD\xEF"
end
it "converts a negative number" do
result = @s.rb_integer_pack(-@value, @words, 1, 9, 0,
CApiIntegerSpecs::BIG_ENDIAN|CApiIntegerSpecs::PACK_2COMP)
result.should == -2
@words.should == "\xFE\xFE\xDC\xBA\x98\x76\x54\x32\x11"
end
it "converts a negative number exactly -2**(numwords*wordsize*8)" do
result = @s.rb_integer_pack(-2**(9*8), @words, 1, 9, 0,
CApiIntegerSpecs::BIG_ENDIAN|CApiIntegerSpecs::PACK_2COMP)
result.should == -1
@words.should == "\x00\x00\x00\x00\x00\x00\x00\x00\x00"
end
end
end
describe "with little endian output" do
it "converts a positive number" do
result = @s.rb_integer_pack(@value, @words, 2, 8, 0,
CApiIntegerSpecs::LITTLE_ENDIAN|CApiIntegerSpecs::PACK_2COMP)
result.should == 1
@words.should == "\xEF\xCD\xAB\x89\x67\x45\x23\x01\x01\xEF\x32\x45\xCD\xAB\x76\x98"
end
it "converts a negative number" do
result = @s.rb_integer_pack(-@value, @words, 2, 8, 0,
CApiIntegerSpecs::LITTLE_ENDIAN|CApiIntegerSpecs::PACK_2COMP)
result.should == -1
@words.should == "\x11\x32\x54\x76\x98\xBA\xDC\xFE\xFE\x10\xCD\xBA\x32\x54\x89\x67"
end
describe "with overflow" do
before :each do
@words = "\000" * 9
end
it "converts a positive number" do
result = @s.rb_integer_pack(@value, @words, 1, 9, 0,
CApiIntegerSpecs::LITTLE_ENDIAN|CApiIntegerSpecs::PACK_2COMP)
result.should == 2
@words.should == "\xEF\xCD\xAB\x89\x67\x45\x23\x01\x01"
end
it "converts a negative number" do
result = @s.rb_integer_pack(-@value, @words, 1, 9, 0,
CApiIntegerSpecs::LITTLE_ENDIAN|CApiIntegerSpecs::PACK_2COMP)
result.should == -2
@words.should == "\x11\x32\x54\x76\x98\xBA\xDC\xFE\xFE"
end
it "converts a negative number exactly -2**(numwords*wordsize*8)" do
result = @s.rb_integer_pack(-2**(9*8), @words, 1, 9, 0,
CApiIntegerSpecs::LITTLE_ENDIAN|CApiIntegerSpecs::PACK_2COMP)
result.should == -1
@words.should == "\x00\x00\x00\x00\x00\x00\x00\x00\x00"
end
end
end
describe "with native endian output" do
big_endian do
it "converts a positive number" do
result = @s.rb_integer_pack(@value, @words, 1, 16, 0,
CApiIntegerSpecs::NATIVE|CApiIntegerSpecs::PACK_2COMP)
result.should == 1
@words.should == "\x98\x76\xAB\xCD\x45\x32\xEF\x01\x01\x23\x45\x67\x89\xAB\xCD\xEF"
end
it "converts a negative number" do
result = @s.rb_integer_pack(-@value, @words, 1, 16, 0,
CApiIntegerSpecs::NATIVE|CApiIntegerSpecs::PACK_2COMP)
result.should == -1
@words.should == "\x67\x89\x54\x32\xBA\xCD\x10\xFE\xFE\xDC\xBA\x98\x76\x54\x32\x11"
end
end
little_endian do
it "converts a positive number" do
result = @s.rb_integer_pack(@value, @words, 1, 16, 0,
CApiIntegerSpecs::NATIVE|CApiIntegerSpecs::PACK_2COMP)
result.should == 1
@words.should == "\xEF\xCD\xAB\x89\x67\x45\x23\x01\x01\xEF\x32\x45\xCD\xAB\x76\x98"
end
it "converts a negative number" do
result = @s.rb_integer_pack(-@value, @words, 1, 16, 0,
CApiIntegerSpecs::NATIVE|CApiIntegerSpecs::PACK_2COMP)
result.should == -1
@words.should == "\x11\x32\x54\x76\x98\xBA\xDC\xFE\xFE\x10\xCD\xBA\x32\x54\x89\x67"
end
end
end
end
end
end
describe "rb_int_positive_pow" do
it "raises an integer to given power" do
@s.rb_int_positive_pow(2, 3).should == 8
end
it "raises a negative integer to given power" do
@s.rb_int_positive_pow(-2, 3).should == -8
@s.rb_int_positive_pow(-2, 4).should == 16
end
it "overflows for large inputs" do
@s.rb_int_positive_pow(8, 23).should == 590295810358705651712
end
end
end