3
use Test::More tests => 45;
4
use Glib qw(TRUE FALSE); # To get TRUE and FALSE
5
use Gtk2 -init; # Could just call init separately
6
use Sane 0.05; # To get SANE_* enums
9
use_ok('Gscan2pdf::Dialog::Scan::Sane');
12
#########################
14
my $window = Gtk2::Window->new;
16
Glib::set_application_name('gscan2pdf');
17
use Log::Log4perl qw(:easy);
18
Log::Log4perl->easy_init($WARN);
19
my $logger = Log::Log4perl::get_logger;
20
Gscan2pdf::Frontend::Sane->setup($logger);
23
my $dialog = Gscan2pdf::Dialog::Scan::Sane->new(
25
'transient-for' => $window,
30
isa_ok( $dialog, 'Gscan2pdf::Dialog::Scan::Sane' );
32
is( $dialog->get('device'), '', 'device' );
33
is( $dialog->get('device-list'), undef, 'device-list' );
34
is( $dialog->get('dir'), undef, 'dir' );
35
is( $dialog->get('num-pages'), 1, 'num-pages' );
36
is( $dialog->get('max-pages'), 0, 'max-pages' );
37
is( $dialog->get('page-number-start'), 1, 'page-number-start' );
38
is( $dialog->get('page-number-increment'), 1, 'page-number-increment' );
39
is( $dialog->get('side-to-scan'), 'facing', 'side-to-scan' );
40
is( $dialog->get('available-scan-options'), undef, 'available-scan-options' );
42
$dialog->{signal} = $dialog->signal_connect(
43
'changed-num-pages' => sub {
44
my ( $widget, $n, $signal ) = @_;
45
$dialog->signal_handler_disconnect( $dialog->{signal} );
46
is( $n, 0, 'changed-num-pages' );
49
$dialog->set( 'num-pages', 0 );
51
$dialog->{signal} = $dialog->signal_connect(
52
'changed-page-number-start' => sub {
53
my ( $widget, $n ) = @_;
54
$dialog->signal_handler_disconnect( $dialog->{signal} );
55
is( $n, 2, 'changed-page-number-start' );
58
$dialog->set( 'page-number-start', 2 );
60
$dialog->{signal} = $dialog->signal_connect(
61
'changed-page-number-increment' => sub {
62
my ( $widget, $n ) = @_;
63
$dialog->signal_handler_disconnect( $dialog->{signal} );
64
is( $n, 2, 'changed-page-number-increment' );
66
$dialog->{signal} = $dialog->signal_connect(
67
'changed-side-to-scan' => sub {
68
my ( $widget, $side ) = @_;
69
$dialog->signal_handler_disconnect( $dialog->{signal} );
70
is( $side, 'reverse', 'changed-side-to-scan' );
71
is( $dialog->get('page-number-increment'),
72
-2, 'reverse side gives increment -2' );
75
$dialog->set( 'side-to-scan', 'reverse' );
79
$dialog->set( 'page-number-increment', 2 );
81
$dialog->{reloaded_signal} = $dialog->signal_connect(
82
'reloaded-scan-options' => sub {
83
$dialog->signal_handler_disconnect( $dialog->{reloaded_signal} );
84
ok( 1, 'reloaded-scan-options' );
86
# So that it can be used in hash
87
my $resolution = SANE_NAME_SCAN_RESOLUTION;
89
$dialog->{signal} = $dialog->signal_connect(
90
'added-profile' => sub {
91
my ( $widget, $name, $profile ) = @_;
92
$dialog->signal_handler_disconnect( $dialog->{signal} );
93
is( $name, 'my profile', 'added-profile name' );
96
[ { $resolution => 52 }, { mode => 'Color' } ],
97
'added-profile profile'
101
$dialog->add_profile( 'my profile',
102
[ { $resolution => 52 }, { mode => 'Color' } ] );
104
######################################
106
$dialog->{signal} = $dialog->signal_connect(
107
'added-profile' => sub {
108
my ( $widget, $name, $profile ) = @_;
109
$dialog->signal_handler_disconnect( $dialog->{signal} );
110
is( $name, 'old profile', 'added-profile old name' );
113
[ { mode => 'Gray' }, { $resolution => 51 } ],
114
'added-profile profile as hash'
118
$dialog->add_profile( 'old profile', { $resolution => 51, mode => 'Gray' } );
120
######################################
122
$dialog->signal_connect(
123
'removed-profile' => sub {
124
my ( $widget, $profile ) = @_;
125
is( $profile, 'old profile', 'removed-profile' );
128
$dialog->remove_profile('old profile');
130
######################################
132
# need a new main loop because of the timeout
133
my $loop = Glib::MainLoop->new;
135
$dialog->{signal} = $dialog->signal_connect(
136
'changed-profile' => sub {
137
my ( $widget, $profile ) = @_;
138
$dialog->signal_handler_disconnect( $dialog->{signal} );
139
is( $profile, 'my profile', 'changed-profile' );
141
$dialog->get('current-scan-options'),
142
[ { $resolution => 52 }, { mode => 'Color' } ],
143
'current-scan-options with profile'
149
$dialog->set( 'profile', 'my profile' );
150
$loop->run unless ($flag);
152
######################################
154
$dialog->add_profile( 'my profile2',
155
[ { $resolution => 52 }, { mode => 'Color' } ] );
157
# need a new main loop because of the timeout
158
$loop = Glib::MainLoop->new;
160
$dialog->{signal} = $dialog->signal_connect(
161
'changed-profile' => sub {
162
my ( $widget, $profile ) = @_;
163
$dialog->signal_handler_disconnect( $dialog->{signal} );
164
is( $profile, 'my profile2', 'set profile with identical options' );
169
$dialog->set( 'profile', 'my profile2' );
170
$loop->run unless ($flag);
172
######################################
174
# need a new main loop because of the timeout
175
$loop = Glib::MainLoop->new;
177
$dialog->{signal} = $dialog->signal_connect(
178
'changed-scan-option' => sub {
179
my ( $widget, $option, $value ) = @_;
180
$dialog->signal_handler_disconnect( $dialog->{signal} );
181
is( $dialog->get('profile'),
182
undef, 'changing an option deselects the current profile' );
184
$dialog->get('current-scan-options'),
185
[ { mode => 'Color' }, { $resolution => 51 } ],
186
'current-scan-options without profile'
192
my $options = $dialog->get('available-scan-options');
193
$dialog->set_option( $options->by_name($resolution), 51 );
194
$loop->run unless ($flag);
195
my @geometry_widgets = keys %{ $options->{box} };
197
$#geometry_widgets == 3,
199
$#geometry_widgets == 5,
200
'Only 4 or 6 options should be flagged as geometry'
203
######################################
205
# need a new main loop because of the timeout
206
$loop = Glib::MainLoop->new;
209
# Reset profile for next test
210
$dialog->{signal} = $dialog->signal_connect(
211
'changed-profile' => sub {
212
my ( $widget, $profile ) = @_;
213
$dialog->signal_handler_disconnect( $dialog->{signal} );
214
is( $profile, 'my profile', 'reset profile' );
219
$dialog->set( 'profile', 'my profile' );
220
$loop->run unless ($flag);
222
######################################
224
# need a new main loop because of the timeout
225
$loop = Glib::MainLoop->new;
227
$dialog->{signal} = $dialog->signal_connect(
228
'changed-profile' => sub {
229
my ( $widget, $profile ) = @_;
230
$dialog->signal_handler_disconnect( $dialog->{signal} );
232
'changing an option fires the changed-profile signal if a profile is set'
235
$dialog->get('current-scan-options'),
236
[ { mode => 'Color' }, { $resolution => 51 } ],
237
'current-scan-options without profile (again)'
239
my $reloaded_options = $dialog->get('available-scan-options');
240
is( $reloaded_options->by_name($resolution)->{val},
241
51, 'option value updated when reloaded' );
246
$options = $dialog->get('available-scan-options');
247
$dialog->set_option( $options->by_name($resolution), 51 );
248
$loop->run unless ($flag);
250
######################################
264
$dialog->add_profile( 'cli geometry',
265
[ { 'Paper size' => 'new' }, { $resolution => 50 } ] );
267
# need a new main loop because of the timeout
268
$loop = Glib::MainLoop->new;
270
$dialog->{signal} = $dialog->signal_connect(
271
'changed-profile' => sub {
272
my ( $widget, $profile ) = @_;
273
$dialog->signal_handler_disconnect( $dialog->{signal} );
274
my $options = $dialog->get('available-scan-options');
275
my $expected = [ { 'Paper size' => 'new' } ];
276
push @$expected, { scalar(SANE_NAME_PAGE_HEIGHT) => 52 }
277
if ( defined $options->by_name(SANE_NAME_PAGE_HEIGHT) );
278
push @$expected, { scalar(SANE_NAME_PAGE_WIDTH) => 51 }
279
if ( defined $options->by_name(SANE_NAME_PAGE_WIDTH) );
280
push @$expected, { scalar(SANE_NAME_SCAN_TL_X) => 1 },
281
{ scalar(SANE_NAME_SCAN_TL_Y) => 2 },
282
{ scalar(SANE_NAME_SCAN_BR_X) => 51 },
283
{ scalar(SANE_NAME_SCAN_BR_Y) => 52 },
284
{ $resolution => 50 };
285
is_deeply( $dialog->get('current-scan-options'),
286
$expected, 'CLI geometry option names' );
291
$dialog->set( 'profile', 'cli geometry' );
292
$loop->run unless ($flag);
294
######################################
296
$dialog->signal_connect(
297
'changed-paper-formats' => sub {
298
my ( $widget, $formats ) = @_;
299
ok( 1, 'changed-paper-formats' );
314
$dialog->signal_connect(
315
'changed-paper' => sub {
316
my ( $widget, $paper ) = @_;
317
is( $paper, 'new2', 'changed-paper' );
320
$dialog->set( 'paper', 'new2' );
323
$s_signal = $dialog->signal_connect(
324
'started-process' => sub {
325
$dialog->signal_handler_disconnect($s_signal);
326
ok( 1, 'started-process' );
330
$c_signal = $dialog->signal_connect(
331
'changed-progress' => sub {
332
$dialog->signal_handler_disconnect($c_signal);
333
ok( 1, 'changed-progress' );
337
$f_signal = $dialog->signal_connect(
338
'finished-process' => sub {
339
my ( $widget, $process ) = @_;
340
$dialog->signal_handler_disconnect($f_signal);
341
is( $process, 'set_option', 'finished-process set_option' );
345
$dialog->signal_connect(
347
( my $widget, $n ) = @_;
350
$dialog->signal_connect(
351
'finished-process' => sub {
352
my ( $widget, $process ) = @_;
353
if ( $process eq 'scan_pages' ) {
354
is( $n, 1, 'new-scan emitted once' );
356
# changing device via the combobox should really change the device!
357
$dialog->{signal} = $dialog->signal_connect(
358
'changed-device' => sub {
359
my ( $widget, $name ) = @_;
360
$dialog->signal_handler_disconnect( $dialog->{signal} );
361
is( $name, 'test:1', 'changed-device via combobox' );
364
$e_signal = $dialog->signal_connect(
365
'process-error' => sub {
366
my ( $widget, $process, $message ) = @_;
367
$dialog->signal_handler_disconnect($e_signal);
368
is( $process, 'open_device', 'caught error opening device' );
373
# setting an unknown device should throw an error
374
$dialog->set( 'device', 'error' );
378
$dialog->{combobd}->set_active(1);
382
$dialog->set( 'num-pages', 1 );
383
$dialog->set( 'page-number-start', 1 );
384
$dialog->set( 'side-to-scan', 'facing' );
388
$dialog->{signal} = $dialog->signal_connect(
389
'changed-device-list' => sub {
390
$dialog->signal_handler_disconnect( $dialog->{signal} );
391
ok( 1, 'changed-device-list' );
394
$dialog->get('device-list'),
396
{ 'name' => 'test:0', 'model' => 'test:0', 'label' => 'test:0' },
397
{ 'name' => 'test:1', 'model' => 'test:1', 'label' => 'test:1' }
399
'add model field if missing'
402
$dialog->{signal} = $dialog->signal_connect(
403
'changed-device' => sub {
404
my ( $widget, $name ) = @_;
405
$dialog->signal_handler_disconnect( $dialog->{signal} );
406
is( $name, 'test:0', 'changed-device' );
409
$dialog->set( 'device', 'test:0' );
412
$dialog->set( 'device-list',
413
[ { 'name' => 'test:0' }, { 'name' => 'test:1' } ] );
416
Gscan2pdf::Frontend::Sane->quit;