rroonga 5.1.1 → 6.0.0

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/ext/groonga/rb-grn.h CHANGED
@@ -21,10 +21,8 @@
21
21
  #define __RB_GRN_H__
22
22
 
23
23
  #include <ruby.h>
24
+ #include <ruby/encoding.h>
24
25
 
25
- #ifdef HAVE_RUBY_ENCODING_H
26
- # include <ruby/encoding.h>
27
- #endif
28
26
  #ifdef HAVE_RUBY_INTERN_H
29
27
  # include <ruby/intern.h>
30
28
  #endif
@@ -99,9 +97,9 @@ RB_GRN_BEGIN_DECLS
99
97
  # define debug(...)
100
98
  #endif
101
99
 
102
- #define RB_GRN_MAJOR_VERSION 5
103
- #define RB_GRN_MINOR_VERSION 1
104
- #define RB_GRN_MICRO_VERSION 1
100
+ #define RB_GRN_MAJOR_VERSION 6
101
+ #define RB_GRN_MINOR_VERSION 0
102
+ #define RB_GRN_MICRO_VERSION 0
105
103
 
106
104
  #define RB_GRN_QUERY_DEFAULT_MAX_EXPRESSIONS 32
107
105
 
@@ -301,6 +299,7 @@ RB_GRN_VAR VALUE rb_cGrnRecordExpressionBuilder;
301
299
  RB_GRN_VAR VALUE rb_cGrnColumnExpressionBuilder;
302
300
  RB_GRN_VAR VALUE rb_cGrnPlugin;
303
301
  RB_GRN_VAR VALUE rb_cGrnNormalizer;
302
+ RB_GRN_VAR VALUE rb_cGrnIndex;
304
303
 
305
304
  void rb_grn_init_utils (VALUE mGrn);
306
305
  void rb_grn_init_exception (VALUE mGrn);
@@ -355,6 +354,7 @@ void rb_grn_init_plugin (VALUE mGrn);
355
354
  void rb_grn_init_normalizer (VALUE mGrn);
356
355
  void rb_grn_init_thread (VALUE mGrn);
357
356
  void rb_grn_init_config (VALUE mGrn);
357
+ void rb_grn_init_index (VALUE mGrn);
358
358
 
359
359
  VALUE rb_grn_rc_to_exception (grn_rc rc);
360
360
  const char *rb_grn_rc_to_message (grn_rc rc);
@@ -383,7 +383,6 @@ void rb_grn_context_object_created (VALUE rb_context,
383
383
  VALUE rb_object);
384
384
 
385
385
  const char *rb_grn_inspect (VALUE object);
386
- const char *rb_grn_inspect_type (unsigned char type);
387
386
  void rb_grn_scan_options (VALUE options, ...)
388
387
  RB_GRN_GNUC_NULL_TERMINATED;
