rubysl-stringio 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.travis.yml +7 -0
- data/Gemfile +4 -0
- data/LICENSE +25 -0
- data/README.md +29 -0
- data/Rakefile +1 -0
- data/lib/rubysl/stringio.rb +2 -0
- data/lib/rubysl/stringio/stringio.rb +611 -0
- data/lib/rubysl/stringio/version.rb +5 -0
- data/lib/stringio.rb +1 -0
- data/rubysl-stringio.gemspec +24 -0
- data/spec/append_spec.rb +83 -0
- data/spec/binmode_spec.rb +8 -0
- data/spec/bytes_spec.rb +12 -0
- data/spec/chars_spec.rb +12 -0
- data/spec/close_read_spec.rb +30 -0
- data/spec/close_spec.rb +22 -0
- data/spec/close_write_spec.rb +30 -0
- data/spec/closed_read_spec.rb +11 -0
- data/spec/closed_spec.rb +15 -0
- data/spec/closed_write_spec.rb +11 -0
- data/spec/codepoints_spec.rb +11 -0
- data/spec/each_byte_spec.rb +10 -0
- data/spec/each_char_spec.rb +12 -0
- data/spec/each_codepoint_spec.rb +12 -0
- data/spec/each_line_spec.rb +14 -0
- data/spec/each_spec.rb +14 -0
- data/spec/eof_spec.rb +10 -0
- data/spec/external_encoding_spec.rb +12 -0
- data/spec/fcntl_spec.rb +7 -0
- data/spec/fileno_spec.rb +8 -0
- data/spec/fixtures/classes.rb +15 -0
- data/spec/flush_spec.rb +8 -0
- data/spec/fsync_spec.rb +8 -0
- data/spec/getbyte_spec.rb +25 -0
- data/spec/getc_spec.rb +31 -0
- data/spec/gets_spec.rb +245 -0
- data/spec/initialize_copy_spec.rb +95 -0
- data/spec/initialize_spec.rb +193 -0
- data/spec/internal_encoding_spec.rb +12 -0
- data/spec/isatty_spec.rb +6 -0
- data/spec/length_spec.rb +6 -0
- data/spec/lineno_spec.rb +29 -0
- data/spec/lines_spec.rb +16 -0
- data/spec/open_spec.rb +215 -0
- data/spec/path_spec.rb +15 -0
- data/spec/pid_spec.rb +7 -0
- data/spec/pos_spec.rb +27 -0
- data/spec/print_spec.rb +113 -0
- data/spec/printf_spec.rb +60 -0
- data/spec/putc_spec.rb +105 -0
- data/spec/puts_spec.rb +173 -0
- data/spec/read_nonblock_spec.rb +29 -0
- data/spec/read_spec.rb +62 -0
- data/spec/readbyte_spec.rb +21 -0
- data/spec/readchar_spec.rb +19 -0
- data/spec/readline_spec.rb +127 -0
- data/spec/readlines_spec.rb +124 -0
- data/spec/readpartial_spec.rb +29 -0
- data/spec/reopen_spec.rb +303 -0
- data/spec/rewind_spec.rb +23 -0
- data/spec/seek_spec.rb +75 -0
- data/spec/set_encoding_spec.rb +34 -0
- data/spec/shared/codepoints.rb +45 -0
- data/spec/shared/each.rb +162 -0
- data/spec/shared/each_byte.rb +60 -0
- data/spec/shared/each_char.rb +50 -0
- data/spec/shared/eof.rb +24 -0
- data/spec/shared/getc.rb +43 -0
- data/spec/shared/isatty.rb +5 -0
- data/spec/shared/length.rb +12 -0
- data/spec/shared/read.rb +186 -0
- data/spec/shared/readchar.rb +29 -0
- data/spec/shared/sysread.rb +27 -0
- data/spec/shared/tell.rb +12 -0
- data/spec/shared/write.rb +134 -0
- data/spec/size_spec.rb +6 -0
- data/spec/string_spec.rb +49 -0
- data/spec/stringio_spec.rb +8 -0
- data/spec/sync_spec.rb +18 -0
- data/spec/sysread_spec.rb +27 -0
- data/spec/syswrite_spec.rb +18 -0
- data/spec/tell_spec.rb +6 -0
- data/spec/truncate_spec.rb +69 -0
- data/spec/tty_spec.rb +6 -0
- data/spec/ungetbyte_spec.rb +88 -0
- data/spec/ungetc_spec.rb +98 -0
- data/spec/write_nonblock_spec.rb +20 -0
- data/spec/write_spec.rb +18 -0
- metadata +267 -0
data/spec/printf_spec.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
2
|
+
|
3
|
+
describe "StringIO#printf" do
|
4
|
+
before(:each) do
|
5
|
+
@io = StringIO.new('example')
|
6
|
+
end
|
7
|
+
|
8
|
+
it "returns nil" do
|
9
|
+
@io.printf("%d %04x", 123, 123).should be_nil
|
10
|
+
end
|
11
|
+
|
12
|
+
it "pads self with \\000 when the current position is after the end" do
|
13
|
+
@io.pos = 10
|
14
|
+
@io.printf("%d", 123)
|
15
|
+
@io.string.should == "example\000\000\000123"
|
16
|
+
end
|
17
|
+
|
18
|
+
it "performs format conversion" do
|
19
|
+
@io.printf("%d %04x", 123, 123)
|
20
|
+
@io.string.should == "123 007b"
|
21
|
+
end
|
22
|
+
|
23
|
+
it "updates the current position" do
|
24
|
+
@io.printf("%d %04x", 123, 123)
|
25
|
+
@io.pos.should eql(8)
|
26
|
+
|
27
|
+
@io.printf("%d %04x", 123, 123)
|
28
|
+
@io.pos.should eql(16)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "StringIO#printf when in append mode" do
|
33
|
+
before(:each) do
|
34
|
+
@io = StringIO.new("example", "a")
|
35
|
+
end
|
36
|
+
|
37
|
+
it "appends the passed argument to the end of self" do
|
38
|
+
@io.printf("%d %04x", 123, 123)
|
39
|
+
@io.string.should == "example123 007b"
|
40
|
+
|
41
|
+
@io.printf("%d %04x", 123, 123)
|
42
|
+
@io.string.should == "example123 007b123 007b"
|
43
|
+
end
|
44
|
+
|
45
|
+
it "correctly updates self's position" do
|
46
|
+
@io.printf("%d %04x", 123, 123)
|
47
|
+
@io.pos.should eql(15)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "StringIO#printf when self is not writable" do
|
52
|
+
it "raises an IOError" do
|
53
|
+
io = StringIO.new("test", "r")
|
54
|
+
lambda { io.printf("test") }.should raise_error(IOError)
|
55
|
+
|
56
|
+
io = StringIO.new("test")
|
57
|
+
io.close_write
|
58
|
+
lambda { io.printf("test") }.should raise_error(IOError)
|
59
|
+
end
|
60
|
+
end
|
data/spec/putc_spec.rb
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
4
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
5
|
+
|
6
|
+
describe "StringIO#putc when passed [String]" do
|
7
|
+
before(:each) do
|
8
|
+
@io = StringIO.new('example')
|
9
|
+
end
|
10
|
+
|
11
|
+
it "overwrites the character at the current position" do
|
12
|
+
@io.putc("t")
|
13
|
+
@io.string.should == "txample"
|
14
|
+
|
15
|
+
@io.pos = 3
|
16
|
+
@io.putc("t")
|
17
|
+
@io.string.should == "txatple"
|
18
|
+
end
|
19
|
+
|
20
|
+
it "only writes the first character from the passed String" do
|
21
|
+
@io.putc("test")
|
22
|
+
@io.string.should == "txample"
|
23
|
+
end
|
24
|
+
|
25
|
+
it "returns the passed String" do
|
26
|
+
str = "test"
|
27
|
+
@io.putc(str).should equal(str)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "correctly updates the current position" do
|
31
|
+
@io.putc("t")
|
32
|
+
@io.pos.should == 1
|
33
|
+
|
34
|
+
@io.putc("test")
|
35
|
+
@io.pos.should == 2
|
36
|
+
|
37
|
+
@io.putc("t")
|
38
|
+
@io.pos.should == 3
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
with_feature :encoding do
|
43
|
+
|
44
|
+
before :each do
|
45
|
+
@enc_io = StringIO.new("ëllø")
|
46
|
+
end
|
47
|
+
|
48
|
+
it "writes a byte into the io" do
|
49
|
+
@enc_io.putc("t")
|
50
|
+
@enc_io.string.should == "t\xABllø"
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "StringIO#putc when passed [Object]" do
|
58
|
+
before(:each) do
|
59
|
+
@io = StringIO.new('example')
|
60
|
+
end
|
61
|
+
|
62
|
+
it "it writes the passed Integer % 256 to self" do
|
63
|
+
@io.putc(333) # 333 % 256 == ?M
|
64
|
+
@io.string.should == "Mxample"
|
65
|
+
|
66
|
+
@io.putc(-450) # -450 % 256 == ?>
|
67
|
+
@io.string.should == "M>ample"
|
68
|
+
end
|
69
|
+
|
70
|
+
it "pads self with \\000 when the current position is after the end" do
|
71
|
+
@io.pos = 10
|
72
|
+
@io.putc(?A)
|
73
|
+
@io.string.should == "example\000\000\000A"
|
74
|
+
end
|
75
|
+
|
76
|
+
it "tries to convert the passed argument to an Integer using #to_int" do
|
77
|
+
obj = mock('to_int')
|
78
|
+
obj.should_receive(:to_int).and_return(116)
|
79
|
+
@io.putc(obj)
|
80
|
+
@io.string.should == "txample"
|
81
|
+
end
|
82
|
+
|
83
|
+
it "raises a TypeError when the passed argument can't be coerced to Integer" do
|
84
|
+
lambda { @io.putc(Object.new) }.should raise_error(TypeError)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe "StringIO#putc when in append mode" do
|
89
|
+
it "appends to the end of self" do
|
90
|
+
io = StringIO.new("test", "a")
|
91
|
+
io.putc(?t)
|
92
|
+
io.string.should == "testt"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe "StringIO#putc when self is not writable" do
|
97
|
+
it "raises an IOError" do
|
98
|
+
io = StringIO.new("test", "r")
|
99
|
+
lambda { io.putc(?a) }.should raise_error(IOError)
|
100
|
+
|
101
|
+
io = StringIO.new("test")
|
102
|
+
io.close_write
|
103
|
+
lambda { io.putc("t") }.should raise_error(IOError)
|
104
|
+
end
|
105
|
+
end
|
data/spec/puts_spec.rb
ADDED
@@ -0,0 +1,173 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
4
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
5
|
+
|
6
|
+
describe "StringIO#puts when passed an Array" do
|
7
|
+
before(:each) do
|
8
|
+
@io = StringIO.new
|
9
|
+
end
|
10
|
+
|
11
|
+
it "writes each element of the passed Array to self, separated by a newline" do
|
12
|
+
@io.puts([1, 2, 3, 4])
|
13
|
+
@io.string.should == "1\n2\n3\n4\n"
|
14
|
+
|
15
|
+
@io.puts([1, 2], [3, 4])
|
16
|
+
@io.string.should == "1\n2\n3\n4\n1\n2\n3\n4\n"
|
17
|
+
end
|
18
|
+
|
19
|
+
it "flattens nested Arrays" do
|
20
|
+
@io.puts([1, [2, [3, [4]]]])
|
21
|
+
@io.string.should == "1\n2\n3\n4\n"
|
22
|
+
end
|
23
|
+
|
24
|
+
it "handles self-recursive arrays correctly" do
|
25
|
+
(ary = [5])
|
26
|
+
ary << ary
|
27
|
+
@io.puts(ary)
|
28
|
+
@io.string.should == "5\n[...]\n"
|
29
|
+
end
|
30
|
+
|
31
|
+
it "does not honor the global output record separator $\\" do
|
32
|
+
begin
|
33
|
+
old_rs, $\ = $\, "test"
|
34
|
+
@io.puts([1, 2, 3, 4])
|
35
|
+
@io.string.should == "1\n2\n3\n4\n"
|
36
|
+
ensure
|
37
|
+
$\ = old_rs
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
it "first tries to convert each Array element to an Array using #to_ary" do
|
42
|
+
obj = mock("Object")
|
43
|
+
obj.should_receive(:to_ary).and_return(["to_ary"])
|
44
|
+
@io.puts([obj])
|
45
|
+
@io.string.should == "to_ary\n"
|
46
|
+
end
|
47
|
+
|
48
|
+
it "then tries to convert each Array element to a String using #to_s" do
|
49
|
+
obj = mock("Object")
|
50
|
+
obj.should_receive(:to_s).and_return("to_s")
|
51
|
+
@io.puts([obj])
|
52
|
+
@io.string.should == "to_s\n"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "StringIO#puts when passed 1 or more objects" do
|
57
|
+
before(:each) do
|
58
|
+
@io = StringIO.new
|
59
|
+
end
|
60
|
+
|
61
|
+
it "does not honor the global output record separator $\\" do
|
62
|
+
begin
|
63
|
+
old_rs, $\ = $\, "test"
|
64
|
+
@io.puts(1, 2, 3, 4)
|
65
|
+
@io.string.should == "1\n2\n3\n4\n"
|
66
|
+
ensure
|
67
|
+
$\ = old_rs
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
it "does not put a \\n after each Objects that end in a newline" do
|
72
|
+
@io.puts("1\n", "2\n", "3\n")
|
73
|
+
@io.string.should == "1\n2\n3\n"
|
74
|
+
end
|
75
|
+
|
76
|
+
it "first tries to convert each Object to an Array using #to_ary" do
|
77
|
+
obj = mock("Object")
|
78
|
+
obj.should_receive(:to_ary).and_return(["to_ary"])
|
79
|
+
@io.puts(obj)
|
80
|
+
@io.string.should == "to_ary\n"
|
81
|
+
end
|
82
|
+
|
83
|
+
it "then tries to convert each Object to a String using #to_s" do
|
84
|
+
obj = mock("Object")
|
85
|
+
obj.should_receive(:to_s).and_return("to_s")
|
86
|
+
@io.puts(obj)
|
87
|
+
@io.string.should == "to_s\n"
|
88
|
+
end
|
89
|
+
|
90
|
+
it "prints a newline when passed an empty string" do
|
91
|
+
@io.puts ''
|
92
|
+
@io.string.should == "\n"
|
93
|
+
end
|
94
|
+
|
95
|
+
ruby_version_is ""..."1.9" do
|
96
|
+
it "prints a newline when passed nil" do
|
97
|
+
@io.puts nil
|
98
|
+
@io.string.should == "nil\n"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
ruby_version_is "1.9" do
|
103
|
+
it "prints a newline when passed nil" do
|
104
|
+
@io.puts nil
|
105
|
+
@io.string.should == "\n"
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe "StringIO#puts when passed no arguments" do
|
111
|
+
before(:each) do
|
112
|
+
@io = StringIO.new
|
113
|
+
end
|
114
|
+
|
115
|
+
it "returns nil" do
|
116
|
+
@io.puts.should be_nil
|
117
|
+
end
|
118
|
+
|
119
|
+
it "prints a newline" do
|
120
|
+
@io.puts
|
121
|
+
@io.string.should == "\n"
|
122
|
+
end
|
123
|
+
|
124
|
+
it "does not honor the global output record separator $\\" do
|
125
|
+
begin
|
126
|
+
old_rs, $\ = $\, "test"
|
127
|
+
@io.puts
|
128
|
+
@io.string.should == "\n"
|
129
|
+
ensure
|
130
|
+
$\ = old_rs
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
describe "StringIO#puts when in append mode" do
|
136
|
+
before(:each) do
|
137
|
+
@io = StringIO.new("example", "a")
|
138
|
+
end
|
139
|
+
|
140
|
+
it "appends the passed argument to the end of self" do
|
141
|
+
@io.puts(", just testing")
|
142
|
+
@io.string.should == "example, just testing\n"
|
143
|
+
|
144
|
+
@io.puts(" and more testing")
|
145
|
+
@io.string.should == "example, just testing\n and more testing\n"
|
146
|
+
end
|
147
|
+
|
148
|
+
it "correctly updates self's position" do
|
149
|
+
@io.puts(", testing")
|
150
|
+
@io.pos.should eql(17)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
describe "StringIO#puts when self is not writable" do
|
155
|
+
it "raises an IOError" do
|
156
|
+
io = StringIO.new("test", "r")
|
157
|
+
lambda { io.puts }.should raise_error(IOError)
|
158
|
+
|
159
|
+
io = StringIO.new("test")
|
160
|
+
io.close_write
|
161
|
+
lambda { io.puts }.should raise_error(IOError)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
describe "StringIO#puts when passed an encoded string" do
|
166
|
+
it "stores the bytes unmodified" do
|
167
|
+
io = StringIO.new("")
|
168
|
+
io.puts "\x00\x01\x02"
|
169
|
+
io.puts "æåø"
|
170
|
+
|
171
|
+
io.string.should == "\x00\x01\x02\næåø\n"
|
172
|
+
end
|
173
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require "stringio"
|
2
|
+
require File.expand_path('../shared/read', __FILE__)
|
3
|
+
require File.expand_path('../shared/sysread', __FILE__)
|
4
|
+
|
5
|
+
ruby_version_is "1.9" do
|
6
|
+
describe "StringIO#read_nonblock when passed length, buffer" do
|
7
|
+
it_behaves_like :stringio_read, :read_nonblock
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "StringIO#read_nonblock when passed length" do
|
11
|
+
it_behaves_like :stringio_read_length, :read_nonblock
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "StringIO#read_nonblock when passed no arguments" do
|
15
|
+
it_behaves_like :stringio_read_no_arguments, :read_nonblock
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "StringIO#read_nonblock when self is not readable" do
|
19
|
+
it_behaves_like :stringio_read_not_readable, :read_nonblock
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "StringIO#read_nonblock when passed nil" do
|
23
|
+
it_behaves_like :stringio_read_nil, :read_nonblock
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "StringIO#read_nonblock when passed length" do
|
27
|
+
it_behaves_like :stringio_sysread_length, :read_nonblock
|
28
|
+
end
|
29
|
+
end
|
data/spec/read_spec.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
3
|
+
require "stringio"
|
4
|
+
require File.expand_path('../shared/read', __FILE__)
|
5
|
+
|
6
|
+
describe "StringIO#read when passed length, buffer" do
|
7
|
+
it_behaves_like :stringio_read, :read
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "StringIO#read when passed length" do
|
11
|
+
it_behaves_like :stringio_read_length, :read
|
12
|
+
|
13
|
+
it "returns nil when passed length > 0 and no data remains" do
|
14
|
+
@io.send(@method, 8).should == "example"
|
15
|
+
@io.send(@method, 2).should be_nil
|
16
|
+
end
|
17
|
+
|
18
|
+
# This was filed as a bug in redmine#156 but since MRI refused to change the
|
19
|
+
# 1.8 behavior, it's now considered a version difference by RubySpec since
|
20
|
+
# it could have a significant impact on user code.
|
21
|
+
ruby_version_is ""..."1.9" do
|
22
|
+
it "returns nil when passed 0 and no data remains" do
|
23
|
+
@io.send(@method, 8).should == "example"
|
24
|
+
@io.send(@method, 0).should be_nil
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
ruby_version_is "1.9" do
|
29
|
+
it "returns an empty String when passed 0 and no data remains" do
|
30
|
+
@io.send(@method, 8).should == "example"
|
31
|
+
@io.send(@method, 0).should == ""
|
32
|
+
end
|
33
|
+
|
34
|
+
it "truncates the buffer when limit > 0 and no data remains" do
|
35
|
+
@io.send(@method)
|
36
|
+
@io.send(@method, 2, buffer = "abc").should be_nil
|
37
|
+
buffer.should == ""
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "StringIO#read when passed no arguments" do
|
43
|
+
it_behaves_like :stringio_read_no_arguments, :read
|
44
|
+
|
45
|
+
it "returns an empty string if at EOF" do
|
46
|
+
@io.read.should == "example"
|
47
|
+
@io.read.should == ""
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "StringIO#read when passed nil" do
|
52
|
+
it_behaves_like :stringio_read_nil, :read
|
53
|
+
|
54
|
+
it "returns an empty string if at EOF" do
|
55
|
+
@io.read(nil).should == "example"
|
56
|
+
@io.read(nil).should == ""
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "StringIO#read when self is not readable" do
|
61
|
+
it_behaves_like :stringio_read_not_readable, :read
|
62
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'stringio'
|
2
|
+
require File.expand_path('../shared/readchar', __FILE__)
|
3
|
+
|
4
|
+
ruby_version_is "1.8.7" do
|
5
|
+
describe "StringIO#readbyte" do
|
6
|
+
it_behaves_like :stringio_readchar, :readbyte
|
7
|
+
|
8
|
+
it "reads the next 8-bit byte from self's current position" do
|
9
|
+
io = StringIO.new("example")
|
10
|
+
|
11
|
+
io.send(@method).should == 101
|
12
|
+
|
13
|
+
io.pos = 4
|
14
|
+
io.send(@method).should == 112
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "StringIO#readbyte when self is not readable" do
|
19
|
+
it_behaves_like :stringio_readchar_not_readable, :readbyte
|
20
|
+
end
|
21
|
+
end
|