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 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
# -*- encoding: utf-8 -*-
describe :stringio_write, :shared => true do
before(:each) do
@io = StringIO.new('12345')
end
it "tries to convert the passed Object to a String using #to_s" do
obj = mock("to_s")
obj.should_receive(:to_s).and_return("to_s")
@io.send(@method, obj)
@io.string.should == "to_s5"
end
it "raises an IOError if the data String is frozen after creating the StringIO instance" do
s = "abcdef"
io = StringIO.new s, "w"
s.freeze
lambda { io.write "xyz" }.should raise_error(IOError)
end
end
describe :stringio_write_string, :shared => true do
before(:each) do
@io = StringIO.new('12345')
end
# TODO: RDoc says that #write appends at the current position.
it "writes the passed String at the current buffer position" do
@io.pos = 2
@io.send(@method, 'x').should == 1
@io.string.should == '12x45'
@io.send(@method, 7).should == 1
@io.string.should == '12x75'
end
it "pads self with \\000 when the current position is after the end" do
@io.pos = 8
@io.send(@method, 'x')
@io.string.should == "12345\000\000\000x"
@io.send(@method, 9)
@io.string.should == "12345\000\000\000x9"
end
it "returns the number of bytes written" do
@io.send(@method, '').should == 0
@io.send(@method, nil).should == 0
str = "1" * 100
@io.send(@method, str).should == 100
end
it "updates self's position" do
@io.send(@method, 'test')
@io.pos.should eql(4)
end
it "taints self's String when the passed argument is tainted" do
@io.send(@method, "test".taint)
@io.string.tainted?.should be_true
end
it "does not taint self when the passed argument is tainted" do
@io.send(@method, "test".taint)
@io.tainted?.should be_false
end
with_feature :encoding do
before :each do
@enc_io = StringIO.new("Hëllø")
end
it "writes binary data into the io" do
data = "Hëll\xFF"
data.force_encoding("ASCII-8BIT")
@enc_io.send(@method, data)
@enc_io.string.should == "Hëll\xFF\xB8"
end
it "retains the original encoding" do
data = "Hëll\xFF"
data.force_encoding("ASCII-8BIT")
@enc_io.send(@method, data)
@enc_io.string.encoding.should == Encoding::UTF_8
end
it "returns the number of bytes written" do
data = "Hëll\xFF"
data.force_encoding("ASCII-8BIT")
@enc_io.send(@method, data).should == 6
end
it "pads multibyte characters properly" do
@enc_io.pos = 8
@enc_io.send(@method, 'x')
@enc_io.string.should == "Hëllø\000x"
@enc_io.send(@method, 9)
@enc_io.string.should == "Hëllø\000x9"
end
end
end
describe :stringio_write_not_writable, :shared => true do
it "raises an IOError" do
io = StringIO.new("test", "r")
lambda { io.send(@method, "test") }.should raise_error(IOError)
io = StringIO.new("test")
io.close_write
lambda { io.send(@method, "test") }.should raise_error(IOError)
end
end
describe :stringio_write_append, :shared => true do
before(:each) do
@io = StringIO.new("example", "a")
end
it "appends the passed argument to the end of self" do
@io.send(@method, ", just testing")
@io.string.should == "example, just testing"
@io.send(@method, " and more testing")
@io.string.should == "example, just testing and more testing"
end
it "correctly updates self's position" do
@io.send(@method, ", testing")
@io.pos.should eql(16)
end
end
|