diff --git a/lib/packer.rb b/lib/packer.rb index 47e05f2..a17b9fb 100644 --- a/lib/packer.rb +++ b/lib/packer.rb @@ -46,6 +46,7 @@ class Packer end def self.pack_big_int(sign, num) + num += 1 if sign == '1' num_bits = num.to_s(2) first = "1#{sign}#{num_bits[-6..]}" @@ -129,32 +130,3 @@ class Unpacker bits.join.to_i(2) * sign end end - -def todo_make_this_rspec_test - # # single byte int - # p Packer.pack_int(1) == [1] - # p Packer.pack_int(3) == [3] - # p Packer.pack_int(16) == [16] - # p Packer.pack_int(63) == [63] - - # # negative single byte - # p Packer.pack_int(-1) == [64] - # p Packer.pack_int(-2) == [65] - - # p Packer.pack_int(-1).first.to_s(2) == '1000000' - # p Packer.pack_int(-2).first.to_s(2) == '1000001' - # p Packer.pack_int(-3).first.to_s(2) == '1000010' - # p Packer.pack_int(-4).first.to_s(2) == '1000011' - - p Packer.pack_int(64).map { |e| e.to_s(2).rjust(8, '0') } == %w[10000000 00000001] - p Packer.pack_int(-64).map { |e| e.to_s(2).rjust(8, '0') } == %w[11000000 00000000] - - # # multi byte int - # p Packer.pack_int(64) == [128, 1] - # p Packer.pack_int(99999999999999999) == [191, 131, 255, 147, 246, 194, 215, 232, 88] - - # # string - # p Packer.pack_str("A") == [65, 0] -end - -# todo_make_this_rspec_test diff --git a/spec/04_packer_spec.rb b/spec/04_packer_spec.rb new file mode 100644 index 0000000..21fb465 --- /dev/null +++ b/spec/04_packer_spec.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +require_relative '../lib/packer' + +describe 'Packer', :packer do + context 'Pack strings' do + it 'Should pack a single string' do + expect(Packer.pack_str('A')).to eq([65, 0]) + end + end + + context 'Pack single byte integers' do + it 'Should pack positive' do + expect(Packer.pack_int(1)).to eq([1]) + expect(Packer.pack_int(3)).to eq([3]) + expect(Packer.pack_int(16)).to eq([16]) + expect(Packer.pack_int(63)).to eq([63]) + end + + it 'Should pack negative' do + expect(Packer.pack_int(-1)).to eq([64]) + expect(Packer.pack_int(-2)).to eq([65]) + end + + it 'Should pack negative match binary' do + expect(Packer.pack_int(-1).first.to_s(2)).to eq('1000000') + expect(Packer.pack_int(-2).first.to_s(2)).to eq('1000001') + expect(Packer.pack_int(-3).first.to_s(2)).to eq('1000010') + expect(Packer.pack_int(-4).first.to_s(2)).to eq('1000011') + end + end + + context 'Pack multi byte integers' do + it 'Should pack positive' do + expect(Packer.pack_int(64).map { |e| e.to_s(2).rjust(8, '0') }).to eq(%w[10000000 00000001]) + expect(Packer.pack_int(64)).to eq([128, 1]) + end + + it 'Should pack negative' do + expect(Packer.pack_int(-65).map { |e| e.to_s(2).rjust(8, '0') }).to eq(%w[11000001 00000001]) + end + + it 'Should pack large numbers' do + expect(Packer.pack_int(99_999_999_999_999_999)).to eq([191, 131, 255, 147, 246, 194, 215, 232, 88]) + end + end +end diff --git a/spec/04_unpacker_spec.rb b/spec/05_unpacker_spec.rb similarity index 100% rename from spec/04_unpacker_spec.rb rename to spec/05_unpacker_spec.rb