diff options
Diffstat (limited to 'spec/rubyspec/library/zlib/inflate/inflate_spec.rb')
-rw-r--r-- | spec/rubyspec/library/zlib/inflate/inflate_spec.rb | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/spec/rubyspec/library/zlib/inflate/inflate_spec.rb b/spec/rubyspec/library/zlib/inflate/inflate_spec.rb new file mode 100644 index 0000000000..1fa16d9e98 --- /dev/null +++ b/spec/rubyspec/library/zlib/inflate/inflate_spec.rb @@ -0,0 +1,152 @@ +require 'zlib' +require File.expand_path('../../../../spec_helper', __FILE__) + +describe "Zlib::Inflate#inflate" do + + before :each do + @inflator = Zlib::Inflate.new + end + it "inflates some data" do + data = [120, 156, 99, 96, 128, 1, 0, 0, 10, 0, 1].pack('C*') + unzipped = @inflator.inflate data + @inflator.finish + + unzipped.should == "\000" * 10 + end + + it "inflates lots of data" do + data = [120, 156, 237, 193, 1, 1, 0, 0] + + [0, 128, 144, 254, 175, 238, 8, 10] + + Array.new(31, 0) + + [24, 128, 0, 0, 1] + + unzipped = @inflator.inflate data.pack('C*') + @inflator.finish + + unzipped.should == "\000" * 32 * 1024 + end + + it "works in pass-through mode, once finished" do + data = [120, 156, 99, 96, 128, 1, 0, 0, 10, 0, 1] + @inflator.inflate data.pack('C*') + @inflator.finish # this is a precondition + + out = @inflator.inflate('uncompressed_data') + out << @inflator.finish + out.should == 'uncompressed_data' + + @inflator << ('uncompressed_data') << nil + @inflator.finish.should == 'uncompressed_data' + end + +end + +describe "Zlib::Inflate.inflate" do + + it "inflates some data" do + data = [120, 156, 99, 96, 128, 1, 0, 0, 10, 0, 1] + unzipped = Zlib::Inflate.inflate data.pack('C*') + + unzipped.should == "\000" * 10 + end + + it "inflates lots of data" do + data = [120, 156, 237, 193, 1, 1, 0, 0] + + [0, 128, 144, 254, 175, 238, 8, 10] + + Array.new(31,0) + + [24, 128, 0, 0, 1] + + zipped = Zlib::Inflate.inflate data.pack('C*') + + zipped.should == "\000" * 32 * 1024 + end + + it "properly handles data in chunks" do + data = [120, 156, 75, 203, 207, 7, 0, 2, 130, 1, 69].pack('C*') + z = Zlib::Inflate.new + # add bytes, one by one + result = "" + data.each_byte { |d| result << z.inflate(d.chr)} + result << z.finish + result.should == "foo" + end + + it "properly handles incomplete data" do + data = [120, 156, 75, 203, 207, 7, 0, 2, 130, 1, 69].pack('C*')[0,5] + z = Zlib::Inflate.new + # add bytes, one by one, but not all + result = "" + data.each_byte { |d| result << z.inflate(d.chr)} + lambda { result << z.finish }.should raise_error(Zlib::BufError) + end + + it "properly handles excessive data, byte-by-byte" do + main_data = [120, 156, 75, 203, 207, 7, 0, 2, 130, 1, 69].pack('C*') + data = main_data * 2 + result = "" + + z = Zlib::Inflate.new + # add bytes, one by one + data.each_byte { |d| result << z.inflate(d.chr)} + result << z.finish + + # the first chunk is inflated to its completion, + # the second chunk is just passed through. + result.should == "foo" + main_data + end + + it "properly handles excessive data, in one go" do + main_data = [120, 156, 75, 203, 207, 7, 0, 2, 130, 1, 69].pack('C*') + data = main_data * 2 + result = "" + + z = Zlib::Inflate.new + result << z.inflate(data) + result << z.finish + + # the first chunk is inflated to its completion, + # the second chunk is just passed through. + result.should == "foo" + main_data + end +end + +describe "Zlib::Inflate#inflate" do + + before do + @zeros = Zlib::Deflate.deflate("0" * 100_000) + @inflator = Zlib::Inflate.new + @chunks = [] + end + + describe "without break" do + + before do + @inflator.inflate(@zeros) do |chunk| + @chunks << chunk + end + end + + it "inflates chunked data" do + @chunks.map { |chunk| chunk.size }.should == [16384, 16384, 16384, 16384, 16384, 16384, 1696] + end + + it "properly handles chunked data" do + @chunks.all? { |chunk| chunk =~ /\A0+\z/ }.should be_true + end + end + + describe "with break" do + + before do + @inflator.inflate(@zeros) do |chunk| + @chunks << chunk + break + end + end + + it "inflates chunked break" do + output = @inflator.inflate nil + (100_000 - @chunks.first.length).should == output.length + end + end +end |