The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w

use strict;

use lib qw( ./blib/lib ../blib/lib );

use Test::More tests => 554;

# Check we can load module
BEGIN { use_ok( 'Data::Pageset' ); }

#######
# new()
#######
eval {
	Data::Pageset->new();
};
like($@,qr/total_entries and entries_per_page must be supplied/,'new - Croak when no params');

eval {
	Data::Pageset->new({
		'total_entries' => 12,
	});
};
like($@,qr/total_entries and entries_per_page must be supplied/,'new - Croak when no entries_per_page');

eval {
	Data::Pageset->new({
		'entries_per_page' => 3,
	});
};
like($@,qr/total_entries and entries_per_page must be supplied/,'new - Croak when no entries_per_page');

eval {
	Data::Pageset->new({
		'total_entries' => 12,
		'entries_per_page' => -2,
	});
};
like($@,qr/Fewer than one entry per page/,'new - Croak when num entries_per_page is negative');


my $dp = Data::Pageset->new({
	'total_entries' => '23',
	'entries_per_page' => '2',
});
is($dp->current_page(),'1','new - Default current page of 1 set');

$dp = Data::Pageset->new({
	'total_entries' => '23',
	'entries_per_page' => '2',
	'current_page' => -90,
});
is($dp->current_page(),'1','new - Default current page of 1 set when current_page less than first_page');

$dp = Data::Pageset->new({
	'total_entries' => '20',
	'entries_per_page' => '10',
	'current_page' => 9,
});
is($dp->current_page(),'2','new - Default current page set to last page when current_page greater than last_page');

######
# pages_per_set
######

is($dp->pages_per_set(),10,'pages_per_set - get undef when not defined');

$dp = Data::Pageset->new({
	'total_entries' => '20',
	'entries_per_page' => '10',
	'current_page' => 4,
	'pages_per_set' => 2,
});

$dp = Data::Pageset->new({
	'total_entries' => '20',
	'entries_per_page' => '10',
	'current_page' => 4,
	'pages_per_set' => -2,
});

#####
# Current_page()
######

$dp = Data::Pageset->new({
	'total_entries' => '20',
	'entries_per_page' => '10',
});

#is($dp->current_page(),1,'Got default current page as 1, when none set');

############
# General tests
############

# Some configs for testing
my %config = (
	'total_entries'		=> 300,
	'entries_per_page'	=> 10,
	'current_page'		=> 17
);

my $page_info = Data::Pageset->new({
	'total_entries'       => $config{'total_entries'}, 
	'entries_per_page'    => $config{'entries_per_page'}, 
	'current_page'		  => $config{'current_page'},
});

isa_ok($page_info,'Data::Pageset');

$page_info->pages_per_set(2);

is($page_info->pages_per_set(),2,'pages_per_set - got 2 as exected');

is('19',$page_info->next_set(),'Know that the next set is 2');

is('15',$page_info->previous_set(),'Know that the next set is 11');

is('17 18',join(' ',@{$page_info->pages_in_set()}),'Pages returned correctly');

is($config{'current_page'},$page_info->current_page(),'Current page matches');

my $name;

my $t = 0;

