test/bits_test.rb in bindata-1.8.2 vs test/bits_test.rb in bindata-1.8.3

- old
+ new

@@ -3,70 +3,62 @@ require File.expand_path(File.join(File.dirname(__FILE__), "common")) module AllBitfields def test_has_a_sensible_value_of_zero - all_classes do |bit_class| - bit_class.new.must_equal 0 + all_objects do |obj, nbits| + obj.must_equal 0 end end def test_avoids_underflow - all_classes do |bit_class| - obj = bit_class.new - + all_objects do |obj, nbits| obj.assign(min_value - 1) obj.must_equal min_value end end def test_avoids_overflow - all_classes do |bit_class| - obj = bit_class.new - + all_objects do |obj, nbits| obj.assign(max_value + 1) obj.must_equal max_value end end def test_assign_values - all_classes do |bit_class| + all_objects do |obj, nbits| some_values_within_range.each do |val| - obj = bit_class.new obj.assign(val) - obj.must_equal val end end end def test_assign_values_from_other_bit_objects - all_classes do |bit_class| + all_objects do |obj, nbits| some_values_within_range.each do |val| - obj = bit_class.new - obj.assign(bit_class.new(val)) - + obj.assign(obj.new(val)) obj.must_equal val end end end def test_symmetrically_read_and_write - all_classes do |bit_class| + all_objects do |obj, nbits| some_values_within_range.each do |val| - obj = bit_class.new obj.assign(val) - - obj.value_read_from_written.must_equal obj + other = obj.new + other.read(obj.to_binary_s) + other.must_equal obj end end end - def all_classes(&block) - @bits.each_pair do |bit_class, nbits| + def all_objects(&block) + @bits.each do |obj, nbits| @nbits = nbits - yield bit_class + yield obj, nbits end end def min_value if @signed @@ -96,25 +88,33 @@ (min_value .. max_value).include?(val) end end def generate_bit_classes_to_test(endian, signed) - bits = {} + bits = [] if signed base = "Sbit" start = 2 else base = "Bit" start = 1 end - (start .. 50).each do |nbits| + (start .. 64).each do |nbits| name = "#{base}#{nbits}" name << "le" if endian == :little - bit_class = BinData.const_get(name) - bits[bit_class] = nbits + obj = BinData.const_get(name).new + bits << [obj, nbits] end + + (start .. 64).each do |nbits| + name = "#{base}" + name << "Le" if endian == :little + obj = BinData.const_get(name).new(:nbits => nbits) + bits << [obj, nbits] + end + bits end describe "Unsigned big endian bitfields" do include AllBitfields @@ -123,15 +123,16 @@ @signed = false @bits = generate_bit_classes_to_test(:big, @signed) end it "read big endian values" do - @bits.each_pair do |bit_class, nbits| + all_objects do |obj, nbits| nbytes = (nbits + 7) / 8 str = [0b1000_0000].pack("C") + "\000" * (nbytes - 1) - bit_class.read(str).must_equal 1 << (nbits - 1) + obj.read(str) + obj.must_equal 1 << (nbits - 1) end end end describe "Signed big endian bitfields" do @@ -141,15 +142,16 @@ @signed = true @bits = generate_bit_classes_to_test(:big, @signed) end it "read big endian values" do - @bits.each_pair do |bit_class, nbits| + all_objects do |obj, nbits| nbytes = (nbits + 7) / 8 str = [0b0100_0000].pack("C") + "\000" * (nbytes - 1) - bit_class.read(str).must_equal 1 << (nbits - 2) + obj.read(str) + obj.must_equal 1 << (nbits - 2) end end end describe "Unsigned little endian bitfields" do @@ -159,15 +161,16 @@ @signed = false @bits = generate_bit_classes_to_test(:little, @signed) end it "read little endian values" do - @bits.each_pair do |bit_class, nbits| + all_objects do |obj, nbits| nbytes = (nbits + 7) / 8 str = [0b0000_0001].pack("C") + "\000" * (nbytes - 1) - bit_class.read(str).must_equal 1 + obj.read(str) + obj.must_equal 1 end end end describe "Signed little endian bitfields" do @@ -177,14 +180,15 @@ @signed = true @bits = generate_bit_classes_to_test(:little, @signed) end it "read little endian values" do - @bits.each_pair do |bit_class, nbits| + all_objects do |obj, nbits| nbytes = (nbits + 7) / 8 str = [0b0000_0001].pack("C") + "\000" * (nbytes - 1) - bit_class.read(str).must_equal 1 + obj.read(str) + obj.must_equal 1 end end end describe "Bits of size 1" do