activegroonga 0.0.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.
Files changed (121) hide show
  1. data/AUTHORS +1 -0
  2. data/NEWS.ja.rdoc +5 -0
  3. data/NEWS.rdoc +5 -0
  4. data/README.ja.rdoc +49 -0
  5. data/README.rdoc +49 -0
  6. data/Rakefile +175 -0
  7. data/lib/active_groonga.rb +75 -0
  8. data/lib/active_groonga/aggregations.rb +30 -0
  9. data/lib/active_groonga/associations.rb +93 -0
  10. data/lib/active_groonga/associations/belongs_to_association.rb +25 -0
  11. data/lib/active_groonga/attribute_methods.rb +36 -0
  12. data/lib/active_groonga/base.rb +1579 -0
  13. data/lib/active_groonga/column.rb +107 -0
  14. data/lib/active_groonga/dirty.rb +30 -0
  15. data/lib/active_groonga/fixtures.rb +92 -0
  16. data/lib/active_groonga/migration.rb +150 -0
  17. data/lib/active_groonga/rails_support.rb +31 -0
  18. data/lib/active_groonga/reflection.rb +30 -0
  19. data/lib/active_groonga/schema.rb +314 -0
  20. data/lib/active_groonga/schema_dumper.rb +147 -0
  21. data/lib/active_groonga/tasks.rb +16 -0
  22. data/lib/active_groonga/tasks/groonga.rake +162 -0
  23. data/lib/active_groonga/test_case.rb +21 -0
  24. data/lib/active_groonga/test_help.rb +21 -0
  25. data/lib/active_groonga/timestamp.rb +30 -0
  26. data/lib/active_groonga/validations.rb +26 -0
  27. data/lib/active_groonga/version.rb +24 -0
  28. data/license/LGPL +504 -0
  29. data/rails/README +28 -0
  30. data/rails/init.rb +70 -0
  31. data/rails_generators/model_groonga/USAGE +28 -0
  32. data/rails_generators/model_groonga/model_groonga_generator.rb +45 -0
  33. data/rails_generators/model_groonga/templates/fixtures.yml +17 -0
  34. data/rails_generators/model_groonga/templates/migration.rb +16 -0
  35. data/rails_generators/model_groonga/templates/model.rb +2 -0
  36. data/rails_generators/model_groonga/templates/unit_test.rb +8 -0
  37. data/test-unit/Rakefile +35 -0
  38. data/test-unit/TODO +5 -0
  39. data/test-unit/bin/testrb +5 -0
  40. data/test-unit/html/classic.html +15 -0
  41. data/test-unit/html/index.html +25 -0
  42. data/test-unit/html/index.html.ja +27 -0
  43. data/test-unit/lib/test/unit.rb +342 -0
  44. data/test-unit/lib/test/unit/assertionfailederror.rb +14 -0
  45. data/test-unit/lib/test/unit/assertions.rb +1149 -0
  46. data/test-unit/lib/test/unit/attribute.rb +125 -0
  47. data/test-unit/lib/test/unit/autorunner.rb +306 -0
  48. data/test-unit/lib/test/unit/collector.rb +43 -0
  49. data/test-unit/lib/test/unit/collector/descendant.rb +23 -0
  50. data/test-unit/lib/test/unit/collector/dir.rb +108 -0
  51. data/test-unit/lib/test/unit/collector/load.rb +135 -0
  52. data/test-unit/lib/test/unit/collector/objectspace.rb +34 -0
  53. data/test-unit/lib/test/unit/color-scheme.rb +86 -0
  54. data/test-unit/lib/test/unit/color.rb +96 -0
  55. data/test-unit/lib/test/unit/diff.rb +538 -0
  56. data/test-unit/lib/test/unit/error.rb +124 -0
  57. data/test-unit/lib/test/unit/exceptionhandler.rb +39 -0
  58. data/test-unit/lib/test/unit/failure.rb +110 -0
  59. data/test-unit/lib/test/unit/fixture.rb +176 -0
  60. data/test-unit/lib/test/unit/notification.rb +125 -0
  61. data/test-unit/lib/test/unit/omission.rb +143 -0
  62. data/test-unit/lib/test/unit/pending.rb +146 -0
  63. data/test-unit/lib/test/unit/priority.rb +161 -0
  64. data/test-unit/lib/test/unit/runner/console.rb +52 -0
  65. data/test-unit/lib/test/unit/runner/emacs.rb +8 -0
  66. data/test-unit/lib/test/unit/testcase.rb +360 -0
  67. data/test-unit/lib/test/unit/testresult.rb +89 -0
  68. data/test-unit/lib/test/unit/testsuite.rb +110 -0
  69. data/test-unit/lib/test/unit/ui/console/outputlevel.rb +14 -0
  70. data/test-unit/lib/test/unit/ui/console/testrunner.rb +220 -0
  71. data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +49 -0
  72. data/test-unit/lib/test/unit/ui/testrunner.rb +20 -0
  73. data/test-unit/lib/test/unit/ui/testrunnermediator.rb +77 -0
  74. data/test-unit/lib/test/unit/ui/testrunnerutilities.rb +41 -0
  75. data/test-unit/lib/test/unit/util/backtracefilter.rb +41 -0
  76. data/test-unit/lib/test/unit/util/method-owner-finder.rb +28 -0
  77. data/test-unit/lib/test/unit/util/observable.rb +90 -0
  78. data/test-unit/lib/test/unit/util/procwrapper.rb +48 -0
  79. data/test-unit/lib/test/unit/version.rb +7 -0
  80. data/test-unit/sample/adder.rb +13 -0
  81. data/test-unit/sample/subtracter.rb +12 -0
  82. data/test-unit/sample/tc_adder.rb +18 -0
  83. data/test-unit/sample/tc_subtracter.rb +18 -0
  84. data/test-unit/sample/test_user.rb +22 -0
  85. data/test-unit/sample/ts_examples.rb +7 -0
  86. data/test-unit/test/collector/test-descendant.rb +135 -0
  87. data/test-unit/test/collector/test-load.rb +333 -0
  88. data/test-unit/test/collector/test_dir.rb +406 -0
  89. data/test-unit/test/collector/test_objectspace.rb +98 -0
  90. data/test-unit/test/run-test.rb +13 -0
  91. data/test-unit/test/test-attribute.rb +86 -0
  92. data/test-unit/test/test-color-scheme.rb +56 -0
  93. data/test-unit/test/test-color.rb +47 -0
  94. data/test-unit/test/test-diff.rb +477 -0
  95. data/test-unit/test/test-emacs-runner.rb +60 -0
  96. data/test-unit/test/test-fixture.rb +287 -0
  97. data/test-unit/test/test-notification.rb +33 -0
  98. data/test-unit/test/test-omission.rb +81 -0
  99. data/test-unit/test/test-pending.rb +70 -0
  100. data/test-unit/test/test-priority.rb +119 -0
  101. data/test-unit/test/test_assertions.rb +1082 -0
  102. data/test-unit/test/test_error.rb +26 -0
  103. data/test-unit/test/test_failure.rb +33 -0
  104. data/test-unit/test/test_testcase.rb +478 -0
  105. data/test-unit/test/test_testresult.rb +113 -0
  106. data/test-unit/test/test_testsuite.rb +129 -0
  107. data/test-unit/test/testunit-test-util.rb +14 -0
  108. data/test-unit/test/ui/test_testrunmediator.rb +20 -0
  109. data/test-unit/test/util/test-method-owner-finder.rb +38 -0
  110. data/test-unit/test/util/test_backtracefilter.rb +41 -0
  111. data/test-unit/test/util/test_observable.rb +102 -0
  112. data/test-unit/test/util/test_procwrapper.rb +36 -0
  113. data/test/active-groonga-test-utils.rb +234 -0
  114. data/test/fixtures/bookmark.rb +2 -0
  115. data/test/fixtures/task.rb +2 -0
  116. data/test/fixtures/user.rb +2 -0
  117. data/test/run-test.rb +51 -0
  118. data/test/test-associations.rb +24 -0
  119. data/test/test-base.rb +194 -0
  120. data/test/test-schema.rb +49 -0
  121. metadata +192 -0
