1 require File.dirname(__FILE__) + '/../../spec_helper'
2 require File.dirname(__FILE__) + '/fixtures/classes'
4 describe "ARGF.seek" do
7 @file1 = ARGFSpecs.fixture_file('file1.txt')
8 @file2 = ARGFSpecs.fixture_file('file2.txt')
9 @stdin = ARGFSpecs.fixture_file('stdin.txt')
10 @contents_file1 = File.read(@file1)
11 @contents_file2 = File.read(@file2)
12 @contents_stdin = File.read(@stdin)
16 # Close any open file (catch exception if already closed)
18 ARGFSpecs.fixture_file_delete(@file1,@file2,@stdin)
21 it "sets the correct absolute position relative to beginning of file" do
22 ARGFSpecs.file_args('file1.txt', 'file2.txt')
23 linef1_1, linef1_2 = @contents_file1.split($/).collect { |l| l+$/ }
24 linef2_1, linef2_2 = @contents_file2.split($/).collect { |l| l+$/ }
27 ARGF.seek(2); res << ARGF.gets
28 ARGF.seek(linef1_1.size); res << ARGF.gets
29 ARGF.seek(0, IO::SEEK_END); res << ARGF.gets
31 res.should == [linef1_1[2..-1], linef1_2, linef2_1]
34 it "sets the correct position relative to current position in file" do
35 ARGFSpecs.file_args('file1.txt', 'file2.txt')
36 linef1_1, linef1_2 = @contents_file1.split($/).collect { |l| l+$/ }
37 linef2_1, linef2_2 = @contents_file2.split($/).collect { |l| l+$/ }
40 ARGF.seek(0, IO::SEEK_CUR); res << ARGF.gets
41 ARGF.seek(-linef1_1.size+2, IO::SEEK_CUR); res << ARGF.gets
42 ARGF.seek(1, IO::SEEK_CUR); res << ARGF.gets
43 ARGF.seek(3, IO::SEEK_CUR); res << ARGF.gets # seek doesn't go beyond file limit
44 ARGF.seek(linef1_2.size, IO::SEEK_CUR); res << ARGF.gets
46 res.should == [linef1_1, linef1_1[2..-1], linef1_2[1..-1], linef2_1, nil]
49 it "sets the correct absolute position relative to end of file" do
50 ARGFSpecs.file_args('file1.txt', 'file2.txt')
51 linef1_1, linef1_2 = @contents_file1.split($/).collect { |l| l+$/ }
52 linef2_1, linef2_2 = @contents_file2.split($/).collect { |l| l+$/ }
55 ARGF.seek(-linef1_1.size-linef1_2.size, IO::SEEK_END); res << ARGF.gets
56 ARGF.seek(-6, IO::SEEK_END); res << ARGF.gets
57 ARGF.seek(-4, IO::SEEK_END); res << ARGF.gets
59 ARGF.seek(-6, IO::SEEK_END); res << ARGF.gets
61 res.should == [linef1_1, linef1_2[-6..-1], linef1_2[4..-1], linef2_1, linef2_2[-6..-1]]
64 it "takes at least one argument (offset)" do
65 lambda { ARGF.seek() }.should raise_error(ArgumentError)