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 -