rroonga 0.9.4-x86-mingw32 → 0.9.5-x86-mingw32

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 (153) hide show
  1. data/NEWS.ja.rdoc +29 -0
  2. data/NEWS.rdoc +29 -0
  3. data/Rakefile +6 -6
  4. data/ext/groonga/rb-grn-array.c +1 -1
  5. data/ext/groonga/rb-grn-context.c +15 -28
  6. data/ext/groonga/rb-grn-exception.c +46 -1
  7. data/ext/groonga/rb-grn-expression.c +22 -13
  8. data/ext/groonga/rb-grn-fix-size-column.c +2 -8
  9. data/ext/groonga/rb-grn-hash.c +8 -1
  10. data/ext/groonga/rb-grn-object.c +1 -1
  11. data/ext/groonga/rb-grn-patricia-trie.c +23 -1
  12. data/ext/groonga/rb-grn-table-key-support.c +22 -0
  13. data/ext/groonga/rb-grn-table.c +37 -5
  14. data/ext/groonga/rb-grn-utils.c +20 -2
  15. data/ext/groonga/rb-grn.h +1 -1
  16. data/ext/groonga/rb-groonga.c +76 -38
  17. data/extconf.rb +17 -1
  18. data/html/developer.html +32 -7
  19. data/html/footer.html.erb +5 -0
  20. data/html/heading-mark.svg +393 -0
  21. data/html/index.html +33 -3
  22. data/lib/1.8/groonga.so +0 -0
  23. data/lib/1.9/groonga.so +0 -0
  24. data/lib/groonga.rb +3 -7
  25. data/lib/groonga/context.rb +2 -13
  26. data/lib/groonga/expression-builder.rb +273 -67
  27. data/lib/groonga/pagination.rb +143 -0
  28. data/lib/groonga/record.rb +2 -0
  29. data/lib/groonga/schema.rb +140 -29
  30. data/pkg/rroonga-0.9.5/NEWS.ja.rdoc +156 -0
  31. data/pkg/rroonga-0.9.5/NEWS.rdoc +158 -0
  32. data/pkg/rroonga-0.9.5/README.ja.rdoc +65 -0
  33. data/pkg/rroonga-0.9.5/README.rdoc +66 -0
  34. data/pkg/rroonga-0.9.5/text/TUTORIAL.ja.rdoc +394 -0
  35. data/pkg/rroonga-0.9.5/text/expression.rdoc +285 -0
  36. data/rroonga-build.rb +2 -2
  37. data/test-unit/Rakefile +40 -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 +323 -0
  44. data/test-unit/lib/test/unit/assertionfailederror.rb +25 -0
  45. data/test-unit/lib/test/unit/assertions.rb +1230 -0
  46. data/test-unit/lib/test/unit/attribute.rb +125 -0
  47. data/test-unit/lib/test/unit/autorunner.rb +360 -0
  48. data/test-unit/lib/test/unit/collector.rb +36 -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 +144 -0
  52. data/test-unit/lib/test/unit/collector/objectspace.rb +34 -0
  53. data/test-unit/lib/test/unit/color-scheme.rb +102 -0
  54. data/test-unit/lib/test/unit/color.rb +96 -0
  55. data/test-unit/lib/test/unit/diff.rb +724 -0
  56. data/test-unit/lib/test/unit/error.rb +130 -0
  57. data/test-unit/lib/test/unit/exceptionhandler.rb +39 -0
  58. data/test-unit/lib/test/unit/failure.rb +136 -0
  59. data/test-unit/lib/test/unit/fixture.rb +176 -0
  60. data/test-unit/lib/test/unit/notification.rb +129 -0
  61. data/test-unit/lib/test/unit/omission.rb +191 -0
  62. data/test-unit/lib/test/unit/pending.rb +150 -0
  63. data/test-unit/lib/test/unit/priority.rb +180 -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/runner/tap.rb +8 -0
  67. data/test-unit/lib/test/unit/testcase.rb +476 -0
  68. data/test-unit/lib/test/unit/testresult.rb +89 -0
  69. data/test-unit/lib/test/unit/testsuite.rb +110 -0
  70. data/test-unit/lib/test/unit/ui/console/outputlevel.rb +14 -0
  71. data/test-unit/lib/test/unit/ui/console/testrunner.rb +466 -0
  72. data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +63 -0
  73. data/test-unit/lib/test/unit/ui/tap/testrunner.rb +92 -0
  74. data/test-unit/lib/test/unit/ui/testrunner.rb +28 -0
  75. data/test-unit/lib/test/unit/ui/testrunnermediator.rb +77 -0
  76. data/test-unit/lib/test/unit/ui/testrunnerutilities.rb +41 -0
  77. data/test-unit/lib/test/unit/util/backtracefilter.rb +41 -0
  78. data/test-unit/lib/test/unit/util/method-owner-finder.rb +28 -0
  79. data/test-unit/lib/test/unit/util/observable.rb +90 -0
  80. data/test-unit/lib/test/unit/util/procwrapper.rb +48 -0
  81. data/test-unit/lib/test/unit/version.rb +7 -0
  82. data/test-unit/sample/adder.rb +13 -0
  83. data/test-unit/sample/subtracter.rb +12 -0
  84. data/test-unit/sample/test_adder.rb +20 -0
  85. data/test-unit/sample/test_subtracter.rb +20 -0
  86. data/test-unit/sample/test_user.rb +23 -0
  87. data/test-unit/test/collector/test-descendant.rb +133 -0
  88. data/test-unit/test/collector/test-load.rb +442 -0
  89. data/test-unit/test/collector/test_dir.rb +406 -0
  90. data/test-unit/test/collector/test_objectspace.rb +100 -0
  91. data/test-unit/test/run-test.rb +15 -0
  92. data/test-unit/test/test-attribute.rb +86 -0
  93. data/test-unit/test/test-color-scheme.rb +67 -0
  94. data/test-unit/test/test-color.rb +47 -0
  95. data/test-unit/test/test-diff.rb +518 -0
  96. data/test-unit/test/test-emacs-runner.rb +60 -0
  97. data/test-unit/test/test-fixture.rb +287 -0
  98. data/test-unit/test/test-notification.rb +33 -0
  99. data/test-unit/test/test-omission.rb +81 -0
  100. data/test-unit/test/test-pending.rb +70 -0
  101. data/test-unit/test/test-priority.rb +119 -0
  102. data/test-unit/test/test-testcase.rb +544 -0
  103. data/test-unit/test/test_assertions.rb +1151 -0
  104. data/test-unit/test/test_error.rb +26 -0
  105. data/test-unit/test/test_failure.rb +33 -0
  106. data/test-unit/test/test_testresult.rb +113 -0
  107. data/test-unit/test/test_testsuite.rb +129 -0
  108. data/test-unit/test/testunit-test-util.rb +14 -0
  109. data/test-unit/test/ui/test_testrunmediator.rb +20 -0
  110. data/test-unit/test/util/test-method-owner-finder.rb +38 -0
  111. data/test-unit/test/util/test_backtracefilter.rb +41 -0
  112. data/test-unit/test/util/test_observable.rb +102 -0
  113. data/test-unit/test/util/test_procwrapper.rb +36 -0
  114. data/test/groonga-test-utils.rb +3 -2
  115. data/test/run-test.rb +14 -2
  116. data/test/test-column.rb +7 -7
  117. data/test/test-context-select.rb +34 -11
  118. data/test/test-exception.rb +3 -0
  119. data/test/test-expression-builder.rb +11 -0
  120. data/test/test-expression.rb +3 -6
  121. data/test/test-gqtp.rb +3 -5
  122. data/test/test-pagination.rb +249 -0
  123. data/test/test-record.rb +36 -8
  124. data/test/test-remote.rb +11 -4
  125. data/test/test-schema-create-table.rb +251 -0
  126. data/test/test-schema.rb +4 -24
  127. data/test/test-table-offset-and-limit.rb +3 -5
  128. data/test/test-table-select-mecab.rb +80 -0
  129. data/test/test-table-select-weight.rb +104 -0
  130. data/test/test-table.rb +22 -4
  131. data/test/test-version.rb +1 -1
  132. data/text/TUTORIAL.ja.rdoc +2 -0
  133. data/text/expression.rdoc +1 -0
  134. data/vendor/local/bin/grntest.exe +0 -0
  135. data/vendor/local/bin/groonga.exe +0 -0
  136. data/vendor/local/bin/libgroonga-0.dll +0 -0
  137. data/vendor/local/include/{groonga.h → groonga/groonga.h} +93 -32
  138. data/vendor/local/lib/groonga/modules/functions/cast.dll +0 -0
  139. data/vendor/local/lib/groonga/modules/functions/cast.la +41 -0
  140. data/vendor/local/lib/pkgconfig/groonga.pc +12 -0
  141. data/vendor/local/share/groonga/admin_html/css/admin.css +104 -0
  142. data/vendor/local/share/groonga/admin_html/css/ui-lightness/jquery-ui-1.8.1.custom.css +486 -0
  143. data/vendor/local/share/groonga/admin_html/index.html +1355 -0
  144. data/vendor/local/share/groonga/admin_html/js/jquery-1.4.2.min.js +154 -0
  145. data/vendor/local/share/groonga/admin_html/js/jquery-ui-1.8.1.custom.min.js +756 -0
  146. data/vendor/local/share/groonga/munin/plugins/groonga_cpu_load +47 -0
  147. data/vendor/local/share/groonga/munin/plugins/groonga_cpu_time +57 -0
  148. data/vendor/local/share/groonga/munin/plugins/groonga_disk +162 -0
  149. data/vendor/local/share/groonga/munin/plugins/groonga_memory +51 -0
  150. data/vendor/local/share/groonga/munin/plugins/groonga_n_records +110 -0
  151. data/vendor/local/share/groonga/munin/plugins/groonga_query_performance +133 -0
  152. data/vendor/local/share/groonga/munin/plugins/groonga_status +84 -0
  153. metadata +126 -36
