1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
|
require File.expand_path('../../../spec_helper', __FILE__)
require File.expand_path('../fixtures/classes', __FILE__)
describe "IO#sysread on a file" do
before :each do
@file_name = tmp("IO_sysread_file") + $$.to_s
File.open(@file_name, "w") do |f|
# write some stuff
f.write("012345678901234567890123456789")
end
@file = File.open(@file_name, "r+")
end
after :each do
@file.close
rm_r @file_name
end
it "reads the specified number of bytes from the file" do
@file.sysread(15).should == "012345678901234"
end
it "reads the specified number of bytes from the file to the buffer" do
buf = "" # empty buffer
@file.sysread(15, buf).should == buf
buf.should == "012345678901234"
@file.rewind
buf = "ABCDE" # small buffer
@file.sysread(15, buf).should == buf
buf.should == "012345678901234"
@file.rewind
buf = "ABCDE" * 5 # large buffer
@file.sysread(15, buf).should == buf
buf.should == "012345678901234"
end
it "coerces the second argument to string and uses it as a buffer" do
buf = "ABCDE"
(obj = mock("buff")).should_receive(:to_str).any_number_of_times.and_return(buf)
@file.sysread(15, obj).should == buf
buf.should == "012345678901234"
end
it "advances the position of the file by the specified number of bytes" do
@file.sysread(15)
@file.sysread(5).should == "56789"
end
ruby_version_is "" ... "1.9" do
it "throws IOError when called immediately after a buffered IO#read" do
@file.read(15)
lambda { @file.sysread(5) }.should raise_error(IOError)
end
end
ruby_version_is "1.9" do
it "reads normally even when called immediately after a buffered IO#read" do
@file.read(15)
@file.sysread(5).should == "56789"
end
end
it "does not raise error if called after IO#read followed by IO#write" do
@file.read(5)
@file.write("abcde")
lambda { @file.sysread(5) }.should_not raise_error(IOError)
end
it "does not raise error if called after IO#read followed by IO#syswrite" do
@file.read(5)
@file.syswrite("abcde")
lambda { @file.sysread(5) }.should_not raise_error(IOError)
end
it "reads updated content after the flushed buffered IO#write" do
@file.write("abcde")
@file.flush
@file.sysread(5).should == "56789"
File.open(@file_name) do |f|
f.sysread(10).should == "abcde56789"
end
end
it "raises IOError on closed stream" do
lambda { IOSpecs.closed_io.sysread(5) }.should raise_error(IOError)
end
end
|