1use strict;
2# Before `make install' is performed this script should be runnable with
3# `make test'. After `make install' it should work as `perl test.pl'
4
5#########################
6
7# change 'tests => 1' to 'tests => last_test_to_print';
8
9use Test::More;
10BEGIN { plan tests => 117 };
11use Search::Xapian qw(:standard);
12
13#########################
14
15# Insert your test code below, the Test module is use()ed here so read
16# its man page ( perldoc Test ) for help writing this test script.
17
18foreach my $backend ("inmemory", "auto") {
19  my $database;
20  if ($backend eq "inmemory") {
21    ok( $database = Search::Xapian::WritableDatabase->new() );
22  } else {
23    ok( $database = Search::Xapian::WritableDatabase->new( 'testdb', Search::Xapian::DB_CREATE_OR_OVERWRITE ) );
24  }
25
26  ok( $database->get_description() );
27
28  my $stemmer;
29  ok( $stemmer = Search::Xapian::Stem->new( 'english' ) );
30  ok( $stemmer->get_description() );
31
32  my %docs;
33
34  my $term = 'test';
35  ok( $term = $stemmer->stem_word( $term ) );
36  if ($backend ne "inmemory") {
37    # inmemory doesn't implement spelling correction support.
38    $database->add_spelling( $term, 1 );
39  }
40
41  my $docid;
42  for my $num (qw( one two three )) {
43    ok( $docs{$num} = Search::Xapian::Document->new() );
44    ok( $docs{$num}->get_description() );
45
46    $docs{$num}->set_data( "$term $num" );
47
48    $docs{$num}->add_posting( $term, 0 );
49    $docs{$num}->add_posting( $num, 1 );
50
51    $docs{$num}->add_value(0, $num);
52
53    if ($backend ne "inmemory") {
54      # inmemory doesn't implement spelling correction support.
55      $database->add_spelling( "x" . $term, 1 );
56      $database->add_spelling( $term, 1 );
57      $database->remove_spelling( "x" . $term, 1 );
58    }
59    ok( $docid = $database->add_document( $docs{$num} ) );
60  }
61  $database->delete_document( $docid );
62  is( $database->get_doccount(), 2 );
63  is( $database->get_lastdocid(), 3 );
64
65  is( $database->get_document(1)->get_docid(), 1 );
66  is( $database->get_document(2)->get_docid(), 2 );
67
68  # regression test - add_posting with 2 parameters set wdfinc 0 in <=0.8.3.0
69  ok( $database->get_doclength(1) == 2 );
70
71  is( $database->get_document(1)->get_value(0), "one" );
72  is( $database->get_document(2)->get_value(0), "two" );
73
74  my $posit = $database->positionlist_begin(1, $term);
75  ok( $posit ne $database->positionlist_end(1, $term) );
76  ok( $posit == 0 );
77  $posit++;
78  ok( $posit eq $database->positionlist_end(1, $term) );
79
80  my $postit = $database->postlist_begin('one');
81  ok( $postit ne $database->postlist_end('one') );
82  ok( $postit != $database->postlist_end('one') );
83  is( $postit->get_docid(), 1 );
84  $postit++;
85  ok( $postit eq $database->postlist_end('one') );
86  ok( $postit == $database->postlist_end('one') );
87
88  my $termit = $database->termlist_begin(1);
89  ok( $termit != $database->termlist_end(1) );
90  is( "$termit", 'one' );
91  $termit++;
92  ok( $termit ne $database->termlist_end(1) );
93  is( $termit->get_termname(), 'test' );
94  ++$termit;
95  ok( $termit eq $database->termlist_end(1) );
96  ok( $termit == $database->termlist_end(1) );
97
98  my $alltermit = $database->allterms_begin();
99  ok( $alltermit != $database->allterms_end() );
100  ok( "$alltermit" eq 'one' );
101  ok( $alltermit->get_termname() eq 'one' );
102  ok( ++$alltermit != $database->allterms_end() );
103  ok( "$alltermit" eq 'test' );
104  ok( $alltermit->get_termname() eq 'test' );
105  ok( ++$alltermit != $database->allterms_end() );
106  ok( "$alltermit" eq 'two' );
107  ok( $alltermit->get_termname() eq 'two' );
108  ok( ++$alltermit == $database->allterms_end() );
109
110  $alltermit = $database->allterms_begin('t');
111  ok( $alltermit != $database->allterms_end('t') );
112  ok( "$alltermit" eq 'test' );
113  ok( $alltermit->get_termname() eq 'test' );
114  ok( ++$alltermit != $database->allterms_end('t') );
115  ok( "$alltermit" eq 'two' );
116  ok( $alltermit->get_termname() eq 'two' );
117  ok( ++$alltermit == $database->allterms_end('t') );
118
119  # Feature test for metadata support.
120  is( $database->get_metadata( "nothing" ), "" );
121  is( $database->get_metadata( "foo" ), "" );
122  $database->set_metadata( "foo", "bar" );
123  is( $database->get_metadata( "nothing" ), "" );
124  is( $database->get_metadata( "foo" ), "bar" );
125}
126
127# Check that trying to create an invalid stemmer gives an exception, not an
128# abort.
129eval {
130  my $badstem = Search::Xapian::Stem->new( 'gibberish' );
131};
132ok($@);
133ok(ref($@), "Search::Xapian::InvalidArgumentError");
134ok($@->isa('Search::Xapian::Error'));
135ok($@->get_msg, "Language code gibberish unknown");
136ok( "$@" =~ /^Exception: Language code gibberish unknown(?: at \S+ line \d+\.)?$/ );
137
1381;
139