@@ -0,0 +1,333 @@
1
+ require 'tmpdir'
2
+ require 'pathname'
3
+
4
+ require 'test/unit'
5
+ require 'test/unit/collector/load'
6
+
7
+ class TestUnitCollectorLoad < Test::Unit::TestCase
8
+ def setup
9
+ @previous_descendants = Test::Unit::TestCase::DESCENDANTS.dup
10
+ Test::Unit::TestCase::DESCENDANTS.clear
11
+
12
+ @temporary_test_cases_module_name = "TempTestCases"
13
+ ::Object.const_set(@temporary_test_cases_module_name, Module.new)
14
+
15
+ @test_dir = Pathname(Dir.tmpdir) + "test-unit"
16
+ @test_dir.rmtree if @test_dir.exist?
17
+ @test_dir.mkpath
18
+ end
19
+
20
+ setup
21
+ def setup_top_level_test_cases
22
+ @test_case1 = @test_dir + "test_case1.rb"
23
+ @test_case2 = @test_dir + "test_case2.rb"
24
+ @no_load_test_case3 = @test_dir + "case3.rb"
25
+
26
+ @test_case1.open("w") do |test_case|
27
+ test_case.puts(<<-EOT)
28
+ module #{@temporary_test_cases_module_name}
29
+ class TestCase1 < Test::Unit::TestCase
30
+ def test1_1
31
+ end
32
+
33
+ def test1_2
34
+ end
35
+ end
36
+ end
37
+ EOT
38
+ end
39
+
40
+ @test_case2.open("w") do |test_case|
41
+ test_case.puts(<<-EOT)
42
+ module #{@temporary_test_cases_module_name}
43
+ class TestCase2 < Test::Unit::TestCase
44
+ def test2
45
+ end
46
+ end
47
+ end
48
+ EOT
49
+ end
50
+
51
+ @no_load_test_case3.open("w") do |test_case|
52
+ test_case.puts(<<-EOT)
53
+ module #{@temporary_test_cases_module_name}
54
+ class NoLoadTestCase3 < Test::Unit::TestCase
55
+ def test3
56
+ end
57
+ end
58
+ end
59
+ EOT
60
+ end
61
+ end
62
+
63
+ setup
64
+ def setup_sub_level_test_cases
65
+ @sub_test_dir = @test_dir + "sub"
66
+ @sub_test_dir.mkpath
67
+
68
+ @sub_test_case4 = @sub_test_dir + "test_case4.rb"
69
+ @no_load_sub_test_case5 = @sub_test_dir + "case5.rb"
70
+ @sub_test_case6 = @sub_test_dir + "test_case6.rb"
71
+
72
+ @sub_test_case4.open("w") do |test_case|
73
+ test_case.puts(<<-EOT)
74
+ module #{@temporary_test_cases_module_name}
75
+ class SubTestCase4 < Test::Unit::TestCase
76
+ def test4_1
77
+ end
78
+
79
+ def test4_2
80
+ end
81
+ end
82
+ end
83
+ EOT
84
+ end
85
+
86
+ @no_load_sub_test_case5.open("w") do |test_case|
87
+ test_case.puts(<<-EOT)
88
+ module #{@temporary_test_cases_module_name}
89
+ class NoLoadSubTestCase5 < Test::Unit::TestCase
90
+ def test5_1
91
+ end
92
+
93
+ def test5_2
94
+ end
95
+ end
96
+ end
97
+ EOT
98
+ end
99
+
100
+ @sub_test_case6.open("w") do |test_case|
101
+ test_case.puts(<<-EOT)
102
+ module #{@temporary_test_cases_module_name}
103
+ class SubTestCase6 < Test::Unit::TestCase
104
+ def test6
105
+ end
106
+ end
107
+ end
108
+ EOT
109
+ end
110
+ end
111
+
112
+ setup
113
+ def setup_sub_level_test_cases2
114
+ @sub2_test_dir = @test_dir + "sub2"
115
+ @sub2_test_dir.mkpath
116
+
117
+ @no_load_sub2_test_case7 = @sub2_test_dir + "case7.rb"
118
+ @sub2_test_case8 = @sub2_test_dir + "test_case8.rb"
119
+ @sub2_test_case9 = @sub2_test_dir + "test_case9.rb"
120
+
121
+ @no_load_sub2_test_case7.open("w") do |test_case|
122
+ test_case.puts(<<-EOT)
123
+ module #{@temporary_test_cases_module_name}
124
+ class NoLoadSub2TestCase7 < Test::Unit::TestCase
125
+ def test7_1
126
+ end
127
+
128
+ def test7_2
129
+ end
130
+ end
131
+ end
132
+ EOT
133
+ end
134
+
135
+ @sub2_test_case8.open("w") do |test_case|
136
+ test_case.puts(<<-EOT)
137
+ module #{@temporary_test_cases_module_name}
138
+ class Sub2TestCase8 < Test::Unit::TestCase
139
+ def test8_1
140
+ end
141
+
142
+ def test8_2
143
+ end
144
+ end
145
+ end
146
+ EOT
147
+ end
148
+
149
+ @sub2_test_case9.open("w") do |test_case|
150
+ test_case.puts(<<-EOT)
151
+ module #{@temporary_test_cases_module_name}
152
+ class Sub2TestCase9 < Test::Unit::TestCase
153
+ def test9
154
+ end
155
+ end
156
+ end
157
+ EOT
158
+ end
159
+ end
160
+
161
+ setup
162
+ def setup_svn_test_cases
163
+ @svn_test_dir = @test_dir + ".svn"
164
+ @svn_test_dir.mkpath
165
+
166
+ @svn_test_case10 = @svn_test_dir + "test_case10.rb"
167
+
168
+ @svn_test_case10.open("w") do |test_case|
169
+ test_case.puts(<<-EOT)
170
+ module #{@temporary_test_cases_module_name}
171
+ class SvnTestCase10 < Test::Unit::TestCase
172
+ def test7
173
+ end
174
+ end
175
+ end
176
+ EOT
177
+ end
178
+ end
179
+
180
+ setup
181
+ def setup_sub_cvs_test_cases
182
+ @sub_cvs_test_dir = @sub_test_dir + "CVS"
183
+ @sub_cvs_test_dir.mkpath
184
+
185
+ @sub_cvs_test_case11 = @sub_cvs_test_dir + "test_case11.rb"
186
+
187
+ @sub_cvs_test_case11.open("w") do |test_case|
188
+ test_case.puts(<<-EOT)
189
+ module #{@temporary_test_cases_module_name}
190
+ class SubCVSTestCase11 < Test::Unit::TestCase
191
+ def test11
192
+ end
193
+ end
194
+ end
195
+ EOT
196
+ end
197
+ end
198
+
199
+ def teardown
200
+ @test_dir.rmtree if @test_dir.exist?
201
+ ::Object.send(:remove_const, @temporary_test_cases_module_name)
202
+ Test::Unit::TestCase::DESCENDANTS.replace(@previous_descendants)
203
+ end
204
+
205
+ def test_simple_collect
206
+ assert_collect([:suite, {:name => @sub_test_dir.basename.to_s},
207
+ [:suite, {:name => _test_case_name("SubTestCase4")},
208
+ [:test, {:name => "test4_1"}],
209
+ [:test, {:name => "test4_2"}]],
210
+ [:suite, {:name => _test_case_name("SubTestCase6")},
211
+ [:test, {:name => "test6"}]]],
212
+ @sub_test_dir.to_s)
213
+ end
214
+
215
+ def test_multilevel_collect
216
+ assert_collect([:suite, {:name => "."},
217
+ [:suite, {:name => _test_case_name("TestCase1")},
218
+ [:test, {:name => "test1_1"}],
219
+ [:test, {:name => "test1_2"}]],
220
+ [:suite, {:name => _test_case_name("TestCase2")},
221
+ [:test, {:name => "test2"}]],
222
+ [:suite, {:name => @sub_test_dir.basename.to_s},
223
+ [:suite, {:name => _test_case_name("SubTestCase4")},
224
+ [:test, {:name => "test4_1"}],
225
+ [:test, {:name => "test4_2"}]],
226
+ [:suite, {:name => _test_case_name("SubTestCase6")},
227
+ [:test, {:name => "test6"}]]],
228
+ [:suite, {:name => @sub2_test_dir.basename.to_s},
229
+ [:suite, {:name => _test_case_name("Sub2TestCase8")},
230
+ [:test, {:name => "test8_1"}],
231
+ [:test, {:name => "test8_2"}]],
232
+ [:suite, {:name => _test_case_name("Sub2TestCase9")},
233
+ [:test, {:name => "test9"}]]]])
234
+ end
235
+
236
+ def test_collect_file
237
+ assert_collect([:suite, {:name => @test_case1.basename.to_s},
238
+ [:suite, {:name => _test_case_name("TestCase1")},
239
+ [:test, {:name => "test1_1"}],
240
+ [:test, {:name => "test1_2"}]]],
241
+ @test_case1.to_s)
242
+
243
+ assert_collect([:suite, {:name => @no_load_sub_test_case5.basename.to_s},
244
+ [:suite, {:name => _test_case_name("NoLoadSubTestCase5")},
245
+ [:test, {:name => "test5_1"}],
246
+ [:test, {:name => "test5_2"}]]],
247
+ @no_load_sub_test_case5.to_s)
248
+ end
249
+
250
+ def test_nil_pattern
251
+ assert_collect([:suite, {:name => @sub_test_dir.basename.to_s},
252
+ [:suite, {:name => _test_case_name("NoLoadSubTestCase5")},
253
+ [:test, {:name => "test5_1"}],
254
+ [:test, {:name => "test5_2"}]],
255
+ [:suite, {:name => _test_case_name("SubTestCase4")},
256
+ [:test, {:name => "test4_1"}],
257
+ [:test, {:name => "test4_2"}]],
258
+ [:suite, {:name => _test_case_name("SubTestCase6")},
259
+ [:test, {:name => "test6"}]]],
260
+ @sub_test_dir.to_s) do |collector|
261
+ collector.patterns.clear
262
+ end
263
+ end
264
+
265
+ def test_filtering
266
+ assert_collect([:suite, {:name => "."},
267
+ [:suite, {:name => _test_case_name("TestCase1")},
268
+ [:test, {:name => "test1_1"}],
269
+ [:test, {:name => "test1_2"}]]]) do |collector|
270
+ collector.filter = Proc.new do |test|
271
+ !/\Atest1/.match(test.method_name).nil?
272
+ end
273
+ end
274
+ end
275
+
276
+ def test_collect_multi
277
+ test_dirs = [@sub_test_dir.to_s, @sub2_test_dir.to_s]
278
+ assert_collect([:suite, {:name => "[#{test_dirs.join(', ')}]"},
279
+ [:suite, {:name => @sub_test_dir.basename.to_s},
280
+ [:suite, {:name => _test_case_name("SubTestCase4")},
281
+ [:test, {:name => "test4_1"}],
282
+ [:test, {:name => "test4_2"}]],
283
+ [:suite, {:name => _test_case_name("SubTestCase6")},
284
+ [:test, {:name => "test6"}]]],
285
+ [:suite, {:name => @sub2_test_dir.basename.to_s},
286
+ [:suite, {:name => _test_case_name("Sub2TestCase8")},
287
+ [:test, {:name => "test8_1"}],
288
+ [:test, {:name => "test8_2"}]],
289
+ [:suite, {:name => _test_case_name("Sub2TestCase9")},
290
+ [:test, {:name => "test9"}]]]],
291
+ *test_dirs)
292
+ end
293
+
294
+ private
295
+ def assert_collect(expected, *collect_args)
296
+ keep_required_files do
297
+ Dir.chdir(@test_dir.to_s) do
298
+ collector = Test::Unit::Collector::Load.new
299
+ yield(collector) if block_given?
300
+ actual = inspect_test_object(collector.send(:collect, *collect_args))
301
+ assert_equal(expected, actual)
302
+ end
303
+ end
304
+ end
305
+
306
+ def keep_required_files
307
+ required_files = $".dup
308
+ yield
309
+ ensure
310
+ $".replace(required_files)
311
+ end
312
+
313
+ def _test_case_name(test_case_class_name)
314
+ "#{@temporary_test_cases_module_name}::#{test_case_class_name}"
315
+ end
316
+
317
+ def inspect_test_object(test_object)
318
+ return nil if test_object.nil?
319
+ case test_object
320
+ when Test::Unit::TestSuite
321
+ sub_tests = test_object.tests.collect do |test|
322
+ inspect_test_object(test)
323
+ end.sort_by do |type, attributes, *children|
324
+ attributes[:name]
325
+ end
326
+ [:suite, {:name => test_object.name}, *sub_tests]
327
+ when Test::Unit::TestCase
328
+ [:test, {:name => test_object.method_name}]
329
+ else
330
+ raise "unexpected test object: #{test_object.inspect}"
331
+ end
332
+ end
333
+ end
@@ -0,0 +1,406 @@
1
+ require 'test/unit'
2
+ require 'test/unit/collector/dir'
3
+ require 'pp'
4
+
5
+ module Test
6
+ module Unit
7
+ module Collector
8
+ class TestDir < TestCase
9
+ class FileSystem
10
+ class Directory
11
+ def initialize(name, fs, parent=self, &block)
12
+ @name = name
13
+ @fs = fs
14
+ @parent = parent
15
+ @contents = {'.' => self, '..' => parent}
16
+ instance_eval(&block) if(block)
17
+ end
18
+
19
+ def file(name, contents)
20
+ @contents[name] = contents
21
+ end
22
+
23
+ def dir(name, &block)
24
+ @contents[name] = self.class.new(name, @fs, self, &block)
25
+ end
26
+
27
+ def entries
28
+ @contents.keys
29
+ end
30
+
31
+ def directory?(name)
32
+ return true if(name.nil? || name.empty?)
33
+ return false unless(@contents.include?(name))
34
+ @contents[name].kind_of?(self.class)
35
+ end
36
+
37
+ def file?(name)
38
+ return false unless(@contents.include?(name))
39
+ !directory?(name)
40
+ end
41
+
42
+ def exist?(name)
43
+ @contents.include?(name)
44
+ end
45
+
46
+ def [](name)
47
+ raise Errno::ENOENT, name unless(@contents.include?(name))
48
+ @contents[name]
49
+ end
50
+
51
+ def path_to(name=nil)
52
+ if(!name)
53
+ @parent.path_to(@name)
54
+ elsif(@parent == self)
55
+ @fs.join('/', name)
56
+ else
57
+ @fs.join(@parent.path_to(@name), name)
58
+ end
59
+ end
60
+ end
61
+
62
+ class ObjectSpace
63
+ def initialize
64
+ @objects = []
65
+ end
66
+
67
+ def each_object(klass, &block)
68
+ @objects.find_all{|o| o.kind_of?(klass)}.each(&block)
69
+ end
70
+
71
+ def <<(object)
72
+ @objects << object
73
+ end
74
+ end
75
+
76
+ attr_reader :object_space
77
+
78
+ def initialize(&block)
79
+ @root = Directory.new('/', self, &block)
80
+ @pwd = @root
81
+ @object_space = ObjectSpace.new
82
+ @required = []
83
+ end
84
+
85
+ def entries(dir)
86
+ e = find(dir)
87
+ require_directory(dir)
88
+ e.entries
89
+ end
90
+
91
+ def directory?(name)
92
+ return true if (base = basename(name)) == '/'
93
+ e = find(dirname(name))
94
+ return false unless(e)
95
+ e.directory?(base)
96
+ end
97
+
98
+ def find(path)
99
+ if(/\A\// =~ path)
100
+ thing = @root
101
+ else
102
+ thing = @pwd
103
+ end
104
+ path.scan(/[^\/]+/) do |e|
105
+ break thing = false unless(thing.kind_of?(Directory))
106
+ thing = thing[e]
107
+ end
108
+ thing
109
+ end
110
+
111
+ def dirname(name)
112
+ if (name = name.tr_s('/', '/')) == '/'
113
+ name
114
+ else
115
+ name[%r"\A.+(?=/[^/]+/?\z)|\A/"] || "."
116
+ end
117
+ end
118
+
119
+ def basename(name)
120
+ name[%r"(\A/|[^/]+)/*\z", 1]
121
+ end
122
+
123
+ def split(name)
124
+ [dirname(name), basename(name)]
125
+ end
126
+
127
+ def join(*parts)
128
+ parts.join('/').gsub(%r{/+}, '/')
129
+ end
130
+
131
+ def file?(name)
132
+ e = find(dirname(name))
133
+ return false unless(e)
134
+ e.file?(basename(name))
135
+ end
136
+
137
+ def pwd
138
+ @pwd.path_to
139
+ end
140
+
141
+ def chdir(to)
142
+ e = find(to)
143
+ require_directory(to)
144
+ @pwd = e
145
+ end
146
+
147
+ def expand_path(path, base = nil)
148
+ until /\A\// =~ path
149
+ base ||= pwd
150
+ path = join(base, path)
151
+ base = nil
152
+ end
153
+ path.gsub!(%r"(?:/\.)+(?=/)", '')
154
+ nil while path.sub!(%r"/(?!\.\./)[^/]+/\.\.(?=/)", '')
155
+ path.sub!(%r"\A(?:/\.\.)+(?=/)", '')
156
+ path.sub!(%r"(?:\A(/)|/)\.\.?\z", '\1')
157
+ path
158
+ end
159
+
160
+ def require_directory(path)
161
+ raise Errno::ENOTDIR, path unless(directory?(path))
162
+ end
163
+
164
+ def require(file)
165
+ return false if(@required.include?(file))
166
+ begin
167
+ e = find(file)
168
+ rescue Errno::ENOENT => e
169
+ if(/\.rb\Z/ =~ file)
170
+ raise LoadError, file
171
+ end
172
+ e = find(file + '.rb')
173
+ end
174
+ @required << file
175
+ @object_space << e
176
+ true
177
+ rescue Errno::ENOENT
178
+ raise LoadError, file
179
+ end
180
+ end
181
+
182
+ def test_dir
183
+ inner_dir = nil
184
+ dirs = FileSystem::Directory.new('/', nil) do
185
+ file 'a', nil
186
+ inner_dir = dir 'b'
187
+ end
188
+ assert_equal(inner_dir, dirs['b'])
189
+ end
190
+
191
+ def test_fs
192
+ fs = FileSystem.new do
193
+ file 'a', nil
194
+ dir 'b'
195
+ end
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'))
206
+ end
207
+
208
+ def test_fs_sub
209
+ fs = FileSystem.new do
210
+ dir 'a' do
211
+ file 'b', nil
212
+ dir 'c' do
213
+ file 'd', nil
214
+ end
215
+ end
216
+ end
217
+ assert(fs.file?('/a/b'))
218
+ assert(!fs.file?('/a/b/c/d'))
219
+ assert(fs.file?('/a/c/d'))
220
+ end
221
+
222
+ def test_fs_pwd
223
+ fs = FileSystem.new do
224
+ file 'a', nil
225
+ dir 'b' do
226
+ file 'c', nil
227
+ dir 'd' do
228
+ file 'e', nil
229
+ end
230
+ end
231
+ end
232
+ assert_equal('/', fs.pwd)
233
+ assert_raises(Errno::ENOENT) do
234
+ fs.chdir('bogus')
235
+ end
236
+ assert_raises(Errno::ENOTDIR) do
237
+ fs.chdir('a')
238
+ end
239
+ fs.chdir('b')
240
+ assert_equal('/b', fs.pwd)
241
+ fs.chdir('d')
242
+ assert_equal('/b/d', fs.pwd)
243
+ fs.chdir('..')
244
+ assert_equal('/b', fs.pwd)
245
+ fs.chdir('..')
246
+ assert_equal('/', fs.pwd)
247
+ end
248
+
249
+ def test_fs_entries
250
+ fs = FileSystem.new do
251
+ file 'a', nil
252
+ dir 'b' do
253
+ file 'c', nil
254
+ file 'd', nil
255
+ end
256
+ file 'e', nil
257
+ dir 'f' do
258
+ file 'g', nil
259
+ dir 'h' do
260
+ file 'i', nil
261
+ end
262
+ end
263
+ end
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
269
+ fs.entries('z')
270
+ end
271
+ assert_raises(Errno::ENOTDIR) do
272
+ fs.entries('a')
273
+ end
274
+ fs.chdir('f')
275
+ assert_equal(['.', '..', 'i'], fs.entries('h').sort)
276
+ end
277
+
278
+ class TestClass1
279
+ end
280
+ class TestClass2
281
+ end
282
+ def test_fs_require
283
+ fs = FileSystem.new do
284
+ file 'test_class1.rb', TestClass1
285
+ dir 'dir' do
286
+ file 'test_class2.rb', TestClass2
287
+ end
288
+ end
289
+ c = []
290
+ fs.object_space.each_object(Class) do |o|
291
+ c << o
292
+ end
293
+ assert_equal([], c)
294
+
295
+ assert_raises(LoadError) do
296
+ fs.require('bogus')
297
+ end
298
+
299
+ assert(fs.require('test_class1.rb'))
300
+ assert(!fs.require('test_class1.rb'))
301
+ c = []
302
+ fs.object_space.each_object(Class) do |o|
303
+ c << o
304
+ end
305
+ assert_equal([TestClass1], c)
306
+
307
+ fs.require('dir/test_class2')
308
+ c = []
309
+ fs.object_space.each_object(Class) do |o|
310
+ c << o
311
+ end
312
+ assert_equal([TestClass1, TestClass2], c)
313
+
314
+ c = []
315
+ fs.object_space.each_object(Time) do |o|
316
+ c << o
317
+ end
318
+ assert_equal([], c)
319
+ end
320
+
321
+ def setup
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
329
+ file 'test_1.rb', t1
330
+ file 'test_2.rb', t2
331
+ dir 'd1' do
332
+ file 'test_3.rb', t3
333
+ end
334
+ file 't4.rb', t4
335
+ dir 'd2' do
336
+ file 'test_5', t5
337
+ file 'test_6.rb', Time
338
+ end
339
+ file 't6.rb', t6
340
+ end
341
+ fs.require('t6')
342
+ @c = Dir.new(fs, fs, fs.object_space, fs)
343
+ end
344
+
345
+ def create_test(name)
346
+ t = Class.new(TestCase)
347
+ t.class_eval <<-EOC
348
+ def self.name
349
+ "T\#{#{name}}"
350
+ end
351
+ def test_#{name}a
352
+ end
353
+ def test_#{name}b
354
+ end
355
+ EOC
356
+ t
357
+ end
358
+
359
+ def test_simple_collect
360
+ expected = TestSuite.new('d1')
361
+ expected << (@t3.suite)
362
+ assert_equal(expected, @c.collect('d1'))
363
+ end
364
+
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)
370
+ end
371
+
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'))
376
+
377
+ expected = TestSuite.new('t4.rb')
378
+ expected << @t4.suite
379
+ assert_equal(expected, @c.collect('t4.rb'))
380
+ end
381
+
382
+ def test_nil_pattern
383
+ expected = TestSuite.new('d2')
384
+ expected << @t5.suite
385
+ @c.pattern.clear
386
+ assert_equal(expected, @c.collect('d2'))
387
+ end
388
+
389
+ def test_filtering
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)
394
+ end
395
+
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'))
402
+ end
403
+ end
404
+ end
405
+ end
406
+ end