@@ -0,0 +1,180 @@
1
+ module Test
2
+ module Unit
3
+ module Priority
4
+ class << self
5
+ def included(base)
6
+ base.extend(ClassMethods)
7
+
8
+ base.class_eval do
9
+ setup :priority_setup, :before => :prepend
10
+ teardown :priority_teardown, :after => :append
11
+ end
12
+ end
13
+
14
+ @@enabled = false
15
+ def enabled?
16
+ @@enabled
17
+ end
18
+
19
+ def enable
20
+ require "fileutils"
21
+ require "tmpdir"
22
+ @@enabled = true
23
+ end
24
+
25
+ def disable
26
+ @@enabled = false
27
+ end
28
+
29
+ @@default = :normal
30
+ def default
31
+ @@default || :normal
32
+ end
33
+
34
+ def default=(default)
35
+ @@default = default
36
+ end
37
+
38
+ def available_values
39
+ Checker.available_priorities
40
+ end
41
+ end
42
+
43
+ class Checker
44
+ class << self
45
+ def have_priority?(name)
46
+ singleton_class = (class << self; self; end)
47
+ singleton_class.method_defined?(priority_check_method_name(name))
48
+ end
49
+
50
+ def need_to_run?(test)
51
+ priority = test[:priority] || Priority.default
52
+ if have_priority?(priority)
53
+ send(priority_check_method_name(priority), test)
54
+ else
55
+ true
56
+ end
57
+ end
58
+
59
+ def available_priorities
60
+ methods(false).collect do |name|
61
+ /\Arun_priority_(.+)\?\z/ =~ name.to_s
62
+ $1
63
+ end.compact
64
+ end
65
+
66
+ def run_priority_must?(test)
67
+ true
68
+ end
69
+
70
+ def run_priority_important?(test)
71
+ rand > 0.1
72
+ end
73
+
74
+ def run_priority_high?(test)
75
+ rand > 0.3
76
+ end
77
+
78
+ def run_priority_normal?(test)
79
+ rand > 0.5
80
+ end
81
+
82
+ def run_priority_low?(test)
83
+ rand > 0.75
84
+ end
85
+
86
+ def run_priority_never?(test)
87
+ false
88
+ end
89
+
90
+ private
91
+ def priority_check_method_name(priority_name)
92
+ "run_priority_#{priority_name}?"
93
+ end
94
+ end
95
+
96
+ attr_reader :test
97
+ def initialize(test)
98
+ @test = test
99
+ end
100
+
101
+ def setup
102
+ FileUtils.rm_f(passed_file)
103
+ end
104
+
105
+ def teardown
106
+ if @test.send(:passed?)
107
+ FileUtils.touch(passed_file)
108
+ else
109
+ FileUtils.rm_f(passed_file)
110
+ end
111
+ end
112
+
113
+ def need_to_run?
114
+ !previous_test_success? or self.class.need_to_run?(@test)
115
+ end
116
+
117
+ private
118
+ def previous_test_success?
119
+ File.exist?(passed_file)
120
+ end
121
+
122
+ def result_dir
123
+ components = [".test-result",
124
+ @test.class.name || "AnonymousTestCase",
125
+ escaped_method_name]
126
+ parent_directories = [File.dirname($0), Dir.pwd]
127
+ if Process.respond_to?(:uid)
128
+ parent_directories << File.join(Dir.tmpdir, Process.uid.to_s)
129
+ end
130
+ parent_directories.each do |parent_directory|
131
+ dir = File.expand_path(File.join(parent_directory, *components))
132
+ begin
133
+ FileUtils.mkdir_p(dir)
134
+ return dir
135
+ rescue Errno::EACCES
136
+ end
137
+ end
138
+
139
+ raise Errno::EACCES, parent_directories.join(", ")
140
+ end
141
+
142
+ def passed_file
143
+ File.join(result_dir, "passed")
144
+ end
145
+
146
+ def escaped_method_name
147
+ @test.method_name.to_s.gsub(/[!?=]$/) do |matched|
148
+ case matched
149
+ when "!"
150
+ ".destructive"
151
+ when "?"
152
+ ".predicate"
153
+ when "="
154
+ ".equal"
155
+ end
156
+ end
157
+ end
158
+ end
159
+
160
+ module ClassMethods
161
+ def priority(name, *tests)
162
+ unless Checker.have_priority?(name)
163
+ raise ArgumentError, "unknown priority: #{name}"
164
+ end
165
+ attribute(:priority, name, {:keep => true}, *tests)
166
+ end
167
+ end
168
+
169
+ def priority_setup
170
+ return unless Priority.enabled?
171
+ Checker.new(self).setup
172
+ end
173
+
174
+ def priority_teardown
175
+ return unless Priority.enabled?
176
+ Checker.new(self).teardown
177
+ end
178
+ end
179
+ end
180
+ end
@@ -0,0 +1,52 @@
1
+ module Test
2
+ module Unit
3
+ AutoRunner.register_runner(:console) do |auto_runner|
4
+ require 'test/unit/ui/console/testrunner'
5
+ Test::Unit::UI::Console::TestRunner
6
+ end
7
+
8
+ AutoRunner.setup_option do |auto_runner, opts|
9
+ require 'test/unit/ui/console/outputlevel'
10
+
11
+ output_levels = [
12
+ [:silent, UI::Console::OutputLevel::SILENT],
13
+ [:progress, UI::Console::OutputLevel::PROGRESS_ONLY],
14
+ [:normal, UI::Console::OutputLevel::NORMAL],
15
+ [:verbose, UI::Console::OutputLevel::VERBOSE],
16
+ ]
17
+ opts.on('-v', '--verbose=[LEVEL]', output_levels,
18
+ "Set the output level (default is verbose).",
19
+ "(#{auto_runner.keyword_display(output_levels)})") do |level|
20
+ level ||= output_levels.assoc(:verbose)[1]
21
+ auto_runner.runner_options[:output_level] = level
22
+ end
23
+
24
+ use_color_options = [
25
+ [:auto, :auto],
26
+ ["-", false],
27
+ ["no", false],
28
+ ["false", false],
29
+ ["+", true],
30
+ ["yes", true],
31
+ ["true", true],
32
+ ]
33
+ opts.on("--[no-]use-color=[auto]", use_color_options,
34
+ "Uses color output",
35
+ "(default is auto)") do |use_color|
36
+ case use_color
37
+ when nil
38
+ use_color = true
39
+ when :auto
40
+ use_color = nil
41
+ end
42
+ auto_runner.runner_options[:use_color] = use_color
43
+ end
44
+
45
+ opts.on("--progress-row-max=MAX", Integer,
46
+ "Uses MAX as max terminal width for progress mark",
47
+ "(default is auto)") do |max|
48
+ auto_runner.runner_options[:progress_row_max] = max
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,8 @@
1
+ module Test
2
+ module Unit
3
+ AutoRunner.register_runner(:emacs) do |auto_runner|
4
+ require 'test/unit/ui/emacs/testrunner'
5
+ Test::Unit::UI::Emacs::TestRunner
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module Test
2
+ module Unit
3
+ AutoRunner.register_runner(:tap) do |auto_runner|
4
+ require 'test/unit/ui/tap/testrunner'
5
+ Test::Unit::UI::Tap::TestRunner
6
+ end
7
+ end
8
+ end
@@ -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