1
package tests::UIPrefsTest;
5
use base qw/Lire::Test::TestCase/;
7
use Lire::Config::TypeSpec;
8
use Lire::Config::ConfigFile;
13
use Lire::Test::CursesUIDriver;
15
use Lire::Utils qw/tempfile/;
18
my $self = shift->SUPER::new( @_ );
20
$self->{'driver'} = new Lire::Test::CursesUIDriver();
21
my $spec = new Lire::Config::ConfigSpec( 'name' => 'lire' );
22
$spec->add( new Lire::Config::StringSpec( 'name' => 'test',
23
'section' => 'programs',
24
'summary' => 'Test Summary',
25
'description' => '<para>Test Description</para>' ) );
26
$spec->add( new Lire::Config::StringSpec( 'name' => 'another_prog',
27
'section' => 'programs', ) );
28
$spec->add( new Lire::Config::StringSpec( 'name' => 'wawa_prog',
29
'summary' => "Summary with\nnewlines \n and wawas",
30
'section' => 'programs' ) );
31
$self->{'spec'} = $spec;
38
$self->SUPER::set_up();
40
$self->{'cfg'}{'_lr_config_spec'} = $self->{'spec'};
42
( $fh, $self->{'cfg_filename'} ) = tempfile( 'lire_cfg_XXXXXX' );
43
$self->{'driver'}->setup_curses_ui();
46
new Lire::Config::ConfigFile( 'spec' => $self->{'spec'},
47
'filename' => $self->{'cfg_filename'} );
48
$self->{'ui'} = new Curses::UI();
49
$self->{'driver'}->set_curses_ui( $self->{'ui'} );
56
$self->SUPER::tear_down();
58
$self->{'driver'}->teardown_curses_ui();
60
unlink $self->{'cfg_filename'};
68
$self->assert_dies( qr/missing \'ui\' parameter/,
69
sub { new Lire::UI::Prefs() } );
70
$self->assert_dies( qr/missing \'config\' parameter/,
71
sub { new Lire::UI::Prefs( $self->{'ui'}) } );
72
$self->assert_dies( qr/\'ui\' parameter should be a \'Curses::UI\' instance, not \'HASH/,
73
sub { new Lire::UI::Prefs( {}, {} ) } );
74
$self->assert_dies( qr/\'config\' parameter should be a \'Lire::Config::ConfigFile\' instance, not \'HASH/,
75
sub { new Lire::UI::Prefs( $self->{'ui'}, {} ) } );
77
my $prefs = new Lire::UI::Prefs( $self->{'ui'}, $self->{'cfg_file'} );
78
$self->assert_str_equals( $self->{'ui'}, $prefs->{'_ui'} );
79
$self->assert_str_equals( $self->{'cfg_file'}, $prefs->{'_cfg_file'} );
80
$self->assert_not_null( $self->{'ui'}->getobj( 'prefs_win' ),
81
'was _create_prefs_win() called?' );
84
sub test_create_prefs_win {
87
my $ui = bless { '_ui' => $self->{'ui'},
88
'_cfg_file' => $self->{'cfg_file'} }, 'Lire::UI::Prefs';
89
$ui->_create_prefs_win();
90
my $win = $self->{'ui'}->getobj( 'prefs_win' );
91
$self->assert_isa( 'Curses::UI::Window', $win );
92
$self->assert_str_equals( 'Lire Preferences', $win->title() );
94
foreach my $id ( qw/ section_menu buttons options_list option_summary option_help / ) {
95
my $widget = $win->getobj( $id );
96
$self->assert_not_null( $widget,
97
"missing widget '$id' in 'prefs_win'" );
99
$self->assert_str_equals( $ui, $win->userdata() );
101
my $options = $win->getobj( 'options_list' );
102
$self->assert_isa( 'Curses::UI::Listbox', $options );
103
$self->assert_str_equals( \&Lire::UI::Prefs::_option_change_cb,
104
$options->{'-onchange'} );
105
$self->assert_str_equals( \&Lire::UI::Prefs::_option_selchange_cb,
106
$options->{'-onselchange'} );
107
my $opt_summary = $win->getobj( 'option_summary' );
108
$self->assert_isa( 'Curses::UI::Label', $opt_summary );
110
my $opt_help = $win->getobj( 'option_help' );
111
$self->assert_isa( 'Curses::UI::TextViewer', $opt_help );
114
sub set_up_mock_prefs_win {
117
$self->{'ui_prefs'} = bless { '_ui' => $self->{'ui'},
118
'_cfg_file' => $self->{'cfg_file'} },
120
$self->{'prefs_win'} =
121
$self->{'ui'}->add( 'prefs_pane', 'Window', '-y' => 1 );
125
sub test_create_section_menu {
128
$self->set_up_mock_prefs_win();
129
my $win = $self->{'prefs_win'};
130
$self->{'ui_prefs'}->_create_section_menu( $win );
132
my $section_menu = $win->getobj( 'section_menu' );
133
$self->assert_isa( 'Curses::UI::Popupmenu', $section_menu );
134
$self->assert_num_equals( 0, $section_menu->{'-selected'} );
135
$self->assert_deep_equals( [ 'report', 'responder', 'operation',
136
'path', 'docbook', 'programs' ],
137
$section_menu->{'-values'} );
138
$self->assert_str_equals( 'Responder Preferences',
139
$section_menu->{'-labels'}{'responder'} );
140
$self->assert_str_equals( \&Lire::UI::Prefs::_section_change_cb,
141
$section_menu->{'-onchange'} );
144
sub test_create_buttons {
147
$self->set_up_mock_prefs_win();
148
my $win = $self->{'prefs_win'};
149
$self->{'ui_prefs'}->_create_buttons( $win );
151
my $buttons = $win->getobj( 'buttons' );
152
$self->assert_isa( 'Curses::UI::Buttonbox', $buttons );
153
$self->assert_str_equals( '< Cancel >',
154
$buttons->{'-buttons'}[0]{'-label'} );
155
$self->assert_str_equals( \&Lire::UI::Prefs::_cancel_cb,
156
$buttons->{'-buttons'}[0]{'-onpress'} );
157
$self->assert_str_equals( '< OK >',
158
$buttons->{'-buttons'}[1]{'-label'} );
159
$self->assert_str_equals( \&Lire::UI::Prefs::_ok_cb,
160
$buttons->{'-buttons'}[1]{'-onpress'} );
166
my $driver = $self->{'driver'};
167
my $prefs_win = '<undef>';
168
$driver->add_event_loop_handler( sub { $prefs_win = $_[1] } );
170
my $section_menu = '<undef>';
172
no warnings 'redefine';
173
local *Lire::UI::Prefs::_section_change_cb =
174
sub { $section_menu = shift;
175
$sel = $section_menu->get() };
176
my $prefs = new Lire::UI::Prefs( $self->{'ui'}, $self->{'cfg_file'} );
177
my $ui_prefs_win = $driver->find_widget( '/prefs_win' );
178
my $ui_section_menu = $driver->find_widget( '/prefs_win/section_menu' );
180
$self->assert_str_equals( $ui_prefs_win, $prefs_win );
181
$self->assert_null( $self->{'ui'}->getobj( 'prefs_win' ) );
182
$self->assert_str_equals( $ui_section_menu, $section_menu );
183
$self->assert_str_equals( 'report', $sel );
186
sub test_section_change_cb {
189
my $driver = $self->{'driver'};
190
my $spec = $self->{'spec'};
192
my $listbox = '<undef>';
194
no warnings 'redefine';
195
local *Lire::UI::Prefs::_option_change_cb =
196
sub { $listbox = shift;
197
$sel = $listbox->{'-selected'} };
199
my $prefs = new Lire::UI::Prefs( $self->{'ui'}, $self->{'cfg_file'} );
200
my $section_menu = $driver->find_widget( '/prefs_win/section_menu' );
201
$section_menu->{'-selected'} = 5; # Programs
203
Lire::UI::Prefs::_section_change_cb( $section_menu );
205
my $options = $driver->find_widget( '/prefs_win/options_list');
206
$self->assert_deep_equals( [ $spec->get( 'test' ),
207
$spec->get( 'another_prog' ),
208
$spec->get( 'wawa_prog' ) ],
209
$options->{'-values'} );
210
$self->assert_deep_equals( { $spec->get( 'another_prog' ) =>'another_prog',
211
$spec->get( 'test' ) => 'test',
212
$spec->get( 'wawa_prog' ) => 'wawa_prog'},
213
$options->{'-labels'} );
215
$self->assert_num_equals( 0, $sel );
216
$self->assert_str_equals( $options, $listbox );
219
sub test_option_selchange_cb {
222
my $driver = $self->{'driver'};
223
my $spec = $self->{'spec'};
224
my $listbox = "<undef>";
225
no warnings 'redefine';
226
local *Lire::UI::Prefs::_option_change_cb = sub { $listbox = shift };
228
my $prefs = new Lire::UI::Prefs( $self->{'ui'}, $self->{'cfg_file'} );
229
my $options = $driver->find_widget( '/prefs_win/options_list' );
230
$options->{'-ypos'} = 0;
231
$options->{'-values'} = [ $spec->get( 'another_prog' ),
232
$spec->get( 'test' ) ];
233
$options->{'-selected'} = undef;
234
Lire::UI::Prefs::_option_selchange_cb( $options );
235
$self->assert_str_equals( $options, $listbox );
236
$self->assert_num_equals( 0, $options->{'-selected'} );
239
sub test_option_change_cb {
242
my $driver = $self->{'driver'};
243
my $spec = $self->{'spec'};
244
my $prefs = new Lire::UI::Prefs( $self->{'ui'}, $self->{'cfg_file'} );
246
my $options = $driver->find_widget( '/prefs_win/options_list' );
247
$options->{'-values'} = [ $spec->get( 'another_prog' ),
248
$spec->get( 'test' ),
249
$spec->get( 'wawa_prog' ) ];
250
$options->{'-ypos'} = 0;
251
$options->{'-selected'} = 1;
253
Lire::UI::Prefs::_option_change_cb( $options );
254
$self->assert_num_equals( 1, $options->{'-ypos'} );
256
my $opt_summary = $driver->find_widget( '/prefs_win/option_summary' );
257
$self->assert_str_equals( 'Test Summary', $opt_summary->text() );
258
my $opt_help = $driver->find_widget( '/prefs_win/option_help' );
259
$self->assert_str_equals( 'Test Description', $opt_help->text() );
262
$driver->find_widget( '/prefs_win' )->getobj( 'option_widget' );
263
$self->assert_isa( "Lire::UI::StringWidget", $opt_widget );
264
$self->assert_str_equals( 'Test Description', $opt_help->text() );
266
$options->{'-selected'} = 0;
267
Lire::UI::Prefs::_option_change_cb( $options );
268
$self->assert_str_equals( 'another_prog', $opt_summary->text() );
269
$self->assert_str_equals( 'No help available.', $opt_help->text() );
270
$self->assert_str_not_equals( $opt_widget,
271
$driver->find_widget( '/prefs_win/option_widget' ) );
273
$options->{'-selected'} = 2;
274
Lire::UI::Prefs::_option_change_cb( $options );
275
$self->assert_str_equals( 'Summary with newlines and wawas', $opt_summary->text() );
280
sub test_option_change_cb_empty {
282
my $driver = $self->{'driver'};
285
new Lire::Config::ConfigFile( 'spec' => new Lire::Config::ConfigSpec(),
286
'filename' => $self->{'cfg_filename'} );
287
my $prefs = new Lire::UI::Prefs( $self->{'ui'}, $cfg_file );
289
my $options = $driver->find_widget( '/prefs_win/options_list' );
290
$options->{'-values'} = [];
291
$options->{'-ypos'} = 1;
292
$options->{'-selected'} = 1;
294
Lire::UI::Prefs::_option_change_cb( $options );
295
$self->assert_num_equals( 0, $options->{'-ypos'} );
296
$self->assert_null($options->{'-selected'}, "-selected should be undef" );
298
my $opt_summary = $driver->find_widget( '/prefs_win/option_summary' );
299
$self->assert_str_equals( '', $opt_summary->text() );
300
my $opt_help = $driver->find_widget( '/prefs_win/option_help' );
301
$self->assert_str_equals( '', $opt_help->text() );
307
my $prefs = bless { '_ui' => $self->{'ui'},
308
'_cfg_file' => $self->{'cfg_file'} }, 'Lire::UI::Prefs';
310
my $test_in_file = $self->{'cfg_file'}->get( 'test' );
311
$self->assert_str_equals( $test_in_file, $prefs->_get_var( 'test' ) );
313
$self->assert( ! $self->{'cfg_file'}->is_set( 'another_prog' ),
314
"'another_prog' unexpectedly set" );
315
$self->{'cfg'}{'another_prog'} = '/bin/ls';
316
my $prog_from_config = Lire::Config->get_var( 'another_prog' );
317
my $prog_from_file = $prefs->_get_var( 'another_prog' );
318
$self->assert_str_not_equals( $prog_from_config, $prog_from_file );
319
$self->assert( $self->{'cfg_file'}->is_set( 'another_prog' ),
320
"'another_prog' should now be set in config file" );
321
$self->assert_str_equals( '/bin/ls', $prog_from_file->get() );
328
my $prefs_win = '< undef (loose_focus not called) >';
329
my $cfg_file = '< undef (save not called) >';
331
my $prefs = new Lire::UI::Prefs( $self->{'ui'}, $self->{'cfg_file'} );
333
no warnings 'redefine';
334
local *Curses::UI::Window::loose_focus = sub { $prefs_win = shift };
335
local *Lire::Config::ConfigFile::save = sub { $cfg_file = shift };
337
my $btn_box = $self->{'driver'}->find_widget( '/prefs_win/buttons' );
338
Lire::UI::Prefs::_ok_cb( $btn_box );
339
$self->assert_str_equals( $self->{'ui'}->getobj( 'prefs_win' ),
342
$self->assert_str_equals( $self->{'cfg_file'}, $cfg_file );
348
my $prefs_win = '< undef (loose_focus not called) >';
349
my $cfg_file = '< undef (revert not called) >';
351
my $prefs = new Lire::UI::Prefs( $self->{'ui'}, $self->{'cfg_file'} );
353
no warnings 'redefine';
354
local *Curses::UI::Window::loose_focus = sub { $prefs_win = shift };
355
local *Lire::Config::ConfigFile::revert = sub { $cfg_file = shift };
357
my $btn_box = $self->{'driver'}->find_widget( '/prefs_win/buttons' );
358
Lire::UI::Prefs::_cancel_cb( $btn_box );
359
$self->assert_str_equals( $self->{'ui'}->getobj( 'prefs_win' ),
362
$self->assert_str_equals( $self->{'cfg_file'}, $cfg_file );