File: write.rb

package info (click to toggle)
jruby 1.7.26-1%2Bdeb9u1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 84,572 kB
  • sloc: ruby: 669,910; java: 253,056; xml: 35,152; ansic: 9,187; yacc: 7,267; cpp: 5,244; sh: 1,036; makefile: 345; jsp: 48; tcl: 40
file content (134 lines) | stat: -rw-r--r-- 3,519 bytes parent folder | download
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