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 135 136
|
require_relative '../../spec_helper'
require_relative 'fixtures/classes'
describe "IO#lineno" do
before :each do
@io = IOSpecs.io_fixture "lines.txt"
end
after :each do
@io.close if @io
end
it "raises an IOError on a closed stream" do
-> { IOSpecs.closed_io.lineno }.should raise_error(IOError)
end
it "raises an IOError on a write-only stream" do
name = tmp("io_lineno.txt")
begin
File.open(name, 'w') do |f|
-> { f.lineno }.should raise_error(IOError)
end
ensure
rm_r name
end
end
it "raises an IOError on a duplexed stream with the read side closed" do
IO.popen('cat', 'r+') do |p|
p.close_read
-> { p.lineno }.should raise_error(IOError)
end
end
it "returns the current line number" do
@io.lineno.should == 0
count = 0
while @io.gets
@io.lineno.should == count += 1
end
@io.rewind
@io.lineno.should == 0
end
end
describe "IO#lineno=" do
before :each do
@io = IOSpecs.io_fixture "lines.txt"
end
after :each do
@io.close if @io
end
it "raises an IOError on a closed stream" do
-> { IOSpecs.closed_io.lineno = 5 }.should raise_error(IOError)
end
it "raises an IOError on a write-only stream" do
name = tmp("io_lineno.txt")
begin
File.open(name, 'w') do |f|
-> { f.lineno = 0 }.should raise_error(IOError)
end
ensure
rm_r name
end
end
it "raises an IOError on a duplexed stream with the read side closed" do
IO.popen('cat', 'r+') do |p|
p.close_read
-> { p.lineno = 0 }.should raise_error(IOError)
end
end
it "calls #to_int on a non-numeric argument" do
obj = mock('123')
obj.should_receive(:to_int).and_return(123)
@io.lineno = obj
@io.lineno.should == 123
end
it "truncates a Float argument" do
@io.lineno = 1.5
@io.lineno.should == 1
@io.lineno = 92233.72036854775808
@io.lineno.should == 92233
end
it "raises TypeError if cannot convert argument to Integer implicitly" do
-> { @io.lineno = "1" }.should raise_error(TypeError, 'no implicit conversion of String into Integer')
-> { @io.lineno = nil }.should raise_error(TypeError, 'no implicit conversion from nil to integer')
end
it "does not accept Integers that don't fit in a C int" do
-> { @io.lineno = 2**32 }.should raise_error(RangeError)
end
it "sets the current line number to the given value" do
@io.lineno = count = 500
while @io.gets
@io.lineno.should == count += 1
end
@io.rewind
@io.lineno.should == 0
end
it "does not change $." do
original_line = $.
numbers = [-2**30, -2**16, -2**8, -100, -10, -1, 0, 1, 10, 2**8, 2**16, 2**30]
numbers.each do |num|
@io.lineno = num
@io.lineno.should == num
$..should == original_line
end
end
it "does not change $. until next read" do
$. = 0
$..should == 0
@io.lineno = count = 500
$..should == 0
while @io.gets
$..should == count += 1
end
end
end
|