foreach my $line (<DATA>) {
  chomp $line;
  next unless $line;

  if ($line =~ /^# ?(.+)/) {
    $name = $1;
    next;
  }
  my @vals = map { $_ = undef if $_ eq 'undef'; $_ } split /\s+/, $line;

  my $page = Data::Pageset->new({
  	'total_entries'		=> $vals[0],
	'entries_per_page'	=> $vals[1],
	'current_page'		=> $vals[2],
	'pages_per_set'		=> $vals[3],
	'mode'			=> $vals[15],
  });

  my @integers = (0..$vals[0]);
  @integers = $page->splice(\@integers);
  my $integers = join ',', @integers;
  my $page_nums = join ',', @{$page->pages_in_set()};
  
  is($page->first_page, $vals[4], "$name: first page");
  is($page->last_page, $vals[5], "$name: last page");
  is($page->first, $vals[6], "$name: first");
  is($page->last, $vals[7], "$name: last");
  is($page->previous_page, $vals[8], "$name: previous_page");
  is($page->current_page, $vals[9], "$name: current_page");
  is($page->next_page, $vals[10], "$name: next_page");
  is($integers, $vals[11], "$name: splice");
  is($page->next_set(), $vals[12], "$name: next_set");
  is($page->previous_set(), $vals[13], "$name: previous_set");
  is($page_nums, $vals[14], "$name: pages_in_set");

#  my $ps = Data::Pageset->new({
#  	'total_entries'		=> $vals[0],
#	'entries_per_page'	=> $vals[1],
#	'current_page'		=> $page->previous_set,
#	'pages_per_set'		=> $vals[3],
#	'mode'			=> $vals[15],
#  });
#  my $ns = Data::Pageset->new({
#  	'total_entries'		=> $vals[0],
#	'entries_per_page'	=> $vals[1],
#	'current_page'		=> $page->next_set,
#	'pages_per_set'		=> $vals[3],
#	'mode'			=> $vals[15],
#  });
#
#  diag("totent($vals[0]) epp($vals[1]) cp($vals[9]) pps($vals[3])\n");
#  diag("previous set pis: ", join(",",@{$ps->pages_in_set()}), "\n") if($page->previous_set);
#  diag("    this set pis: ", join(",",@{$page->pages_in_set()}), "\n");
#  diag("    next set pis: ", join(",",@{$ns->pages_in_set()}), "\n") if($page->next_set);

}

# 0: total_entries
# 1: entries_per_page
# 2: current_page
# 3: pages_per_set
# 4: first_page number
# 5: last_page number
# 6: first entry on page
# 7: last last entry on page
# 8: previous_page
# 9: current_page
# 10: next_page
# 11: results on current page
# 12: next_set
# 13: previous_set
# 14: page numbers for set
# 15: mode
 
__DATA__
# Initial test
50 10 1 1   1 5 1 10 undef 1 2 0,1,2,3,4,5,6,7,8,9 2 undef 1
50 10 2 4   1 5 11 20 1 2 3 10,11,12,13,14,15,16,17,18,19 5 undef 1,2,3,4
50 10 3 undef   1 5 21 30 2 3 4 20,21,22,23,24,25,26,27,28,29 undef undef 1,2,3,4,5
50 10 4 2   1 5 31 40 3 4 5 30,31,32,33,34,35,36,37,38,39 5 1 3,4
50 10 5 1   1 5 41 50 4 5 undef 40,41,42,43,44,45,46,47,48,49 undef 4 1

# Under 10
1 10 1 4   1 1 1 1 undef 1 undef 0 undef undef 1
2 10 1 5   1 1 1 2 undef 1 undef 0,1  undef undef 1
3 10 1 6   1 1 1 3 undef 1 undef 0,1,2 undef undef 1
4 10 1 7   1 1 1 4 undef 1 undef 0,1,2,3 undef undef 1
5 10 1 undef   1 1 1 5 undef 1 undef 0,1,2,3,4 undef undef 1
6 10 1 9   1 1 1 6 undef 1 undef 0,1,2,3,4,5 undef undef 1
7 10 1 10   1 1 1 7 undef 1 undef 0,1,2,3,4,5,6 undef undef 1
8 10 1 undef   1 1 1 8 undef 1 undef 0,1,2,3,4,5,6,7 undef undef 1
9 10 1 12   1 1 1 9 undef 1 undef 0,1,2,3,4,5,6,7,8 undef undef 1
10 10 1 13   1 1 1 10 undef 1 undef 0,1,2,3,4,5,6,7,8,9 undef undef 1

# Over 10
11 10 1 2   1 2 1 10 undef 1 2 0,1,2,3,4,5,6,7,8,9 undef undef 1,2
11 10 2 3   1 2 11 11 1 2 undef 10 undef undef 1,2
12 10 1 undef   1 2 1 10 undef 1 2 0,1,2,3,4,5,6,7,8,9 undef undef 1,2
12 10 2 5   1 2 11 12 1 2 undef 10,11  undef undef 1,2
13 10 1 6   1 2 1 10 undef 1 2 0,1,2,3,4,5,6,7,8,9  undef undef 1,2
13 10 2 7   1 2 11 13 1 2 undef 10,11,12 undef undef 1,2

