5 use Test::More tests => 9;
9 BEGIN { use_ok('List::Index'); }
10 ok(eval { List::Index->VERSION(1) }, 'version 1.00 compatibility');
12 subtest 'single-char alphabet' => sub {
14 my @data = ('a'..'z');
16 is_deeply(List::Index->new->ranges(\@data), ['-'], 'single page');
17 is_deeply(\@data, ['a'..'z'], 'original data unaltered');
19 List::Index->new({ pages => 3 })->ranges(\@data),
24 List::Index->new({ pagesize => @data / 2.1 })->ranges(\@data),
29 List::Index->new({ pages => 500 })->ranges(\@data),
30 ['-a', 'b'..'y', 'z-'],
35 subtest 'uniform alphanumeric' => sub {
37 my @data = ('aa'..'zz', 1..202);
38 my $index = List::Index->new or return;
41 $index->ranges(\@data),
44 .-bp bq-dm dn-fi fj-hf hg-i j-k l-m n-os ot-qp qq-sm sn-uj uk-wf wg-x y-
49 $index->ranges(\@data, { pagesize => 300 }),
55 subtest 'context' => sub {
58 kkeg kl km kmlu knsy koxb kpeo kuaa kuab kuac
59 kuapa kuq kur kux kzb lc lg lgu lgua lguc
60 lguq lgur lgws lgx lka lkq lks lln llq llx
62 my $index = List::Index->new({ pagesize => 10 }) or return;
65 $index->ranges(\@data, { context => 0, length => 5 }),
66 # ranges should match offsets exactly
67 [qw(-kuap. kuapa-lgup lguq-)],
71 $index->ranges(\@data, { context => 0 }),
72 # default length limits to 4 chars
73 [qw(-kuao kuap-lgup lguq-)],
77 $index->ranges(\@data, { context => 1 }),
78 # lookbehinds aren't shorter (kuac<kuap, lguc<lguq)
79 # 'kuap' can advance to 'kuq'
80 [qw(-kup kuq-lgup lguq-)],
84 local $TODO = 'backtrack';
86 $index->ranges(\@data, { context => 2 }),
87 # allowed to advance to 'kur', but provides no benefits over 'kuq'
88 [qw(-kup kuq-lgup lguq-)],
93 $index->ranges(\@data, { context => 3 }),
94 # shorten 'kuap' to 'ku' because lookbehind is 'kp...'
95 # 'lguq' matches 'lg', but may only backtrack to 'lgu'
96 [qw(-kt ku-lgt lgu-)],
100 $index->ranges(\@data, { context => 4 }),
105 $index->ranges(\@data, { context => 5 }),
106 # after forwarding 'kuap' to 'lc'
107 # disallow backtracking of 'lguq' to 'lc' to prevent qw[-k l-]
108 # so only lookahead (to 'lkq') remains
110 'lookbehind forbidden'
113 $index->ranges(\@data, { context => 9 }),
114 # allow a single (10-9) entry (l-lf = lc) to remain
119 $index->ranges(\@data, { context => 10 }),
120 # allow the last page to go back upto 'lc', replacing the 2nd page
126 subtest 'distribution' => sub {
129 gnihka gniub go gsearnrqns gtdvcxyt gw gwoufolwcvmtueyg gysgphci h habkdgifjfxoh
130 hbbvjf hbqleexnqts hccg hd hdoeqwdmgqwaoya hfbegicieuxz hfm hj hkoysmws hmylu
131 hnvtvpievbdlkrmb hs hvdvcqn hvn hyrybeur iaiaab ib ibavqyar idfniqvxpohbk idh
133 my $index = List::Index->new({ pagesize => 10 }) or return;
136 $index->ranges(\@data, { context => 7 }),
141 $index->ranges(\@data, { context => 6 }),
142 # after 2nd page is enlarged by lookbehind to 'h', limit subsequent lookahead
143 # to prevent the page from getting too large (17 entries if forwarded to 'i')
147 # page #14 [gn-g] (8): gnihka gniub go gsearnrqns gtdvcxyt gwawkvmueovdjtfj gwoufolwcvmtueyg gysgphci
148 # page #15 [h] (17): h habkdgifjfxoh hbbvjf hbqleexnqts hccgszftbaymfu hdaqzkow hdoeqwdmgqwaoya hfbegicieu hfmlpzzioqjbthz hj hkoysmws hmylu hnvtvpievbdlkrmb hsodfpkatk hvdvcqn hvn hyrybeurqtevjfmi
149 # page #16 [i-ie] (5): i iaab ibiavqyar idfniqvxpohbk idh
152 subtest 'modulo' => sub {
154 my @data = qw( a b ccb ccd cce gf gg gh i j );
155 my $index = List::Index->new({ pagesize => 4, context => 0 }) or return;
156 # 10 entries at 4 per page requires 3 pages
157 # so actual target page sizes should be 3,4,3 (not 4,4,2)
160 $index->ranges(\@data),
161 [qw(-ccc ccd-gg gh-)],
164 { local $TODO = 'early lookbehind causing [c-gg]';
166 $index->ranges(\@data, { context => 1 }),
168 'context at new intervals'
173 subtest 'context' => sub {
175 my @data = qw( baa1 baa2 baa3 baaa bbc cbc daaa ea eaaa zed );
176 my $index = List::Index->new({ pagesize => 2 }) or return;
179 $index->ranges(\@data, { context => 0 }),
180 [qw(-baa. baa.-bbb bbc-daa. daaa-eaa. eaaa-)],
184 $index->ranges(\@data, { context => undef }),
185 [qw(-a b c d e-)], #TODO
186 'default context' # context should be 1
189 $index->ranges(\@data, { context => 2 }),
190 # first item equals second due to large context
195 $index->ranges(\@data, { context => 0, length => 1 }),
200 #pp(List::Index->new({pagesize => 2, context => 2, length => 1}))->ranges(\@data);