require "spec"
require "compress/zlib"

module Compress::Zlib
  describe Writer do
    it "should be able to write" do
      message = "this is a test string !!!!\n"
      io = IO::Memory.new

      writer = Writer.new(io)

      io.bytesize.should eq(0)
      writer.flush
      io.bytesize.should_not eq(0)

      writer.print message
      writer.close

      io.rewind
      reader = Reader.new(io)
      reader.gets_to_end.should eq(message)
    end

    it "can be closed without sync" do
      io = IO::Memory.new
      writer = Writer.new(io)
      writer.close
      writer.closed?.should be_true
      io.closed?.should be_false

      expect_raises IO::Error, "Closed stream" do
        writer.print "a"
      end
    end

    it "can be closed with sync (1)" do
      io = IO::Memory.new
      writer = Writer.new(io, sync_close: true)
      writer.close
      writer.closed?.should be_true
      io.closed?.should be_true
    end

    it "can be closed with sync (2)" do
      io = IO::Memory.new
      writer = Writer.new(io)
      writer.sync_close = true
      writer.close
      writer.closed?.should be_true
      io.closed?.should be_true
    end

    it "can be flushed" do
      io = IO::Memory.new
      writer = Writer.new(io)

      writer.print "this"
      io.to_slice.hexstring.should eq("789c")

      writer.flush
      io.to_slice.hexstring.size.should be > 4

      writer.print " is a test string !!!!\n"
      writer.close

      io.rewind
      reader = Reader.new(io)
      reader.gets_to_end.should eq("this is a test string !!!!\n")
    end
  end
end