# Under 20
19 10 1 2   1 2 1 10 undef 1 2 0,1,2,3,4,5,6,7,8,9 undef undef 1,2
19 10 2 3   1 2 11 19 1 2 undef 10,11,12,13,14,15,16,17,18 undef undef 1,2
20 10 1 undef   1 2 1 10 undef 1 2 0,1,2,3,4,5,6,7,8,9 undef undef 1,2
20 10 2 5   1 2 11 20 1 2 undef 10,11,12,13,14,15,16,17,18,19 undef undef 1,2

# Over 20
21 10 1 5   1 3 1 10 undef 1 2 0,1,2,3,4,5,6,7,8,9 undef undef 1,2,3
21 10 2 5   1 3 11 20 1 2 3 10,11,12,13,14,15,16,17,18,19 undef undef 1,2,3
21 10 3 5   1 3 21 21 2 3 undef 20 undef undef 1,2,3
22 10 1 5   1 3 1 10 undef 1 2 0,1,2,3,4,5,6,7,8,9 undef undef 1,2,3
22 10 2 10   1 3 11 20 1 2 3 10,11,12,13,14,15,16,17,18,19 undef undef 1,2,3
22 10 3 10   1 3 21 22 2 3 undef 20,21 undef undef 1,2,3
23 10 1 10   1 3 1 10 undef 1 2 0,1,2,3,4,5,6,7,8,9 undef undef 1,2,3
23 10 2 undef   1 3 11 20 1 2 3 10,11,12,13,14,15,16,17,18,19 undef undef 1,2,3
23 10 3 10   1 3 21 23 2 3 undef 20,21,22 undef undef 1,2,3

# Slide - no sliding (to low pages)
1 10 1 4   1 1 1 1 undef 1 undef 0 undef undef 1 slide
89 10 1 10 1 9 1 10 undef 1 2 0,1,2,3,4,5,6,7,8,9 undef undef 1,2,3,4,5,6,7,8,9 slide

# Slide - no sliding (current page to low)
89 10 1 10 1 9 1 10 undef 1 2 0,1,2,3,4,5,6,7,8,9 undef undef 1,2,3,4,5,6,7,8,9 slide
89 10 4 10 1 9 31 40 3 4 5 30,31,32,33,34,35,36,37,38,39 undef undef 1,2,3,4,5,6,7,8,9 slide

# Slide - sliding
89 10 4 10 1 9 31 40 3 4 5 30,31,32,33,34,35,36,37,38,39 undef undef 1,2,3,4,5,6,7,8,9 slide
999 10 20 9 1 100 191 200 19 20 21 190,191,192,193,194,195,196,197,198,199 29 11 16,17,18,19,20,21,22,23,24 slide
999 10 11 9 1 100 101 110 10 11 12 100,101,102,103,104,105,106,107,108,109 20 2 7,8,9,10,11,12,13,14,15 slide
999 10 20 10 1 100 191 200 19 20 21 190,191,192,193,194,195,196,197,198,199 30 10 16,17,18,19,20,21,22,23,24,25 slide
1070 20 54 15 1 54 1061 1070 53 54 undef 1060,1061,1062,1063,1064,1065,1066,1067,1068,1069 undef 32 40,41,42,43,44,45,46,47,48,49,50,51,52,53,54 slide 
209 10 5 5 1 21 41 50 4 5 6 40,41,42,43,44,45,46,47,48,49 10 1 3,4,5,6,7 slide

# High pages - shift left two
500 20 21 5 1 25 401 420 20 21 22    400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419 26    16 19,20,21,22,23 slide
# High pages - shift left one    
500 20 22 5 1 25 421 440 21 22 23    420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439 27    17 20,21,22,23,24 slide
# High pages - first fixed    
500 20 23 5 1 25 441 460 22 23 24    440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459 undef 18 21,22,23,24,25 slide
# High pages - penultimate fixed    
500 20 24 5 1 25 461 480 23 24 25    460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479 undef 18 21,22,23,24,25 slide
# High pages - final page    
500 20 25 5 1 25 481 500 24 25 undef 480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499 undef 18 21,22,23,24,25 slide