2
require 'test/unit/collector/dir'
8
class TestDir < TestCase
11
def initialize(name, fs, parent=self, &block)
15
@contents = {'.' => self, '..' => parent}
16
instance_eval(&block) if(block)
19
def file(name, contents)
20
@contents[name] = contents
24
@contents[name] = self.class.new(name, @fs, self, &block)
32
return true if(name.nil? || name.empty?)
33
return false unless(@contents.include?(name))
34
@contents[name].kind_of?(self.class)
38
return false unless(@contents.include?(name))
43
@contents.include?(name)
47
raise Errno::ENOENT, name unless(@contents.include?(name))
53
@parent.path_to(@name)
54
elsif(@parent == self)
57
@fs.join(@parent.path_to(@name), name)
67
def each_object(klass, &block)
68
@objects.find_all{|o| o.kind_of?(klass)}.each(&block)
76
attr_reader :object_space
78
def initialize(&block)
79
@root = Directory.new('/', self, &block)
81
@object_space = ObjectSpace.new
87
require_directory(dir)
92
return true if (base = basename(name)) == '/'
93
e = find(dirname(name))
94
return false unless(e)
104
path.scan(/[^\/]+/) do |e|
105
break thing = false unless(thing.kind_of?(Directory))
112
if (name = name.tr_s('/', '/')) == '/'
115
name[%r"\A.+(?=/[^/]+/?\z)|\A/"] || "."
120
name[%r"(\A/|[^/]+)/*\z", 1]
124
[dirname(name), basename(name)]
128
parts.join('/').gsub(%r{/+}, '/')
132
e = find(dirname(name))
133
return false unless(e)
134
e.file?(basename(name))
143
require_directory(to)
147
def expand_path(path, base = nil)
150
path = join(base, path)
153
path.gsub!(%r"(?:/\.)+(?=/)", '')
154
nil while path.sub!(%r"/(?!\.\./)[^/]+/\.\.(?=/)", '')
155
path.sub!(%r"\A(?:/\.\.)+(?=/)", '')
156
path.sub!(%r"(?:\A(/)|/)\.\.?\z", '\1')
160
def require_directory(path)
161
raise Errno::ENOTDIR, path unless(directory?(path))
165
return false if(@required.include?(file))
168
rescue Errno::ENOENT => e
170
raise LoadError, file
172
e = find(file + '.rb')
178
raise LoadError, file
184
dirs = FileSystem::Directory.new('/', nil) do
188
assert_equal(inner_dir, dirs['b'])
192
fs = FileSystem.new do
196
assert_equal(['.', '..', 'a', 'b'].sort, fs.entries('/').sort)
197
assert(fs.directory?('/'))
198
assert(!fs.directory?('/a'))
199
assert(!fs.directory?('/bogus'))
200
assert(fs.file?('/a'))
201
assert(!fs.file?('/'))
202
assert(!fs.file?('/bogus'))
203
assert(fs.directory?('/b'))
204
assert(fs.file?('a'))
205
assert(fs.directory?('b'))
209
fs = FileSystem.new do
217
assert(fs.file?('/a/b'))
218
assert(!fs.file?('/a/b/c/d'))
219
assert(fs.file?('/a/c/d'))
223
fs = FileSystem.new do
232
assert_equal('/', fs.pwd)
233
assert_raises(Errno::ENOENT) do
236
assert_raises(Errno::ENOTDIR) do
240
assert_equal('/b', fs.pwd)
242
assert_equal('/b/d', fs.pwd)
244
assert_equal('/b', fs.pwd)
246
assert_equal('/', fs.pwd)
250
fs = FileSystem.new do
264
assert_equal(['.', '..', 'a', 'b', 'e', 'f'], fs.entries('/').sort)
265
assert_equal(['.', '..', 'a', 'b', 'e', 'f'], fs.entries('.').sort)
266
assert_equal(['.', '..', 'a', 'b', 'e', 'f'], fs.entries('b/..').sort)
267
assert_equal(['.', '..', 'c', 'd'], fs.entries('b').sort)
268
assert_raises(Errno::ENOENT) do
271
assert_raises(Errno::ENOTDIR) do
275
assert_equal(['.', '..', 'i'], fs.entries('h').sort)
283
fs = FileSystem.new do
284
file 'test_class1.rb', TestClass1
286
file 'test_class2.rb', TestClass2
290
fs.object_space.each_object(Class) do |o|
295
assert_raises(LoadError) do
299
assert(fs.require('test_class1.rb'))
300
assert(!fs.require('test_class1.rb'))
302
fs.object_space.each_object(Class) do |o|
305
assert_equal([TestClass1], c)
307
fs.require('dir/test_class2')
309
fs.object_space.each_object(Class) do |o|
312
assert_equal([TestClass1, TestClass2], c)
315
fs.object_space.each_object(Time) do |o|
322
@t1 = t1 = create_test(1)
323
@t2 = t2 = create_test(2)
324
@t3 = t3 = create_test(3)
325
@t4 = t4 = create_test(4)
326
@t5 = t5 = create_test(5)
327
@t6 = t6 = create_test(6)
328
fs = FileSystem.new do
337
file 'test_6.rb', Time
342
@c = Dir.new(fs, fs, fs.object_space, fs)
345
def create_test(name)
346
t = Class.new(TestCase)
359
def test_simple_collect
360
expected = TestSuite.new('d1')
361
expected << (@t3.suite)
362
assert_equal(expected, @c.collect('d1'))
365
def test_multilevel_collect
366
expected = TestSuite.new('.')
367
expected << @t1.suite << @t2.suite
368
expected << (TestSuite.new('d1') << @t3.suite)
369
assert_equal(expected, @c.collect)
372
def test_collect_file
373
expected = TestSuite.new('test_1.rb')
374
expected << @t1.suite
375
assert_equal(expected, @c.collect('test_1.rb'))
377
expected = TestSuite.new('t4.rb')
378
expected << @t4.suite
379
assert_equal(expected, @c.collect('t4.rb'))
383
expected = TestSuite.new('d2')
384
expected << @t5.suite
386
assert_equal(expected, @c.collect('d2'))
390
expected = TestSuite.new('.')
391
expected << @t1.suite
392
@c.filter = proc{|t| t.method_name == 'test_1a' || t.method_name == 'test_1b'}
393
assert_equal(expected, @c.collect)
396
def test_collect_multi
397
expected = TestSuite.new('[d1, d2]')
398
expected << (TestSuite.new('d1') << @t3.suite)
399
expected << (TestSuite.new('d2') << @t5.suite)
400
@c.pattern.replace([/\btest_/])
401
assert_equal(expected, @c.collect('d1', 'd2'))