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.
- data/NEWS.ja.rdoc +29 -0
- data/NEWS.rdoc +29 -0
- data/Rakefile +6 -6
- data/ext/groonga/rb-grn-array.c +1 -1
- data/ext/groonga/rb-grn-context.c +15 -28
- data/ext/groonga/rb-grn-exception.c +46 -1
- data/ext/groonga/rb-grn-expression.c +22 -13
- data/ext/groonga/rb-grn-fix-size-column.c +2 -8
- data/ext/groonga/rb-grn-hash.c +8 -1
- data/ext/groonga/rb-grn-object.c +1 -1
- data/ext/groonga/rb-grn-patricia-trie.c +23 -1
- data/ext/groonga/rb-grn-table-key-support.c +22 -0
- data/ext/groonga/rb-grn-table.c +37 -5
- data/ext/groonga/rb-grn-utils.c +20 -2
- data/ext/groonga/rb-grn.h +1 -1
- data/ext/groonga/rb-groonga.c +76 -38
- data/extconf.rb +17 -1
- data/html/developer.html +32 -7
- data/html/footer.html.erb +5 -0
- data/html/heading-mark.svg +393 -0
- data/html/index.html +33 -3
- data/lib/1.8/groonga.so +0 -0
- data/lib/1.9/groonga.so +0 -0
- data/lib/groonga.rb +3 -7
- data/lib/groonga/context.rb +2 -13
- data/lib/groonga/expression-builder.rb +273 -67
- data/lib/groonga/pagination.rb +143 -0
- data/lib/groonga/record.rb +2 -0
- data/lib/groonga/schema.rb +140 -29
- data/pkg/rroonga-0.9.5/NEWS.ja.rdoc +156 -0
- data/pkg/rroonga-0.9.5/NEWS.rdoc +158 -0
- data/pkg/rroonga-0.9.5/README.ja.rdoc +65 -0
- data/pkg/rroonga-0.9.5/README.rdoc +66 -0
- data/pkg/rroonga-0.9.5/text/TUTORIAL.ja.rdoc +394 -0
- data/pkg/rroonga-0.9.5/text/expression.rdoc +285 -0
- data/rroonga-build.rb +2 -2
- data/test-unit/Rakefile +40 -0
- data/test-unit/TODO +5 -0
- data/test-unit/bin/testrb +5 -0
- data/test-unit/html/classic.html +15 -0
- data/test-unit/html/index.html +25 -0
- data/test-unit/html/index.html.ja +27 -0
- data/test-unit/lib/test/unit.rb +323 -0
- data/test-unit/lib/test/unit/assertionfailederror.rb +25 -0
- data/test-unit/lib/test/unit/assertions.rb +1230 -0
- data/test-unit/lib/test/unit/attribute.rb +125 -0
- data/test-unit/lib/test/unit/autorunner.rb +360 -0
- data/test-unit/lib/test/unit/collector.rb +36 -0
- data/test-unit/lib/test/unit/collector/descendant.rb +23 -0
- data/test-unit/lib/test/unit/collector/dir.rb +108 -0
- data/test-unit/lib/test/unit/collector/load.rb +144 -0
- data/test-unit/lib/test/unit/collector/objectspace.rb +34 -0
- data/test-unit/lib/test/unit/color-scheme.rb +102 -0
- data/test-unit/lib/test/unit/color.rb +96 -0
- data/test-unit/lib/test/unit/diff.rb +724 -0
- data/test-unit/lib/test/unit/error.rb +130 -0
- data/test-unit/lib/test/unit/exceptionhandler.rb +39 -0
- data/test-unit/lib/test/unit/failure.rb +136 -0
- data/test-unit/lib/test/unit/fixture.rb +176 -0
- data/test-unit/lib/test/unit/notification.rb +129 -0
- data/test-unit/lib/test/unit/omission.rb +191 -0
- data/test-unit/lib/test/unit/pending.rb +150 -0
- data/test-unit/lib/test/unit/priority.rb +180 -0
- data/test-unit/lib/test/unit/runner/console.rb +52 -0
- data/test-unit/lib/test/unit/runner/emacs.rb +8 -0
- data/test-unit/lib/test/unit/runner/tap.rb +8 -0
- data/test-unit/lib/test/unit/testcase.rb +476 -0
- data/test-unit/lib/test/unit/testresult.rb +89 -0
- data/test-unit/lib/test/unit/testsuite.rb +110 -0
- data/test-unit/lib/test/unit/ui/console/outputlevel.rb +14 -0
- data/test-unit/lib/test/unit/ui/console/testrunner.rb +466 -0
- data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +63 -0
- data/test-unit/lib/test/unit/ui/tap/testrunner.rb +92 -0
- data/test-unit/lib/test/unit/ui/testrunner.rb +28 -0
- data/test-unit/lib/test/unit/ui/testrunnermediator.rb +77 -0
- data/test-unit/lib/test/unit/ui/testrunnerutilities.rb +41 -0
- data/test-unit/lib/test/unit/util/backtracefilter.rb +41 -0
- data/test-unit/lib/test/unit/util/method-owner-finder.rb +28 -0
- data/test-unit/lib/test/unit/util/observable.rb +90 -0
- data/test-unit/lib/test/unit/util/procwrapper.rb +48 -0
- data/test-unit/lib/test/unit/version.rb +7 -0
- data/test-unit/sample/adder.rb +13 -0
- data/test-unit/sample/subtracter.rb +12 -0
- data/test-unit/sample/test_adder.rb +20 -0
- data/test-unit/sample/test_subtracter.rb +20 -0
- data/test-unit/sample/test_user.rb +23 -0
- data/test-unit/test/collector/test-descendant.rb +133 -0
- data/test-unit/test/collector/test-load.rb +442 -0
- data/test-unit/test/collector/test_dir.rb +406 -0
- data/test-unit/test/collector/test_objectspace.rb +100 -0
- data/test-unit/test/run-test.rb +15 -0
- data/test-unit/test/test-attribute.rb +86 -0
- data/test-unit/test/test-color-scheme.rb +67 -0
- data/test-unit/test/test-color.rb +47 -0
- data/test-unit/test/test-diff.rb +518 -0
- data/test-unit/test/test-emacs-runner.rb +60 -0
- data/test-unit/test/test-fixture.rb +287 -0
- data/test-unit/test/test-notification.rb +33 -0
- data/test-unit/test/test-omission.rb +81 -0
- data/test-unit/test/test-pending.rb +70 -0
- data/test-unit/test/test-priority.rb +119 -0
- data/test-unit/test/test-testcase.rb +544 -0
- data/test-unit/test/test_assertions.rb +1151 -0
- data/test-unit/test/test_error.rb +26 -0
- data/test-unit/test/test_failure.rb +33 -0
- data/test-unit/test/test_testresult.rb +113 -0
- data/test-unit/test/test_testsuite.rb +129 -0
- data/test-unit/test/testunit-test-util.rb +14 -0
- data/test-unit/test/ui/test_testrunmediator.rb +20 -0
- data/test-unit/test/util/test-method-owner-finder.rb +38 -0
- data/test-unit/test/util/test_backtracefilter.rb +41 -0
- data/test-unit/test/util/test_observable.rb +102 -0
- data/test-unit/test/util/test_procwrapper.rb +36 -0
- data/test/groonga-test-utils.rb +3 -2
- data/test/run-test.rb +14 -2
- data/test/test-column.rb +7 -7
- data/test/test-context-select.rb +34 -11
- data/test/test-exception.rb +3 -0
- data/test/test-expression-builder.rb +11 -0
- data/test/test-expression.rb +3 -6
- data/test/test-gqtp.rb +3 -5
- data/test/test-pagination.rb +249 -0
- data/test/test-record.rb +36 -8
- data/test/test-remote.rb +11 -4
- data/test/test-schema-create-table.rb +251 -0
- data/test/test-schema.rb +4 -24
- data/test/test-table-offset-and-limit.rb +3 -5
- data/test/test-table-select-mecab.rb +80 -0
- data/test/test-table-select-weight.rb +104 -0
- data/test/test-table.rb +22 -4
- data/test/test-version.rb +1 -1
- data/text/TUTORIAL.ja.rdoc +2 -0
- data/text/expression.rdoc +1 -0
- data/vendor/local/bin/grntest.exe +0 -0
- data/vendor/local/bin/groonga.exe +0 -0
- data/vendor/local/bin/libgroonga-0.dll +0 -0
- data/vendor/local/include/{groonga.h → groonga/groonga.h} +93 -32
- data/vendor/local/lib/groonga/modules/functions/cast.dll +0 -0
- data/vendor/local/lib/groonga/modules/functions/cast.la +41 -0
- data/vendor/local/lib/pkgconfig/groonga.pc +12 -0
- data/vendor/local/share/groonga/admin_html/css/admin.css +104 -0
- data/vendor/local/share/groonga/admin_html/css/ui-lightness/jquery-ui-1.8.1.custom.css +486 -0
- data/vendor/local/share/groonga/admin_html/index.html +1355 -0
- data/vendor/local/share/groonga/admin_html/js/jquery-1.4.2.min.js +154 -0
- data/vendor/local/share/groonga/admin_html/js/jquery-ui-1.8.1.custom.min.js +756 -0
- data/vendor/local/share/groonga/munin/plugins/groonga_cpu_load +47 -0
- data/vendor/local/share/groonga/munin/plugins/groonga_cpu_time +57 -0
- data/vendor/local/share/groonga/munin/plugins/groonga_disk +162 -0
- data/vendor/local/share/groonga/munin/plugins/groonga_memory +51 -0
- data/vendor/local/share/groonga/munin/plugins/groonga_n_records +110 -0
- data/vendor/local/share/groonga/munin/plugins/groonga_query_performance +133 -0
- data/vendor/local/share/groonga/munin/plugins/groonga_status +84 -0
- 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,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
|