rroonga 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (135) hide show
  1. data/NEWS.ja.rdoc +46 -0
  2. data/NEWS.rdoc +46 -0
  3. data/README.ja.rdoc +2 -2
  4. data/README.rdoc +2 -3
  5. data/Rakefile +148 -11
  6. data/example/bookmark.rb +94 -91
  7. data/ext/groonga/extconf.rb +25 -25
  8. data/ext/groonga/groonga.def +2 -0
  9. data/ext/groonga/mkmf.log +7 -7
  10. data/ext/groonga/rb-grn-column.c +66 -0
  11. data/ext/groonga/rb-grn-context.c +92 -5
  12. data/ext/groonga/rb-grn-database.c +24 -1
  13. data/ext/groonga/rb-grn-exception.c +15 -0
  14. data/ext/groonga/rb-grn-hash.c +2 -2
  15. data/ext/groonga/rb-grn-index-column.c +8 -4
  16. data/ext/groonga/rb-grn-object.c +4 -2
  17. data/ext/groonga/rb-grn-patricia-trie.c +2 -2
  18. data/ext/groonga/rb-grn-snippet.c +1 -0
  19. data/ext/groonga/rb-grn-table-key-support.c +22 -19
  20. data/ext/groonga/rb-grn-table.c +63 -5
  21. data/ext/groonga/rb-grn.h +1 -1
  22. data/ext/groonga/rb-groonga.c +1 -0
  23. data/extconf.rb +1 -1
  24. data/html/developer.html +8 -2
  25. data/html/favicon.ico +0 -0
  26. data/html/favicon.svg +591 -0
  27. data/html/index.html +71 -8
  28. data/html/logo.svg +612 -0
  29. data/html/ranguba.css +92 -7
  30. data/html/readme.svg +256 -0
  31. data/lib/groonga/expression-builder.rb +8 -4
  32. data/lib/groonga/record.rb +77 -7
  33. data/lib/groonga/schema.rb +429 -100
  34. data/rroonga-build.rb +1 -1
  35. data/test/run-test.rb +1 -1
  36. data/test/test-array.rb +4 -0
  37. data/test/test-context.rb +8 -0
  38. data/test/test-database.rb +8 -1
  39. data/test/test-expression-builder.rb +14 -0
  40. data/test/test-fix-size-column.rb +4 -0
  41. data/test/test-hash.rb +10 -4
  42. data/test/test-index-column.rb +11 -0
  43. data/test/test-patricia-trie.rb +7 -1
  44. data/test/test-record.rb +14 -0
  45. data/test/test-remote.rb +3 -2
  46. data/test/test-schema-create-table.rb +32 -2
  47. data/test/test-schema.rb +108 -11
  48. data/test/test-table-select-normalize.rb +7 -3
  49. data/test/test-table-select.rb +12 -0
  50. data/test/test-table.rb +7 -0
  51. data/test/test-variable-size-column.rb +4 -0
  52. data/test-unit/Rakefile +40 -0
  53. data/test-unit/TODO +5 -0
  54. data/test-unit/bin/testrb +5 -0
  55. data/test-unit/html/classic.html +15 -0
  56. data/test-unit/html/index.html +25 -0
  57. data/test-unit/html/index.html.ja +27 -0
  58. data/test-unit/lib/test/unit/assertionfailederror.rb +25 -0
  59. data/test-unit/lib/test/unit/assertions.rb +1230 -0
  60. data/test-unit/lib/test/unit/attribute.rb +125 -0
  61. data/test-unit/lib/test/unit/autorunner.rb +360 -0
  62. data/test-unit/lib/test/unit/collector/descendant.rb +23 -0
  63. data/test-unit/lib/test/unit/collector/dir.rb +108 -0
  64. data/test-unit/lib/test/unit/collector/load.rb +144 -0
  65. data/test-unit/lib/test/unit/collector/objectspace.rb +34 -0
  66. data/test-unit/lib/test/unit/collector.rb +36 -0
  67. data/test-unit/lib/test/unit/color-scheme.rb +102 -0
  68. data/test-unit/lib/test/unit/color.rb +96 -0
  69. data/test-unit/lib/test/unit/diff.rb +724 -0
  70. data/test-unit/lib/test/unit/error.rb +130 -0
  71. data/test-unit/lib/test/unit/exceptionhandler.rb +39 -0
  72. data/test-unit/lib/test/unit/failure.rb +136 -0
  73. data/test-unit/lib/test/unit/fixture.rb +176 -0
  74. data/test-unit/lib/test/unit/notification.rb +129 -0
  75. data/test-unit/lib/test/unit/omission.rb +191 -0
  76. data/test-unit/lib/test/unit/pending.rb +150 -0
  77. data/test-unit/lib/test/unit/priority.rb +180 -0
  78. data/test-unit/lib/test/unit/runner/console.rb +52 -0
  79. data/test-unit/lib/test/unit/runner/emacs.rb +8 -0
  80. data/test-unit/lib/test/unit/runner/tap.rb +8 -0
  81. data/test-unit/lib/test/unit/testcase.rb +476 -0
  82. data/test-unit/lib/test/unit/testresult.rb +89 -0
  83. data/test-unit/lib/test/unit/testsuite.rb +110 -0
  84. data/test-unit/lib/test/unit/ui/console/outputlevel.rb +14 -0
  85. data/test-unit/lib/test/unit/ui/console/testrunner.rb +466 -0
  86. data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +63 -0
  87. data/test-unit/lib/test/unit/ui/tap/testrunner.rb +92 -0
  88. data/test-unit/lib/test/unit/ui/testrunner.rb +28 -0
  89. data/test-unit/lib/test/unit/ui/testrunnermediator.rb +77 -0
  90. data/test-unit/lib/test/unit/ui/testrunnerutilities.rb +41 -0
  91. data/test-unit/lib/test/unit/util/backtracefilter.rb +41 -0
  92. data/test-unit/lib/test/unit/util/method-owner-finder.rb +28 -0
  93. data/test-unit/lib/test/unit/util/observable.rb +90 -0
  94. data/test-unit/lib/test/unit/util/procwrapper.rb +48 -0
  95. data/test-unit/lib/test/unit/version.rb +7 -0
  96. data/test-unit/lib/test/unit.rb +323 -0
  97. data/test-unit/sample/adder.rb +13 -0
  98. data/test-unit/sample/subtracter.rb +12 -0
  99. data/test-unit/sample/test_adder.rb +20 -0
  100. data/test-unit/sample/test_subtracter.rb +20 -0
  101. data/test-unit/sample/test_user.rb +23 -0
  102. data/test-unit/test/collector/test-descendant.rb +133 -0
  103. data/test-unit/test/collector/test-load.rb +442 -0
  104. data/test-unit/test/collector/test_dir.rb +406 -0
  105. data/test-unit/test/collector/test_objectspace.rb +100 -0
  106. data/test-unit/test/run-test.rb +15 -0
  107. data/test-unit/test/test-attribute.rb +86 -0
  108. data/test-unit/test/test-color-scheme.rb +67 -0
  109. data/test-unit/test/test-color.rb +47 -0
  110. data/test-unit/test/test-diff.rb +518 -0
  111. data/test-unit/test/test-emacs-runner.rb +60 -0
  112. data/test-unit/test/test-fixture.rb +287 -0
  113. data/test-unit/test/test-notification.rb +33 -0
  114. data/test-unit/test/test-omission.rb +81 -0
  115. data/test-unit/test/test-pending.rb +70 -0
  116. data/test-unit/test/test-priority.rb +119 -0
  117. data/test-unit/test/test-testcase.rb +544 -0
  118. data/test-unit/test/test_assertions.rb +1151 -0
  119. data/test-unit/test/test_error.rb +26 -0
  120. data/test-unit/test/test_failure.rb +33 -0
  121. data/test-unit/test/test_testresult.rb +113 -0
  122. data/test-unit/test/test_testsuite.rb +129 -0
  123. data/test-unit/test/testunit-test-util.rb +14 -0
  124. data/test-unit/test/ui/test_testrunmediator.rb +20 -0
  125. data/test-unit/test/util/test-method-owner-finder.rb +38 -0
  126. data/test-unit/test/util/test_backtracefilter.rb +41 -0
  127. data/test-unit/test/util/test_observable.rb +102 -0
  128. data/test-unit/test/util/test_procwrapper.rb +36 -0
  129. data/text/{TUTORIAL.ja.rdoc → tutorial.ja.rdoc} +165 -126
  130. metadata +106 -16
  131. data/html/favicon.xcf +0 -0
  132. data/html/logo.xcf +0 -0
  133. data/license/GPL +0 -340
  134. data/license/RUBY +0 -59
  135. data/pkg-config.rb +0 -333
