5 use Test::More tests => 8;
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 @uniform = 'a'..'z';
15 my $index = List::Index->new(\@uniform) or return;
16 is_deeply(\@uniform, ['a'..'z'], 'original data unaltered');
17 is_deeply($index->ranges, ['-'], 'single page');
18 is_deeply($index->ranges({pages => 3}), [qw(-i j-q r-)], 'given pages');
19 is_deeply($index->ranges({pagesize => @uniform / 2.1}), [qw(
21 )], 'equivalent pagesize');
24 subtest 'uniform alphanumeric' => sub {
26 my $index = List::Index->new(['aa'..'zz', 1..202]) or return;
27 is_deeply($index->ranges, [qw(
29 .-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-
31 )], 'default ranges');
32 is_deeply($index->ranges({pagesize => 300}), [qw(-c d-n o-)], 'large pagesize');
35 subtest 'context' => sub {
37 my $index = List::Index->new([qw(
38 kkeg kl km kmlu knsy koxb kpeo kuaa kuab kuac
39 kuapa kuq kur kux kzb lc lg lgu lgua lguc
40 lguq lgur lgws lgx lka lkq lks lln llq llx
43 $index->ranges({ pagesize=>10, context=>0, length=>5 }),
44 # ranges should match offsets exactly
45 [qw(-kuap. kuapa-lgup lguq-)],
49 $index->ranges({ pagesize=>10, context=>0 }),
50 # default length limits to 4 chars
51 [qw(-kuao kuap-lgup lguq-)],
55 $index->ranges({ pagesize=>10, context=>1 }),
56 # lookbehinds aren't shorter (kuac<kuap, lguc<lguq)
57 # 'kuap' can advance to 'kuq'
58 [qw(-kup kuq-lgup lguq-)],
62 local $TODO = 'backtrack';
64 $index->ranges({ pagesize=>10, context=>2 }),
65 # allowed to advance to 'kur', but provides no benefits over 'kuq'
66 [qw(-kup kuq-lgup lguq-)],
71 $index->ranges({ pagesize=>10, context=>3 }),
72 # shorten 'kuap' to 'ku' because lookbehind is 'kp...'
73 # 'lguq' matches 'lg', but may only backtrack to 'lgu'
74 [qw(-kt ku-lgt lgu-)],
78 $index->ranges({ pagesize=>10, context=>4 }),
83 $index->ranges({ pagesize=>10, context=>5 }),
84 # after forwarding 'kuap' to 'lc'
85 # disallow backtracking of 'lguq' to 'lc' to prevent qw[-k l-]
86 # so only lookahead (to 'lkq') remains
88 'lookbehind forbidden'
91 $index->ranges({ pagesize=>10, context=>9 }),
92 # allow a single (10-9) entry (l-lf = lc) to remain
97 $index->ranges({ pagesize=>10, context=>10 }),
98 # allow the last page to go back upto 'lc', replacing the 2nd page
104 subtest 'distribution' => sub {
106 my $index = List::Index->new([qw(
107 gnihka gniub go gsearnrqns gtdvcxyt gw gwoufolwcvmtueyg gysgphci h habkdgifjfxoh
108 hbbvjf hbqleexnqts hccg hd hdoeqwdmgqwaoya hfbegicieuxz hfm hj hkoysmws hmylu
109 hnvtvpievbdlkrmb hs hvdvcqn hvn hyrybeur iaiaab ib ibavqyar idfniqvxpohbk idh
112 $index->ranges({ pagesize=>10, context=>8 }),
117 $index->ranges({ pagesize=>10, context=>7 }),
118 # after 2nd page is enlarged by lookbehind to 'h', limit subsequent lookahead
119 # to prevent the page from getting too large (17 entries if forwarded to 'i')
123 # page #14 [gn-g] (8): gnihka gniub go gsearnrqns gtdvcxyt gwawkvmueovdjtfj gwoufolwcvmtueyg gysgphci
124 # page #15 [h] (17): h habkdgifjfxoh hbbvjf hbqleexnqts hccgszftbaymfu hdaqzkow hdoeqwdmgqwaoya hfbegicieu hfmlpzzioqjbthz hj hkoysmws hmylu hnvtvpievbdlkrmb hsodfpkatk hvdvcqn hvn hyrybeurqtevjfmi
125 # page #16 [i-ie] (5): i iaab ibiavqyar idfniqvxpohbk idh
128 subtest 'context' => sub {
130 my $index = List::Index->new([qw(
131 baa1 baa2 baa3 baaa bbc cbc daaa ea eaaa zed
133 is_deeply($index->ranges({pagesize => 2, context => 0}), [
134 qw(-baa. baa.-bbb bbc-daa. daaa-eaa. eaaa-)
136 is_deeply($index->ranges({pagesize => 2}), [
138 ], 'default context'); # context should be 1
139 is_deeply($index->ranges({pagesize => 2, context => 2}), [
141 ], 'overlap'); # first item equals second due to large context
142 is_deeply($index->ranges({pagesize => 2, context => 0, length => 1}), [
146 #pp($index->ranges({pagesize => 2, context => 2, length => 1}));