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 lgus 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 $index->ranges(\@data, { context => 2 }),
85 # allowed to advance to 'kur', but provides no benefits over 'kuq'
86 [qw(-kup kuq-lgup lguq-)],
90 $index->ranges(\@data, { context => 3 }),
91 # shorten 'kuap' to 'ku' because lookbehind is 'kp...'
92 # 'lguq' matches 'lg', but may only backtrack to 'lgu'
93 [qw(-kt ku-lgt lgu-)],
97 $index->ranges(\@data, { context => 4 }),
102 $index->ranges(\@data, { context => 5 }),
103 # after forwarding 'kuap' to 'lc'
104 # disallow backtracking of 'lguq' to 'lc' to prevent qw[-k l-]
105 # so only lookahead (to 'lkq') remains
107 'lookbehind forbidden'
110 $index->ranges(\@data, { context => 9 }),
111 # allow a single (10-9) entry (l-lf = lc) to remain
116 $index->ranges(\@data, { context => 10 }),
117 # allow the last page to go back upto 'lc', replacing the 2nd page
123 subtest 'distribution' => sub {
126 gnihka gniub go gsearnrqns gtdvcxyt gw gwoufolwcvmtueyg gysgphci h habkdgifjfxoh
127 hbbvjf hbqleexnqts hccg hd hdoeqwdmgqwaoya hfbegicieuxz hfm hj hkoysmws hmylu
128 hnvtvpievbdlkrmb hs hvdvcqn hvn hyrybeur iaiaab ib ibavqyar idfniqvxpohbk idh
130 my $index = List::Index->new({ pagesize => 10 }) or return;
133 $index->ranges(\@data, { context => 7 }),
138 $index->ranges(\@data, { context => 6 }),
139 # after 2nd page is enlarged by lookbehind to 'h', limit subsequent lookahead
140 # to prevent the page from getting too large (17 entries if forwarded to 'i')
144 # page #14 [gn-g] (8): gnihka gniub go gsearnrqns gtdvcxyt gwawkvmueovdjtfj gwoufolwcvmtueyg gysgphci
145 # page #15 [h] (17): h habkdgifjfxoh hbbvjf hbqleexnqts hccgszftbaymfu hdaqzkow hdoeqwdmgqwaoya hfbegicieu hfmlpzzioqjbthz hj hkoysmws hmylu hnvtvpievbdlkrmb hsodfpkatk hvdvcqn hvn hyrybeurqtevjfmi
146 # page #16 [i-ie] (5): i iaab ibiavqyar idfniqvxpohbk idh
149 subtest 'modulo' => sub {
151 my @data = qw( a b ccb ccd cce gf ggg ggh i j );
152 my $index = List::Index->new({ pagesize => 4, context => 0 }) or return;
153 # 10 entries at 4 per page requires 3 pages
154 # so actual target page sizes should be 3,4,3 (not 4,4,2)
157 $index->ranges(\@data),
158 [qw(-ccc ccd-ggg ggh-)],
162 $index->ranges(\@data, { context => 1 }),
164 'context at new intervals'
168 subtest 'context' => sub {
170 my @data = qw( baa1 baa2 baa3 baaa bbc cbc daaa ea eaaa zed );
171 my $index = List::Index->new({ pagesize => 2 }) or return;
174 $index->ranges(\@data, { context => 0 }),
175 [qw(-baa. baa.-bbb bbc-daa. daaa-eaa. eaaa-)],
179 $index->ranges(\@data, { context => undef }),
180 [qw(-baa. baa.-b c d e-)],
181 'default context' # context should be 1
184 $index->ranges(\@data, { context => 2 }),
185 # first item equals second due to large context
186 [qw(-ba bb-b c d e-)],
190 $index->ranges(\@data, { context => 0, length => 1 }),
195 #pp(List::Index->new({pagesize => 2, context => 2, length => 1}))->ranges(\@data);