diff --git a/spec/payload_spec.cr b/spec/payload_spec.cr index f4eb6cc..e6c18c7 100644 --- a/spec/payload_spec.cr +++ b/spec/payload_spec.cr @@ -1,6 +1,6 @@ require "./spec_helper" -class NonPositionIO < ::IO +class DummyIO < ::IO def initialize(@data : Bytes) end @@ -31,60 +31,48 @@ describe MQTT::Protocol::Payload do it "should return true for two BytePayload with same bytes" do one = MQTT::Protocol::BytesPayload.new("foo".to_slice) two = MQTT::Protocol::BytesPayload.new("foo".to_slice) - (one == two).should be_true end it "should return false for two BytePayload with different bytes" do one = MQTT::Protocol::BytesPayload.new("foo".to_slice) two = MQTT::Protocol::BytesPayload.new("bar".to_slice) - (one == two).should be_false end it "should return true for two IOPayload with same content" do io_one = IO::Memory.new("foo".to_slice) io_two = IO::Memory.new("foo".to_slice) - io_one.rewind io_two.rewind - one = MQTT::Protocol::IOPayload.new(io_one, 3) two = MQTT::Protocol::IOPayload.new(io_two, 3) - (one == two).should be_true end it "should return false for two IOPayload with different content" do io_one = IO::Memory.new("foo".to_slice) io_two = IO::Memory.new("bar".to_slice) - io_one.rewind io_two.rewind - one = MQTT::Protocol::IOPayload.new(io_one, 3) two = MQTT::Protocol::IOPayload.new(io_two, 3) - (one == two).should be_false end it "should return true for one BytesPayload and one IOPayload with same content" do io_two = IO::Memory.new("foo".to_slice) io_two.rewind - one = MQTT::Protocol::BytesPayload.new("foo".to_slice) two = MQTT::Protocol::IOPayload.new(io_two, 3) - (one == two).should be_true end it "should return false for one BytesPayload and one IOPayload with different content" do io_two = IO::Memory.new("bar".to_slice) io_two.rewind - one = MQTT::Protocol::BytesPayload.new("foo".to_slice) two = MQTT::Protocol::IOPayload.new(io_two, 3) - (one == two).should be_false end end @@ -94,46 +82,49 @@ describe MQTT::Protocol::Payload do it "should peek if possible" do io = IO::Memory.new("foo".to_slice) io.rewind - obj = MQTT::Protocol::IOPayload.new(io, 3) - obj.to_slice - + obj.to_slice.should eq "foo".to_slice obj.@data.should be_nil end it "should copy data if peek isn't possible" do - io = NonPositionIO.new("foo".to_slice) - + io = DummyIO.new("foo".to_slice) obj = MQTT::Protocol::IOPayload.new(io, 3) - obj.to_slice - + obj.to_slice.should eq "foo".to_slice obj.@data.should eq "foo".to_slice end end describe "#to_io" do - it "should not affect position if io support pos/pos=" do - io = IO::Memory.new("foo".to_slice) - io.rewind + it "should not affect position if io is FileDescriptor" do + File.open(File.tempfile.path, "w+") do |io| + io.write "foo".to_slice + io.rewind + obj = MQTT::Protocol::IOPayload.new(io, 3) + dst = IO::Memory.new + obj.to_io(dst) + obj.@data.should be_nil + obj.@io.pos.should eq 0 + dst.to_slice.should eq "foo".to_slice + end + end + it "should not copy data if io is Memory" do + io = ::IO::Memory.new("foo".to_slice) obj = MQTT::Protocol::IOPayload.new(io, 3) - dst = IO::Memory.new obj.to_io(dst) - obj.@data.should be_nil - obj.@io.pos.should eq 0 + dst.to_slice.should eq "foo".to_slice end - it "should copy data if io doesn't support pos/pos=" do - io = NonPositionIO.new("foo".to_slice) - + it "should copy data if io is other than Memory or FileDescriptor" do + io = DummyIO.new("foo".to_slice) obj = MQTT::Protocol::IOPayload.new(io, 3) - dst = IO::Memory.new obj.to_io(dst) - obj.@data.should eq "foo".to_slice + dst.to_slice.should eq "foo".to_slice end end end