test/bits_test.rb in bindata-1.8.0 vs test/bits_test.rb in bindata-1.8.1
- old
+ new
@@ -67,15 +67,23 @@
yield bit_class
end
end
def min_value
- 0
+ if @signed
+ -max_value - 1
+ else
+ 0
+ end
end
def max_value
- (1 << @nbits) - 1
+ if @signed
+ (1 << (@nbits - 1)) - 1
+ else
+ (1 << @nbits) - 1
+ end
end
def some_values_within_range
lo = min_value + 1
mid = (min_value + max_value) / 2
@@ -87,25 +95,35 @@
def value_within_range?(val)
(min_value .. max_value).include?(val)
end
end
-def generate_bit_classes_to_test(endian)
+def generate_bit_classes_to_test(endian, signed)
bits = {}
- (1 .. 50).each do |nbits|
- name = (endian == :big) ? "Bit#{nbits}" : "Bit#{nbits}le"
+ if signed
+ base = "Sbit"
+ start = 2
+ else
+ base = "Bit"
+ start = 1
+ end
+
+ (start .. 50).each do |nbits|
+ name = "#{base}#{nbits}"
+ name << "le" if endian == :little
bit_class = BinData.const_get(name)
bits[bit_class] = nbits
end
bits
end
-describe "Big endian bitfields" do
+describe "Unsigned big endian bitfields" do
include AllBitfields
before do
- @bits = generate_bit_classes_to_test(:big)
+ @signed = false
+ @bits = generate_bit_classes_to_test(:big, @signed)
end
it "read big endian values" do
@bits.each_pair do |bit_class, nbits|
nbytes = (nbits + 7) / 8
@@ -114,27 +132,64 @@
bit_class.read(str).must_equal 1 << (nbits - 1)
end
end
end
-describe "Little endian bitfields" do
+describe "Signed big endian bitfields" do
include AllBitfields
before do
- @bits = generate_bit_classes_to_test(:little)
+ @signed = true
+ @bits = generate_bit_classes_to_test(:big, @signed)
end
+ it "read big endian values" do
+ @bits.each_pair do |bit_class, nbits|
+ nbytes = (nbits + 7) / 8
+ str = [0b0100_0000].pack("C") + "\000" * (nbytes - 1)
+
+ bit_class.read(str).must_equal 1 << (nbits - 2)
+ end
+ end
+end
+
+describe "Unsigned little endian bitfields" do
+ include AllBitfields
+
+ before do
+ @signed = false
+ @bits = generate_bit_classes_to_test(:little, @signed)
+ end
+
it "read little endian values" do
@bits.each_pair do |bit_class, nbits|
nbytes = (nbits + 7) / 8
str = [0b0000_0001].pack("C") + "\000" * (nbytes - 1)
bit_class.read(str).must_equal 1
end
end
end
+describe "Signed little endian bitfields" do
+ include AllBitfields
+
+ before do
+ @signed = true
+ @bits = generate_bit_classes_to_test(:little, @signed)
+ end
+
+ it "read little endian values" do
+ @bits.each_pair do |bit_class, nbits|
+ nbytes = (nbits + 7) / 8
+ str = [0b0000_0001].pack("C") + "\000" * (nbytes - 1)
+
+ bit_class.read(str).must_equal 1
+ end
+ end
+end
+
describe "Bits of size 1" do
let(:bit_classes) { [BinData::Bit1, BinData::Bit1le] }
it "accept true as value" do
bit_classes.each do |bit_class|
@@ -158,6 +213,5 @@
obj.assign(nil)
obj.must_equal 0
end
end
end
-