io-like 0.3.1 → 0.4.0.pre1

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.
Files changed (71) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +1 -1
  3. data/NEWS.md +14 -1
  4. data/README.md +75 -94
  5. data/lib/io/like.rb +1916 -1314
  6. data/lib/io/like_helpers/abstract_io.rb +512 -0
  7. data/lib/io/like_helpers/blocking_io.rb +86 -0
  8. data/lib/io/like_helpers/buffered_io.rb +555 -0
  9. data/lib/io/like_helpers/character_io/basic_reader.rb +122 -0
  10. data/lib/io/like_helpers/character_io/converter_reader.rb +252 -0
  11. data/lib/io/like_helpers/character_io.rb +529 -0
  12. data/lib/io/like_helpers/delegated_io.rb +250 -0
  13. data/lib/io/like_helpers/duplexed_io.rb +259 -0
  14. data/lib/io/like_helpers/io.rb +21 -0
  15. data/lib/io/like_helpers/io_wrapper.rb +290 -0
  16. data/lib/io/like_helpers/pipeline.rb +77 -0
  17. data/lib/io/like_helpers/ruby_facts.rb +33 -0
  18. data/lib/io/like_helpers.rb +14 -0
  19. metadata +107 -224
  20. data/.yardopts +0 -1
  21. data/Rakefile +0 -228
  22. data/ruby.1.8.mspec +0 -7
  23. data/spec/binmode_spec.rb +0 -29
  24. data/spec/close_read_spec.rb +0 -64
  25. data/spec/close_spec.rb +0 -36
  26. data/spec/close_write_spec.rb +0 -61
  27. data/spec/closed_spec.rb +0 -16
  28. data/spec/each_byte_spec.rb +0 -38
  29. data/spec/each_line_spec.rb +0 -11
  30. data/spec/each_spec.rb +0 -11
  31. data/spec/eof_spec.rb +0 -11
  32. data/spec/fixtures/classes.rb +0 -96
  33. data/spec/fixtures/gets.txt +0 -9
  34. data/spec/fixtures/numbered_lines.txt +0 -5
  35. data/spec/fixtures/one_byte.txt +0 -1
  36. data/spec/fixtures/paragraphs.txt +0 -7
  37. data/spec/fixtures/readlines.txt +0 -6
  38. data/spec/flush_spec.rb +0 -8
  39. data/spec/getc_spec.rb +0 -44
  40. data/spec/gets_spec.rb +0 -212
  41. data/spec/isatty_spec.rb +0 -6
  42. data/spec/lineno_spec.rb +0 -84
  43. data/spec/output_spec.rb +0 -47
  44. data/spec/pos_spec.rb +0 -53
  45. data/spec/print_spec.rb +0 -97
  46. data/spec/printf_spec.rb +0 -24
  47. data/spec/putc_spec.rb +0 -57
  48. data/spec/puts_spec.rb +0 -99
  49. data/spec/read_spec.rb +0 -162
  50. data/spec/readchar_spec.rb +0 -49
  51. data/spec/readline_spec.rb +0 -60
  52. data/spec/readlines_spec.rb +0 -140
  53. data/spec/readpartial_spec.rb +0 -92
  54. data/spec/rewind_spec.rb +0 -56
  55. data/spec/seek_spec.rb +0 -72
  56. data/spec/shared/each.rb +0 -204
  57. data/spec/shared/eof.rb +0 -116
  58. data/spec/shared/pos.rb +0 -39
  59. data/spec/shared/tty.rb +0 -12
  60. data/spec/shared/write.rb +0 -53
  61. data/spec/sync_spec.rb +0 -56
  62. data/spec/sysread_spec.rb +0 -87
  63. data/spec/sysseek_spec.rb +0 -68
  64. data/spec/syswrite_spec.rb +0 -60
  65. data/spec/tell_spec.rb +0 -7
  66. data/spec/to_io_spec.rb +0 -19
  67. data/spec/tty_spec.rb +0 -6
  68. data/spec/ungetc_spec.rb +0 -118
  69. data/spec/write_spec.rb +0 -61
  70. data/spec_helper.rb +0 -49
  71. /data/{LICENSE-rubyspec → rubyspec/LICENSE} +0 -0
