From 47a944eae433135ef8d4b6e17934061df17c13e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20B=C3=B6rjesson?= Date: Wed, 23 Oct 2024 18:50:58 +0200 Subject: [PATCH] Add more specs --- spec/payload_spec.cr | 66 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 52 insertions(+), 14 deletions(-) diff --git a/spec/payload_spec.cr b/spec/payload_spec.cr index 2eda7f4..4f06948 100644 --- a/spec/payload_spec.cr +++ b/spec/payload_spec.cr @@ -1,5 +1,19 @@ require "./spec_helper" +class NonPositionIO < ::IO + def initialize(@data : Bytes) + end + + def read(slice : Bytes) + slice.size.times { |i| slice[i] = @data[i] } + slice.size + end + + def write(slice : Bytes) : Nil + raise NotImplementedError.new("write") + end +end + describe MQTT::Protocol::Payload do it ".new(Bytes) returns a BytesPayload" do obj = MQTT::Protocol::Payload.new("foo".to_slice) @@ -76,27 +90,51 @@ describe MQTT::Protocol::Payload do end describe "IOPayload" do - it "#to_slice should peek if possible" do - io = IO::Memory.new("foo".to_slice) - io.rewind + describe "#to_slice" do + it "should peek if possible" do + io = IO::Memory.new("foo".to_slice) + io.rewind - obj = MQTT::Protocol::IOPayload.new(io, 3) - data = obj.to_slice + obj = MQTT::Protocol::IOPayload.new(io, 3) + data = obj.to_slice - obj.@data.should be_nil + obj.@data.should be_nil + end + + it "should copy data if peek isn't possible" do + io = NonPositionIO.new("foo".to_slice) + + obj = MQTT::Protocol::IOPayload.new(io, 3) + data = obj.to_slice + + obj.@data.should eq "foo".to_slice + end end - it "#to_io should not affect position" do - io = IO::Memory.new("foo".to_slice) - io.rewind + describe "#to_io" do + it "should not affect position if io support pos/pos=" do + io = IO::Memory.new("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 + end + + it "should copy data if io doesn't support pos/pos=" do + io = NonPositionIO.new("foo".to_slice) - obj = MQTT::Protocol::IOPayload.new(io, 3) + obj = MQTT::Protocol::IOPayload.new(io, 3) - dst = IO::Memory.new - obj.to_io(dst) + dst = IO::Memory.new + obj.to_io(dst) - obj.@data.should be_nil - obj.@io.pos.should eq(0) + obj.@data.should eq "foo".to_slice + end end end end