rroonga 0.9.2-mswin32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (202) hide show
  1. data/AUTHORS +5 -0
  2. data/NEWS.ja.rdoc +114 -0
  3. data/NEWS.rdoc +116 -0
  4. data/README.ja.rdoc +65 -0
  5. data/README.rdoc +66 -0
  6. data/Rakefile +217 -0
  7. data/benchmark/common.rb +49 -0
  8. data/benchmark/read-write-many-small-items.rb +144 -0
  9. data/benchmark/write-many-small-items.rb +135 -0
  10. data/example/bookmark.rb +161 -0
  11. data/example/index-html.rb +89 -0
  12. data/example/search/config.ru +211 -0
  13. data/example/search/public/css/groonga.css +122 -0
  14. data/ext/.gitignore +2 -0
  15. data/ext/libruby-groonga.a +0 -0
  16. data/ext/rb-grn-accessor.c +52 -0
  17. data/ext/rb-grn-array-cursor.c +36 -0
  18. data/ext/rb-grn-array.c +210 -0
  19. data/ext/rb-grn-column.c +573 -0
  20. data/ext/rb-grn-context.c +655 -0
  21. data/ext/rb-grn-database.c +472 -0
  22. data/ext/rb-grn-encoding-support.c +64 -0
  23. data/ext/rb-grn-encoding.c +257 -0
  24. data/ext/rb-grn-exception.c +1110 -0
  25. data/ext/rb-grn-expression-builder.c +75 -0
  26. data/ext/rb-grn-expression.c +735 -0
  27. data/ext/rb-grn-fix-size-column.c +166 -0
  28. data/ext/rb-grn-hash-cursor.c +38 -0
  29. data/ext/rb-grn-hash.c +294 -0
  30. data/ext/rb-grn-index-column.c +488 -0
  31. data/ext/rb-grn-logger.c +504 -0
  32. data/ext/rb-grn-object.c +1369 -0
  33. data/ext/rb-grn-operation.c +198 -0
  34. data/ext/rb-grn-patricia-trie-cursor.c +39 -0
  35. data/ext/rb-grn-patricia-trie.c +488 -0
  36. data/ext/rb-grn-procedure.c +52 -0
  37. data/ext/rb-grn-query.c +260 -0
  38. data/ext/rb-grn-record.c +40 -0
  39. data/ext/rb-grn-snippet.c +334 -0
  40. data/ext/rb-grn-table-cursor-key-support.c +69 -0
  41. data/ext/rb-grn-table-cursor.c +247 -0
  42. data/ext/rb-grn-table-key-support.c +731 -0
  43. data/ext/rb-grn-table.c +2141 -0
  44. data/ext/rb-grn-type.c +181 -0
  45. data/ext/rb-grn-utils.c +769 -0
  46. data/ext/rb-grn-variable-size-column.c +36 -0
  47. data/ext/rb-grn-variable.c +108 -0
  48. data/ext/rb-grn-view-accessor.c +53 -0
  49. data/ext/rb-grn-view-cursor.c +35 -0
  50. data/ext/rb-grn-view-record.c +41 -0
  51. data/ext/rb-grn-view.c +421 -0
  52. data/ext/rb-grn.h +700 -0
  53. data/ext/rb-groonga.c +117 -0
  54. data/extconf.rb +266 -0
  55. data/html/bar.svg +153 -0
  56. data/html/developer.html +117 -0
  57. data/html/developer.svg +469 -0
  58. data/html/download.svg +253 -0
  59. data/html/favicon.ico +0 -0
  60. data/html/favicon.xcf +0 -0
  61. data/html/footer.html.erb +28 -0
  62. data/html/head.html.erb +4 -0
  63. data/html/header.html.erb +17 -0
  64. data/html/index.html +147 -0
  65. data/html/install.svg +636 -0
  66. data/html/logo.xcf +0 -0
  67. data/html/ranguba.css +250 -0
  68. data/html/tutorial.svg +559 -0
  69. data/lib/groonga.rb +90 -0
  70. data/lib/groonga/context.rb +184 -0
  71. data/lib/groonga/expression-builder.rb +285 -0
  72. data/lib/groonga/patricia-trie.rb +53 -0
  73. data/lib/groonga/record.rb +311 -0
  74. data/lib/groonga/schema.rb +1191 -0
  75. data/lib/groonga/view-record.rb +56 -0
  76. data/license/GPL +340 -0
  77. data/license/LGPL +504 -0
  78. data/license/RUBY +59 -0
  79. data/misc/grnop2ruby.rb +49 -0
  80. data/pkg-config.rb +333 -0
  81. data/test-unit/Rakefile +40 -0
  82. data/test-unit/TODO +5 -0
  83. data/test-unit/bin/testrb +5 -0
  84. data/test-unit/html/classic.html +15 -0
  85. data/test-unit/html/index.html +25 -0
  86. data/test-unit/html/index.html.ja +27 -0
  87. data/test-unit/lib/test/unit.rb +323 -0
  88. data/test-unit/lib/test/unit/assertionfailederror.rb +25 -0
  89. data/test-unit/lib/test/unit/assertions.rb +1230 -0
  90. data/test-unit/lib/test/unit/attribute.rb +125 -0
  91. data/test-unit/lib/test/unit/autorunner.rb +360 -0
  92. data/test-unit/lib/test/unit/collector.rb +36 -0
  93. data/test-unit/lib/test/unit/collector/descendant.rb +23 -0
  94. data/test-unit/lib/test/unit/collector/dir.rb +108 -0
  95. data/test-unit/lib/test/unit/collector/load.rb +136 -0
  96. data/test-unit/lib/test/unit/collector/objectspace.rb +34 -0
  97. data/test-unit/lib/test/unit/color-scheme.rb +102 -0
  98. data/test-unit/lib/test/unit/color.rb +96 -0
  99. data/test-unit/lib/test/unit/diff.rb +724 -0
  100. data/test-unit/lib/test/unit/error.rb +130 -0
  101. data/test-unit/lib/test/unit/exceptionhandler.rb +39 -0
  102. data/test-unit/lib/test/unit/failure.rb +136 -0
  103. data/test-unit/lib/test/unit/fixture.rb +176 -0
  104. data/test-unit/lib/test/unit/notification.rb +129 -0
  105. data/test-unit/lib/test/unit/omission.rb +191 -0
  106. data/test-unit/lib/test/unit/pending.rb +150 -0
  107. data/test-unit/lib/test/unit/priority.rb +180 -0
  108. data/test-unit/lib/test/unit/runner/console.rb +52 -0
  109. data/test-unit/lib/test/unit/runner/emacs.rb +8 -0
  110. data/test-unit/lib/test/unit/runner/tap.rb +8 -0
  111. data/test-unit/lib/test/unit/testcase.rb +476 -0
  112. data/test-unit/lib/test/unit/testresult.rb +89 -0
  113. data/test-unit/lib/test/unit/testsuite.rb +110 -0
  114. data/test-unit/lib/test/unit/ui/console/outputlevel.rb +14 -0
  115. data/test-unit/lib/test/unit/ui/console/testrunner.rb +466 -0
  116. data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +63 -0
  117. data/test-unit/lib/test/unit/ui/tap/testrunner.rb +92 -0
  118. data/test-unit/lib/test/unit/ui/testrunner.rb +28 -0
  119. data/test-unit/lib/test/unit/ui/testrunnermediator.rb +77 -0
  120. data/test-unit/lib/test/unit/ui/testrunnerutilities.rb +41 -0
  121. data/test-unit/lib/test/unit/util/backtracefilter.rb +41 -0
  122. data/test-unit/lib/test/unit/util/method-owner-finder.rb +28 -0
  123. data/test-unit/lib/test/unit/util/observable.rb +90 -0
  124. data/test-unit/lib/test/unit/util/procwrapper.rb +48 -0
  125. data/test-unit/lib/test/unit/version.rb +7 -0
  126. data/test-unit/sample/adder.rb +13 -0
  127. data/test-unit/sample/subtracter.rb +12 -0
  128. data/test-unit/sample/test_adder.rb +20 -0
  129. data/test-unit/sample/test_subtracter.rb +20 -0
  130. data/test-unit/sample/test_user.rb +23 -0
  131. data/test-unit/test/collector/test-descendant.rb +133 -0
  132. data/test-unit/test/collector/test-load.rb +348 -0
  133. data/test-unit/test/collector/test_dir.rb +406 -0
  134. data/test-unit/test/collector/test_objectspace.rb +100 -0
  135. data/test-unit/test/run-test.rb +15 -0
  136. data/test-unit/test/test-attribute.rb +86 -0
  137. data/test-unit/test/test-color-scheme.rb +67 -0
  138. data/test-unit/test/test-color.rb +47 -0
  139. data/test-unit/test/test-diff.rb +518 -0
  140. data/test-unit/test/test-emacs-runner.rb +60 -0
  141. data/test-unit/test/test-fixture.rb +287 -0
  142. data/test-unit/test/test-notification.rb +33 -0
  143. data/test-unit/test/test-omission.rb +81 -0
  144. data/test-unit/test/test-pending.rb +70 -0
  145. data/test-unit/test/test-priority.rb +119 -0
  146. data/test-unit/test/test-testcase.rb +544 -0
  147. data/test-unit/test/test_assertions.rb +1151 -0
  148. data/test-unit/test/test_error.rb +26 -0
  149. data/test-unit/test/test_failure.rb +33 -0
  150. data/test-unit/test/test_testresult.rb +113 -0
  151. data/test-unit/test/test_testsuite.rb +129 -0
  152. data/test-unit/test/testunit-test-util.rb +14 -0
  153. data/test-unit/test/ui/test_testrunmediator.rb +20 -0
  154. data/test-unit/test/util/test-method-owner-finder.rb +38 -0
  155. data/test-unit/test/util/test_backtracefilter.rb +41 -0
  156. data/test-unit/test/util/test_observable.rb +102 -0
  157. data/test-unit/test/util/test_procwrapper.rb +36 -0
  158. data/test/.gitignore +1 -0
  159. data/test/groonga-test-utils.rb +133 -0
  160. data/test/run-test.rb +58 -0
  161. data/test/test-array.rb +97 -0
  162. data/test/test-column.rb +316 -0
  163. data/test/test-context-select.rb +93 -0
  164. data/test/test-context.rb +73 -0
  165. data/test/test-database.rb +113 -0
  166. data/test/test-encoding.rb +33 -0
  167. data/test/test-exception.rb +93 -0
  168. data/test/test-expression-builder.rb +156 -0
  169. data/test/test-expression.rb +134 -0
  170. data/test/test-fix-size-column.rb +65 -0
  171. data/test/test-gqtp.rb +72 -0
  172. data/test/test-hash.rb +312 -0
  173. data/test/test-index-column.rb +81 -0
  174. data/test/test-logger.rb +37 -0
  175. data/test/test-patricia-trie.rb +189 -0
  176. data/test/test-procedure.rb +37 -0
  177. data/test/test-query.rb +22 -0
  178. data/test/test-record.rb +279 -0
  179. data/test/test-remote.rb +54 -0
  180. data/test/test-schema-view.rb +90 -0
  181. data/test/test-schema.rb +459 -0
  182. data/test/test-snippet.rb +130 -0
  183. data/test/test-table-cursor.rb +153 -0
  184. data/test/test-table-offset-and-limit.rb +102 -0
  185. data/test/test-table-select-normalize.rb +53 -0
  186. data/test/test-table-select.rb +150 -0
  187. data/test/test-table.rb +690 -0
  188. data/test/test-type.rb +71 -0
  189. data/test/test-variable-size-column.rb +98 -0
  190. data/test/test-variable.rb +28 -0
  191. data/test/test-vector-column.rb +76 -0
  192. data/test/test-version.rb +31 -0
  193. data/test/test-view.rb +72 -0
  194. data/text/TUTORIAL.ja.rdoc +392 -0
  195. data/text/expression.rdoc +284 -0
  196. data/vendor/local/bin/grntest.exe +0 -0
  197. data/vendor/local/bin/groonga.exe +0 -0
  198. data/vendor/local/bin/libgroonga.dll +0 -0
  199. data/vendor/local/bin/libmecab.dll +0 -0
  200. data/vendor/local/include/groonga.h +2285 -0
  201. data/vendor/local/lib/libgroonga.lib +0 -0
  202. metadata +280 -0
@@ -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