| Akron | efe7e04 | 2017-06-20 23:30:05 +0200 | [diff] [blame] | 1 | use strict; |
| 2 | use warnings; |
| 3 | use Test::Krawfish; |
| 4 | use Test::More; |
| 5 | |
| 6 | use_ok('Krawfish::Koral::Query::Builder'); |
| 7 | |
| 8 | my $qb = Krawfish::Koral::Query::Builder->new; |
| 9 | |
| 10 | # query is fine |
| Akron | 704ec06 | 2017-07-24 15:46:21 +0200 | [diff] [blame] | 11 | my $q = $qb->length($qb->span('a'),3,5); |
| 12 | is($q->min_span, 1, 'Minimum length'); # There needs to be at least one token |
| 13 | is($q->max_span, -1, 'Minimum length'); |
| 14 | is($q->to_string, "length(3-5:<a>)", 'Query is valid'); |
| Akron | efe7e04 | 2017-06-20 23:30:05 +0200 | [diff] [blame] | 15 | ok($q = $q->normalize->finalize, 'Normalization'); |
| Akron | 704ec06 | 2017-07-24 15:46:21 +0200 | [diff] [blame] | 16 | is($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); |
| 20 | is($q->min_span, 2, 'Minimum length'); |
| 21 | is($q->max_span, 2, 'Maximum length'); |
| 22 | is($q->to_string, "length(3-5:ab)", 'Query is valid'); |
| 23 | ok($q = $q->normalize->finalize, 'Normalization'); |
| 24 | is($q->to_string, "length(3-5:ab)", 'Query is valid'); |
| 25 | is($q->min_span, 2, 'Minimum length'); |
| 26 | is($q->max_span, 2, 'Minimum length'); |
| 27 | |
| Akron | efe7e04 | 2017-06-20 23:30:05 +0200 | [diff] [blame] | 28 | |
| 29 | # query is null |
| 30 | $q = $qb->length($qb->null,3,5); |
| Akron | 704ec06 | 2017-07-24 15:46:21 +0200 | [diff] [blame] | 31 | is($q->min_span, 0, 'Minimum length'); |
| 32 | is($q->max_span, 0, 'Minimum length'); |
| 33 | |
| Akron | efe7e04 | 2017-06-20 23:30:05 +0200 | [diff] [blame] | 34 | is($q->to_string, "length(3-5:-)", 'Query is valid'); |
| 35 | ok($q = $q->normalize, 'Normalization'); |
| Akron | 704ec06 | 2017-07-24 15:46:21 +0200 | [diff] [blame] | 36 | is($q->min_span, 0, 'Minimum length'); |
| 37 | is($q->max_span, 0, 'Minimum length'); |
| 38 | is($q->to_string, "-", 'Query is valid'); |
| 39 | ok(!$q->finalize, 'Finalization'); |
| 40 | ok($q->has_error, 'Has errors'); |
| 41 | is($q->error->[0]->[1], 'This query matches everywhere', 'Error'); |
| 42 | ok($q->is_null, 'Matches nowhere'); |
| 43 | |
| Akron | efe7e04 | 2017-06-20 23:30:05 +0200 | [diff] [blame] | 44 | |
| 45 | |
| Akron | 5a5595b | 2017-09-10 13:00:57 +0200 | [diff] [blame] | 46 | # query is nowhere |
| 47 | $q = $qb->length($qb->nowhere,3,5); |
| Akron | efe7e04 | 2017-06-20 23:30:05 +0200 | [diff] [blame] | 48 | is($q->to_string, "length(3-5:[0])", 'Query is valid'); |
| Akron | 704ec06 | 2017-07-24 15:46:21 +0200 | [diff] [blame] | 49 | is($q->min_span, -1, 'Minimum length'); |
| 50 | is($q->max_span, -1, 'Minimum length'); |
| Akron | efe7e04 | 2017-06-20 23:30:05 +0200 | [diff] [blame] | 51 | ok($q = $q->normalize, 'Normalization'); |
| 52 | is($q->to_string, "[0]", 'Query is valid'); |
| 53 | ok($q = $q->finalize, 'Normalization'); |
| Akron | 5a5595b | 2017-09-10 13:00:57 +0200 | [diff] [blame] | 54 | ok($q->is_nowhere, 'Matches nowhere'); |
| Akron | 704ec06 | 2017-07-24 15:46:21 +0200 | [diff] [blame] | 55 | is($q->min_span, -1, 'Minimum length'); |
| 56 | is($q->max_span, -1, 'Minimum length'); |
| 57 | |
| Akron | efe7e04 | 2017-06-20 23:30:05 +0200 | [diff] [blame] | 58 | |
| Akron | 655a10a | 2017-09-11 14:13:18 +0200 | [diff] [blame] | 59 | # query is anywhere |
| 60 | $q = $qb->length($qb->anywhere,3,5); |
| Akron | 704ec06 | 2017-07-24 15:46:21 +0200 | [diff] [blame] | 61 | is($q->min_span, 1, 'Minimum length'); |
| 62 | is($q->max_span, 1, 'Minimum length'); |
| Akron | efe7e04 | 2017-06-20 23:30:05 +0200 | [diff] [blame] | 63 | is($q->to_string, "length(3-5:[])", 'Query is valid'); |
| 64 | ok($q = $q->normalize, 'Normalization'); |
| Akron | 704ec06 | 2017-07-24 15:46:21 +0200 | [diff] [blame] | 65 | is($q->min_span, 1, 'Minimum length'); |
| 66 | is($q->max_span, 1, 'Minimum length'); |
| Akron | efe7e04 | 2017-06-20 23:30:05 +0200 | [diff] [blame] | 67 | |
| 68 | |
| Akron | 704ec06 | 2017-07-24 15:46:21 +0200 | [diff] [blame] | 69 | TODO: { |
| 70 | local $TODO = 'Optimize repetitions'; |
| Akron | 655a10a | 2017-09-11 14:13:18 +0200 | [diff] [blame] | 71 | $q = $qb->length($qb->repeat($qb->anywhere,0,undef),3,5); |
| Akron | 704ec06 | 2017-07-24 15:46:21 +0200 | [diff] [blame] | 72 | 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'); |
| Akron | 655a10a | 2017-09-11 14:13:18 +0200 | [diff] [blame] | 80 | ok($q->is_anywhere, 'Matches everywhere'); |
| Akron | 704ec06 | 2017-07-24 15:46:21 +0200 | [diff] [blame] | 81 | ok(!$q->is_optional, 'Optional'); |
| Akron | 655a10a | 2017-09-11 14:13:18 +0200 | [diff] [blame] | 82 | is($q->error->[0]->[1], 'Unable to search for anywhere tokens', 'Warning'); |
| Akron | 704ec06 | 2017-07-24 15:46:21 +0200 | [diff] [blame] | 83 | |
| Akron | 655a10a | 2017-09-11 14:13:18 +0200 | [diff] [blame] | 84 | # query is anywhere and optional |
| 85 | $q = $qb->length($qb->repeat($qb->anywhere,0, undef),0,5); |
| Akron | 704ec06 | 2017-07-24 15:46:21 +0200 | [diff] [blame] | 86 | 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'); |
| Akron | 655a10a | 2017-09-11 14:13:18 +0200 | [diff] [blame] | 89 | ok($q->is_anywhere, 'Matches everywhere'); |
| Akron | 704ec06 | 2017-07-24 15:46:21 +0200 | [diff] [blame] | 90 | ok($q->is_optional, 'Optional'); |
| 91 | ok(!$q->finalize, 'Normalization'); |
| Akron | 655a10a | 2017-09-11 14:13:18 +0200 | [diff] [blame] | 92 | ok($q->is_anywhere, 'Matches everywhere'); |
| Akron | 704ec06 | 2017-07-24 15:46:21 +0200 | [diff] [blame] | 93 | ok(!$q->is_optional, 'Optional'); |
| 94 | # is($q->warning->[0]->[1], 'Optionality of query is ignored', 'Warning'); |
| Akron | 655a10a | 2017-09-11 14:13:18 +0200 | [diff] [blame] | 95 | # is($q->error->[0]->[1], 'Unable to search for anywhere tokens', 'Warning'); |
| Akron | 704ec06 | 2017-07-24 15:46:21 +0200 | [diff] [blame] | 96 | }; |
| 97 | |
| Akron | efe7e04 | 2017-06-20 23:30:05 +0200 | [diff] [blame] | 98 | |
| 99 | done_testing; |
| 100 | __END__ |