data/spec/lineno_spec.rb DELETED
@@ -1,84 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require File.dirname(__FILE__) + '/fixtures/classes'
3
-
4
- describe "IO::Like#lineno" do
5
- it "raises IOError on closed stream" do
6
- lambda { IOSpecs.closed_file.lineno }.should raise_error(IOError)
7
- end
8
-
9
- it "returns the current line number" do
10
- IOSpecs.readable_iowrapper do |f|
11
- f.lineno.should == 0
12
- while (f.gets)
13
- f.lineno.should > 0
14
- end
15
- f.rewind
16
- f.lineno.should == 0
17
- end
18
- end
19
- end
20
-
21
- describe "IO::Like#lineno=" do
22
- it "raises IOError on closed stream" do
23
- lambda { IOSpecs.closed_file.lineno = 5 }.should raise_error(IOError)
24
- end
25
-
26
- it "invokes to_int on non-numeric arguments" do
27
- (obj = mock('123')).should_receive(:to_int).and_return(123)
28
- IOSpecs.readable_iowrapper do |f|
29
- f.lineno = obj
30
- f.lineno.should == 123
31
-
32
- f.lineno = 1.5
33
- f.lineno.should == 1
34
-
35
- f.lineno = 92233.72036854775808
36
- f.lineno.should == 92233
37
- end
38
- end
39
-
40
- it "raises TypeError on nil argument" do
41
- IOSpecs.readable_iowrapper do |f|
42
- lambda { f.lineno = nil }.should raise_error(TypeError)
43
- end
44
- end
45
-
46
- it "sets the current line number to the given value" do
47
- IOSpecs.readable_iowrapper do |f|
48
- count = 500
49
- f.lineno = count - 1
50
- while (f.gets)
51
- f.lineno.should == count
52
- count += 1
53
- end
54
- f.rewind
55
- f.lineno.should == 0
56
- end
57
- end
58
-
59
- it "does not change $." do
60
- orig_value = $.
61
- IOSpecs.readable_iowrapper do |f|
62
- numbers = [-2**30, -2**16, -2**8, -100, -10, -1, 0, 1, 10, 2**8, 2**16, 2**30]
63
- numbers.each { |num|
64
- f.lineno = num
65
- f.lineno.should == num
66
- $..should == orig_value
67
- }
68
- end
69
- end
70
-
71
- it "does not change $. until next read" do
72
- $. = 0
73
- IOSpecs.readable_iowrapper do |f|
74
- $..should == 0
75
- count = 500
76
- f.lineno = count - 1
77
- $..should == 0
78
- while (f.gets)
79
- $..should == count
80
- count += 1
81
- end
82
- end
83
- end
84
- end
data/spec/output_spec.rb DELETED
@@ -1,47 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require File.dirname(__FILE__) + '/fixtures/classes'
3
- require File.dirname(__FILE__) + '/shared/write'
4
-
5
- describe "IO::Like#<<" do
6
- before :each do
7
- @filename = tmp("IO_Like__write_test")
8
- @content = "012345678901234567890123456789"
9
- File.open(@filename, "w") { |f| f.syswrite(@content) }
10
- @file = File.open(@filename, "r+")
11
- @iowrapper = IOWrapper.open(@file)
12
- end
13
-
14
- after :each do
15
- @iowrapper.close unless @iowrapper.closed?
16
- @file.close unless @file.closed?
17
- File.delete(@filename)
18
- end
19
-
20
- it "returns a reference to the stream" do
21
- (@iowrapper << 'abcde').should == @iowrapper
22
- end
23
-
24
- it "writes all of the string's bytes without buffering if mode is sync" do
25
- @iowrapper.sync = true
26
- @iowrapper << "abcde"
27
- File.open(@filename) do |file|
28
- file.read(10).should == "abcde56789"
29
- end
30
- end
31
-
32
- it "does not raise IOError on read-only stream if writing zero bytes" do
33
- lambda do
34
- IOSpecs.readable_iowrapper do |iowrapper|
35
- iowrapper << ""
36
- end
37
- end.should_not raise_error
38
- end
39
-
40
- it "does not raise IOError on closed stream if writing zero bytes" do
41
- lambda { IOSpecs.closed_file << "" }.should_not raise_error
42
- end
43
- end
44
-
45
- describe "IO::Like#<<" do
46
- it_behaves_like :io_like__write, :<<
47
- end
data/spec/pos_spec.rb DELETED
@@ -1,53 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require File.dirname(__FILE__) + '/fixtures/classes'
3
- require File.dirname(__FILE__) + '/shared/pos'
4
-
5
- describe "IO::Like#pos" do
6
- it_behaves_like(:io_like__pos, :pos)
7
- end
8
-
9
- describe "IO::Like#pos=" do
10
- before :each do
11
- @fname = 'test.txt'
12
- File.open(@fname, 'w') { |f| f.write("123") }
13
- end
14
-
15
- after :each do
16
- File.unlink(@fname)
17
- end
18
-
19
- it "sets the offset" do
20
- File.open(@fname) do |f|
21
- ReadableIOWrapper.open(f) do |iowrapper|
22
- val1 = iowrapper.read(1)
23
- iowrapper.pos = 0
24
- iowrapper.read(1).should == val1
25
- end
26
- end
27
- end
28
-
29
- it "can handle any numerical argument without breaking" do
30
- File.open(@fname) do |f|
31
- ReadableIOWrapper.open(f) do |iowrapper|
32
- iowrapper.pos = 1.2
33
- iowrapper.pos.should == 1
34
-
35
- iowrapper.pos = 2**32
36
- iowrapper.pos.should == 2**32
37
-
38
- iowrapper.pos = 1.23423423432e12
39
- iowrapper.pos.should == Integer(1.23423423432e12)
40
-
41
- iowrapper.pos = Float::EPSILON
42
- iowrapper.pos.should == 0
43
-
44
- lambda { iowrapper.pos = 2**128 }.should raise_error(RangeError)
45
- end
46
- end
47
- end
48
-
49
- it "raises IOError on closed stream" do
50
- lambda { IOSpecs.closed_file.pos = 0 }.should raise_error(IOError)
51
- end
52
- end
53
-
data/spec/print_spec.rb DELETED
@@ -1,97 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require File.dirname(__FILE__) + '/fixtures/classes'
3
-
4
- describe "IO::Like#print" do
5
- before :each do
6
- @old_record_separator = $\
7
- @old_field_separator = $,
8
- @filename = tmp('IO_Like__print_test')
9
- @file = File.open(@filename, 'w')
10
- @file.sync = true
11
- @iowrapper = WritableIOWrapper.open(@file)
12
- @iowrapper.sync = true
13
- end
14
-
15
- after :each do
16
- $\ = @old_record_separator
17
- $, = @old_field_separator
18
- @iowrapper.close unless @iowrapper.closed?
19
- @file.close unless @file.closed?
20
- end
21
-
22
- it "returns nil" do
23
- @iowrapper.print('hello').should == nil
24
- end
25
-
26
- # MRI LIMITATION:
27
- # $_ will not cross into the implementation of print since its value is
28
- # limited to the local scope in managed code.
29
- #
30
- #it "writes $_ by default" do
31
- # $_ = 'hello'
32
- # @iowrapper.print()
33
- # @iowrapper.close
34
- # @file.close
35
- # File.read(@filename).should == "hello\n"
36
- #end
37
-
38
- it "coerces arguments to strings using to_s" do
39
- data = 'abcdefgh9876'
40
- (obj = mock('test')).should_receive(:to_s).and_return(data)
41
- @iowrapper.print(obj)
42
- File.read(@filename).should == data
43
- end
44
-
45
- it "writes nil arguments as \"nil\"" do
46
- @iowrapper.print(nil)
47
- File.read(@filename).should == "nil"
48
- end
49
-
50
- it "appends $\\ to the output" do
51
- $\ = '->'
52
- data = 'abcdefgh9876'
53
- @iowrapper.print(data)
54
- File.read(@filename).should == "#{data}#{$\}"
55
- end
56
-
57
- it "does not append $\\ to the output when it is nil" do
58
- $\ = nil
59
- data = 'abcdefgh9876'
60
- @iowrapper.print(data)
61
- File.read(@filename).should == data
62
- end
63
-
64
- it "writes $, between arguments" do
65
- $, = '->'
66
- data1 = 'abcdefgh9876'
67
- data2 = '12345678zyxw'
68
- @iowrapper.print(data1, data2)
69
- File.read(@filename).should == "#{data1}#{$,}#{data2}"
70
- end
71
-
72
- it "does not write $, between arguments when it is nil" do
73
- $, = nil
74
- data1 = 'abcdefgh9876'
75
- data2 = '12345678zyxw'
76
- @iowrapper.print(data1, data2)
77
- File.read(@filename).should == "#{data1}#{data2}"
78
- end
79
-
80
- it "does not check if the file is writable if writing zero bytes" do
81
- lambda { IOSpecs.readable_iowrapper.print("") }.should_not raise_error
82
- end
83
-
84
- it "checks if the file is writable if writing more than zero bytes" do
85
- lambda do
86
- IOSpecs.readable_iowrapper.print("hello")
87
- end.should raise_error(IOError)
88
- end
89
-
90
- it "does not raise IOError on closed stream if writing zero bytes" do
91
- lambda { IOSpecs.closed_file.print("") }.should_not raise_error
92
- end
93
-
94
- it "raises IOError on closed stream if writing more than zero bytes" do
95
- lambda { IOSpecs.closed_file.print("hello") }.should raise_error(IOError)
96
- end
97
- end
data/spec/printf_spec.rb DELETED
@@ -1,24 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require File.dirname(__FILE__) + '/fixtures/classes'
3
-
4
- describe "IO::Like#printf" do
5
- before :each do
6
- @io = IO.new(STDOUT.fileno, 'w')
7
- @iowrapper = WritableIOWrapper.open(@io)
8
- @iowrapper.sync = true
9
- end
10
-
11
- after :each do
12
- @iowrapper.close unless @iowrapper.closed?
13
- end
14
-
15
- it "writes the #sprintf formatted string to the file descriptor" do
16
- lambda do
17
- @io.printf("%s\n", "look ma, no hands")
18
- end.should output_to_fd("look ma, no hands\n", @io)
19
- end
20
-
21
- it "raises IOError on closed stream" do
22
- lambda { IOSpecs.closed_file.printf("stuff") }.should raise_error(IOError)
23
- end
24
- end
data/spec/putc_spec.rb DELETED
@@ -1,57 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require File.dirname(__FILE__) + '/fixtures/classes'
3
-
4
- describe "IO::Like#putc" do
5
- before :each do
6
- @filename = tmp('IO_Like__putc_test')
7
- @file = File.open(@filename, 'w')
8
- @file.sync = true
9
- @iowrapper = WritableIOWrapper.open(@file)
10
- @iowrapper.sync = true
11
- end
12
-
13
- after :each do
14
- @iowrapper.close unless @iowrapper.closed?
15
- @file.close unless @file.closed?
16
- File.unlink @filename
17
- end
18
-
19
- it "returns a reference to the object" do
20
- @iowrapper.putc('a').should == 'a'
21
- @iowrapper.putc(128).should == 128
22
- end
23
-
24
- it "writes the first byte of a String" do
25
- @iowrapper.putc("foo")
26
- File.read(@filename).should == 'f'
27
- end
28
-
29
- it "writes the first byte of an object's string representation" do
30
- (obj = mock('test')).should_receive(:to_int).and_return(261)
31
- @iowrapper.putc(obj)
32
- File.read(@filename).should == "\005"
33
- end
34
-
35
- it "writes Numerics that fit in a C char" do
36
- @iowrapper.putc(-128)
37
- @iowrapper.putc(0)
38
- @iowrapper.putc(255)
39
-
40
- File.read(@filename).should == "\200\000\377"
41
- end
42
-
43
- it "write the first byte of Numerics that don't fit in a C char" do
44
- @iowrapper.putc(-129)
45
- @iowrapper.putc(256)
46
-
47
- File.read(@filename).should == "\177\000"
48
- end
49
-
50
- it "checks if the stream is writable" do
51
- lambda { IOSpecs.readable_iowrapper.putc('a') }.should raise_error(IOError)
52
- end
53
-
54
- it "raises IOError on closed stream" do
55
- lambda { IOSpecs.closed_file.putc('a') }.should raise_error(IOError)
56
- end
57
- end
data/spec/puts_spec.rb DELETED
@@ -1,99 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require File.dirname(__FILE__) + '/fixtures/classes'
3
-
4
- # TODO: need to find a better way to test this. Too fragile to set expectations
5
- # to each write call. Only care that all the characters are sent not the number
6
- # or write calls. Also, these tests do not make sure the ordering of the write calls
7
- # are correct.
8
- describe "IO::Like#puts" do
9
- before :each do
10
- @old_record_separator = $\
11
- @old_field_separator = $,
12
- @filename = tmp('IO_Like__print_test')
13
- @file = File.open(@filename, 'w')
14
- @file.sync = true
15
- @iowrapper = WritableIOWrapper.open(@file)
16
- @iowrapper.sync = true
17
- end
18
-
19
- after :each do
20
- $\ = @old_record_separator
21
- $, = @old_field_separator
22
- @iowrapper.close unless @iowrapper.closed?
23
- @file.close unless @file.closed?
24
- end
25
-
26
- it "returns nil" do
27
- @iowrapper.puts('hello').should == nil
28
- end
29
-
30
- it "writes just a newline when given no args" do
31
- @iowrapper.puts()
32
- File.read(@filename).should == "\n"
33
- end
34
-
35
- it "writes just a newline when given just a newline" do
36
- @iowrapper.puts("\n")
37
- File.read(@filename).should == "\n"
38
- end
39
-
40
- it "writes nil with a newline when given nil as an arg" do
41
- @iowrapper.puts(nil)
42
- File.read(@filename).should == "nil\n"
43
- end
44
-
45
- it "coerces arguments to strings using to_s" do
46
- data = 'abcdefgh9876'
47
- (obj = mock('test')).should_receive(:to_s).and_return(data)
48
- @iowrapper.puts(obj)
49
- File.read(@filename).should == "#{data}\n"
50
- end
51
-
52
- it "writes each arg if given several" do
53
- data1 = 'abcdefgh9876'
54
- data2 = '12345678zyxw'
55
- @iowrapper.puts(data1, data2)
56
- File.read(@filename).should == "#{data1}\n#{data2}\n"
57
- end
58
-
59
- it "flattens a nested array before writing it" do
60
- data = ['abcdefgh9876', '12345678zyxw']
61
- @iowrapper.puts(data)
62
- File.read(@filename).should == "#{data[0]}\n#{data[1]}\n"
63
- end
64
-
65
- it "writes [...] for a recursive array arg" do
66
- data = []
67
- data << 1 << data << 2
68
- @iowrapper.puts(data)
69
- File.read(@filename).should == "#{data[0]}\n[...]\n#{data[2]}\n"
70
- end
71
-
72
- it "writes a newline after objects that do not end in newlines" do
73
- data = 'abcdefgh9876'
74
- @iowrapper.puts(data)
75
- File.read(@filename).should == "#{data}\n"
76
- end
77
-
78
- it "does not write a newline after objects that end in newlines" do
79
- data = "abcdefgh9876\n"
80
- @iowrapper.puts(data)
81
- File.read(@filename).should == data
82
- end
83
-
84
- it "ignores the $\ separator global" do
85
- $\ = ":"
86
- data1 = 'abcdefgh9876'
87
- data2 = '12345678zyxw'
88
- @iowrapper.puts(data1, data2)
89
- File.read(@filename).should == "#{data1}\n#{data2}\n"
90
- end
91
-
92
- it "raises IOError on read-only stream" do
93
- lambda { IOSpecs.readable_iowrapper.puts }.should raise_error(IOError)
94
- end
95
-
96
- it "raises IOError on closed stream" do
97
- lambda { IOSpecs.closed_file.puts }.should raise_error(IOError)
98
- end
99
- end
data/spec/read_spec.rb DELETED
@@ -1,162 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require File.dirname(__FILE__) + '/fixtures/classes'
3
-
4
- describe "IO::Like#read" do
5
- before :each do
6
- @filename = tmp('IO_Like__read_test')
7
- @contents = "1234567890"
8
- File.open(@filename, "w") { |io| io.write(@contents) }
9
-
10
- @file = File.open(@filename, "r+")
11
- @iowrapper = IOWrapper.open(@file)
12
- end
13
-
14
- after :each do
15
- @iowrapper.close unless @iowrapper.closed?
16
- @file.close unless @file.closed?
17
- File.delete(@filename) if File.exists?(@filename)
18
- end
19
-
20
- it "can be read from consecutively" do
21
- @iowrapper.read(1).should == '1'
22
- @iowrapper.read(2).should == '23'
23
- @iowrapper.read(3).should == '456'
24
- @iowrapper.read(4).should == '7890'
25
- end
26
-
27
- it "can read lots of data" do
28
- data = "\xaa" * (8096 * 2 + 1024) # HACK IO::BufferSize
29
- File.open(@filename, 'w') { |io| io.write(data) }
30
- actual = nil
31
- File.open(@filename, 'r') { |io| actual = io.read }
32
-
33
- actual.length.should == data.length
34
- actual.split('').all? { |c| c == "\xaa" }.should == true
35
- end
36
-
37
- it "can read lots of data with length" do
38
- read_length = 8096 * 2 + 1024 # HACK IO::BufferSize
39
- data = "\xaa" * (read_length + 8096) # HACK same
40
- File.open(@filename, 'w') { |io| io.write(data) }
41
- actual = nil
42
- File.open(@filename, 'r') { |io| actual = io.read(read_length) }
43
-
44
- actual.length.should == read_length
45
- actual.split('').all? { |c| c == "\xaa" }.should == true
46
- end
47
-
48
- it "consumes zero bytes when reading zero bytes" do
49
- pre_pos = @iowrapper.pos
50
-
51
- @iowrapper.read(0).should == ''
52
- @iowrapper.getc.chr.should == '1'
53
- end
54
-
55
- it "is at end-of-file when everything has been read" do
56
- @iowrapper.read
57
- @iowrapper.eof?.should == true
58
- end
59
-
60
- it "reads the contents of a file" do
61
- @iowrapper.read.should == @contents
62
- end
63
-
64
- it "places the specified number of bytes in the buffer" do
65
- buf = ""
66
- @iowrapper.read(5, buf)
67
-
68
- buf.should == "12345"
69
- end
70
-
71
- it "expands the buffer when too small" do
72
- buf = "ABCDE"
73
- @iowrapper.read(nil, buf)
74
-
75
- buf.should == @contents
76
- end
77
-
78
- it "overwrites the buffer" do
79
- buf = "ABCDEFGHIJ"
80
- @iowrapper.read(nil, buf)
81
-
82
- buf.should == @contents
83
- end
84
-
85
- it "truncates the buffer when too big" do
86
- buf = "ABCDEFGHIJKLMNO"
87
- @iowrapper.read(nil, buf)
88
- buf.should == @contents
89
-
90
- @iowrapper.rewind
91
- buf = "ABCDEFGHIJKLMNO"
92
- @iowrapper.read(5, buf)
93
- buf.should == @contents[0..4]
94
- end
95
-
96
- it "returns the given buffer" do
97
- buf = ""
98
-
99
- @iowrapper.read(nil, buf).object_id.should == buf.object_id
100
- end
101
-
102
- it "coerces the second argument to string and uses it as a buffer" do
103
- buf = "ABCDE"
104
- obj = mock("buff")
105
- obj.should_receive(:to_str).any_number_of_times.and_return(buf)
106
-
107
- @iowrapper.read(15, obj).object_id.should_not == obj.object_id
108
- buf.should == @contents
109
- end
110
-
111
- it "returns an empty string at end-of-file" do
112
- @iowrapper.read
113
- @iowrapper.read.should == ''
114
- end
115
-
116
- it "reads the contents of a file when more bytes are specified" do
117
- @iowrapper.read(@contents.length + 1).should == @contents
118
- end
119
-
120
- it "reads all data available before a SystemCallError is raised" do
121
- # Overrride @file.sysread to raise SystemCallError every other time it's
122
- # called.
123
- class << @file
124
- alias :sysread_orig :sysread
125
- def sysread(length)
126
- if @error_raised then
127
- @error_raised = false
128
- sysread_orig(length)
129
- else
130
- @error_raised = true
131
- raise SystemCallError, 'Test Error'
132
- end
133
- end
134
- end
135
-
136
- lambda { @iowrapper.read }.should raise_error(SystemCallError)
137
- @iowrapper.read.should == @contents
138
- end
139
-
140
- it "returns an empty string when the current pos is bigger than the content size" do
141
- @iowrapper.pos = 1000
142
- @iowrapper.read.should == ''
143
- end
144
-
145
- it "returns nil at end-of-file with a length" do
146
- @iowrapper.read
147
- @iowrapper.read(1).should == nil
148
- end
149
-
150
- it "with length argument returns nil when the current pos is bigger than the content size" do
151
- @iowrapper.pos = 1000
152
- @iowrapper.read(1).should == nil
153
- end
154
-
155
- it "raises IOError on write-only stream" do
156
- lambda { IOSpecs.writable_iowrapper.read }.should raise_error(IOError)
157
- end
158
-
159
- it "raises IOError on closed stream" do
160
- lambda { IOSpecs.closed_file.read }.should raise_error(IOError)
161
- end
162
- end
@@ -1,49 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require File.dirname(__FILE__) + '/fixtures/classes'
3
-
4
- describe "IO::Like#readchar" do
5
- before :each do
6
- @file_name = File.dirname(__FILE__) + '/fixtures/readlines.txt'
7
- @io = File.open(@file_name, 'r')
8
- @iowrapper = IOWrapper.open(@io)
9
- end
10
-
11
- after :each do
12
- @iowrapper.close unless @iowrapper.closed?
13
- @io.close unless @io.closed?
14
- end
15
-
16
- it "returns the next byte from the stream" do
17
- @io.readchar.should == 86
18
- @io.readchar.should == 111
19
- @io.readchar.should == 105
20
- # read the rest of line
21
- @io.readline.should == "ci la ligne une.\n"
22
- @io.readchar.should == 81
23
- end
24
-
25
- it "raises EOFError when invoked at the end of the stream" do
26
- # read entire content
27
- @io.read
28
- lambda { @io.readchar }.should raise_error(EOFError)
29
- end
30
-
31
- it "raises EOFError when reaches the end of the stream" do
32
- lambda { loop { @io.readchar } }.should raise_error(EOFError)
33
- end
34
-
35
- it "raises EOFError on empty stream" do
36
- path = tmp('empty.txt')
37
- File.open(path, "w+") do |empty|
38
- IOWrapper.open(empty) do |iowrapper|
39
- lambda { iowrapper.readchar }.should raise_error(EOFError)
40
- end
41
- end
42
-
43
- File.unlink(path)
44
- end
45
-
46
- it "raises IOError on closed stream" do
47
- lambda { IOSpecs.closed_file.readchar }.should raise_error(IOError)
48
- end
49
- end