389
388
  grn_bool rb_grn_equal_option (VALUE option,
@@ -634,6 +633,9 @@ VALUE rb_grn_column_expression_builder_new (VALUE column,
634
633
  VALUE rb_grn_column_expression_builder_build
635
634
  (VALUE self);
636
635
 
636
+ VALUE rb_grn_index_new (VALUE rb_index_column,
637
+ VALUE rb_section);
638
+
637
639
 
638
640
  #define RB_GRN_INTERN(c_string) (rb_to_symbol(rb_str_new_cstr(c_string)))
639
641
 
@@ -740,11 +742,9 @@ VALUE rb_grn_column_expression_builder_build
740
742
  grn_encoding rb_grn_encoding_from_ruby_object (VALUE object,
741
743
  grn_ctx *context);
742
744
  VALUE rb_grn_encoding_to_ruby_object (grn_encoding encoding);
743
- #ifdef HAVE_RUBY_ENCODING_H
744
745
  rb_encoding *rb_grn_encoding_to_ruby_encoding (grn_encoding encoding);
745
746
  VALUE rb_grn_encoding_to_ruby_encoding_object
746
747
  (grn_encoding encoding);
747
- #endif
748
748
 
749
749
  grn_ctx *rb_grn_context_from_ruby_object (VALUE object);
750
750
  VALUE rb_grn_context_to_ruby_object (grn_ctx *context);
@@ -1,6 +1,6 @@
1
1
  /* -*- coding: utf-8; mode: C; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
2
  /*
3
- Copyright (C) 2009-2015 Kouhei Sutou <kou@clear-code.com>
3
+ Copyright (C) 2009-2016 Kouhei Sutou <kou@clear-code.com>
4
4
  Copyright (C) 2016 Masafumi Yokoyama <yokoyama@clear-code.com>
5
5
 
6
6
  This library is free software; you can redistribute it and/or
@@ -30,6 +30,34 @@ finish_groonga (VALUE data)
30
30
  debug("finish: done\n");
31
31
  }
32
32
 
33
+ /*
34
+ * @overload error_message
35
+ * @return [String, nil] The process global error message.
36
+ *
37
+ * @since 6.0.0
38
+ */
39
+ static VALUE
40
+ rb_grn_s_get_error_message (VALUE klass)
41
+ {
42
+ const char *message;
43
+
44
+ message = grn_get_global_error_message();
45
+ if (message[0] == '\0') {
46
+ return Qnil;
47
+ } else {
48
+ grn_encoding encoding = grn_get_default_encoding();
49
+ return rb_enc_str_new_cstr(message,
50
+ rb_grn_encoding_to_ruby_encoding(encoding));
51
+ }
52
+ }
53
+
54
+ static void
55
+ rb_grn_init_error_message (VALUE mGrn)
56
+ {
57
+ rb_define_singleton_method(mGrn, "error_message",
58
+ rb_grn_s_get_error_message, 0);
59
+ }
60
+
33
61
  static void
34
62
  rb_grn_init_runtime_version (VALUE mGrn)
35
63
  {
@@ -180,6 +208,7 @@ Init_groonga (void)
180
208
 
181
209
  mGrn = rb_define_module("Groonga");
182
210
 
211
+ rb_grn_init_error_message(mGrn);
183
212
  rb_grn_init_exception(mGrn);
184
213
 
185
214
  rb_grn_rc_check(grn_init(), Qnil);
@@ -219,4 +248,5 @@ Init_groonga (void)
219
248
  rb_grn_init_normalizer(mGrn);
220
249
  rb_grn_init_thread(mGrn);
221
250
  rb_grn_init_config(mGrn);
251
+ rb_grn_init_index(mGrn);
222
252
  }
@@ -21,5 +21,18 @@ module Groonga
21
21
  measurer = StatisticMeasurer.new
22
22
  measurer.measure_disk_usage(path)
23
23
  end
24
+
25
+ # @param [Groonga::Operator] operator (Groonga::Operator::MATCH)
26
+ # @return [Array<Groonga::IndexColumn>] Indexes on `column` which can
27
+ # execute `operator`.
28
+ # @since 1.0.9
29
+ #
30
+ # @deprecated since 6.0.0. Use {Groonga::Column#find_indexes} instead.
31
+ def indexes(operator=nil)
32
+ operator ||= Operator::MATCH
33
+ find_indexes(:operator => operator).collect do |index|
34
+ index.column
35
+ end
36
+ end
24
37
  end
25
38
  end
@@ -666,6 +666,7 @@ module Groonga
666
666
  @have_output = !@output.nil?
667
667
  @output ||= Dumper.default_output
668
668
  @error_output = @options[:error_output]
669
+ @max_records = @options[:max_records]
669
670
  end
670
671
 
671
672
  def dump
@@ -709,7 +710,8 @@ module Groonga
709
710
  when Groonga::Array, Groonga::Hash
710
711
  order_by = nil if order_by == :key
711
712
  end
712
- @table.each(:order_by => order_by) do |record|
713
+ limit = @options[:max_records]
714
+ @table.each(:order_by => order_by, :limit => limit) do |record|
713
715
  write(",\n")
714
716
  values = columns.collect do |column|
715
717
  resolve_value(record, column, column[record.id])
@@ -1,7 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  #
3
3
  # Copyright (C) 2015 Masafumi Yokoyama <yokoyama@clear-code.com>
4
- # Copyright (C) 2009-2015 Kouhei Sutou <kou@clear-code.com>
4
+ # Copyright (C) 2009-2016 Kouhei Sutou <kou@clear-code.com>
5
5
  #
6
6
  # This library is free software; you can redistribute it and/or
7
7
  # modify it under the terms of the GNU Lesser General Public
@@ -56,6 +56,10 @@ module Groonga
56
56
  other
57
57
  end
58
58
 
59
+ def -(other)
60
+ other
61
+ end
62
+
59
63
  private
60
64
  def default_parse_options
61
65
  {
@@ -110,6 +114,10 @@ module Groonga
110
114
  def |(other)
111
115
  OrExpressionBuilder.new(self, other)
112
116
  end
117
+
118
+ def -(other)
119
+ AndNotExpressionBuilder.new(self, other)
120
+ end
113
121
  end
114
122
 
115
123
  # @private
@@ -143,6 +151,13 @@ module Groonga
143
151
  end
144
152
  end
145
153
 
154
+ # @private
155
+ class AndNotExpressionBuilder < SetExpressionBuilder
156
+ def initialize(*expression_builders)
157
+ super(Groonga::Operation::AND_NOT, *expression_builders)
158
+ end
159
+ end
160
+
146
161
  # @private
147
162
  class ColumnValueExpressionBuilder < ExpressionBuilder
148
163
  def initialize(column, options={})
@@ -168,6 +183,10 @@ module Groonga
168
183
  EqualExpressionBuilder.new(self, normalize(other))
169
184
  end
170
185
 
186
+ def !=(other)
187
+ NotEqualExpressionBuilder.new(self, normalize(other))
188
+ end
189
+
171
190
  def =~(other)
172
191
  if other.nil?
173
192
  full_column_name = "#{@table.name}.#{@column_name}"
@@ -249,25 +268,45 @@ module Groonga
249
268
 
250
269
  private
251
270
  def normalize(other)
252
- if @range.is_a?(Groonga::Table)
253
- if other.respond_to?(:record_id)
254
- id = other.record_id
255
- else
256
- id = other
257
- end
258
- return Groonga::Record.new(@range, id) if id.is_a?(Integer)
271
+ return other unless @range.is_a?(Table)
272
+ return other if other.is_a?(Record)
273
+
274
+ if other.respond_to?(:record_raw_id)
275
+ return Record.new(@range, other.record_raw_id)
259
276
  end
277
+
278
+ if other.respond_to?(:record_id)
279
+ return @range[other.record_id]
280
+ end
281
+
260
282
  other
261
283
  end
262
284
 
285
+ def callable_object?(object)
286
+ return false unless object.respond_to?(:function_procedure?)
287
+
288
+ object.function_procedure?
289
+ end
290
+
263
291
  def method_missing(name, *args, &block)
264
292
  return super if block
265
- return super unless args.empty?
266
- if VALID_COLUMN_NAME_RE =~ name.to_s
267
- RecordExpressionBuilder.new(@table, @name)["#{@column_name}.#{name}"]
268
- else
269
- super
293
+
294
+ if args.empty? and VALID_COLUMN_NAME_RE =~ name.to_s
295
+ accessor_name = "#{@column_name}.#{name}"
296
+ accessor = @table.column(accessor_name)
297
+ if accessor
298
+ return self.class.new(accessor,
299
+ :table => @table,
300
+ :column_name => accessor_name)
301
+ end
302
+ end
303
+
304
+ object = @table.context[name]
305
+ if callable_object?(object)
306
+ return CallExpressionBuilder.new(object, self, *args)
270
307
  end
308
+
309
+ super
271
310
  end
272
311
  end
273
312
 
@@ -331,6 +370,13 @@ module Groonga
331
370
  end
332
371
  end
333
372
 
373
+ # @private
374
+ class NotEqualExpressionBuilder < BinaryExpressionBuilder
375
+ def initialize(column_value_builder, value)
376
+ super(Groonga::Operation::NOT_EQUAL, column_value_builder, value)
377
+ end
378
+ end
379
+
334
380
  # @private
335
381
  class MatchExpressionBuilder < BinaryExpressionBuilder
336
382
  def initialize(column_value_builder, value)
@@ -461,8 +507,10 @@ module Groonga
461
507
  expression.append_object(@function)
462
508
  @arguments.each do |argument|
463
509
  case argument
464
- when String
510
+ when String, Integer, Time
465
511
  expression.append_constant(argument)
512
+ when ::Hash
513
+ expression.append_object(argument)
466
514
  else
467
515
  argument.build(expression, variable)
468
516
  end
@@ -595,6 +643,10 @@ module Groonga
595
643
  column_expression_builder == other
596
644
  end
597
645
 
646
+ def !=(other)
647
+ column_expression_builder != other
648
+ end
649
+
598
650
  def =~(other)
599
651
  column_expression_builder =~ other
600
652
  end
@@ -666,7 +718,3 @@ module Groonga
666
718
  end
667
719
  end
668
720
  end
669
-
670
- if RUBY_VERSION >= "1.9"
671
- require "groonga/expression-builder-19"
672
- end
@@ -1,6 +1,4 @@
1
- # -*- coding: utf-8 -*-
2
- #
3
- # Copyright (C) 2011 Kouhei Sutou <kou@clear-code.com>
1
+ # Copyright (C) 2016 Kouhei Sutou <kou@clear-code.com>
4
2
  #
5
3
  # This library is free software; you can redistribute it and/or
6
4
  # modify it under the terms of the GNU Lesser General Public
@@ -16,25 +14,19 @@
16
14
  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
15
 
18
16
  module Groonga
19
- module ExpressionBuildable
20
- class ColumnValueExpressionBuilder
21
- def !=(other)
22
- NotEqualExpressionBuilder.new(self, normalize(other))
23
- end
24
- end
17
+ class Index
18
+ attr_reader :column
19
+ attr_reader :section
25
20
 
26
- # @private
27
- class NotEqualExpressionBuilder < BinaryExpressionBuilder
28
- def initialize(column_value_builder, value)
29
- super(Groonga::Operation::NOT_EQUAL, column_value_builder, value)
30
- end
21
+ def initialize(column, section)
22
+ @column = column
23
+ @section = section
31
24
  end
32
- end
33
25
 
34
- # @private
35
- class ColumnExpressionBuilder
36
- def !=(other)
37
- column_value_builder != other
26
+ def ==(other)
27
+ other.is_a?(self.class) and
28
+ @column == other.column and
29
+ @section == other.section
38
30
  end
39
31
  end
40
32
  end
@@ -400,7 +400,7 @@ module Groonga
400
400
  end
401
401
 
402
402
  # @private
403
- def respond_to?(name)
403
+ def respond_to?(name, include_all=false)
404
404
  super or !@table.column(name.to_s.sub(/=\z/, '')).nil?
405
405
  end
406
406
 
data/lib/groonga.rb CHANGED
@@ -38,6 +38,7 @@ require "groonga/geo-point"
38
38
  require "groonga/record"
39
39
  require "groonga/expression-builder"
40
40
  require "groonga/posting"
41
+ require "groonga/index"
41
42
  begin
42
43
  major, minor, _ = RUBY_VERSION.split(/\./)
43
44
  require "#{major}.#{minor}/groonga.so"
data/lib/rroonga.rb ADDED
@@ -0,0 +1,16 @@
1
+ # Copyright (C) 2016 Fumiaki MATSUSHIMA <mtsmfm@gmail.com>
2
+ #
3
+ # This library is free software; you can redistribute it and/or
4
+ # modify it under the terms of the GNU Lesser General Public
5
+ # License version 2.1 as published by the Free Software Foundation.
6
+ #
7
+ # This library is distributed in the hope that it will be useful,
8
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
9
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
10
+ # Lesser General Public License for more details.
11
+ #
12
+ # You should have received a copy of the GNU Lesser General Public
13
+ # License along with this library; if not, write to the Free Software
14
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15
+
16
+ require "groonga"
data/rroonga-build.rb CHANGED
@@ -18,17 +18,17 @@
18
18
 
19
19
  module RroongaBuild
20
20
  module RequiredGroongaVersion
21
- MAJOR = 5
22
- MINOR = 1
21
+ MAJOR = 6
22
+ MINOR = 0
23
23
  MICRO = 0
24
24
  VERSION = [MAJOR, MINOR, MICRO]
25
- RELEASED_DATE = Time.utc(2015, 11, 29)
25
+ RELEASED_DATE = Time.utc(2016, 2, 29)
26
26
  end
27
27
 
28
28
  module LatestGroongaVersion
29
- MAJOR = 5
30
- MINOR = 1
31
- MICRO = 1
29
+ MAJOR = 6
30
+ MINOR = 0
31
+ MICRO = 0
32
32
  VERSION = [MAJOR, MINOR, MICRO]
33
33
  end
34
34
 
data/rroonga.gemspec CHANGED
@@ -60,7 +60,7 @@ Gem::Specification.new do |s|
60
60
  s.summary, s.description, = description.split(/\n\n+/, 3)
61
61
 
62
62
  s.files = ["README.md", "AUTHORS", "Rakefile", "Gemfile", ".yardopts"]
63
- s.files += Dir.glob("doc/text/*.textile")
63
+ s.files += Dir.glob("doc/text/*.md")
64
64
  s.files += Dir.glob("doc/images/*")
65
65
  s.files += ["#{s.name}.gemspec"]
66
66
  s.files += ["rroonga-build.rb", "extconf.rb"]
@@ -158,14 +158,6 @@ module GroongaTestUtils
158
158
  actual.expression.inspect)
159
159
  end
160
160
 
161
- def ruby19?
162
- RUBY_VERSION >= "1.9"
163
- end
164
-
165
- def only_ruby19
166
- omit("Ruby 1.9 is needed.") unless ruby19?
167
- end
168
-
169
161
  def linux?
170
162
  /linux/ =~ RUBY_PLATFORM
171
163
  end
data/test/test-column.rb CHANGED
@@ -1,4 +1,5 @@
1
- # Copyright (C) 2009-2013 Kouhei Sutou <kou@clear-code.com>
1
+ # Copyright (C) 2009-2016 Kouhei Sutou <kou@clear-code.com>
2
+ # Copyright (C) 2016 Masafumi Yokoyama <yokoyama@clear-code.com>
2
3
  #
3
4
  # This library is free software; you can redistribute it and/or
4
5
  # modify it under the terms of the GNU Lesser General Public
@@ -584,4 +585,109 @@ class ColumnTest < Test::Unit::TestCase
584
585
  assert_equal(["title1"], select.call)
585
586
  end
586
587
  end
588
+
589
+ class FindIndexesTest < self
590
+ class NoOperatorTest < self
591
+ def setup
592
+ super
593
+ Groonga::Schema.define do |schema|
594
+ schema.create_table("Comments") do |table|
595
+ table.short_text("title")
596
+ table.short_text("body")
597
+ end
598
+ end
599
+ @title = Groonga["Comments.title"]
600
+ end
601
+
602
+ def test_nothing
603
+ assert_equal([], @title.find_indexes)
604
+ end
605
+
606
+ def test_one_index
607
+ Groonga::Schema.define do |schema|
608
+ schema.create_table("Terms",
609
+ :type => :patricia_trie,
610
+ :key_type => :short_text,
611
+ :default_tokenizer => "TokenBigram") do |table|
612
+ table.index("Comments.title")
613
+ end
614
+ end
615
+ assert_equal([
616
+ Groonga::Index.new(Groonga["Terms.Comments_title"], 0),
617
+ ],
618
+ @title.find_indexes)
619
+ end
620
+
621
+ def test_multiple_indexes
622
+ Groonga::Schema.define do |schema|
623
+ schema.create_table("Terms",
624
+ :type => :patricia_trie,
625
+ :key_type => :short_text,
626
+ :default_tokenizer => "TokenBigram") do |table|
627
+ table.index("Comments.title")
628
+ end
629
+
630
+ schema.create_table("Titles",
631
+ :type => :hash,
632
+ :key_type => :short_text) do |table|
633
+ table.index("Comments.title")
634
+ end
635
+ end
636
+ assert_equal([
637
+ Groonga::Index.new(Groonga["Terms.Comments_title"], 0),
638
+ Groonga::Index.new(Groonga["Titles.Comments_title"], 0),
639
+ ],
640
+ @title.find_indexes.sort_by {|index| index.column.name})
641
+ end
642
+
643
+ def test_multiple_column_index
644
+ Groonga::Schema.define do |schema|
645
+ schema.create_table("Terms",
646
+ :type => :patricia_trie,
647
+ :default_tokenizer => "TokenBigram") do |table|
648
+ table.index("Comments", "body", "title",
649
+ :name => "comments")
650
+ end
651
+ end
652
+ assert_equal([
653
+ Groonga::Index.new(Groonga["Terms.comments"], 2),
654
+ ],
655
+ @title.find_indexes)
656
+ end
657
+ end
658
+
659
+ class OperatorTest < self
660
+ def setup
661
+ super
662
+ Groonga::Schema.define do |schema|
663
+ schema.create_table("Comments") do |table|
664
+ table.short_text("title")
665
+ table.short_text("body")
666
+ end
667
+ end
668
+ @title = Groonga["Comments.title"]
669
+ end
670
+
671
+ def test_equal
672
+ Groonga::Schema.define do |schema|
673
+ schema.create_table("Terms",
674
+ :type => :patricia_trie,
675
+ :key_type => :short_text,
676
+ :default_tokenizer => "TokenBigram") do |table|
677
+ table.index("Comments.title")
678
+ end
679
+
680
+ schema.create_table("Titles",
681
+ :type => :patricia_trie,
682
+ :key_type => :short_text) do |table|
683
+ table.index("Comments.title")
684
+ end
685
+ end
686
+ assert_equal([
687
+ Groonga::Index.new(Groonga["Titles.Comments_title"], 0),
688
+ ],
689
+ @title.find_indexes(:operator => :equal))
690
+ end
691
+ end
692
+ end
587
693
  end
data/test/test-config.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  # Copyright (C) 2015-2016 Kouhei Sutou <kou@clear-code.com>
2
+ # Copyright (C) 2016 Masafumi Yokoyama <yokoyama@clear-code.com>
2
3
  #
3
4
  # This library is free software; you can redistribute it and/or
4
5
  # modify it under the terms of the GNU Lesser General Public
@@ -28,4 +29,21 @@ class ConfigTest < Test::Unit::TestCase
28
29
  assert_nil(context.config["nonexistent"])
29
30
  end
30
31
  end
32
+
33
+ test "#delete" do
34
+ context.config["rroonga.key"] = "value"
35
+ assert_equal("value", context.config["rroonga.key"])
36
+ context.config.delete("rroonga.key")
37
+ assert_nil(context.config["rroonga.key"])
38
+ end
39
+
40
+ test "#each" do
41
+ context.config["rroonga.key1"] = "value1"
42
+ context.config["rroonga.key2"] = "value2"
43
+ assert_equal([
44
+ ["rroonga.key1", "value1"],
45
+ ["rroonga.key2", "value2"],
46
+ ],
47
+ context.config.to_a)
48
+ end
31
49
  end
@@ -71,8 +71,6 @@ class DatabaseTest < Test::Unit::TestCase
71
71
  end
72
72
 
73
73
  def test_new
74
- # TODO: remove the line when Groonga 5.0.5 released.
75
- omit("This test is failing on Groonga 5.0.4.") if Groonga.version == "5.0.4"
76
74
  assert_raise(Groonga::NoSuchFileOrDirectory) do
77
75
  new_context = Groonga::Context.new
78
76
  Groonga::Database.new(@database_path.to_s, :context => new_context)
@@ -0,0 +1,20 @@
1
+ # Copyright (C) 2016 Kouhei Sutou <kou@clear-code.com>
2
+ #
3
+ # This library is free software; you can redistribute it and/or
4
+ # modify it under the terms of the GNU Lesser General Public
5
+ # License version 2.1 as published by the Free Software Foundation.
6
+ #
7
+ # This library is distributed in the hope that it will be useful,
8
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
9
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
10
+ # Lesser General Public License for more details.
11
+ #
12
+ # You should have received a copy of the GNU Lesser General Public
13
+ # License along with this library; if not, write to the Free Software
14
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15
+
16
+ class ErrorMessageTest < Test::Unit::TestCase
17
+ def test_nonexistent
18
+ assert_nil(Groonga.error_message)
19
+ end
20
+ end