1use Test::More tests => 30;
2
3use strict;
4use warnings;
5
6use FindBin;
7use lib "$FindBin::RealBin/fakelib";
8use Curses::UI;
9
10$ENV{LINES} = 25;
11$ENV{COLUMNS} = 80;
12
13# Tests 1: module load.
14BEGIN {
15    $| = 1;
16    # Ensure Term::ReadKey doesn't fail to get the screen size.
17    $ENV{LINES} = 25;
18    $ENV{COLUMNS} = 80;
19
20    use_ok('Curses::UI::Notebook');
21}
22
23my $debug = 0;
24
25my $cui = new Curses::UI ( -clear_on_exit => 0,
26			   -debug => $debug, );
27$cui->leave_curses();
28
29my $win = $cui->add(undef, 'Window');
30exit unless $win;
31
32# Tests 2-4: notebook object creation.
33my $nb1 = $win->add(undef, 'Notebook');
34isa_ok( $nb1, 'Curses::UI::Notebook');
35
36ok(
37    $nb1->{-border} == 1 && $nb1->{-sbborder} == 0 &&
38    $nb1->{-padleft} == 0 && $nb1->{-ipadleft} == 1,
39    'Initialization w/ defaults'
40);
41
42ok(!$nb1->active_page, 'active_page(), w/o pages');
43
44my $nb2 = $win->add(
45    undef, 'Notebook',
46    -border     => 0,
47    -sbborder   => 1,
48    -wraparound => 0,
49);
50ok(
51    $nb2->isa('Curses::UI::Notebook') &&
52    $nb2->{-border} == 0 && $nb2->{-sbborder} == 1 &&
53    $nb2->{-wraparound} == 0,
54    'Initialization w/ specific values'
55);
56
57
58# Tests 5-11: page addition.
59for (my $i = 1; $i <= 3; $i++) {
60    my $page = $nb1->add_page("Page $i");
61    ok(
62        defined $page &&
63        $page->isa('Curses::UI::Window') &&
64        scalar(@{$nb1->{-pages}}) == $i,
65        "add_page(), page $i, nb1"
66    );
67}
68
69# nb: with three pages, tab window uses 28 spaces (6/tab for labels, 2/tab
70#     for padding, 1/tab for start border, and 1 for final border) before
71#     adding this page.
72my $page = $nb1->add_page('=' x ($nb1->{-w} - 28 - 3 + 1));
73ok(!$page, 'add_page(), overflow');
74
75for (my $i = 1; $i <= 3; $i++) {
76    my $page = $nb2->add_page("Page $i");
77    ok(
78        defined $page &&
79        $page->isa('Curses::UI::Window') &&
80        scalar(@{$nb2->{-pages}}) == $i,
81        "add_page(), page $i, nb2"
82    );
83}
84
85
86# Tests 12-17: page ordering and wraparound.
87ok($nb1->active_page eq 'Page 1', 'active_page()');
88
89ok($nb1->first_page eq 'Page 1', 'first_page()');
90
91ok($nb1->last_page eq 'Page 3', 'last_page()');
92
93ok($nb1->prev_page eq 'Page 3', 'prev_page(), w/ wraparound');
94
95ok($nb2->prev_page eq 'Page 1', 'prev_page(), w/o wraparound');
96
97ok($nb1->next_page eq 'Page 2', 'next_page()');
98
99
100# Tests 18-19: page movement.
101ok(
102    $nb1->activate_page('Page 3') && $nb1->active_page eq 'Page 3',
103    'active_page(), nb1'
104);
105
106ok(
107    $nb2->activate_page('Page 3') && $nb2->active_page eq 'Page 3',
108    'active_page(), nb2'
109);
110
111
112# Tests 20-21: wraparound (at end).
113ok($nb1->next_page eq 'Page 1', 'next_page(), w/ wraparound');
114
115ok($nb2->next_page eq 'Page 3', 'next_page() w/o wraparound');
116
117
118# Tests 22-24: page deletion.
119$nb1->delete_page('Page 1');
120ok(
121    $nb1->first_page eq 'Page 2' &&
122    scalar(@{$nb1->{-pages}}) == 2,
123    'delete_page()'
124);
125
126# - deleting active page should make Page 3 active.
127$nb1->activate_page('Page 2');
128$nb1->delete_page('Page 2');
129ok(
130    $nb1->active_page eq 'Page 3' &&
131    $nb1->next_page eq 'Page 3' &&
132    scalar(@{$nb1->{-pages}}) == 1,
133    'delete_page(), active page'
134);
135
136$nb1->delete_page('Page 3');
137ok(
138    !$nb1->active_page &&
139    scalar(@{$nb1->{-pages}}) == 0,
140    'delete_page(), final page'
141);
142
143my ($activated_widget,$activated_name) ;
144my ($deleted_widget,$deleted_name) ;
145
146my $ac_sub  = sub { ($activated_widget,$activated_name) = @_ ;} ;
147my $del_sub = sub { ($deleted_widget,$deleted_name) = @_ ;} ;
148
149# create page with activation and deletion call-back
150my $cbpage = $nb1->add_page("CB Page", -on_activate => $ac_sub,
151			   -on_delete => $del_sub );
152
153ok($cbpage, "Created page with callback") ;
154
155$nb1->activate_page('CB Page');
156is($activated_widget, $nb1, "activate callback called (widget ok)" );
157is($activated_name,  'CB Page', "activate callback called (name ok)");
158
159$nb1->delete_page('CB Page') ;
160is($deleted_widget, $nb1, "delete callback called (widget ok)" );
161is($deleted_name,  'CB Page', "delete callback called (name ok)");
162