rroonga 0.9.4-x86-mingw32 → 0.9.5-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- 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,285 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
= grn式 (grn_expr)
|
4
|
+
|
5
|
+
|
6
|
+
== 名前
|
7
|
+
|
8
|
+
grn式 - 検索条件やデータベースへの操作を表現する文字列の形式。(読み方:"ぐるんしき")
|
9
|
+
|
10
|
+
|
11
|
+
== 書式
|
12
|
+
|
13
|
+
grn式はquery形式とscript形式のいずれかによって表現することができます。
|
14
|
+
|
15
|
+
query形式
|
16
|
+
|
17
|
+
[条件式]
|
18
|
+
以下の条件式が使用できます。
|
19
|
+
|
20
|
+
[文字列]
|
21
|
+
全文検索条件(デフォルト検索対象カラムの値が指定された文字列を含んでいる)
|
22
|
+
|
23
|
+
["文字列"]
|
24
|
+
フレーズ検索条件(デフォルト検索対象カラムの値が指定されたフレーズを含んでいる)
|
25
|
+
|
26
|
+
[カラム名:値]
|
27
|
+
一致条件(カラム値 == 値)
|
28
|
+
|
29
|
+
[カラム名:!値]
|
30
|
+
不一致条件(カラム値 != 値)
|
31
|
+
|
32
|
+
[カラム名:<値]
|
33
|
+
比較条件(カラム値 < 値)
|
34
|
+
|
35
|
+
[カラム名:>値]
|
36
|
+
比較条件(カラム値 > 値)
|
37
|
+
|
38
|
+
[カラム名:<=値]
|
39
|
+
比較条件(カラム値 <= 値)
|
40
|
+
|
41
|
+
[カラム名:>=値]
|
42
|
+
比較条件(カラム値 >= 値)
|
43
|
+
|
44
|
+
[カラム名:@文字列]
|
45
|
+
全文検索条件(カラム値が指定された文字列を含んでいる)
|
46
|
+
|
47
|
+
[補助演算子 [1]]
|
48
|
+
全文検索条件の挙動を制御する以下の演算子が指定できます。
|
49
|
+
|
50
|
+
[~文字列]
|
51
|
+
文字列を含んでいた場合は、そのレコードのスコアを下げます。
|
52
|
+
|
53
|
+
[<文字列]
|
54
|
+
文字列を含んでいた場合に加算されるスコアの値を小さくします。
|
55
|
+
|
56
|
+
[>文字列]
|
57
|
+
文字列を含んでいた場合に加算されるスコアの値を大きくします。
|
58
|
+
|
59
|
+
[文字列*]
|
60
|
+
文字列に前方一致する条件を示します。
|
61
|
+
|
62
|
+
[*S[数値]"文字列"]
|
63
|
+
文字列と関連する文書を検索します。文字列から抽出する特徴語の数を数値に指定します。
|
64
|
+
|
65
|
+
[*N[数値]"文字列"]
|
66
|
+
文字列に含まれる複数の語が、近傍に含まれる文書を検索します。近傍の範囲の上限とな
|
67
|
+
る語数を数値に指定します。N-gramの場合は、文字数を指定します。
|
68
|
+
|
69
|
+
[結合演算子]
|
70
|
+
複数の条件式を結合するために以下の演算子が使用できる。演算子を伴わずに複数の条件式 が空白('
|
71
|
+
')区切りで指定された場合は、デフォルトの結合演算子が指定されたものとみな される。
|
72
|
+
|
73
|
+
[a OR b]
|
74
|
+
論理和(aとbといずれかの条件がマッチする)
|
75
|
+
|
76
|
+
[a + b]
|
77
|
+
論理積(aとbの両方がマッチする)
|
78
|
+
|
79
|
+
[a - b]
|
80
|
+
aにマッチし、bにはマッチしない
|
81
|
+
|
82
|
+
[( )]
|
83
|
+
複数の条件をまとめる
|
84
|
+
|
85
|
+
[プラグマ [2]]
|
86
|
+
query形式文字列の先頭に、処理方法を指定するプラグマを埋め込むことができます。
|
87
|
+
|
88
|
+
プラグマは必ずクエリ文字列の冒頭に存在しなければなりません。(先頭に空白を入れては いけません)
|
89
|
+
|
90
|
+
一つのクエリに複数のプラグマを指定することができます。
|
91
|
+
|
92
|
+
複数のプラグマを指定する場合は、間に空白を入れてはいけません。
|
93
|
+
|
94
|
+
[*E数値1[,数値2]]
|
95
|
+
検索結果の数が数値1よりも小さい場合、完全一致→非わかち書き→部分一致の順に自動
|
96
|
+
的に検索処理方法を切り替えます。完全一致でヒットした文書と比べて非わかち書き一致、
|
97
|
+
部分一致でヒットした文書には数値2分だけ小さいスコアを付与します。数値2を省略した
|
98
|
+
場合は既定値(=2)と解釈されます。数値1に負の数を指定した場合は以下のように処理し ます。
|
99
|
+
|
100
|
+
-1
|
101
|
+
|
102
|
+
完全一致検索のみを行う
|
103
|
+
|
104
|
+
-2
|
105
|
+
|
106
|
+
非わかち書き検索のみを行う
|
107
|
+
|
108
|
+
-3
|
109
|
+
|
110
|
+
完全一致検索と非わかち書き検索のみを行う
|
111
|
+
|
112
|
+
-4
|
113
|
+
|
114
|
+
部分一致検索のみを行う
|
115
|
+
|
116
|
+
-5
|
117
|
+
|
118
|
+
完全一致検索と部分一致検索のみを行う
|
119
|
+
|
120
|
+
-6
|
121
|
+
|
122
|
+
非わかち書き検索と部分一致検索のみを行う
|
123
|
+
|
124
|
+
-7
|
125
|
+
|
126
|
+
完全一致検索,非わかち書き検索,部分一致検索の全てを行う
|
127
|
+
|
128
|
+
例:
|
129
|
+
|
130
|
+
*E10,3
|
131
|
+
|
132
|
+
検索結果数が10件以下だった場合に検索処理方法を順次切り替え、スコアを3ずつ小さ くします。
|
133
|
+
|
134
|
+
[*D演算子]
|
135
|
+
結合演算子の既定値(演算子を省略した場合にどの演算を行うか)を指定します。指定できる演 算子は、OR, +, - のいずれかです。
|
136
|
+
|
137
|
+
例1:
|
138
|
+
|
139
|
+
*D+ abc def
|
140
|
+
|
141
|
+
abcとdefを両方含む文書を検索します。
|
142
|
+
|
143
|
+
例2:
|
144
|
+
|
145
|
+
*DOR abc def
|
146
|
+
|
147
|
+
abcとdefのいずれかを含む文書を検索します。
|
148
|
+
|
149
|
+
[*W[数値[:重み][,数値[:重み]]...]
|
150
|
+
数値で指定されたセクション番号のみを対象に検索します。セクションごとに検索スコア
|
151
|
+
の倍数を指定することができます。重みは、省略された場合1となります。負の重みも指 定することができます。
|
152
|
+
|
153
|
+
script形式 [3]
|
154
|
+
|
155
|
+
ECMAScript風の構文で検索条件やレコードへの操作を記述します。
|
156
|
+
|
157
|
+
式中のIDENTIFIER(識別子)は、以下のいずれかを指します。
|
158
|
+
|
159
|
+
[引数名]
|
160
|
+
grn式が受け取る引数の名前
|
161
|
+
|
162
|
+
[カラム名]
|
163
|
+
操作対象としているレコードのカラム名
|
164
|
+
|
165
|
+
[型名・関数名・テーブル名]
|
166
|
+
データベースに定義された型・テーブル・関数の名前
|
167
|
+
|
168
|
+
|
169
|
+
== 説明
|
170
|
+
|
171
|
+
grn式は、検索条件やデータベースへの操作を表現するために使用される文字列の形式です。
|
172
|
+
|
173
|
+
selectやloadなどのいくつかの組込コマンドや、API関数grn_table_select()などで使用されます。grn式はquery
|
174
|
+
形式とscript形式という2種類の方式で記述することができます。query形式は、多くのweb検索エンジンなどで検索フォームにユーザが指定
|
175
|
+
可能なクエリ文字列の書式に合わせた形式です。script形式は、ECMAScriptの構文から式(expression)以下の構文要素を抜粋
|
176
|
+
した形式になっており、文(statement)や制御構造などは表現できません。
|
177
|
+
|
178
|
+
query形式のgrn式もscript形式のgrn式も、共通の中間形式に翻訳された上で処理されますので、処理速度や効率には差違はありません。
|
179
|
+
記述できる処理の範囲はscript形式の方がquery形式より広くなっています。たとえば更新系の操作はscript形式のみで記述できます。
|
180
|
+
|
181
|
+
DB-APIレイヤでは、異なる形式で記述された複数のgrn式を結合することも可能です。
|
182
|
+
|
183
|
+
|
184
|
+
== 例
|
185
|
+
|
186
|
+
query形式でcolumn1の値が'hoge'に等しいという条件
|
187
|
+
|
188
|
+
column1:hoge
|
189
|
+
|
190
|
+
script形式でcolumn1の値が'hoge'に等しいという条件
|
191
|
+
|
192
|
+
column1 == "hoge"
|
193
|
+
|
194
|
+
|
195
|
+
== 構文
|
196
|
+
|
197
|
+
query形式のgrn式で有効な式の構文を拡張BNF記法で示します。
|
198
|
+
|
199
|
+
query ::= query_element
|
200
|
+
| ( query query_element )
|
201
|
+
| ( query "+" query_element )
|
202
|
+
| ( query "-" query_element )
|
203
|
+
| ( query "OR" query_element )
|
204
|
+
query_element ::= STRING
|
205
|
+
| ( "(" query ")" )
|
206
|
+
| ( IDENTIFIER relative_operator query_element )
|
207
|
+
relative_operator ::= ( ":" | ":!" | ":<" | ":>" | ":<=" | ":>=" | ":@" )
|
208
|
+
|
209
|
+
script形式のgrn式で有効な式の構文を拡張BNF記法で示します。
|
210
|
+
|
211
|
+
expression ::= assignment_expression
|
212
|
+
expression ::= ( expression "," assignment_expression )
|
213
|
+
assignment_expression ::= conditional_expression
|
214
|
+
| ( lefthand_side_expression assign_operator assignment_expression )
|
215
|
+
assign_operator ::= ( "=" | "*=" | "/=" | "%=" | "+=" | "-=" | "<<=" | ">>=" | ">>>=" | "&=" | "^=" | "|=" )
|
216
|
+
conditional_expression ::= logical_or_expression
|
217
|
+
| ( logical_or_expression "?" assignment_expression ":" assignment_expression )
|
218
|
+
logical_or_expression ::= logical_and_expression
|
219
|
+
| ( logical_or_expression "||" logical_and_expression )
|
220
|
+
logical_and_expression ::= bitwise_or_expression
|
221
|
+
| ( logical_and_expression logical_and_operator bitwise_or_expression )
|
222
|
+
logical_and_operator ::= ( "&&" | "&!" )
|
223
|
+
bitwise_or_expression ::= bitwise_xor_expression
|
224
|
+
| ( bitwise_or_expression "|" bitwise_xor_expression )
|
225
|
+
bitwise_xor_expression ::= bitwise_and_expression
|
226
|
+
| ( bitwise_xor_expression "^" bitwise_and_expression )
|
227
|
+
bitwise_and_expression ::= equality_expression
|
228
|
+
| bitwise_and_expression "&" equality_expression )
|
229
|
+
equality_expression ::= relational_expression
|
230
|
+
| ( equality_expression equality_operator relational_expression )
|
231
|
+
equality_operator ::= ( "==" | "!=" )
|
232
|
+
relational_expression ::= shift_expression
|
233
|
+
| ( relational_expression relational_operator shift_expression )
|
234
|
+
relational_operator ::= ( "<" | ">" | "<=" | ">=" | "in" | "@" )
|
235
|
+
shift_expression ::= additive_expression
|
236
|
+
| ( shift_expression shift_operator additive_expression )
|
237
|
+
shift_operator ::= ( "<<" | ">>" | ">>>" )
|
238
|
+
additive_expression ::= multiplicative_expression
|
239
|
+
| ( additive_expression additive_operator multiplicative_expression )
|
240
|
+
additive_operator ::= ( "+" | "-" )
|
241
|
+
multiplicative_expression ::= unary_expression
|
242
|
+
| ( multiplicative_expression multiplicative_operator unary_expression )
|
243
|
+
multiplicative_operator ::= ( "*" | "/" | "%" )
|
244
|
+
unary_expression ::= postfix_expression
|
245
|
+
| ( unary_operator unary_expression )
|
246
|
+
unary_operator ::= ( "delete" : "++" : "--" : "+" : "-" : "!" : "~" )
|
247
|
+
postfix_expression ::= lefthand_side_expression
|
248
|
+
| ( lefthand_side_expression postfix_operator )
|
249
|
+
postfix_operator ::= ( "++" | "--" )
|
250
|
+
lefthand_side_expression ::= (call_expression | member_expression)
|
251
|
+
call_expression ::= member_expression arguments
|
252
|
+
member_expression ::= primary_expression
|
253
|
+
member_expression ::= member_expression member_expression_part
|
254
|
+
primary_expression ::= object_literal
|
255
|
+
| ( "(" expression ")" )
|
256
|
+
| IDENTIFIER
|
257
|
+
| array_literal
|
258
|
+
| DECIMAL
|
259
|
+
| HEX_INTEGER
|
260
|
+
| STRING
|
261
|
+
| "true"
|
262
|
+
| "false
|
263
|
+
| "null"
|
264
|
+
array_literal ::= ( "[" elision "]" )
|
265
|
+
| ( "[" `element_list elision` "]" )
|
266
|
+
| ( "[" element_list "]" )
|
267
|
+
elision ::= "," | ( elision "," )
|
268
|
+
element_list ::= assignment_expression
|
269
|
+
| ( elision assignment_expression )
|
270
|
+
| ( element_list elision assignment_expression )
|
271
|
+
object_literal ::= ( "{" property_name_and_value_list "}" )
|
272
|
+
property_name_and_value_list ::= ( property_name_and_value_list "," property_name_and_value )
|
273
|
+
property_name_and_value ::= ( property_name ":" assignment_expression )
|
274
|
+
property_name ::= IDENTIFIER | STRING | DECIMAL
|
275
|
+
member_expression_part ::= "[" expression "]" | ( "." IDENTIFIER )
|
276
|
+
arguments ::= ( "(" argument_list ")" )
|
277
|
+
argument_list ::= assignment_expression | ( argument_list "," assignment_expression )
|
278
|
+
|
279
|
+
-[ 脚注 ]-
|
280
|
+
|
281
|
+
[1] 補助演算子はv1.0でサポートされます。
|
282
|
+
|
283
|
+
[2] プラグマはv1.0でサポートされます。
|
284
|
+
|
285
|
+
[3] script形式のgrn式はv1.0でサポートされます。
|
data/rroonga-build.rb
CHANGED
data/test-unit/Rakefile
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
gem 'rdoc'
|
5
|
+
require 'hoe'
|
6
|
+
require './lib/test/unit/version.rb'
|
7
|
+
|
8
|
+
ENV["NODOT"] = "yes"
|
9
|
+
|
10
|
+
version = Test::Unit::VERSION
|
11
|
+
ENV["VERSION"] = version
|
12
|
+
Hoe.spec('test-unit') do |p|
|
13
|
+
Hoe::Test::SUPPORTED_TEST_FRAMEWORKS[:testunit2] = "test/run-test.rb"
|
14
|
+
p.version = version
|
15
|
+
p.developer('Kouhei Sutou', 'kou@cozmixng.org')
|
16
|
+
p.developer('Ryan Davis', 'ryand-ruby@zenspider.com')
|
17
|
+
|
18
|
+
# Ex-Parrot:
|
19
|
+
# p.developer('Nathaniel Talbott', 'nathaniel@talbott.ws')
|
20
|
+
end
|
21
|
+
|
22
|
+
task :check_manifest => :clean_test_result
|
23
|
+
task :check_manifest => :clean_coverage
|
24
|
+
|
25
|
+
task :clean_test_result do
|
26
|
+
test_results = Dir.glob("**/.test-result")
|
27
|
+
sh("rm", "-rf", *test_results) unless test_results.empty?
|
28
|
+
end
|
29
|
+
|
30
|
+
task :clean_coverage do
|
31
|
+
sh("rm", "-rf", "coverage")
|
32
|
+
end
|
33
|
+
|
34
|
+
task :tag do
|
35
|
+
message = "Released Test::Unit #{version}!"
|
36
|
+
base = "svn+ssh://#{ENV['USER']}@rubyforge.org/var/svn/test-unit/"
|
37
|
+
sh 'svn', 'copy', '-m', message, "#{base}trunk", "#{base}tags/#{version}"
|
38
|
+
end
|
39
|
+
|
40
|
+
# vim: syntax=Ruby
|
data/test-unit/TODO
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Test::Unit (Classic)</title>
|
5
|
+
</head>
|
6
|
+
<body bgcolor="red">
|
7
|
+
<p style="text-align: center">
|
8
|
+
<img height="161" width="308" src="test-unit-classic.png">
|
9
|
+
<br>
|
10
|
+
<br>
|
11
|
+
<br>
|
12
|
+
Read the <a href="classic/test-unit/">rdoc</a>
|
13
|
+
</p>
|
14
|
+
</body>
|
15
|
+
</html>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8" ?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
5
|
+
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
6
|
+
<head>
|
7
|
+
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
|
8
|
+
<title>Test::Unit - a Unit Testing Framework for Ruby</title>
|
9
|
+
</head>
|
10
|
+
<body>
|
11
|
+
<h1>Test::Unit - a Unit Testing Framework for Ruby</h1>
|
12
|
+
<p>[<a href="index.html.ja">Japanese</a>]</p>
|
13
|
+
<ul>
|
14
|
+
<li><a href="http://rubyforge.org/projects/test-unit/">Project Page</a></li>
|
15
|
+
<li>
|
16
|
+
<a href="test-unit/">RDoc</a>
|
17
|
+
<!--(<a href="ja/test-unit/">ja</a>)-->
|
18
|
+
</li>
|
19
|
+
<li>
|
20
|
+
<a href="classic.html">Classic</a>
|
21
|
+
<!--(<a href="ja/classic.html">ja</a>)-->
|
22
|
+
</li>
|
23
|
+
</ul>
|
24
|
+
</body>
|
25
|
+
</html>
|
@@ -0,0 +1,27 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8" ?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
5
|
+
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
|
6
|
+
<head>
|
7
|
+
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
|
8
|
+
<title>Test::Unit - Ruby用単体テストフレームワーク</title>
|
9
|
+
</head>
|
10
|
+
<body>
|
11
|
+
<h1>Test::Unit - Ruby用単体テストフレームワーク</h1>
|
12
|
+
<p>[<a href="./">English</a>]</p>
|
13
|
+
<ul>
|
14
|
+
<li>
|
15
|
+
<a href="http://rubyforge.org/projects/test-unit/">プロジェクトページ</a>
|
16
|
+
</li>
|
17
|
+
<li>
|
18
|
+
<!--<a href="ja/test-unit/">RDoc</a>-->
|
19
|
+
RDoc(<a href="test-unit/">en</a>)
|
20
|
+
</li>
|
21
|
+
<li>
|
22
|
+
<!--<a href="classic.html.html">Classic</a>-->
|
23
|
+
Classic(<a href="classic.html">en</a>)
|
24
|
+
</li>
|
25
|
+
</ul>
|
26
|
+
</body>
|
27
|
+
</html>
|
@@ -0,0 +1,323 @@
|
|
1
|
+
require 'test/unit/testcase'
|
2
|
+
require 'test/unit/autorunner'
|
3
|
+
|
4
|
+
module Test # :nodoc:
|
5
|
+
#
|
6
|
+
# = Test::Unit - Ruby Unit Testing Framework
|
7
|
+
#
|
8
|
+
# == Introduction
|
9
|
+
#
|
10
|
+
# Unit testing is making waves all over the place, largely due to the
|
11
|
+
# fact that it is a core practice of XP. While XP is great, unit testing
|
12
|
+
# has been around for a long time and has always been a good idea. One
|
13
|
+
# of the keys to good unit testing, though, is not just writing tests,
|
14
|
+
# but having tests. What's the difference? Well, if you just _write_ a
|
15
|
+
# test and throw it away, you have no guarantee that something won't
|
16
|
+
# change later which breaks your code. If, on the other hand, you _have_
|
17
|
+
# tests (obviously you have to write them first), and run them as often
|
18
|
+
# as possible, you slowly build up a wall of things that cannot break
|
19
|
+
# without you immediately knowing about it. This is when unit testing
|
20
|
+
# hits its peak usefulness.
|
21
|
+
#
|
22
|
+
# Enter Test::Unit, a framework for unit testing in Ruby, helping you to
|
23
|
+
# design, debug and evaluate your code by making it easy to write and
|
24
|
+
# have tests for it.
|
25
|
+
#
|
26
|
+
#
|
27
|
+
# == Notes
|
28
|
+
#
|
29
|
+
# Test::Unit has grown out of and superceded Lapidary.
|
30
|
+
#
|
31
|
+
#
|
32
|
+
# == Feedback
|
33
|
+
#
|
34
|
+
# I like (and do my best to practice) XP, so I value early releases,
|
35
|
+
# user feedback, and clean, simple, expressive code. There is always
|
36
|
+
# room for improvement in everything I do, and Test::Unit is no
|
37
|
+
# exception. Please, let me know what you think of Test::Unit as it
|
38
|
+
# stands, and what you'd like to see expanded/changed/improved/etc. If
|
39
|
+
# you find a bug, let me know ASAP; one good way to let me know what the
|
40
|
+
# bug is is to submit a new test that catches it :-) Also, I'd love to
|
41
|
+
# hear about any successes you have with Test::Unit, and any
|
42
|
+
# documentation you might add will be greatly appreciated. My contact
|
43
|
+
# info is below.
|
44
|
+
#
|
45
|
+
#
|
46
|
+
# == Contact Information
|
47
|
+
#
|
48
|
+
# A lot of discussion happens about Ruby in general on the ruby-talk
|
49
|
+
# mailing list (http://www.ruby-lang.org/en/ml.html), and you can ask
|
50
|
+
# any questions you might have there. I monitor the list, as do many
|
51
|
+
# other helpful Rubyists, and you're sure to get a quick answer. Of
|
52
|
+
# course, you're also welcome to email me (Nathaniel Talbott) directly
|
53
|
+
# at mailto:testunit@talbott.ws, and I'll do my best to help you out.
|
54
|
+
#
|
55
|
+
#
|
56
|
+
# == Credits
|
57
|
+
#
|
58
|
+
# I'd like to thank...
|
59
|
+
#
|
60
|
+
# Matz, for a great language!
|
61
|
+
#
|
62
|
+
# Masaki Suketa, for his work on RubyUnit, which filled a vital need in
|
63
|
+
# the Ruby world for a very long time. I'm also grateful for his help in
|
64
|
+
# polishing Test::Unit and getting the RubyUnit compatibility layer
|
65
|
+
# right. His graciousness in allowing Test::Unit to supercede RubyUnit
|
66
|
+
# continues to be a challenge to me to be more willing to defer my own
|
67
|
+
# rights.
|
68
|
+
#
|
69
|
+
# Ken McKinlay, for his interest and work on unit testing, and for his
|
70
|
+
# willingness to dialog about it. He was also a great help in pointing
|
71
|
+
# out some of the holes in the RubyUnit compatibility layer.
|
72
|
+
#
|
73
|
+
# Dave Thomas, for the original idea that led to the extremely simple
|
74
|
+
# "require 'test/unit'", plus his code to improve it even more by
|
75
|
+
# allowing the selection of tests from the command-line. Also, without
|
76
|
+
# RDoc, the documentation for Test::Unit would stink a lot more than it
|
77
|
+
# does now.
|
78
|
+
#
|
79
|
+
# Everyone who's helped out with bug reports, feature ideas,
|
80
|
+
# encouragement to continue, etc. It's a real privilege to be a part of
|
81
|
+
# the Ruby community.
|
82
|
+
#
|
83
|
+
# The guys at RoleModel Software, for putting up with me repeating, "But
|
84
|
+
# this would be so much easier in Ruby!" whenever we're coding in Java.
|
85
|
+
#
|
86
|
+
# My Creator, for giving me life, and giving it more abundantly.
|
87
|
+
#
|
88
|
+
#
|
89
|
+
# == License
|
90
|
+
#
|
91
|
+
# Test::Unit is copyright (c) 2000-2003 Nathaniel Talbott. It is free
|
92
|
+
# software, and is distributed under the Ruby license. See the COPYING
|
93
|
+
# file in the standard Ruby distribution for details.
|
94
|
+
#
|
95
|
+
#
|
96
|
+
# == Warranty
|
97
|
+
#
|
98
|
+
# This software is provided "as is" and without any express or
|
99
|
+
# implied warranties, including, without limitation, the implied
|
100
|
+
# warranties of merchantibility and fitness for a particular
|
101
|
+
# purpose.
|
102
|
+
#
|
103
|
+
#
|
104
|
+
# == Author
|
105
|
+
#
|
106
|
+
# Nathaniel Talbott.
|
107
|
+
# Copyright (c) 2000-2003, Nathaniel Talbott
|
108
|
+
#
|
109
|
+
# ----
|
110
|
+
#
|
111
|
+
# = Usage
|
112
|
+
#
|
113
|
+
# The general idea behind unit testing is that you write a _test_
|
114
|
+
# _method_ that makes certain _assertions_ about your code, working
|
115
|
+
# against a _test_ _fixture_. A bunch of these _test_ _methods_ are
|
116
|
+
# bundled up into a _test_ _suite_ and can be run any time the
|
117
|
+
# developer wants. The results of a run are gathered in a _test_
|
118
|
+
# _result_ and displayed to the user through some UI. So, lets break
|
119
|
+
# this down and see how Test::Unit provides each of these necessary
|
120
|
+
# pieces.
|
121
|
+
#
|
122
|
+
#
|
123
|
+
# == Assertions
|
124
|
+
#
|
125
|
+
# These are the heart of the framework. Think of an assertion as a
|
126
|
+
# statement of expected outcome, i.e. "I assert that x should be equal
|
127
|
+
# to y". If, when the assertion is executed, it turns out to be
|
128
|
+
# correct, nothing happens, and life is good. If, on the other hand,
|
129
|
+
# your assertion turns out to be false, an error is propagated with
|
130
|
+
# pertinent information so that you can go back and make your
|
131
|
+
# assertion succeed, and, once again, life is good. For an explanation
|
132
|
+
# of the current assertions, see Test::Unit::Assertions.
|
133
|
+
#
|
134
|
+
#
|
135
|
+
# == Test Method & Test Fixture
|
136
|
+
#
|
137
|
+
# Obviously, these assertions have to be called within a context that
|
138
|
+
# knows about them and can do something meaningful with their
|
139
|
+
# pass/fail value. Also, it's handy to collect a bunch of related
|
140
|
+
# tests, each test represented by a method, into a common test class
|
141
|
+
# that knows how to run them. The tests will be in a separate class
|
142
|
+
# from the code they're testing for a couple of reasons. First of all,
|
143
|
+
# it allows your code to stay uncluttered with test code, making it
|
144
|
+
# easier to maintain. Second, it allows the tests to be stripped out
|
145
|
+
# for deployment, since they're really there for you, the developer,
|
146
|
+
# and your users don't need them. Third, and most importantly, it
|
147
|
+
# allows you to set up a common test fixture for your tests to run
|
148
|
+
# against.
|
149
|
+
#
|
150
|
+
# What's a test fixture? Well, tests do not live in a vacuum; rather,
|
151
|
+
# they're run against the code they are testing. Often, a collection
|
152
|
+
# of tests will run against a common set of data, also called a
|
153
|
+
# fixture. If they're all bundled into the same test class, they can
|
154
|
+
# all share the setting up and tearing down of that data, eliminating
|
155
|
+
# unnecessary duplication and making it much easier to add related
|
156
|
+
# tests.
|
157
|
+
#
|
158
|
+
# Test::Unit::TestCase wraps up a collection of test methods together
|
159
|
+
# and allows you to easily set up and tear down the same test fixture
|
160
|
+
# for each test. This is done by overriding #setup and/or #teardown,
|
161
|
+
# which will be called before and after each test method that is
|
162
|
+
# run. The TestCase also knows how to collect the results of your
|
163
|
+
# assertions into a Test::Unit::TestResult, which can then be reported
|
164
|
+
# back to you... but I'm getting ahead of myself. To write a test,
|
165
|
+
# follow these steps:
|
166
|
+
#
|
167
|
+
# * Make sure Test::Unit is in your library path.
|
168
|
+
# * require 'test/unit' in your test script.
|
169
|
+
# * Create a class that subclasses Test::Unit::TestCase.
|
170
|
+
# * Add a method that begins with "test" to your class.
|
171
|
+
# * Make assertions in your test method.
|
172
|
+
# * Optionally define #setup and/or #teardown to set up and/or tear
|
173
|
+
# down your common test fixture.
|
174
|
+
# * You can now run your test as you would any other Ruby
|
175
|
+
# script... try it and see!
|
176
|
+
#
|
177
|
+
# A really simple test might look like this (#setup and #teardown are
|
178
|
+
# commented out to indicate that they are completely optional):
|
179
|
+
#
|
180
|
+
# require 'test/unit'
|
181
|
+
#
|
182
|
+
# class MyTest < Test::Unit::TestCase
|
183
|
+
# # def setup
|
184
|
+
# # end
|
185
|
+
#
|
186
|
+
# # def teardown
|
187
|
+
# # end
|
188
|
+
#
|
189
|
+
# def test_fail
|
190
|
+
# assert(false, 'Assertion was false.')
|
191
|
+
# end
|
192
|
+
# end
|
193
|
+
#
|
194
|
+
#
|
195
|
+
# == Test Runners
|
196
|
+
#
|
197
|
+
# So, now you have this great test class, but you still
|
198
|
+
# need a way to run it and view any failures that occur
|
199
|
+
# during the run. There are some test runner; console test
|
200
|
+
# runner, GTK+ test runner and so on. The console test
|
201
|
+
# runner is automatically invoked for you if you require
|
202
|
+
# 'test/unit' and simply run the file. To use another
|
203
|
+
# runner simply set default test runner ID to
|
204
|
+
# Test::Unit::AutoRunner:
|
205
|
+
#
|
206
|
+
# require 'test/unit'
|
207
|
+
# Test::Unit::AutoRunner.default_runner = "gtk2"
|
208
|
+
#
|
209
|
+
# == Test Suite
|
210
|
+
#
|
211
|
+
# As more and more unit tests accumulate for a given project, it
|
212
|
+
# becomes a real drag running them one at a time, and it also
|
213
|
+
# introduces the potential to overlook a failing test because you
|
214
|
+
# forget to run it. Suddenly it becomes very handy that the
|
215
|
+
# TestRunners can take any object that returns a Test::Unit::TestSuite
|
216
|
+
# in response to a suite method. The TestSuite can, in turn, contain
|
217
|
+
# other TestSuites or individual tests (typically created by a
|
218
|
+
# TestCase). In other words, you can easily wrap up a group of
|
219
|
+
# TestCases and TestSuites.
|
220
|
+
#
|
221
|
+
# Test::Unit does a little bit more for you, by wrapping
|
222
|
+
# these up automatically when you require
|
223
|
+
# 'test/unit'. What does this mean? It means you could
|
224
|
+
# write the above test case like this instead:
|
225
|
+
#
|
226
|
+
# require 'test/unit'
|
227
|
+
# require 'test_myfirsttests'
|
228
|
+
# require 'test_moretestsbyme'
|
229
|
+
# require 'test_anothersetoftests'
|
230
|
+
#
|
231
|
+
# Test::Unit is smart enough to find all the test cases existing in
|
232
|
+
# the ObjectSpace and wrap them up into a suite for you. It then runs
|
233
|
+
# the dynamic suite using the console TestRunner.
|
234
|
+
#
|
235
|
+
#
|
236
|
+
# == Configuration file
|
237
|
+
#
|
238
|
+
# Test::Unit reads 'test-unit.yml' in the current working
|
239
|
+
# directory as Test::Unit's configuration file. It can
|
240
|
+
# contain the following configurations:
|
241
|
+
#
|
242
|
+
# * color scheme definitions
|
243
|
+
# * test runner to be used
|
244
|
+
# * test runner options
|
245
|
+
# * test collector to be used
|
246
|
+
#
|
247
|
+
# Except color scheme definitions, all of them are
|
248
|
+
# specified by command line option.
|
249
|
+
#
|
250
|
+
# Here are sample color scheme definitions:
|
251
|
+
#
|
252
|
+
# color_schemes:
|
253
|
+
# inverted:
|
254
|
+
# success:
|
255
|
+
# name: red
|
256
|
+
# bold: true
|
257
|
+
# failure:
|
258
|
+
# name: green
|
259
|
+
# bold: true
|
260
|
+
# other_scheme:
|
261
|
+
# ...
|
262
|
+
#
|
263
|
+
# Here are the syntax of color scheme definitions:
|
264
|
+
#
|
265
|
+
# color_schemes:
|
266
|
+
# SCHEME_NAME:
|
267
|
+
# EVENT_NAME:
|
268
|
+
# name: COLOR_NAME
|
269
|
+
# intensity: BOOLEAN
|
270
|
+
# bold: BOOLEAN
|
271
|
+
# italic: BOOLEAN
|
272
|
+
# underline: BOOLEAN
|
273
|
+
# ...
|
274
|
+
# ...
|
275
|
+
#
|
276
|
+
# SCHEME_NAME:: the name of the color scheme
|
277
|
+
# EVENT_NAME:: one of [success, failure, pending,
|
278
|
+
# omission, notification, error]
|
279
|
+
# COLOR_NAME:: one of [black, red, green, yellow, blue,
|
280
|
+
# magenta, cyan, white]
|
281
|
+
# BOOLEAN:: true or false
|
282
|
+
#
|
283
|
+
# You can use the above 'inverted' color scheme with the
|
284
|
+
# following configuration:
|
285
|
+
#
|
286
|
+
# runner: console
|
287
|
+
# console_options:
|
288
|
+
# color_scheme: inverted
|
289
|
+
# color_schemes:
|
290
|
+
# inverted:
|
291
|
+
# success:
|
292
|
+
# name: red
|
293
|
+
# bold: true
|
294
|
+
# failure:
|
295
|
+
# name: green
|
296
|
+
# bold: true
|
297
|
+
#
|
298
|
+
# == Questions?
|
299
|
+
#
|
300
|
+
# I'd really like to get feedback from all levels of Ruby
|
301
|
+
# practitioners about typos, grammatical errors, unclear statements,
|
302
|
+
# missing points, etc., in this document (or any other).
|
303
|
+
#
|
304
|
+
|
305
|
+
module Unit
|
306
|
+
# Set true when Test::Unit has run. If set to true Test::Unit
|
307
|
+
# will not automatically run at exit.
|
308
|
+
def self.run=(flag)
|
309
|
+
@run = flag
|
310
|
+
end
|
311
|
+
|
312
|
+
# Already tests have run?
|
313
|
+
def self.run?
|
314
|
+
@run ||= false
|
315
|
+
end
|
316
|
+
end
|
317
|
+
end
|
318
|
+
|
319
|
+
at_exit do
|
320
|
+
unless $! || Test::Unit.run?
|
321
|
+
exit Test::Unit::AutoRunner.run
|
322
|
+
end
|
323
|
+
end
|