blob: 0311a781a642a04218a73361675dd2f6ad0f75b6 [file] [log] [blame]
Akronefe7e042017-06-20 23:30:05 +02001use strict;
2use warnings;
3use Test::Krawfish;
4use Test::More;
5
6use_ok('Krawfish::Koral::Query::Builder');
7
8my $qb = Krawfish::Koral::Query::Builder->new;
9
10# query is fine
Akron704ec062017-07-24 15:46:21 +020011my $q = $qb->length($qb->span('a'),3,5);
12is($q->min_span, 1, 'Minimum length'); # There needs to be at least one token
13is($q->max_span, -1, 'Minimum length');
14is($q->to_string, "length(3-5:<a>)", 'Query is valid');
Akronefe7e042017-06-20 23:30:05 +020015ok($q = $q->normalize->finalize, 'Normalization');
Akron704ec062017-07-24 15:46:21 +020016is($q->to_string, "length(3-5:<a>)", 'Query is valid');
17
18
19$q = $qb->length($qb->seq($qb->term('a'), $qb->term('b')),3,5);
20is($q->min_span, 2, 'Minimum length');
21is($q->max_span, 2, 'Maximum length');
22is($q->to_string, "length(3-5:ab)", 'Query is valid');
23ok($q = $q->normalize->finalize, 'Normalization');
24is($q->to_string, "length(3-5:ab)", 'Query is valid');
25is($q->min_span, 2, 'Minimum length');
26is($q->max_span, 2, 'Minimum length');
27
Akronefe7e042017-06-20 23:30:05 +020028
29# query is null
30$q = $qb->length($qb->null,3,5);
Akron704ec062017-07-24 15:46:21 +020031is($q->min_span, 0, 'Minimum length');
32is($q->max_span, 0, 'Minimum length');
33
Akronefe7e042017-06-20 23:30:05 +020034is($q->to_string, "length(3-5:-)", 'Query is valid');
35ok($q = $q->normalize, 'Normalization');
Akron704ec062017-07-24 15:46:21 +020036is($q->min_span, 0, 'Minimum length');
37is($q->max_span, 0, 'Minimum length');
38is($q->to_string, "-", 'Query is valid');
39ok(!$q->finalize, 'Finalization');
40ok($q->has_error, 'Has errors');
41is($q->error->[0]->[1], 'This query matches everywhere', 'Error');
42ok($q->is_null, 'Matches nowhere');
43
Akronefe7e042017-06-20 23:30:05 +020044
45
Akron5a5595b2017-09-10 13:00:57 +020046# query is nowhere
47$q = $qb->length($qb->nowhere,3,5);
Akronefe7e042017-06-20 23:30:05 +020048is($q->to_string, "length(3-5:[0])", 'Query is valid');
Akron704ec062017-07-24 15:46:21 +020049is($q->min_span, -1, 'Minimum length');
50is($q->max_span, -1, 'Minimum length');
Akronefe7e042017-06-20 23:30:05 +020051ok($q = $q->normalize, 'Normalization');
52is($q->to_string, "[0]", 'Query is valid');
53ok($q = $q->finalize, 'Normalization');
Akron5a5595b2017-09-10 13:00:57 +020054ok($q->is_nowhere, 'Matches nowhere');
Akron704ec062017-07-24 15:46:21 +020055is($q->min_span, -1, 'Minimum length');
56is($q->max_span, -1, 'Minimum length');
57
Akronefe7e042017-06-20 23:30:05 +020058
Akron655a10a2017-09-11 14:13:18 +020059# query is anywhere
60$q = $qb->length($qb->anywhere,3,5);
Akron704ec062017-07-24 15:46:21 +020061is($q->min_span, 1, 'Minimum length');
62is($q->max_span, 1, 'Minimum length');
Akronefe7e042017-06-20 23:30:05 +020063is($q->to_string, "length(3-5:[])", 'Query is valid');
64ok($q = $q->normalize, 'Normalization');
Akron704ec062017-07-24 15:46:21 +020065is($q->min_span, 1, 'Minimum length');
66is($q->max_span, 1, 'Minimum length');
Akronefe7e042017-06-20 23:30:05 +020067
68
Akron704ec062017-07-24 15:46:21 +020069TODO: {
70 local $TODO = 'Optimize repetitions';
Akron655a10a2017-09-11 14:13:18 +020071 $q = $qb->length($qb->repeat($qb->anywhere,0,undef),3,5);
Akron704ec062017-07-24 15:46:21 +020072 is($q->to_string, "length(3-5:[]*)", 'Query is valid');
73 is($q->min_span, 1, 'Minimum length');
74 is($q->max_span, 1, 'Minimum length');
75 ok($q = $q->normalize, 'Normalization');
76 is($q->min_span, 1, 'Minimum length');
77 is($q->max_span, 1, 'Minimum length');
78 is($q->to_string, "[]{3,5}", 'Query is valid');
79 ok(!$q->finalize, 'Normalization');
Akron655a10a2017-09-11 14:13:18 +020080 ok($q->is_anywhere, 'Matches everywhere');
Akron704ec062017-07-24 15:46:21 +020081 ok(!$q->is_optional, 'Optional');
Akron655a10a2017-09-11 14:13:18 +020082 is($q->error->[0]->[1], 'Unable to search for anywhere tokens', 'Warning');
Akron704ec062017-07-24 15:46:21 +020083
Akron655a10a2017-09-11 14:13:18 +020084 # query is anywhere and optional
85 $q = $qb->length($qb->repeat($qb->anywhere,0, undef),0,5);
Akron704ec062017-07-24 15:46:21 +020086 is($q->to_string, "length(0-5:[]*)", 'Query is valid');
87 ok($q = $q->normalize, 'Normalization');
88 is($q->to_string, "[]{0,5}", 'Query is valid');
Akron655a10a2017-09-11 14:13:18 +020089 ok($q->is_anywhere, 'Matches everywhere');
Akron704ec062017-07-24 15:46:21 +020090 ok($q->is_optional, 'Optional');
91 ok(!$q->finalize, 'Normalization');
Akron655a10a2017-09-11 14:13:18 +020092 ok($q->is_anywhere, 'Matches everywhere');
Akron704ec062017-07-24 15:46:21 +020093 ok(!$q->is_optional, 'Optional');
94# is($q->warning->[0]->[1], 'Optionality of query is ignored', 'Warning');
Akron655a10a2017-09-11 14:13:18 +020095# is($q->error->[0]->[1], 'Unable to search for anywhere tokens', 'Warning');
Akron704ec062017-07-24 15:46:21 +020096};
97
Akronefe7e042017-06-20 23:30:05 +020098
99done_testing;
100__END__