5 use Test::More tests => 10;
9 BEGIN { use_ok('List::Index'); }
10 ok(eval { List::Index->VERSION(1) }, 'version 1.00 compatibility');
12 eval { Test::More->VERSION(0.93) } or eval q{
13 diag "Install Test::More v0.93 to run subtests\n";
15 SKIP: { skip 'subtest', 1; }
19 subtest('single-char alphabet' => sub {
21 my @data = ('a'..'z');
23 is_deeply(List::Index->new->ranges(\@data), ['-'], 'single page');
24 is_deeply(\@data, ['a'..'z'], 'original data unaltered');
26 List::Index->new({ pages => 3 })->ranges(\@data),
31 List::Index->new({ pagesize => @data / 2.1 })->ranges(\@data),
36 List::Index->new({ pages => 500 })->ranges(\@data),
37 ['-a', 'b'..'y', 'z-'],
42 subtest('uniform alphanumeric' => sub {
44 my @data = ('aa'..'zz', 1..202);
45 my $index = List::Index->new or return;
48 $index->ranges(\@data),
51 ...-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-
56 $index->ranges(\@data, { pagesize => 300 }),
62 subtest('context' => sub {
65 kkeg kl km kmlu knsy koxb kpeo kuaa kuab kuac
66 kuapa kuq kur kux kzb lc lg lgu lgua lguc
67 lguq lgur lgus lgx lka lkq lks lln llq llx
69 my $index = List::Index->new({ pagesize => 10 }) or return;
72 $index->ranges(\@data, { context => 0, length => 5 }),
73 # ranges should match offsets exactly
74 [qw(-kuap. kuapa-lgup lguq-)],
78 $index->ranges(\@data, { context => 0 }),
79 # default length limits to 4 chars
80 [qw(-kuao kuap-lgup lguq-)],
84 $index->ranges(\@data, { context => 1 }),
85 # lookbehinds aren't shorter (kuac<kuap, lguc<lguq)
86 # 'kuap' can advance to 'kuq'
87 [qw(-kup kuq-lgup lguq-)],
91 $index->ranges(\@data, { context => 2 }),
92 # allowed to advance to 'kur', but provides no benefits over 'kuq'
93 [qw(-kup kuq-lgup lguq-)],
97 $index->ranges(\@data, { context => 3 }),
98 # shorten 'kuap' to 'ku' because lookbehind is 'kp...'
99 # 'lguq' matches 'lg', but may only backtrack to 'lgu'
100 [qw(-kt ku-lgt lgu-)],
104 $index->ranges(\@data, { context => 4 }),
109 $index->ranges(\@data, { context => 5 }),
110 # after forwarding 'kuap' to 'lc'
111 # disallow backtracking of 'lguq' to 'lc' to prevent qw[-k l-]
112 # so only lookahead (to 'lkq') remains
114 'lookbehind forbidden'
117 $index->ranges(\@data, { context => 9 }),
118 # allow a single (10-9) entry (l-lf = lc) to remain
123 $index->ranges(\@data, { context => 10 }),
124 # allow the last page to go back upto 'lc', replacing the 2nd page
130 subtest('distribution' => sub {
133 gnihka gniub go gsearnrqns gtdvcxyt gw gwoufolwcvmtueyg gysgphci h habkdgifjfxoh
134 hbbvjf hbqleexnqts hccg hd hdoeqwdmgqwaoya hfbegicieuxz hfm hj hkoysmws hmylu
135 hnvtvpievbdlkrmb hs hvdvcqn hvn hyrybeur iaiaab ib ibavqyar idfniqvxpohbk idh
137 my $index = List::Index->new({ pagesize => 10 }) or return;
140 $index->ranges(\@data, { context => 7 }),
145 $index->ranges(\@data, { context => 6 }),
146 # after 2nd page is enlarged by lookbehind to 'h', limit subsequent lookahead
147 # to prevent the page from getting too large (17 entries if forwarded to 'i')
151 # page #14 [gn-g] (8): gnihka gniub go gsearnrqns gtdvcxyt gwawkvmueovdjtfj gwoufolwcvmtueyg gysgphci
152 # page #15 [h] (17): h habkdgifjfxoh hbbvjf hbqleexnqts hccgszftbaymfu hdaqzkow hdoeqwdmgqwaoya hfbegicieu hfmlpzzioqjbthz hj hkoysmws hmylu hnvtvpievbdlkrmb hsodfpkatk hvdvcqn hvn hyrybeurqtevjfmi
153 # page #16 [i-ie] (5): i iaab ibiavqyar idfniqvxpohbk idh
156 subtest('modulo' => sub {
158 my @data = qw( a b ccb ccd cce gf ggg ggh i j );
159 my $index = List::Index->new({ pagesize => 4, context => 0 }) or return;
160 # 10 entries at 4 per page requires 3 pages
161 # so actual target page sizes should be 3,4,3 (not 4,4,2)
164 $index->ranges(\@data),
165 [qw(-ccc ccd-ggg ggh-)],
169 $index->ranges(\@data, { context => 1 }),
171 'context at new intervals'
175 subtest('corner cases' => sub {
179 List::Index->new->ranges(['foo','bar']),
185 subtest('context' => sub {
187 my @data = qw( baa1 baa2 baa3 baaa bbc cbc daaa ea eaaa zed );
188 my $index = List::Index->new({ pagesize => 2 }) or return;
191 $index->ranges(\@data, { context => 0 }),
192 [qw(-baa. baa.-bbb bbc-daa. daaa-eaa. eaaa-)],
196 $index->ranges(\@data, { context => undef }),
197 [qw(-baa. baa.-b c d e-)],
198 'default context' # context should be 1
201 $index->ranges(\@data, { context => 2 }),
202 # first item equals second due to large context
203 [qw(-ba bb-b c d e-)],
207 $index->ranges(\@data, { context => 0, length => 1 }),
212 #pp(List::Index->new({pagesize => 2, context => 2, length => 1}))->ranges(\@data);