@@ -0,0 +1,476 @@
1
+ #--
2
+ #
3
+ # Author:: Nathaniel Talbott.
4
+ # Copyright::
5
+ # * Copyright (c) 2000-2003 Nathaniel Talbott. All rights reserved.
6
+ # * Copyright (c) 2008-2009 Kouhei Sutou <tt><kou@clear-code.com></tt>
7
+ # License:: Ruby license.
8
+
9
+ require 'test/unit/attribute'
10
+ require 'test/unit/fixture'
11
+ require 'test/unit/exceptionhandler'
12
+ require 'test/unit/assertions'
13
+ require 'test/unit/failure'
14
+ require 'test/unit/error'
15
+ require 'test/unit/pending'
16
+ require 'test/unit/omission'
17
+ require 'test/unit/notification'
18
+ require 'test/unit/priority'
19
+ require 'test/unit/testsuite'
20
+ require 'test/unit/assertionfailederror'
21
+ require 'test/unit/util/backtracefilter'
22
+ require 'test/unit/util/method-owner-finder'
23
+
24
+ module Test
25
+ module Unit
26
+
27
+ # Ties everything together. If you subclass and add your own
28
+ # test methods, it takes care of making them into tests and
29
+ # wrapping those tests into a suite. It also does the
30
+ # nitty-gritty of actually running an individual test and
31
+ # collecting its results into a Test::Unit::TestResult object.
32
+ #
33
+ # You can run two hooks before/after a TestCase run.
34
+ #
35
+ # Example:
36
+ # class TestMyClass < Test::Unit::TestCase
37
+ # class << self
38
+ # def startup
39
+ # ...
40
+ # end
41
+ #
42
+ # def shutdown
43
+ # ...
44
+ # end
45
+ # end
46
+ #
47
+ # def setup
48
+ # ...
49
+ # end
50
+ #
51
+ # def teardown
52
+ # ...
53
+ # end
54
+ #
55
+ # def test_my_method1
56
+ # ...
57
+ # end
58
+ #
59
+ # def test_my_method2
60
+ # ...
61
+ # end
62
+ # end
63
+ #
64
+ # Here is a call order:
65
+ # * startup
66
+ # * setup
67
+ # * test_my_method1
68
+ # * teardown
69
+ # * setup
70
+ # * test_my_method2
71
+ # * teardown
72
+ # * shutdown
73
+ class TestCase
74
+ include Attribute
75
+ include Fixture
76
+ include ExceptionHandler
77
+ include ErrorHandler
78
+ include FailureHandler
79
+ include TestCasePendingSupport
80
+ include TestCaseOmissionSupport
81
+ include TestCaseNotificationSupport
82
+ include Priority
83
+ include Assertions
84
+ include Util::BacktraceFilter
85
+
86
+ STARTED = name + "::STARTED" # :nodoc:
87
+ FINISHED = name + "::FINISHED" # :nodoc:
88
+
89
+ DESCENDANTS = [] # :nodoc:
90
+ AVAILABLE_ORDERS = [:alphabetic, :random, :defined] # :nodoc:
91
+
92
+ class << self
93
+ def inherited(sub_class) # :nodoc:
94
+ DESCENDANTS << sub_class
95
+ end
96
+
97
+ @@added_methods = {}
98
+ def method_added(name) # :nodoc:
99
+ super
100
+ added_methods = (@@added_methods[self] ||= [])
101
+ stringified_name = name.to_s
102
+ if added_methods.include?(stringified_name)
103
+ attribute(:redefined, true, {}, stringified_name)
104
+ end
105
+ added_methods << stringified_name
106
+ end
107
+
108
+ # Rolls up all of the test* methods in the fixture into
109
+ # one suite, creating a new instance of the fixture for
110
+ # each method.
111
+ def suite
112
+ suite = TestSuite.new(name, self)
113
+ collect_test_names.each do |test|
114
+ catch(:invalid_test) do
115
+ suite << new(test)
116
+ end
117
+ end
118
+ if suite.empty?
119
+ catch(:invalid_test) do
120
+ suite << new("default_test")
121
+ end
122
+ end
123
+ suite
124
+ end
125
+
126
+ # Called before every test case runs. Can be used
127
+ # to set up fixture information used in test case
128
+ # scope.
129
+ #
130
+ # Here is an example test case:
131
+ # class TestMyClass < Test::Unit::TestCase
132
+ # class << self
133
+ # def startup
134
+ # ...
135
+ # end
136
+ # end
137
+ #
138
+ # def setup
139
+ # ...
140
+ # end
141
+ #
142
+ # def test_my_class1
143
+ # ...
144
+ # end
145
+ #
146
+ # def test_my_class2
147
+ # ...
148
+ # end
149
+ # end
150
+ #
151
+ # Here is a call order:
152
+ # * startup
153
+ # * setup
154
+ # * test_my_class1 (or test_my_class2)
155
+ # * setup
156
+ # * test_my_class2 (or test_my_class1)
157
+ #
158
+ # Note that you should not assume test order. Tests
159
+ # should be worked in any order.
160
+ def startup
161
+ end
162
+
163
+ # Called after every test case runs. Can be used to tear
164
+ # down fixture information used in test case scope.
165
+ #
166
+ # Here is an example test case:
167
+ # class TestMyClass < Test::Unit::TestCase
168
+ # class << self
169
+ # def shutdown
170
+ # ...
171
+ # end
172
+ # end
173
+ #
174
+ # def teardown
175
+ # ...
176
+ # end
177
+ #
178
+ # def test_my_class1
179
+ # ...
180
+ # end
181
+ #
182
+ # def test_my_class2
183
+ # ...
184
+ # end
185
+ # end
186
+ #
187
+ # Here is a call order:
188
+ # * test_my_class1 (or test_my_class2)
189
+ # * teardown
190
+ # * test_my_class2 (or test_my_class1)
191
+ # * teardown
192
+ # * shutdown
193
+ #
194
+ # Note that you should not assume test order. Tests
195
+ # should be worked in any order.
196
+ def shutdown
197
+ end
198
+
199
+ @@test_orders = {}
200
+
201
+ # Returns the current test order. This returns
202
+ # +:alphabetic+ by default.
203
+ def test_order
204
+ @@test_orders[self] || AVAILABLE_ORDERS.first
205
+ end
206
+
207
+ # Sets the current test order.
208
+ #
209
+ # Here are the available _order_:
210
+ # [:alphabetic]
211
+ # Default. Tests are sorted in alphabetic order.
212
+ # [:random]
213
+ # Tests are sorted in random order.
214
+ # [:defined]
215
+ # Tests are sorted in defined order.
216
+ def test_order=(order)
217
+ @@test_orders[self] = order
218
+ end
219
+
220
+ # Defines a test in declarative syntax.
221
+ #
222
+ # The following two test definitions are the same:
223
+ #
224
+ # description "register user"
225
+ # def test_register_user
226
+ # ...
227
+ # end
228
+ #
229
+ # test "register user" do
230
+ # ...
231
+ # end
232
+ def test(test_description, &block)
233
+ normalized_description = test_description.gsub(/[^a-zA-Z\d_]+/, '_')
234
+ method_name = "test_#{normalized_description}".to_sym
235
+ define_method(method_name, &block)
236
+ description(test_description, method_name)
237
+ end
238
+
239
+ # Describes a test.
240
+ #
241
+ # The following example associates "register a
242
+ # normal user" description with "test_register"
243
+ # test.
244
+ #
245
+ # description "register a normal user"
246
+ # def test_register
247
+ # ...
248
+ # end
249
+ def description(value, target=nil)
250
+ attribute(:description, value, {}, target || [])
251
+ end
252
+
253
+ # :stopdoc:
254
+ private
255
+ def collect_test_names
256
+ method_names = public_instance_methods(true).collect do |name|
257
+ name.to_s
258
+ end
259
+ test_names = method_names.find_all do |method_name|
260
+ method_name =~ /^test./
261
+ end
262
+ send("sort_test_names_in_#{test_order}_order", test_names)
263
+ end
264
+
265
+ def sort_test_names_in_alphabetic_order(test_names)
266
+ test_names.sort
267
+ end
268
+
269
+ def sort_test_names_in_random_order(test_names)
270
+ test_names.sort_by {rand(test_names.size)}
271
+ end
272
+
273
+ def sort_test_names_in_defined_order(test_names)
274
+ added_methods = @@added_methods[self]
275
+ test_names.sort do |test1, test2|
276
+ test1_defined_order = added_methods.index(test1)
277
+ test2_defined_order = added_methods.index(test2)
278
+ if test1_defined_order and test2_defined_order
279
+ test1_defined_order <=> test2_defined_order
280
+ elsif test1_defined_order
281
+ 1
282
+ elsif test2_defined_order
283
+ -1
284
+ else
285
+ test1 <=> test2
286
+ end
287
+ end
288
+ end
289
+ # :startdoc:
290
+ end
291
+
292
+ attr_reader :method_name
293
+
294
+ # Creates a new instance of the fixture for running the
295
+ # test represented by test_method_name.
296
+ def initialize(test_method_name)
297
+ throw :invalid_test unless respond_to?(test_method_name)
298
+ test_method = method(test_method_name)
299
+ throw :invalid_test if test_method.arity > 0
300
+ owner = Util::MethodOwnerFinder.find(self, test_method_name)
301
+ if owner.class != Module and self.class != owner
302
+ throw :invalid_test
303
+ end
304
+ @method_name = test_method_name
305
+ @test_passed = true
306
+ @interrupted = false
307
+ end
308
+
309
+ # Runs the individual test method represented by this
310
+ # instance of the fixture, collecting statistics, failures
311
+ # and errors in result.
312
+ def run(result)
313
+ begin
314
+ @_result = result
315
+ yield(STARTED, name)
316
+ begin
317
+ run_setup
318
+ run_test
319
+ rescue Exception
320
+ @interrupted = true
321
+ raise unless handle_exception($!)
322
+ ensure
323
+ begin
324
+ run_teardown
325
+ rescue Exception
326
+ raise unless handle_exception($!)
327
+ end
328
+ end
329
+ result.add_run
330
+ yield(FINISHED, name)
331
+ ensure
332
+ # @_result = nil # For test-spec's after_all :<
333
+ end
334
+ end
335
+
336
+ # Called before every test method runs. Can be used
337
+ # to set up fixture information.
338
+ #
339
+ # You can add additional setup tasks by the following
340
+ # code:
341
+ # class TestMyClass < Test::Unit::TestCase
342
+ # def setup
343
+ # ...
344
+ # end
345
+ #
346
+ # setup
347
+ # def my_setup1
348
+ # ...
349
+ # end
350
+ #
351
+ # setup
352
+ # def my_setup2
353
+ # ...
354
+ # end
355
+ #
356
+ # def test_my_class
357
+ # ...
358
+ # end
359
+ # end
360
+ #
361
+ # Here is a call order:
362
+ # * setup
363
+ # * my_setup1
364
+ # * my_setup2
365
+ # * test_my_class
366
+ def setup
367
+ end
368
+
369
+ # Called after every test method runs. Can be used to tear
370
+ # down fixture information.
371
+ #
372
+ # You can add additional teardown tasks by the following
373
+ # code:
374
+ # class TestMyClass < Test::Unit::TestCase
375
+ # def teardown
376
+ # ...
377
+ # end
378
+ #
379
+ # teardown
380
+ # def my_teardown1
381
+ # ...
382
+ # end
383
+ #
384
+ # teardown
385
+ # def my_teardown2
386
+ # ...
387
+ # end
388
+ #
389
+ # def test_my_class
390
+ # ...
391
+ # end
392
+ # end
393
+ #
394
+ # Here is a call order:
395
+ # * test_my_class
396
+ # * my_teardown2
397
+ # * my_teardown1
398
+ # * teardown
399
+ def teardown
400
+ end
401
+
402
+ def default_test
403
+ flunk("No tests were specified")
404
+ end
405
+
406
+ def size
407
+ 1
408
+ end
409
+
410
+ # Returns a human-readable name for the specific test that
411
+ # this instance of TestCase represents.
412
+ def name
413
+ "#{@method_name}(#{self.class.name})"
414
+ end
415
+
416
+ # Returns a description for the test. A description
417
+ # will be associated by Test::Unit::TestCase.test or
418
+ # Test::Unit::TestCase.description.
419
+ #
420
+ # Returns a name for the test for no description test.
421
+ def description
422
+ self[:description] || name
423
+ end
424
+
425
+ # Overridden to return #name.
426
+ def to_s
427
+ name
428
+ end
429
+
430
+ # It's handy to be able to compare TestCase instances.
431
+ def ==(other)
432
+ return false unless(other.kind_of?(self.class))
433
+ return false unless(@method_name == other.method_name)
434
+ self.class == other.class
435
+ end
436
+
437
+ def interrupted?
438
+ @interrupted
439
+ end
440
+
441
+ private
442
+ def current_result
443
+ @_result
444
+ end
445
+
446
+ def run_test
447
+ if self.class.get_attribute(@method_name, :redefined)
448
+ notify("#{self.class}\##{@method_name} was redefined")
449
+ end
450
+ __send__(@method_name)
451
+ end
452
+
453
+ def handle_exception(exception)
454
+ self.class.exception_handlers.each do |handler|
455
+ return true if send(handler, exception)
456
+ end
457
+ false
458
+ end
459
+
460
+ # Returns whether this individual test passed or
461
+ # not. Primarily for use in teardown so that artifacts
462
+ # can be left behind if the test fails.
463
+ def passed?
464
+ @test_passed
465
+ end
466
+
467
+ def problem_occurred
468
+ @test_passed = false
469
+ end
470
+
471
+ def add_assertion
472
+ current_result.add_assertion
473
+ end
474
+ end
475
+ end
476
+ end
@@ -0,0 +1,89 @@
1
+ #--
2
+ # Author:: Nathaniel Talbott.
3
+ # Copyright:: Copyright (c) 2000-2002 Nathaniel Talbott. All rights reserved.
4
+ # License:: Ruby license.
5
+
6
+ require 'test/unit/util/observable'
7
+ require 'test/unit/failure'
8
+ require 'test/unit/error'
9
+ require 'test/unit/omission'
10
+ require 'test/unit/pending'
11
+ require 'test/unit/notification'
12
+
13
+ module Test
14
+ module Unit
15
+ module NullResultContainerInitializer
16
+ private
17
+ def initialize_containers
18
+ end
19
+ end
20
+
21
+ # Collects Test::Unit::Failure and Test::Unit::Error so that
22
+ # they can be displayed to the user. To this end, observers
23
+ # can be added to it, allowing the dynamic updating of, say, a
24
+ # UI.
25
+ class TestResult
26
+ include Util::Observable
27
+ include NullResultContainerInitializer
28
+ include TestResultFailureSupport
29
+ include TestResultErrorSupport
30
+ include TestResultPendingSupport
31
+ include TestResultOmissionSupport
32
+ include TestResultNotificationSupport
33
+
34
+ CHANGED = "CHANGED"
35
+ FAULT = "FAULT"
36
+
37
+ attr_reader :run_count, :assertion_count, :faults
38
+
39
+ # Constructs a new, empty TestResult.
40
+ def initialize
41
+ @run_count, @assertion_count = 0, 0
42
+ @summary_generators = []
43
+ @problem_checkers = []
44
+ @faults = []
45
+ initialize_containers
46
+ end
47
+
48
+ # Records a test run.
49
+ def add_run
50
+ @run_count += 1
51
+ notify_changed
52
+ end
53
+
54
+ # Records an individual assertion.
55
+ def add_assertion
56
+ @assertion_count += 1
57
+ notify_changed
58
+ end
59
+
60
+ # Returns a string contain the recorded runs, assertions,
61
+ # failures and errors in this TestResult.
62
+ def summary
63
+ ["#{run_count} tests",
64
+ "#{assertion_count} assertions",
65
+ *@summary_generators.collect {|generator| send(generator)}].join(", ")
66
+ end
67
+
68
+ def to_s
69
+ summary
70
+ end
71
+
72
+ # Returns whether or not this TestResult represents
73
+ # successful completion.
74
+ def passed?
75
+ @problem_checkers.all? {|checker| not send(checker)}
76
+ end
77
+
78
+ private
79
+ def notify_changed
80
+ notify_listeners(CHANGED, self)
81
+ end
82
+
83
+ def notify_fault(fault)
84
+ @faults << fault
85
+ notify_listeners(FAULT, fault)
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,110 @@
1
+ #--
2
+ #
3
+ # Author:: Nathaniel Talbott.
4
+ # Copyright:: Copyright (c) 2000-2003 Nathaniel Talbott. All rights reserved.
5
+ # License:: Ruby license.
6
+
7
+ require 'test/unit/error'
8
+
9
+ module Test
10
+ module Unit
11
+
12
+ # A collection of tests which can be #run.
13
+ #
14
+ # Note: It is easy to confuse a TestSuite instance with
15
+ # something that has a static suite method; I know because _I_
16
+ # have trouble keeping them straight. Think of something that
17
+ # has a suite method as simply providing a way to get a
18
+ # meaningful TestSuite instance.
19
+ class TestSuite
20
+ attr_reader :name, :tests
21
+
22
+ STARTED = name + "::STARTED"
23
+ FINISHED = name + "::FINISHED"
24
+
25
+ # Creates a new TestSuite with the given name.
26
+ def initialize(name="Unnamed TestSuite", test_case=nil)
27
+ @name = name
28
+ @tests = []
29
+ @test_case = test_case
30
+ end
31
+
32
+ # Runs the tests and/or suites contained in this
33
+ # TestSuite.
34
+ def run(result, &progress_block)
35
+ yield(STARTED, name)
36
+ run_startup(result)
37
+ @tests.each do |test|
38
+ test.run(result, &progress_block)
39
+ end
40
+ run_shutdown(result)
41
+ yield(FINISHED, name)
42
+ end
43
+
44
+ # Adds the test to the suite.
45
+ def <<(test)
46
+ @tests << test
47
+ self
48
+ end
49
+
50
+ def delete(test)
51
+ @tests.delete(test)
52
+ end
53
+
54
+ # Retuns the rolled up number of tests in this suite;
55
+ # i.e. if the suite contains other suites, it counts the
56
+ # tests within those suites, not the suites themselves.
57
+ def size
58
+ total_size = 0
59
+ @tests.each { |test| total_size += test.size }
60
+ total_size
61
+ end
62
+
63
+ def empty?
64
+ tests.empty?
65
+ end
66
+
67
+ # Overridden to return the name given the suite at
68
+ # creation.
69
+ def to_s
70
+ @name
71
+ end
72
+
73
+ # It's handy to be able to compare TestSuite instances.
74
+ def ==(other)
75
+ return false unless(other.kind_of?(self.class))
76
+ return false unless(@name == other.name)
77
+ @tests == other.tests
78
+ end
79
+
80
+ private
81
+ def run_startup(result)
82
+ return if @test_case.nil? or !@test_case.respond_to?(:startup)
83
+ begin
84
+ @test_case.startup
85
+ rescue Exception
86
+ raise unless handle_exception($!, result)
87
+ end
88
+ end
89
+
90
+ def run_shutdown(result)
91
+ return if @test_case.nil? or !@test_case.respond_to?(:shutdown)
92
+ begin
93
+ @test_case.shutdown
94
+ rescue Exception
95
+ raise unless handle_exception($!, result)
96
+ end
97
+ end
98
+
99
+ def handle_exception(exception, result)
100
+ case exception
101
+ when *ErrorHandler::PASS_THROUGH_EXCEPTIONS
102
+ false
103
+ else
104
+ result.add_error(Error.new(@test_case.name, exception))
105
+ true
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,14 @@
1
+ module Test
2
+ module Unit
3
+ module UI
4
+ module Console
5
+ module OutputLevel
6
+ SILENT = 0
7
+ PROGRESS_ONLY = 1
8
+ NORMAL = 2
9
+ VERBOSE = 3
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end