mnoble-fakefs 0.3.1

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.
@@ -0,0 +1,39 @@
1
+ require "test_helper"
2
+
3
+ class FileStat < Test::Unit::TestCase
4
+ def setup
5
+ FakeFS.activate!
6
+ FakeFS::FileSystem.clear
7
+ end
8
+
9
+ def teardown
10
+ FakeFS.deactivate!
11
+ end
12
+
13
+ def test_calling_stat_should_create_a_new_file_stat_object
14
+ File.open("foo", "w") do |f|
15
+ f << "bar"
16
+ end
17
+
18
+ File.open("foo") do |f|
19
+ assert_equal File::Stat, f.stat.class
20
+ end
21
+ end
22
+
23
+ def test_stat_should_use_correct_file
24
+ File.open("bar", "w") do |f|
25
+ f << "1"
26
+ end
27
+
28
+ File.open("bar") do |f|
29
+ assert_equal 1, f.stat.size
30
+ end
31
+ end
32
+
33
+ def test_stat_should_report_on_symlink_pointer
34
+ File.open("foo", "w") { |f| f << "some content" }
35
+ File.symlink "foo", "my_symlink"
36
+
37
+ assert_equal File.stat("my_symlink").size, File.stat("foo").size
38
+ end
39
+ end
@@ -0,0 +1,44 @@
1
+ require "test_helper"
2
+
3
+ class FileSysSeek < Test::Unit::TestCase
4
+ def setup
5
+ FakeFS.activate!
6
+ FakeFS::FileSystem.clear
7
+ end
8
+
9
+ def teardown
10
+ FakeFS.deactivate!
11
+ end
12
+
13
+ def test_should_seek_to_position
14
+ file = File.open("foo", "w") do |f|
15
+ f << "0123456789"
16
+ end
17
+
18
+ File.open("foo", "r") do |f|
19
+ f.sysseek(3)
20
+ assert_equal 3, f.pos
21
+
22
+ f.sysseek(0)
23
+ assert_equal 0, f.pos
24
+ end
25
+ end
26
+
27
+ def test_seek_returns_offset_into_file
28
+ File.open("foo", "w") do |f|
29
+ # 66 chars long
30
+ str = "0123456789" +
31
+ "0123456789" +
32
+ "0123456789" +
33
+ "0123456789" +
34
+ "0123456789" +
35
+ "0123456789" +
36
+ "012345"
37
+
38
+ f << str
39
+ end
40
+
41
+ f = File.open("foo")
42
+ assert_equal 53, f.sysseek(-13, IO::SEEK_END)
43
+ end
44
+ end
@@ -0,0 +1,62 @@
1
+ require "test_helper"
2
+
3
+ class FileSysWriteTest < Test::Unit::TestCase
4
+ def setup
5
+ FakeFS.activate!
6
+ FakeFS::FileSystem.clear
7
+ end
8
+
9
+ def teardown
10
+ FakeFS.deactivate!
11
+ end
12
+
13
+ def test_returns_one_byte_when_written
14
+ f = File.open "foo", "w"
15
+ result = f.syswrite "a"
16
+ assert_equal 1, result
17
+ end
18
+
19
+ def test_returns_two_bytes_when_two_written
20
+ f = File.open "foo", "w"
21
+ result = f.syswrite "ab"
22
+ assert_equal 2, result
23
+ end
24
+
25
+ def test_syswrite_writes_file
26
+ f = File.open "foo", "w"
27
+ f.syswrite "abcdef"
28
+ f.close
29
+
30
+ assert_equal "abcdef", File.read("foo")
31
+ end
32
+
33
+ def test_writes_to_the_actual_position_when_called_after_buffered_io_read
34
+ File.open("foo", "w") do |file|
35
+ file.syswrite("012345678901234567890123456789")
36
+ end
37
+
38
+ file = File.open("foo", "r+")
39
+ file.read(5)
40
+ file.syswrite("abcde")
41
+
42
+ File.open("foo") do |file|
43
+ assert_equal "01234abcde", file.sysread(10)
44
+ end
45
+ end
46
+
47
+ def test_writes_all_of_the_strings_bytes_but_does_not_buffer_them
48
+ File.open("foo", "w") do |file|
49
+ file.syswrite("012345678901234567890123456789")
50
+ end
51
+
52
+ file = File.open("foo", "r+")
53
+ written = file.syswrite("abcde")
54
+
55
+ File.open("foo") do |file|
56
+ assert_equal "abcde56789", file.sysread(10)
57
+ file.seek(0)
58
+ file.fsync
59
+ assert_equal "abcde56789", file.sysread(10)
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,97 @@
1
+ require "test_helper"
2
+
3
+ class FakeFileTest < Test::Unit::TestCase
4
+ include FakeFS
5
+
6
+ def setup
7
+ FileSystem.clear
8
+
9
+ @file = FakeFile.new
10
+ end
11
+
12
+ def test_fake_file_has_empty_content_by_default
13
+ assert_equal "", @file.content
14
+ end
15
+
16
+ def test_fake_file_can_read_and_write_to_content
17
+ @file.content = "foobar"
18
+ assert_equal "foobar", @file.content
19
+ end
20
+
21
+ def test_fake_file_has_1_link_by_default
22
+ assert_equal [@file], @file.links
23
+ end
24
+
25
+ def test_fake_file_can_create_link
26
+ other_file = FakeFile.new
27
+
28
+ @file.link(other_file)
29
+
30
+ assert_equal [@file, other_file], @file.links
31
+ end
32
+
33
+ def test_fake_file_wont_add_link_to_same_file_twice
34
+ other_file = FakeFile.new
35
+
36
+ @file.link other_file
37
+ @file.link other_file
38
+
39
+ assert_equal [@file, other_file], @file.links
40
+ end
41
+
42
+ def test_links_are_mutual
43
+ other_file = FakeFile.new
44
+
45
+ @file.link(other_file)
46
+
47
+ assert_equal [@file, other_file], other_file.links
48
+ end
49
+
50
+ def test_can_link_multiple_files
51
+ file_two = FakeFile.new
52
+ file_three = FakeFile.new
53
+
54
+ @file.link file_two
55
+ @file.link file_three
56
+
57
+ assert_equal [@file, file_two, file_three], @file.links
58
+ assert_equal [@file, file_two, file_three], file_two.links
59
+ assert_equal [@file, file_two, file_three], file_three.links
60
+ end
61
+
62
+ def test_links_share_same_content
63
+ other_file = FakeFile.new
64
+
65
+ @file.link other_file
66
+
67
+ @file.content = "foobar"
68
+
69
+ assert_equal "foobar", other_file.content
70
+ end
71
+
72
+ def test_clone_creates_new_inode
73
+ clone = @file.clone
74
+ assert !clone.inode.equal?(@file.inode)
75
+ end
76
+
77
+ def test_cloning_does_not_use_same_content_object
78
+ clone = @file.clone
79
+
80
+ clone.content = "foo"
81
+ @file.content = "bar"
82
+
83
+ assert_equal "foo", clone.content
84
+ assert_equal "bar", @file.content
85
+ end
86
+
87
+ def test_raises_an_error_with_the_correct_path
88
+ path = "/some/non/existing/file"
89
+ begin
90
+ FakeFS::File.new path
91
+ msg = nil
92
+ rescue Errno::ENOENT => e
93
+ msg = e.message
94
+ end
95
+ assert_equal "No such file or directory - #{path}", msg
96
+ end
97
+ end
@@ -0,0 +1,10 @@
1
+ require "test_helper"
2
+
3
+ class FakeSymlinkTest < Test::Unit::TestCase
4
+ include FakeFS
5
+
6
+ def test_symlink_has_method_missing_as_private
7
+ methods = FakeSymlink.private_instance_methods.map { |m| m.to_s }
8
+ assert methods.include?("method_missing")
9
+ end
10
+ end
@@ -0,0 +1,1611 @@
1
+ require "test_helper"
2
+
3
+ class FakeFSTest < Test::Unit::TestCase
4
+ include FakeFS
5
+
6
+ def setup
7
+ FakeFS.activate!
8
+ FileSystem.clear
9
+ end
10
+
11
+ def teardown
12
+ FakeFS.deactivate!
13
+ end
14
+
15
+ def test_can_be_initialized_empty
16
+ fs = FileSystem
17
+ assert_equal 0, fs.files.size
18
+ end
19
+
20
+ def xtest_can_be_initialized_with_an_existing_directory
21
+ fs = FileSystem
22
+ fs.clone(File.expand_path(File.dirname(__FILE__))).inspect
23
+ assert_equal 1, fs.files.size
24
+ end
25
+
26
+ def test_can_create_directories_with_file_utils_mkdir_p
27
+ FileUtils.mkdir_p("/path/to/dir")
28
+ assert_kind_of FakeDir, FileSystem.fs['path']['to']['dir']
29
+ end
30
+
31
+ def test_can_create_directories_with_options
32
+ FileUtils.mkdir_p("/path/to/dir", :mode => 0755)
33
+ assert_kind_of FakeDir, FileSystem.fs['path']['to']['dir']
34
+ end
35
+
36
+ def test_can_create_directories_with_file_utils_mkdir
37
+ FileUtils.mkdir_p("/path/to/dir")
38
+ FileUtils.mkdir("/path/to/dir/subdir")
39
+ assert_kind_of FakeDir, FileSystem.fs['path']['to']['dir']['subdir']
40
+ end
41
+
42
+ def test_raises_error_when_creating_a_new_dir_with_mkdir_in_non_existent_path
43
+ assert_raises Errno::ENOENT do
44
+ FileUtils.mkdir("/this/path/does/not/exists/newdir")
45
+ end
46
+ end
47
+
48
+ def test_can_create_directories_with_mkpath
49
+ FileUtils.mkpath("/path/to/dir")
50
+ assert_kind_of FakeDir, FileSystem.fs['path']['to']['dir']
51
+ end
52
+
53
+ def test_can_create_directories_with_mkpath_and_options
54
+ FileUtils.mkpath("/path/to/dir", :mode => 0755)
55
+ assert_kind_of FakeDir, FileSystem.fs['path']['to']['dir']
56
+ end
57
+
58
+ def test_can_delete_directories
59
+ FileUtils.mkdir_p("/path/to/dir")
60
+ FileUtils.rmdir("/path/to/dir")
61
+ assert File.exists?("/path/to/")
62
+ assert File.exists?("/path/to/dir") == false
63
+ end
64
+
65
+ def test_can_delete_multiple_files
66
+ FileUtils.touch(["foo", "bar"])
67
+ FileUtils.rm(["foo", "bar"])
68
+ assert File.exists?("foo") == false
69
+ assert File.exists?("bar") == false
70
+ end
71
+
72
+ def test_knows_directories_exist
73
+ FileUtils.mkdir_p(path = "/path/to/dir")
74
+ assert File.exists?(path)
75
+ end
76
+
77
+ def test_knows_directories_are_directories
78
+ FileUtils.mkdir_p(path = "/path/to/dir")
79
+ assert File.directory?(path)
80
+ end
81
+
82
+ def test_knows_symlink_directories_are_directories
83
+ FileUtils.mkdir_p(path = "/path/to/dir")
84
+ FileUtils.ln_s path, sympath = '/sympath'
85
+ assert File.directory?(sympath)
86
+ end
87
+
88
+ def test_knows_non_existent_directories_arent_directories
89
+ path = 'does/not/exist/'
90
+ assert_equal RealFile.directory?(path), File.directory?(path)
91
+ end
92
+
93
+ def test_doesnt_overwrite_existing_directories
94
+ FileUtils.mkdir_p(path = "/path/to/dir")
95
+ assert File.exists?(path)
96
+ FileUtils.mkdir_p("/path/to")
97
+ assert File.exists?(path)
98
+ assert_raises Errno::EEXIST do
99
+ FileUtils.mkdir("/path/to")
100
+ end
101
+ assert File.exists?(path)
102
+ end
103
+
104
+ def test_can_create_symlinks
105
+ FileUtils.mkdir_p(target = "/path/to/target")
106
+ FileUtils.ln_s(target, "/path/to/link")
107
+ assert_kind_of FakeSymlink, FileSystem.fs['path']['to']['link']
108
+
109
+ assert_raises(Errno::EEXIST) do
110
+ FileUtils.ln_s(target, '/path/to/link')
111
+ end
112
+ end
113
+
114
+ def test_can_force_creation_of_symlinks
115
+ FileUtils.mkdir_p(target = "/path/to/first/target")
116
+ FileUtils.ln_s(target, "/path/to/link")
117
+ assert_kind_of FakeSymlink, FileSystem.fs['path']['to']['link']
118
+ FileUtils.ln_s(target, '/path/to/link', :force => true)
119
+ end
120
+
121
+ def test_create_symlink_using_ln_sf
122
+ FileUtils.mkdir_p(target = "/path/to/first/target")
123
+ FileUtils.ln_s(target, "/path/to/link")
124
+ assert_kind_of FakeSymlink, FileSystem.fs['path']['to']['link']
125
+ FileUtils.ln_sf(target, '/path/to/link')
126
+ end
127
+
128
+ def test_can_follow_symlinks
129
+ FileUtils.mkdir_p(target = "/path/to/target")
130
+ FileUtils.ln_s(target, link = "/path/to/symlink")
131
+ assert_equal target, File.readlink(link)
132
+ end
133
+
134
+ def test_knows_symlinks_are_symlinks
135
+ FileUtils.mkdir_p(target = "/path/to/target")
136
+ FileUtils.ln_s(target, link = "/path/to/symlink")
137
+ assert File.symlink?(link)
138
+ end
139
+
140
+ def test_can_create_files
141
+ path = '/path/to/file.txt'
142
+ File.open(path, 'w') do |f|
143
+ f.write "Yatta!"
144
+ end
145
+
146
+ assert File.exists?(path)
147
+ assert File.readable?(path)
148
+ assert File.writable?(path)
149
+ end
150
+
151
+ def test_can_create_files_with_bitmasks
152
+ path = '/path/to/file.txt'
153
+ File.open(path, File::RDWR | File::CREAT) do |f|
154
+ f.write "Yatta!"
155
+ end
156
+
157
+ assert File.exists?(path)
158
+ assert File.readable?(path)
159
+ assert File.writable?(path)
160
+ end
161
+
162
+ def test_file_opens_in_read_only_mode
163
+ File.open("foo", "w") { |f| f << "foo" }
164
+
165
+ f = File.open("foo")
166
+
167
+ assert_raises(IOError) do
168
+ f << "bar"
169
+ end
170
+ end
171
+
172
+ def test_file_opens_in_read_only_mode_with_bitmasks
173
+ File.open("foo", "w") { |f| f << "foo" }
174
+
175
+ f = File.open("foo", File::RDONLY)
176
+
177
+ assert_raises(IOError) do
178
+ f << "bar"
179
+ end
180
+ end
181
+
182
+ def test_file_opens_in_invalid_mode
183
+ FileUtils.touch("foo")
184
+
185
+ assert_raises(ArgumentError) do
186
+ File.open("foo", "an_illegal_mode")
187
+ end
188
+ end
189
+
190
+ def test_raises_error_when_cannot_find_file_in_read_mode
191
+ assert_raises(Errno::ENOENT) do
192
+ File.open("does_not_exist", "r")
193
+ end
194
+ end
195
+
196
+ def test_raises_error_when_cannot_find_file_in_read_write_mode
197
+ assert_raises(Errno::ENOENT) do
198
+ File.open("does_not_exist", "r+")
199
+ end
200
+ end
201
+
202
+ def test_creates_files_in_write_only_mode
203
+ File.open("foo", "w")
204
+ assert File.exists?("foo")
205
+ end
206
+
207
+ def test_creates_files_in_write_only_mode_with_bitmasks
208
+ File.open("foo", File::WRONLY | File::CREAT)
209
+ assert File.exists?("foo")
210
+ end
211
+
212
+ def test_raises_in_write_only_mode_without_create_bitmask
213
+ assert_raises(Errno::ENOENT) do
214
+ File.open("foo", File::WRONLY)
215
+ end
216
+ end
217
+
218
+ def test_creates_files_in_read_write_truncate_mode
219
+ File.open("foo", "w+")
220
+ assert File.exists?("foo")
221
+ end
222
+
223
+ def test_creates_files_in_append_write_only
224
+ File.open("foo", "a")
225
+ assert File.exists?("foo")
226
+ end
227
+
228
+ def test_creates_files_in_append_read_write
229
+ File.open("foo", "a+")
230
+ assert File.exists?("foo")
231
+ end
232
+
233
+ def test_file_in_write_only_raises_error_when_reading
234
+ FileUtils.touch("foo")
235
+
236
+ f = File.open("foo", "w")
237
+
238
+ assert_raises(IOError) do
239
+ f.read
240
+ end
241
+ end
242
+
243
+ def test_file_in_write_mode_truncates_existing_file
244
+ File.open("foo", "w") { |f| f << "contents" }
245
+
246
+ f = File.open("foo", "w")
247
+
248
+ assert_equal "", File.read("foo")
249
+ end
250
+
251
+ def test_file_in_read_write_truncation_mode_truncates_file
252
+ File.open("foo", "w") { |f| f << "foo" }
253
+
254
+ f = File.open("foo", "w+")
255
+
256
+ assert_equal "", File.read("foo")
257
+ end
258
+
259
+ def test_file_in_append_write_only_raises_error_when_reading
260
+ FileUtils.touch("foo")
261
+
262
+ f = File.open("foo", "a")
263
+
264
+ assert_raises(IOError) do
265
+ f.read
266
+ end
267
+ end
268
+
269
+ def test_can_read_files_once_written
270
+ path = '/path/to/file.txt'
271
+ File.open(path, 'w') do |f|
272
+ f.write "Yatta!"
273
+ end
274
+
275
+ assert_equal "Yatta!", File.read(path)
276
+ end
277
+
278
+ def test_can_write_to_files
279
+ path = '/path/to/file.txt'
280
+ File.open(path, 'w') do |f|
281
+ f << 'Yada Yada'
282
+ end
283
+ assert_equal 'Yada Yada', File.read(path)
284
+ end
285
+
286
+ def test_raises_error_when_opening_with_binary_mode_only
287
+ assert_raise ArgumentError do
288
+ File.open("/foo", "b")
289
+ end
290
+ end
291
+
292
+ def test_can_open_file_in_binary_mode
293
+ File.open("/foo", "wb") { |x| x << "a" }
294
+ assert_equal "a", File.read("/foo")
295
+ end
296
+
297
+ def test_can_chunk_io_when_reading
298
+ path = '/path/to/file.txt'
299
+ File.open(path, 'w') do |f|
300
+ f << 'Yada Yada'
301
+ end
302
+ file = File.new(path, 'r')
303
+ assert_equal 'Yada', file.read(4)
304
+ assert_equal ' Yada', file.read(5)
305
+ assert_equal '', file.read
306
+ file.rewind
307
+ assert_equal 'Yada Yada', file.read
308
+ end
309
+
310
+ def test_can_get_size_of_files
311
+ path = '/path/to/file.txt'
312
+ File.open(path, 'w') do |f|
313
+ f << 'Yada Yada'
314
+ end
315
+ assert_equal 9, File.size(path)
316
+ end
317
+
318
+ def test_can_check_if_file_has_size?
319
+ path = '/path/to/file.txt'
320
+ File.open(path, 'w') do |f|
321
+ f << 'Yada Yada'
322
+ end
323
+ assert File.size?(path)
324
+ assert_nil File.size?("/path/to/other.txt")
325
+ end
326
+
327
+ def test_can_check_size_of_empty_file
328
+ path = '/path/to/file.txt'
329
+ File.open(path, 'w') do |f|
330
+ f << ''
331
+ end
332
+ assert_nil File.size?("/path/to/file.txt")
333
+ end
334
+
335
+ def test_raises_error_on_mtime_if_file_does_not_exist
336
+ assert_raise Errno::ENOENT do
337
+ File.mtime('/path/to/file.txt')
338
+ end
339
+ end
340
+
341
+ def test_can_return_mtime_on_existing_file
342
+ path = '/path/to/file.txt'
343
+ File.open(path, 'w') do |f|
344
+ f << ''
345
+ end
346
+ assert File.mtime('/path/to/file.txt').is_a?(Time)
347
+ end
348
+
349
+ def test_raises_error_on_ctime_if_file_does_not_exist
350
+ assert_raise Errno::ENOENT do
351
+ File.ctime('/path/to/file.txt')
352
+ end
353
+ end
354
+
355
+ def test_can_return_ctime_on_existing_file
356
+ File.open("foo", "w") { |f| f << "some content" }
357
+ assert File.ctime('foo').is_a?(Time)
358
+ end
359
+
360
+ def test_ctime_and_mtime_are_equal_for_new_files
361
+ File.open("foo", "w") { |f| f << "some content" }
362
+ ctime = File.ctime("foo")
363
+ mtime = File.mtime("foo")
364
+ assert ctime.is_a?(Time)
365
+ assert mtime.is_a?(Time)
366
+ assert_equal ctime, mtime
367
+
368
+ File.open("foo", "r") do |f|
369
+ assert_equal ctime, f.ctime
370
+ assert_equal mtime, f.mtime
371
+ end
372
+ end
373
+
374
+ def test_ctime_and_mtime_are_equal_for_new_directories
375
+ FileUtils.mkdir_p("foo")
376
+ ctime = File.ctime("foo")
377
+ mtime = File.mtime("foo")
378
+ assert ctime.is_a?(Time)
379
+ assert mtime.is_a?(Time)
380
+ assert_equal ctime, mtime
381
+ end
382
+
383
+ def test_file_ctime_is_equal_to_file_stat_ctime
384
+ File.open("foo", "w") { |f| f << "some content" }
385
+ assert_equal File.stat("foo").ctime, File.ctime("foo")
386
+ end
387
+
388
+ def test_directory_ctime_is_equal_to_directory_stat_ctime
389
+ FileUtils.mkdir_p("foo")
390
+ assert_equal File.stat("foo").ctime, File.ctime("foo")
391
+ end
392
+
393
+ def test_file_mtime_is_equal_to_file_stat_mtime
394
+ File.open("foo", "w") { |f| f << "some content" }
395
+ assert_equal File.stat("foo").mtime, File.mtime("foo")
396
+ end
397
+
398
+ def test_directory_mtime_is_equal_to_directory_stat_mtime
399
+ FileUtils.mkdir_p("foo")
400
+ assert_equal File.stat("foo").mtime, File.mtime("foo")
401
+ end
402
+
403
+ def test_utime_raises_error_if_path_does_not_exist
404
+ assert_raise Errno::ENOENT do
405
+ File.utime(Time.now, Time.now, '/path/to/file.txt')
406
+ end
407
+ end
408
+
409
+ def test_can_call_utime_on_an_existing_file
410
+ time = Time.now - 300 # Not now
411
+ path = '/path/to/file.txt'
412
+ File.open(path, 'w') do |f|
413
+ f << ''
414
+ end
415
+ File.utime(time, time, path)
416
+ assert_equal time, File.mtime('/path/to/file.txt')
417
+ end
418
+
419
+ def test_utime_returns_number_of_paths
420
+ path1, path2 = '/path/to/file.txt', '/path/to/another_file.txt'
421
+ [path1, path2].each do |path|
422
+ File.open(path, 'w') do |f|
423
+ f << ''
424
+ end
425
+ end
426
+ assert_equal 2, File.utime(Time.now, Time.now, path1, path2)
427
+ end
428
+
429
+ def test_can_read_with_File_readlines
430
+ path = '/path/to/file.txt'
431
+ File.open(path, 'w') do |f|
432
+ f.puts "Yatta!", "Gatta!"
433
+ f.puts ["woot","toot"]
434
+ end
435
+
436
+ assert_equal %w(Yatta! Gatta! woot toot), File.readlines(path)
437
+ end
438
+
439
+ def test_File_close_disallows_further_access
440
+ path = '/path/to/file.txt'
441
+ file = File.open(path, 'w')
442
+ file.write 'Yada'
443
+ file.close
444
+ assert_raise IOError do
445
+ file.read
446
+ end
447
+ end
448
+
449
+ def test_File_close_disallows_further_writes
450
+ path = '/path/to/file.txt'
451
+ file = File.open(path, 'w')
452
+ file.write 'Yada'
453
+ file.close
454
+ assert_raise IOError do
455
+ file << "foo"
456
+ end
457
+ end
458
+
459
+ def test_can_read_from_file_objects
460
+ path = '/path/to/file.txt'
461
+ File.open(path, 'w') do |f|
462
+ f.write "Yatta!"
463
+ end
464
+
465
+ assert_equal "Yatta!", File.new(path).read
466
+ end
467
+
468
+ def test_file_read_errors_appropriately
469
+ assert_raise Errno::ENOENT do
470
+ File.read('anything')
471
+ end
472
+ end
473
+
474
+ def test_knows_files_are_files
475
+ path = '/path/to/file.txt'
476
+ File.open(path, 'w') do |f|
477
+ f.write "Yatta!"
478
+ end
479
+
480
+ assert File.file?(path)
481
+ end
482
+
483
+ def test_File_io_returns_self
484
+ f = File.open("/foo", "w")
485
+ assert_equal f, f.to_io
486
+ end
487
+
488
+ def test_File_to_i_is_alias_for_filno
489
+ f = File.open("/foo", "w")
490
+ assert_equal f.method(:to_i), f.method(:fileno)
491
+ end
492
+
493
+ def test_knows_symlink_files_are_files
494
+ path = '/path/to/file.txt'
495
+ File.open(path, 'w') do |f|
496
+ f.write "Yatta!"
497
+ end
498
+ FileUtils.ln_s path, sympath='/sympath'
499
+
500
+ assert File.file?(sympath)
501
+ end
502
+
503
+ def test_knows_non_existent_files_arent_files
504
+ assert_equal RealFile.file?('does/not/exist.txt'), File.file?('does/not/exist.txt')
505
+ end
506
+
507
+ def test_can_chown_files
508
+ good = 'file.txt'
509
+ bad = 'nofile.txt'
510
+ File.open(good,'w') { |f| f.write "foo" }
511
+
512
+ out = FileUtils.chown('noone', 'nogroup', good, :verbose => true)
513
+ assert_equal [good], out
514
+ assert_raises(Errno::ENOENT) do
515
+ FileUtils.chown('noone', 'nogroup', bad, :verbose => true)
516
+ end
517
+
518
+ assert_equal [good], FileUtils.chown('noone', 'nogroup', good)
519
+ assert_raises(Errno::ENOENT) do
520
+ FileUtils.chown('noone', 'nogroup', bad)
521
+ end
522
+
523
+ assert_equal [good], FileUtils.chown('noone', 'nogroup', [good])
524
+ assert_raises(Errno::ENOENT) do
525
+ FileUtils.chown('noone', 'nogroup', [good, bad])
526
+ end
527
+ end
528
+
529
+ def test_can_chown_R_files
530
+ FileUtils.mkdir_p '/path/'
531
+ File.open('/path/foo', 'w') { |f| f.write 'foo' }
532
+ File.open('/path/foobar', 'w') { |f| f.write 'foo' }
533
+ resp = FileUtils.chown_R('no', 'no', '/path')
534
+ assert_equal ['/path'], resp
535
+ end
536
+
537
+ def test_dir_globs_paths
538
+ FileUtils.mkdir_p '/path'
539
+ File.open('/path/foo', 'w') { |f| f.write 'foo' }
540
+ File.open('/path/foobar', 'w') { |f| f.write 'foo' }
541
+
542
+ FileUtils.mkdir_p '/path/bar'
543
+ File.open('/path/bar/baz', 'w') { |f| f.write 'foo' }
544
+
545
+ FileUtils.cp_r '/path/bar', '/path/bar2'
546
+
547
+ assert_equal ['/path'], Dir['/path']
548
+ assert_equal %w( /path/bar /path/bar2 /path/foo /path/foobar ), Dir['/path/*']
549
+
550
+ assert_equal ['/path/bar/baz'], Dir['/path/bar/*']
551
+ assert_equal ['/path/foo'], Dir['/path/foo']
552
+
553
+ assert_equal ['/path'], Dir['/path*']
554
+ assert_equal ['/path/foo', '/path/foobar'], Dir['/p*h/foo*']
555
+ assert_equal ['/path/foo', '/path/foobar'], Dir['/p??h/foo*']
556
+
557
+ assert_equal ['/path/bar', '/path/bar/baz', '/path/bar2', '/path/bar2/baz', '/path/foo', '/path/foobar'], Dir['/path/**/*']
558
+ assert_equal ['/path', '/path/bar', '/path/bar/baz', '/path/bar2', '/path/bar2/baz', '/path/foo', '/path/foobar'], Dir['/**/*']
559
+
560
+ assert_equal ['/path/bar', '/path/bar/baz', '/path/bar2', '/path/bar2/baz', '/path/foo', '/path/foobar'], Dir['/path/**/*']
561
+
562
+ assert_equal ['/path/bar/baz'], Dir['/path/bar/**/*']
563
+
564
+ FileUtils.cp_r '/path', '/otherpath'
565
+
566
+ assert_equal %w( /otherpath/foo /otherpath/foobar /path/foo /path/foobar ), Dir['/*/foo*']
567
+ end
568
+
569
+ def test_dir_glob_handles_root
570
+ FileUtils.mkdir_p '/path'
571
+
572
+ # this fails. the root dir should be named '/' but it is '.'
573
+ #assert_equal ['/'], Dir['/']
574
+ end
575
+
576
+ def test_dir_glob_handles_recursive_globs
577
+ File.open('/one/two/three/four.rb', 'w')
578
+ File.open('/one/five.rb', 'w')
579
+ assert_equal ['/one/five.rb', '/one/two/three/four.rb'], Dir['/one/**/*.rb']
580
+ assert_equal ['/one/two'], Dir['/one/**/two']
581
+ assert_equal ['/one/two/three'], Dir['/one/**/three']
582
+ end
583
+
584
+ def test_dir_recursive_glob_ending_in_wildcards_returns_both_files_and_dirs
585
+ File.open('/one/two/three/four.rb', 'w')
586
+ File.open('/one/five.rb', 'w')
587
+ assert_equal ['/one/five.rb', '/one/two', '/one/two/three', '/one/two/three/four.rb'], Dir['/one/**/*']
588
+ assert_equal ['/one/five.rb', '/one/two'], Dir['/one/**']
589
+ end
590
+
591
+ def test_dir_glob_with_block
592
+ FileUtils.touch('foo')
593
+ FileUtils.touch('bar')
594
+
595
+ yielded = []
596
+ Dir.glob('*') { |file| yielded << file }
597
+
598
+ assert_equal 2, yielded.size
599
+ end
600
+
601
+ def test_should_report_pos_as_0_when_opening
602
+ File.open("/foo", "w") do |f|
603
+ f << "foobar"
604
+ f.rewind
605
+
606
+ assert_equal 0, f.pos
607
+ end
608
+ end
609
+
610
+ def test_should_report_pos_as_1_when_seeking_one_char
611
+ File.open("/foo", "w") do |f|
612
+ f << "foobar"
613
+
614
+ f.rewind
615
+ f.seek(1)
616
+
617
+ assert_equal 1, f.pos
618
+ end
619
+ end
620
+
621
+ def test_should_set_pos
622
+ File.open("/foo", "w") do |f|
623
+ f << "foo"
624
+ end
625
+
626
+ fp = File.open("/foo", "r")
627
+ fp.pos = 1
628
+
629
+ assert_equal 1, fp.pos
630
+ end
631
+
632
+ def test_should_set_pos_with_tell_method
633
+ File.open("/foo", "w") do |f|
634
+ f << "foo"
635
+ end
636
+
637
+ fp = File.open("/foo", "r")
638
+ fp.tell = 1
639
+
640
+ assert_equal 1, fp.pos
641
+ end
642
+
643
+ # Every method in File is in FakeFS::File
644
+ RealFile.instance_methods.each do |method_name|
645
+ define_method "test_should_have_method_#{method_name}_from_real_file_class" do
646
+ assert File.instance_methods.include?(method_name)
647
+ end
648
+ end
649
+
650
+ # No methods which are in StringIO that aren't in File are included into
651
+ # FakeFS::File (because of inheritence)
652
+ uniq_string_io_methods = StringIO.instance_methods - RealFile.instance_methods
653
+ uniq_string_io_methods.each do |method_name|
654
+ define_method "test_file_should_not_respond_to_#{method_name}" do
655
+ assert !File.instance_methods.include?(method_name)
656
+ end
657
+ end
658
+
659
+ def test_does_not_remove_methods_from_stringio
660
+ stringio = StringIO.new("foo")
661
+ assert stringio.respond_to?(:size)
662
+ end
663
+
664
+ def test_chdir_changes_directories_like_a_boss
665
+ # I know memes!
666
+ FileUtils.mkdir_p '/path'
667
+ assert_equal '.', FileSystem.fs.name
668
+ assert_equal({}, FileSystem.fs['path'])
669
+ Dir.chdir '/path' do
670
+ File.open('foo', 'w') { |f| f.write 'foo'}
671
+ File.open('foobar', 'w') { |f| f.write 'foo'}
672
+ end
673
+
674
+ assert_equal '.', FileSystem.fs.name
675
+ assert_equal(['foo', 'foobar'], FileSystem.fs['path'].keys.sort)
676
+
677
+ c = nil
678
+ Dir.chdir '/path' do
679
+ c = File.open('foo', 'r') { |f| f.read }
680
+ end
681
+
682
+ assert_equal 'foo', c
683
+ end
684
+
685
+ def test_chdir_shouldnt_keep_us_from_absolute_paths
686
+ FileUtils.mkdir_p '/path'
687
+
688
+ Dir.chdir '/path' do
689
+ File.open('foo', 'w') { |f| f.write 'foo'}
690
+ File.open('/foobar', 'w') { |f| f.write 'foo'}
691
+ end
692
+ assert_equal ['foo'], FileSystem.fs['path'].keys.sort
693
+ assert_equal ['foobar', 'path'], FileSystem.fs.keys.sort
694
+
695
+ Dir.chdir '/path' do
696
+ FileUtils.rm('foo')
697
+ FileUtils.rm('/foobar')
698
+ end
699
+
700
+ assert_equal [], FileSystem.fs['path'].keys.sort
701
+ assert_equal ['path'], FileSystem.fs.keys.sort
702
+ end
703
+
704
+ def test_chdir_should_be_nestable
705
+ FileUtils.mkdir_p '/path/me'
706
+ Dir.chdir '/path' do
707
+ File.open('foo', 'w') { |f| f.write 'foo'}
708
+ Dir.chdir 'me' do
709
+ File.open('foobar', 'w') { |f| f.write 'foo'}
710
+ end
711
+ end
712
+
713
+ assert_equal ['foo','me'], FileSystem.fs['path'].keys.sort
714
+ assert_equal ['foobar'], FileSystem.fs['path']['me'].keys.sort
715
+ end
716
+
717
+ def test_chdir_should_flop_over_and_die_if_the_dir_doesnt_exist
718
+ assert_raise(Errno::ENOENT) do
719
+ Dir.chdir('/nope') do
720
+ 1
721
+ end
722
+ end
723
+ end
724
+
725
+ def test_chdir_shouldnt_lose_state_because_of_errors
726
+ FileUtils.mkdir_p '/path'
727
+
728
+ Dir.chdir '/path' do
729
+ File.open('foo', 'w') { |f| f.write 'foo'}
730
+ File.open('foobar', 'w') { |f| f.write 'foo'}
731
+ end
732
+
733
+ begin
734
+ Dir.chdir('/path') do
735
+ raise Exception
736
+ end
737
+ rescue Exception # hardcore
738
+ end
739
+
740
+ Dir.chdir('/path') do
741
+ begin
742
+ Dir.chdir('nope'){ }
743
+ rescue Errno::ENOENT
744
+ end
745
+
746
+ assert_equal ['/path'], FileSystem.dir_levels
747
+ end
748
+
749
+ assert_equal(['foo', 'foobar'], FileSystem.fs['path'].keys.sort)
750
+ end
751
+
752
+ def test_chdir_with_no_block_is_awesome
753
+ FileUtils.mkdir_p '/path'
754
+ Dir.chdir('/path')
755
+ FileUtils.mkdir_p 'subdir'
756
+ assert_equal ['subdir'], FileSystem.current_dir.keys
757
+ Dir.chdir('subdir')
758
+ File.open('foo', 'w') { |f| f.write 'foo'}
759
+ assert_equal ['foo'], FileSystem.current_dir.keys
760
+
761
+ assert_raises(Errno::ENOENT) do
762
+ Dir.chdir('subsubdir')
763
+ end
764
+
765
+ assert_equal ['foo'], FileSystem.current_dir.keys
766
+ end
767
+
768
+ def test_current_dir_reflected_by_pwd
769
+ FileUtils.mkdir_p '/path'
770
+ Dir.chdir('/path')
771
+
772
+ assert_equal '/path', Dir.pwd
773
+ assert_equal '/path', Dir.getwd
774
+
775
+ FileUtils.mkdir_p 'subdir'
776
+ Dir.chdir('subdir')
777
+
778
+ assert_equal '/path/subdir', Dir.pwd
779
+ assert_equal '/path/subdir', Dir.getwd
780
+ end
781
+
782
+ def test_file_open_defaults_to_read
783
+ File.open('foo','w') { |f| f.write 'bar' }
784
+ assert_equal 'bar', File.open('foo') { |f| f.read }
785
+ end
786
+
787
+ def test_flush_exists_on_file
788
+ r = File.open('foo','w') { |f| f.write 'bar'; f.flush }
789
+ assert_equal 'foo', r.path
790
+ end
791
+
792
+ def test_mv_should_raise_error_on_missing_file
793
+ assert_raise(Errno::ENOENT) do
794
+ FileUtils.mv 'blafgag', 'foo'
795
+ end
796
+ end
797
+
798
+ def test_mv_actually_works
799
+ File.open('foo', 'w') { |f| f.write 'bar' }
800
+ FileUtils.mv 'foo', 'baz'
801
+ assert_equal 'bar', File.open('baz') { |f| f.read }
802
+ end
803
+
804
+ def test_mv_works_with_options
805
+ File.open('foo', 'w') {|f| f.write 'bar'}
806
+ FileUtils.mv 'foo', 'baz', :force => true
807
+ assert_equal('bar', File.open('baz') { |f| f.read })
808
+ end
809
+
810
+ def test_mv_to_directory
811
+ File.open('foo', 'w') {|f| f.write 'bar'}
812
+ FileUtils.mkdir_p 'destdir'
813
+ FileUtils.mv 'foo', 'destdir'
814
+ assert_equal('bar', File.open('destdir/foo') {|f| f.read })
815
+ assert File.directory?('destdir')
816
+ end
817
+
818
+ def test_mv_array
819
+ File.open('foo', 'w') {|f| f.write 'bar' }
820
+ File.open('baz', 'w') {|f| f.write 'binky' }
821
+ FileUtils.mkdir_p 'destdir'
822
+ FileUtils.mv %w(foo baz), 'destdir'
823
+ assert_equal('bar', File.open('destdir/foo') {|f| f.read })
824
+ assert_equal('binky', File.open('destdir/baz') {|f| f.read })
825
+ end
826
+
827
+ def test_cp_actually_works
828
+ File.open('foo', 'w') {|f| f.write 'bar' }
829
+ FileUtils.cp('foo', 'baz')
830
+ assert_equal 'bar', File.read('baz')
831
+ end
832
+
833
+ def test_cp_file_into_dir
834
+ File.open('foo', 'w') {|f| f.write 'bar' }
835
+ FileUtils.mkdir_p 'baz'
836
+
837
+ FileUtils.cp('foo', 'baz')
838
+ assert_equal 'bar', File.read('baz/foo')
839
+ end
840
+
841
+ def test_cp_overwrites_dest_file
842
+ File.open('foo', 'w') {|f| f.write 'FOO' }
843
+ File.open('bar', 'w') {|f| f.write 'BAR' }
844
+
845
+ FileUtils.cp('foo', 'bar')
846
+ assert_equal 'FOO', File.read('bar')
847
+ end
848
+
849
+ def test_cp_fails_on_no_source
850
+ assert_raise Errno::ENOENT do
851
+ FileUtils.cp('foo', 'baz')
852
+ end
853
+ end
854
+
855
+ def test_cp_fails_on_directory_copy
856
+ FileUtils.mkdir_p 'baz'
857
+
858
+ assert_raise Errno::EISDIR do
859
+ FileUtils.cp('baz', 'bar')
860
+ end
861
+ end
862
+
863
+ def test_cp_r_doesnt_tangle_files_together
864
+ File.open('foo', 'w') { |f| f.write 'bar' }
865
+ FileUtils.cp_r('foo', 'baz')
866
+ File.open('baz', 'w') { |f| f.write 'quux' }
867
+ assert_equal 'bar', File.open('foo') { |f| f.read }
868
+ end
869
+
870
+ def test_cp_r_should_raise_error_on_missing_file
871
+ # Yes, this error sucks, but it conforms to the original Ruby
872
+ # method.
873
+ assert_raise(RuntimeError) do
874
+ FileUtils.cp_r 'blafgag', 'foo'
875
+ end
876
+ end
877
+
878
+ def test_cp_r_handles_copying_directories
879
+ FileUtils.mkdir_p 'subdir'
880
+ Dir.chdir('subdir'){ File.open('foo', 'w') { |f| f.write 'footext' } }
881
+
882
+ FileUtils.mkdir_p 'baz'
883
+
884
+ # To a previously uncreated directory
885
+ FileUtils.cp_r('subdir', 'quux')
886
+ assert_equal 'footext', File.open('quux/foo') { |f| f.read }
887
+
888
+ # To a directory that already exists
889
+ FileUtils.cp_r('subdir', 'baz')
890
+ assert_equal 'footext', File.open('baz/subdir/foo') { |f| f.read }
891
+
892
+ # To a subdirectory of a directory that does not exist
893
+ assert_raises(Errno::ENOENT) do
894
+ FileUtils.cp_r('subdir', 'nope/something')
895
+ end
896
+ end
897
+
898
+ def test_cp_r_only_copies_into_directories
899
+ FileUtils.mkdir_p 'subdir'
900
+ Dir.chdir('subdir') { File.open('foo', 'w') { |f| f.write 'footext' } }
901
+
902
+ File.open('bar', 'w') { |f| f.write 'bartext' }
903
+
904
+ assert_raises(Errno::EEXIST) do
905
+ FileUtils.cp_r 'subdir', 'bar'
906
+ end
907
+
908
+ FileUtils.mkdir_p 'otherdir'
909
+ FileUtils.ln_s 'otherdir', 'symdir'
910
+
911
+ FileUtils.cp_r 'subdir', 'symdir'
912
+ assert_equal 'footext', File.open('symdir/subdir/foo') { |f| f.read }
913
+ end
914
+
915
+ def test_cp_r_sets_parent_correctly
916
+ FileUtils.mkdir_p '/path/foo'
917
+ File.open('/path/foo/bar', 'w') { |f| f.write 'foo' }
918
+ File.open('/path/foo/baz', 'w') { |f| f.write 'foo' }
919
+
920
+ FileUtils.cp_r '/path/foo', '/path/bar'
921
+
922
+ assert File.exists?('/path/bar/baz')
923
+ FileUtils.rm_rf '/path/bar/baz'
924
+ assert_equal %w( /path/bar/bar ), Dir['/path/bar/*']
925
+ end
926
+
927
+ def test_clone_clones_normal_files
928
+ RealFile.open(here('foo'), 'w') { |f| f.write 'bar' }
929
+ assert !File.exists?(here('foo'))
930
+ FileSystem.clone(here('foo'))
931
+ assert_equal 'bar', File.open(here('foo')) { |f| f.read }
932
+ ensure
933
+ RealFile.unlink(here('foo')) if RealFile.exists?(here('foo'))
934
+ end
935
+
936
+ def test_clone_clones_directories
937
+ FakeFS.deactivate!
938
+ RealFileUtils.mkdir_p(here('subdir'))
939
+ FakeFS.activate!
940
+
941
+ FileSystem.clone(here('subdir'))
942
+
943
+ assert File.exists?(here('subdir')), 'subdir was cloned'
944
+ assert File.directory?(here('subdir')), 'subdir is a directory'
945
+ ensure
946
+ FakeFS.deactivate!
947
+ RealFileUtils.rm_rf(here('subdir'))
948
+ FakeFS.activate!
949
+ end
950
+
951
+ def test_clone_clones_dot_files_even_hard_to_find_ones
952
+ FakeFS.deactivate!
953
+ RealFileUtils.mkdir_p(here('subdir/.bar/baz/.quux/foo'))
954
+ FakeFS.activate!
955
+
956
+ assert !File.exists?(here('subdir'))
957
+
958
+ FileSystem.clone(here('subdir'))
959
+ assert_equal ['.bar'], FileSystem.find(here('subdir')).keys
960
+ assert_equal ['foo'], FileSystem.find(here('subdir/.bar/baz/.quux')).keys
961
+ ensure
962
+ FakeFS.deactivate!
963
+ RealFileUtils.rm_rf(here('subdir'))
964
+ FakeFS.activate!
965
+ end
966
+
967
+ def test_putting_a_dot_at_end_copies_the_contents
968
+ FileUtils.mkdir_p 'subdir'
969
+ Dir.chdir('subdir') { File.open('foo', 'w') { |f| f.write 'footext' } }
970
+
971
+ FileUtils.mkdir_p 'newdir'
972
+ FileUtils.cp_r 'subdir/.', 'newdir'
973
+ assert_equal 'footext', File.open('newdir/foo') { |f| f.read }
974
+ end
975
+
976
+ def test_file_can_read_from_symlinks
977
+ File.open('first', 'w') { |f| f.write '1'}
978
+ FileUtils.ln_s 'first', 'one'
979
+ assert_equal '1', File.open('one') { |f| f.read }
980
+
981
+ FileUtils.mkdir_p 'subdir'
982
+ File.open('subdir/nother','w') { |f| f.write 'works' }
983
+ FileUtils.ln_s 'subdir', 'new'
984
+ assert_equal 'works', File.open('new/nother') { |f| f.read }
985
+ end
986
+
987
+ def test_can_symlink_through_file
988
+ FileUtils.touch("/foo")
989
+
990
+ File.symlink("/foo", "/bar")
991
+
992
+ assert File.symlink?("/bar")
993
+ end
994
+
995
+ def test_files_can_be_touched
996
+ FileUtils.touch('touched_file')
997
+ assert File.exists?('touched_file')
998
+ list = ['newfile', 'another']
999
+ FileUtils.touch(list)
1000
+ list.each { |fp| assert(File.exists?(fp)) }
1001
+ end
1002
+
1003
+ def test_touch_does_not_work_if_the_dir_path_cannot_be_found
1004
+ assert_raises(Errno::ENOENT) do
1005
+ FileUtils.touch('this/path/should/not/be/here')
1006
+ end
1007
+ FileUtils.mkdir_p('subdir')
1008
+ list = ['subdir/foo', 'nosubdir/bar']
1009
+
1010
+ assert_raises(Errno::ENOENT) do
1011
+ FileUtils.touch(list)
1012
+ end
1013
+ end
1014
+
1015
+ def test_extname
1016
+ assert File.extname("test.doc") == ".doc"
1017
+ end
1018
+
1019
+ # Directory tests
1020
+ def test_new_directory
1021
+ FileUtils.mkdir_p('/this/path/should/be/here')
1022
+
1023
+ assert_nothing_raised do
1024
+ Dir.new('/this/path/should/be/here')
1025
+ end
1026
+ end
1027
+
1028
+ def test_new_directory_does_not_work_if_dir_path_cannot_be_found
1029
+ assert_raises(Errno::ENOENT) do
1030
+ Dir.new('/this/path/should/not/be/here')
1031
+ end
1032
+ end
1033
+
1034
+ def test_directory_close
1035
+ FileUtils.mkdir_p('/this/path/should/be/here')
1036
+ dir = Dir.new('/this/path/should/be/here')
1037
+ assert dir.close.nil?
1038
+
1039
+ assert_raises(IOError) do
1040
+ dir.each { |dir| dir }
1041
+ end
1042
+ end
1043
+
1044
+ def test_directory_each
1045
+ test = ['.', '..', 'file_1', 'file_2', 'file_3', 'file_4', 'file_5' ]
1046
+
1047
+ FileUtils.mkdir_p('/this/path/should/be/here')
1048
+
1049
+ test.each do |f|
1050
+ FileUtils.touch("/this/path/should/be/here/#{f}")
1051
+ end
1052
+
1053
+ dir = Dir.new('/this/path/should/be/here')
1054
+
1055
+ yielded = []
1056
+ dir.each do |dir|
1057
+ yielded << dir
1058
+ end
1059
+
1060
+ assert yielded.size == test.size
1061
+ test.each { |t| assert yielded.include?(t) }
1062
+ end
1063
+
1064
+ def test_directory_path
1065
+ FileUtils.mkdir_p('/this/path/should/be/here')
1066
+ good_path = '/this/path/should/be/here'
1067
+ assert_equal good_path, Dir.new('/this/path/should/be/here').path
1068
+ end
1069
+
1070
+ def test_directory_pos
1071
+ test = ['.', '..', 'file_1', 'file_2', 'file_3', 'file_4', 'file_5' ]
1072
+ FileUtils.mkdir_p('/this/path/should/be/here')
1073
+ test.each do |f|
1074
+ FileUtils.touch("/this/path/should/be/here/#{f}")
1075
+ end
1076
+
1077
+ dir = Dir.new('/this/path/should/be/here')
1078
+
1079
+ assert dir.pos == 0
1080
+ dir.read
1081
+ assert dir.pos == 1
1082
+ dir.read
1083
+ assert dir.pos == 2
1084
+ dir.read
1085
+ assert dir.pos == 3
1086
+ dir.read
1087
+ assert dir.pos == 4
1088
+ dir.read
1089
+ assert dir.pos == 5
1090
+ end
1091
+
1092
+ def test_directory_pos_assign
1093
+ test = ['.', '..', 'file_1', 'file_2', 'file_3', 'file_4', 'file_5' ]
1094
+
1095
+ FileUtils.mkdir_p('/this/path/should/be/here')
1096
+ test.each do |f|
1097
+ FileUtils.touch("/this/path/should/be/here/#{f}")
1098
+ end
1099
+
1100
+ dir = Dir.new('/this/path/should/be/here')
1101
+
1102
+ assert dir.pos == 0
1103
+ dir.pos = 2
1104
+ assert dir.pos == 2
1105
+ end
1106
+
1107
+ def test_directory_read
1108
+ test = ['.', '..', 'file_1', 'file_2', 'file_3', 'file_4', 'file_5' ]
1109
+
1110
+ FileUtils.mkdir_p('/this/path/should/be/here')
1111
+ test.each do |f|
1112
+ FileUtils.touch("/this/path/should/be/here/#{f}")
1113
+ end
1114
+
1115
+ dir = Dir.new('/this/path/should/be/here')
1116
+
1117
+ assert dir.pos == 0
1118
+ d = dir.read
1119
+ assert dir.pos == 1
1120
+ assert d == '.'
1121
+
1122
+ d = dir.read
1123
+ assert dir.pos == 2
1124
+ assert d == '..'
1125
+ end
1126
+
1127
+ def test_directory_read_past_length
1128
+ test = ['.', '..', 'file_1', 'file_2', 'file_3', 'file_4', 'file_5' ]
1129
+
1130
+ FileUtils.mkdir_p('/this/path/should/be/here')
1131
+ test.each do |f|
1132
+ FileUtils.touch("/this/path/should/be/here/#{f}")
1133
+ end
1134
+
1135
+ dir = Dir.new('/this/path/should/be/here')
1136
+
1137
+ d = dir.read
1138
+ assert_not_nil d
1139
+ d = dir.read
1140
+ assert_not_nil d
1141
+ d = dir.read
1142
+ assert_not_nil d
1143
+ d = dir.read
1144
+ assert_not_nil d
1145
+ d = dir.read
1146
+ assert_not_nil d
1147
+ d = dir.read
1148
+ assert_not_nil d
1149
+ d = dir.read
1150
+ assert_not_nil d
1151
+ d = dir.read
1152
+ assert_nil d
1153
+ end
1154
+
1155
+ def test_directory_rewind
1156
+ test = ['.', '..', 'file_1', 'file_2', 'file_3', 'file_4', 'file_5' ]
1157
+
1158
+ FileUtils.mkdir_p('/this/path/should/be/here')
1159
+ test.each do |f|
1160
+ FileUtils.touch("/this/path/should/be/here/#{f}")
1161
+ end
1162
+
1163
+ dir = Dir.new('/this/path/should/be/here')
1164
+
1165
+ d = dir.read
1166
+ d = dir.read
1167
+ assert dir.pos == 2
1168
+ dir.rewind
1169
+ assert dir.pos == 0
1170
+ end
1171
+
1172
+ def test_directory_seek
1173
+ test = ['.', '..', 'file_1', 'file_2', 'file_3', 'file_4', 'file_5' ]
1174
+
1175
+ FileUtils.mkdir_p('/this/path/should/be/here')
1176
+ test.each do |f|
1177
+ FileUtils.touch("/this/path/should/be/here/#{f}")
1178
+ end
1179
+
1180
+ dir = Dir.new('/this/path/should/be/here')
1181
+
1182
+ d = dir.seek 1
1183
+ assert d == '..'
1184
+ assert dir.pos == 1
1185
+ end
1186
+
1187
+ def test_directory_class_delete
1188
+ FileUtils.mkdir_p('/this/path/should/be/here')
1189
+ Dir.delete('/this/path/should/be/here')
1190
+ assert File.exists?('/this/path/should/be/here') == false
1191
+ end
1192
+
1193
+ def test_directory_class_delete_does_not_act_on_non_empty_directory
1194
+ test = ['.', '..', 'file_1', 'file_2', 'file_3', 'file_4', 'file_5' ]
1195
+
1196
+ FileUtils.mkdir_p('/this/path/should/be/here')
1197
+ test.each do |f|
1198
+ FileUtils.touch("/this/path/should/be/here/#{f}")
1199
+ end
1200
+
1201
+ assert_raises(SystemCallError) do
1202
+ Dir.delete('/this/path/should/be/here')
1203
+ end
1204
+ end
1205
+
1206
+ def test_directory_entries
1207
+ test = ['.', '..', 'file_1', 'file_2', 'file_3', 'file_4', 'file_5' ]
1208
+
1209
+ FileUtils.mkdir_p('/this/path/should/be/here')
1210
+
1211
+ test.each do |f|
1212
+ FileUtils.touch("/this/path/should/be/here/#{f}")
1213
+ end
1214
+
1215
+ yielded = Dir.entries('/this/path/should/be/here')
1216
+ assert yielded.size == test.size
1217
+ test.each { |t| assert yielded.include?(t) }
1218
+ end
1219
+
1220
+ def test_directory_entries_works_with_trailing_slash
1221
+ test = ['.', '..', 'file_1', 'file_2', 'file_3', 'file_4', 'file_5' ]
1222
+
1223
+ FileUtils.mkdir_p('/this/path/should/be/here')
1224
+
1225
+ test.each do |f|
1226
+ FileUtils.touch("/this/path/should/be/here/#{f}")
1227
+ end
1228
+
1229
+ yielded = Dir.entries('/this/path/should/be/here/')
1230
+ assert yielded.size == test.size
1231
+ test.each { |t| assert yielded.include?(t) }
1232
+ end
1233
+
1234
+ def test_directory_foreach
1235
+ test = ['.', '..', 'file_1', 'file_2', 'file_3', 'file_4', 'file_5' ]
1236
+
1237
+ FileUtils.mkdir_p('/this/path/should/be/here')
1238
+
1239
+ test.each do |f|
1240
+ FileUtils.touch("/this/path/should/be/here/#{f}")
1241
+ end
1242
+
1243
+ yielded = []
1244
+ Dir.foreach('/this/path/should/be/here') do |dir|
1245
+ yielded << dir
1246
+ end
1247
+
1248
+ assert yielded.size == test.size
1249
+ test.each { |t| assert yielded.include?(t) }
1250
+ end
1251
+
1252
+ def test_directory_mkdir
1253
+ Dir.mkdir('/path')
1254
+ assert File.exists?('/path')
1255
+ end
1256
+
1257
+ def test_directory_mkdir_relative
1258
+ FileUtils.mkdir_p('/new/root')
1259
+ FileSystem.chdir('/new/root')
1260
+ Dir.mkdir('path')
1261
+ assert File.exists?('/new/root/path')
1262
+ end
1263
+
1264
+ def test_directory_mkdir_not_recursive
1265
+ assert_raises(Errno::ENOENT) do
1266
+ Dir.mkdir('/path/does/not/exist')
1267
+ end
1268
+ end
1269
+
1270
+ def test_mkdir_raises_error_if_already_created
1271
+ Dir.mkdir "foo"
1272
+
1273
+ assert_raises(Errno::EEXIST) do
1274
+ Dir.mkdir "foo"
1275
+ end
1276
+ end
1277
+
1278
+ def test_directory_open
1279
+ test = ['.', '..', 'file_1', 'file_2', 'file_3', 'file_4', 'file_5' ]
1280
+
1281
+ FileUtils.mkdir_p('/this/path/should/be/here')
1282
+
1283
+ test.each do |f|
1284
+ FileUtils.touch("/this/path/should/be/here/#{f}")
1285
+ end
1286
+
1287
+ dir = Dir.open('/this/path/should/be/here')
1288
+ assert dir.path == '/this/path/should/be/here'
1289
+ end
1290
+
1291
+ def test_directory_open_block
1292
+ test = ['.', '..', 'file_1', 'file_2', 'file_3', 'file_4', 'file_5' ]
1293
+
1294
+ FileUtils.mkdir_p('/this/path/should/be/here')
1295
+
1296
+ test.each do |f|
1297
+ FileUtils.touch("/this/path/should/be/here/#{f}")
1298
+ end
1299
+
1300
+ yielded = []
1301
+ Dir.open('/this/path/should/be/here') do |dir|
1302
+ yielded << dir
1303
+ end
1304
+
1305
+ assert yielded.size == test.size
1306
+ test.each { |t| assert yielded.include?(t) }
1307
+ end
1308
+
1309
+ def test_tmpdir
1310
+ assert Dir.tmpdir == "/tmp"
1311
+ end
1312
+
1313
+ def test_rename_renames_a_file
1314
+ FileUtils.touch("/foo")
1315
+ File.rename("/foo", "/bar")
1316
+ assert File.file?("/bar")
1317
+ end
1318
+
1319
+ def test_rename_returns
1320
+ FileUtils.touch("/foo")
1321
+ assert_equal 0, File.rename("/foo", "/bar")
1322
+ end
1323
+
1324
+ def test_rename_renames_two_files
1325
+ FileUtils.touch("/foo")
1326
+ FileUtils.touch("/bar")
1327
+ File.rename("/foo", "/bar")
1328
+ assert File.file?("/bar")
1329
+ end
1330
+
1331
+ def test_rename_renames_a_directories
1332
+ Dir.mkdir("/foo")
1333
+ File.rename("/foo", "/bar")
1334
+ assert File.directory?("/bar")
1335
+ end
1336
+
1337
+ def test_rename_renames_two_directories
1338
+ Dir.mkdir("/foo")
1339
+ Dir.mkdir("/bar")
1340
+ File.rename("/foo", "/bar")
1341
+ assert File.directory?("/bar")
1342
+ end
1343
+
1344
+ def test_rename_file_to_directory_raises_error
1345
+ FileUtils.touch("/foo")
1346
+ Dir.mkdir("/bar")
1347
+ assert_raises(Errno::EISDIR) do
1348
+ File.rename("/foo", "/bar")
1349
+ end
1350
+ end
1351
+
1352
+ def test_rename_directory_to_file_raises_error
1353
+ Dir.mkdir("/foo")
1354
+ FileUtils.touch("/bar")
1355
+ assert_raises(Errno::ENOTDIR) do
1356
+ File.rename("/foo", "/bar")
1357
+ end
1358
+ end
1359
+
1360
+
1361
+ def test_rename_with_missing_source_raises_error
1362
+ assert_raises(Errno::ENOENT) do
1363
+ File.rename("/no_such_file", "/bar")
1364
+ end
1365
+ end
1366
+
1367
+ def test_hard_link_creates_file
1368
+ FileUtils.touch("/foo")
1369
+
1370
+ File.link("/foo", "/bar")
1371
+ assert File.exists?("/bar")
1372
+ end
1373
+
1374
+ def test_hard_link_with_missing_file_raises_error
1375
+ assert_raises(Errno::ENOENT) do
1376
+ File.link("/foo", "/bar")
1377
+ end
1378
+ end
1379
+
1380
+ def test_hard_link_with_existing_destination_file
1381
+ FileUtils.touch("/foo")
1382
+ FileUtils.touch("/bar")
1383
+
1384
+ assert_raises(Errno::EEXIST) do
1385
+ File.link("/foo", "/bar")
1386
+ end
1387
+ end
1388
+
1389
+ def test_hard_link_returns_0_when_successful
1390
+ FileUtils.touch("/foo")
1391
+
1392
+ assert_equal 0, File.link("/foo", "/bar")
1393
+ end
1394
+
1395
+ def test_hard_link_returns_duplicate_file
1396
+ File.open("/foo", "w") { |x| x << "some content" }
1397
+
1398
+ File.link("/foo", "/bar")
1399
+ assert_equal "some content", File.read("/bar")
1400
+ end
1401
+
1402
+ def test_hard_link_with_directory_raises_error
1403
+ Dir.mkdir "/foo"
1404
+
1405
+ assert_raises(Errno::EPERM) do
1406
+ File.link("/foo", "/bar")
1407
+ end
1408
+ end
1409
+
1410
+ def test_file_stat_returns_file_stat_object
1411
+ FileUtils.touch("/foo")
1412
+ assert_equal File::Stat, File.stat("/foo").class
1413
+ end
1414
+
1415
+ def test_can_delete_file_with_delete
1416
+ FileUtils.touch("/foo")
1417
+
1418
+ File.delete("/foo")
1419
+
1420
+ assert !File.exists?("/foo")
1421
+ end
1422
+
1423
+ def test_can_delete_multiple_files_with_delete
1424
+ FileUtils.touch("/foo")
1425
+ FileUtils.touch("/bar")
1426
+
1427
+ File.delete("/foo", "/bar")
1428
+
1429
+ assert !File.exists?("/foo")
1430
+ assert !File.exists?("/bar")
1431
+ end
1432
+
1433
+ def test_delete_raises_argument_error_with_no_filename_given
1434
+ assert_raises ArgumentError do
1435
+ File.delete
1436
+ end
1437
+ end
1438
+
1439
+ def test_delete_returns_number_one_when_given_one_arg
1440
+ FileUtils.touch("/foo")
1441
+
1442
+ assert_equal 1, File.delete("/foo")
1443
+ end
1444
+
1445
+ def test_delete_returns_number_two_when_given_two_args
1446
+ FileUtils.touch("/foo")
1447
+ FileUtils.touch("/bar")
1448
+
1449
+ assert_equal 2, File.delete("/foo", "/bar")
1450
+ end
1451
+
1452
+ def test_delete_raises_error_when_first_file_does_not_exist
1453
+ assert_raises Errno::ENOENT do
1454
+ File.delete("/foo")
1455
+ end
1456
+ end
1457
+
1458
+ def test_delete_does_not_raise_error_when_second_file_does_not_exist
1459
+ FileUtils.touch("/foo")
1460
+
1461
+ assert_nothing_raised do
1462
+ File.delete("/foo", "/bar")
1463
+ end
1464
+ end
1465
+
1466
+ def test_unlink_is_alias_for_delete
1467
+ assert_equal File.method(:unlink), File.method(:delete)
1468
+ end
1469
+
1470
+ def test_unlink_removes_only_one_file_content
1471
+ File.open("/foo", "w") { |f| f << "some_content" }
1472
+ File.link("/foo", "/bar")
1473
+
1474
+ File.unlink("/bar")
1475
+ File.read("/foo") == "some_content"
1476
+ end
1477
+
1478
+ def test_link_reports_correct_stat_info_after_unlinking
1479
+ File.open("/foo", "w") { |f| f << "some_content" }
1480
+ File.link("/foo", "/bar")
1481
+
1482
+ File.unlink("/bar")
1483
+ assert_equal 1, File.stat("/foo").nlink
1484
+ end
1485
+
1486
+ def test_delete_works_with_symlink
1487
+ FileUtils.touch("/foo")
1488
+ File.symlink("/foo", "/bar")
1489
+
1490
+ File.unlink("/bar")
1491
+
1492
+ assert File.exists?("/foo")
1493
+ assert !File.exists?("/bar")
1494
+ end
1495
+
1496
+ def test_delete_works_with_symlink_source
1497
+ FileUtils.touch("/foo")
1498
+ File.symlink("/foo", "/bar")
1499
+
1500
+ File.unlink("/foo")
1501
+
1502
+ assert !File.exists?("/foo")
1503
+ end
1504
+
1505
+ def test_file_seek_returns_0
1506
+ File.open("/foo", "w") do |f|
1507
+ f << "one\ntwo\nthree"
1508
+ end
1509
+
1510
+ file = File.open("/foo", "r")
1511
+
1512
+ assert_equal 0, file.seek(1)
1513
+ end
1514
+
1515
+ def test_file_seek_seeks_to_location
1516
+ File.open("/foo", "w") do |f|
1517
+ f << "123"
1518
+ end
1519
+
1520
+ file = File.open("/foo", "r")
1521
+ file.seek(1)
1522
+ assert_equal "23", file.read
1523
+ end
1524
+
1525
+ def test_file_seek_seeks_to_correct_location
1526
+ File.open("/foo", "w") do |f|
1527
+ f << "123"
1528
+ end
1529
+
1530
+ file = File.open("/foo", "r")
1531
+ file.seek(2)
1532
+ assert_equal "3", file.read
1533
+ end
1534
+
1535
+ def test_file_seek_can_take_negative_offset
1536
+ File.open("/foo", "w") do |f|
1537
+ f << "123456789"
1538
+ end
1539
+
1540
+ file = File.open("/foo", "r")
1541
+
1542
+ file.seek(-1, IO::SEEK_END)
1543
+ assert_equal "9", file.read
1544
+
1545
+ file.seek(-2, IO::SEEK_END)
1546
+ assert_equal "89", file.read
1547
+
1548
+ file.seek(-3, IO::SEEK_END)
1549
+ assert_equal "789", file.read
1550
+ end
1551
+
1552
+ def test_should_have_constants_inherited_from_descending_from_io
1553
+ assert_equal IO::SEEK_CUR, File::SEEK_CUR
1554
+ assert_equal IO::SEEK_END, File::SEEK_END
1555
+ assert_equal IO::SEEK_SET, File::SEEK_SET
1556
+ end
1557
+
1558
+ def test_filetest_exists_return_correct_values
1559
+ FileUtils.mkdir_p("/path/to/dir")
1560
+ assert FileTest.exist?("/path/to/")
1561
+
1562
+ FileUtils.rmdir("/path/to/dir")
1563
+ assert !FileTest.exist?("/path/to/dir")
1564
+ end
1565
+
1566
+ def test_pathname_exists_returns_correct_value
1567
+ FileUtils.touch "foo"
1568
+ assert Pathname.new("foo").exist?
1569
+
1570
+ assert !Pathname.new("bar").exist?
1571
+ end
1572
+
1573
+ def test_activating_returns_true
1574
+ FakeFS.deactivate!
1575
+ assert_equal true, FakeFS.activate!
1576
+ end
1577
+
1578
+ def test_deactivating_returns_true
1579
+ assert_equal true, FakeFS.deactivate!
1580
+ end
1581
+
1582
+ def here(fname)
1583
+ RealFile.expand_path(File.join(RealFile.dirname(__FILE__), fname))
1584
+ end
1585
+
1586
+ if RUBY_VERSION >= "1.9.2"
1587
+ def test_file_size
1588
+ File.open("foo", 'w') do |f|
1589
+ f << 'Yada Yada'
1590
+ assert_equal 9, f.size
1591
+ end
1592
+ end
1593
+
1594
+ def test_fdatasync
1595
+ File.open("foo", 'w') do |f|
1596
+ f << 'Yada Yada'
1597
+ assert_nothing_raised do
1598
+ f.fdatasync
1599
+ end
1600
+ end
1601
+ end
1602
+
1603
+ def test_autoclose
1604
+ File.open("foo", 'w') do |f|
1605
+ assert_equal true, f.autoclose?
1606
+ f.autoclose = false
1607
+ assert_equal false, f.autoclose?
1608
+ end
1609
+ end
1610
+ end
1611
+ end