From f6416acdd722ebd6e20af4e1f5d8593c72ded812 Mon Sep 17 00:00:00 2001 From: Jeffrey Ratcliffe <4869402+carygravel@users.noreply.github.com> Date: Sat, 8 Apr 2023 00:00:00 +0000 Subject: [PATCH] Skip options where min>max MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Petr Písař: Ported to 2.13.2. --- MANIFEST | 1 + lib/Gscan2pdf/Dialog/Scan/Image_Sane.pm | 11 ++ t/06182_Dialog_Scan_Image_Sane.t | 159 ++++++++++++++++++++++++ create mode 100644 t/06182_Dialog_Scan_Image_Sane.t diff --git a/MANIFEST b/MANIFEST index 79f05af1..f6142433 100644 --- a/MANIFEST +++ b/MANIFEST @@ -191,6 +191,7 @@ t/0615_Dialog_Scan_Image_Sane.t t/0616_Dialog_Scan_Image_Sane.t t/0617_Dialog_Scan_Image_Sane.t t/06181_Dialog_Scan_Image_Sane.t +t/06182_Dialog_Scan_Image_Sane.t t/0618_Dialog_Scan_Image_Sane.t t/06190_Dialog_Scan_Image_Sane.t t/06191_Dialog_Scan_Image_Sane.t diff --git a/lib/Gscan2pdf/Dialog/Scan/Image_Sane.pm b/lib/Gscan2pdf/Dialog/Scan/Image_Sane.pm index 0730373f..c2c23331 100644 --- a/lib/Gscan2pdf/Dialog/Scan/Image_Sane.pm +++ b/lib/Gscan2pdf/Dialog/Scan/Image_Sane.pm @@ -295,6 +295,17 @@ sub _initialise_options { ## no critic (ProhibitExcessComplexity) if ( $opt->{constraint}{quant} ) { $step = $opt->{constraint}{quant}; } + if ( $opt->{constraint}{min} > $opt->{constraint}{max} ) { + $logger->error( + sprintf __( +"Ignoring scan option '%s', minimum range (%s) > maximum (%s)" + ), + $opt->{name}, + $opt->{constraint}{min}, + $opt->{constraint}{max} + ); + next; + } $widget = Gtk3::SpinButton->new_with_range( $opt->{constraint}{min}, $opt->{constraint}{max}, $step ); diff --git a/t/06182_Dialog_Scan_Image_Sane.t b/t/06182_Dialog_Scan_Image_Sane.t new file mode 100644 index 00000000..19747eea --- /dev/null +++ b/t/06182_Dialog_Scan_Image_Sane.t @@ -0,0 +1,159 @@ +use warnings; +use strict; +use Test::More tests => 2; +use Glib qw(TRUE FALSE); # To get TRUE and FALSE +use Gtk3 -init; # Could just call init separately +use Image::Sane ':all'; # To get SANE_* enums +use Sub::Override; # Override Frontend::Image_Sane to test functionality that + # we can't with the test backend +use Storable qw(freeze); # For cloning the options cache + +BEGIN { + use Gscan2pdf::Dialog::Scan::Image_Sane; +} + +######################### + +my $window = Gtk3::Window->new; + +Gscan2pdf::Translation::set_domain('gscan2pdf'); +use Log::Log4perl qw(:easy); +Log::Log4perl->easy_init($WARN); +my $logger = Log::Log4perl::get_logger; + +# The overrides must occur before the thread is spawned in setup. +my $override = Sub::Override->new; +$override->replace( + 'Gscan2pdf::Frontend::Image_Sane::_thread_get_devices' => sub { + my ( $self, $uuid ) = @_; + $self->{return}->enqueue( + { + type => 'finished', + process => 'get-devices', + uuid => $uuid, + info => freeze( + [ + { + 'name' => 'mock_device', + 'label' => 'mock_device' + } + ] + ), + status => SANE_STATUS_GOOD, + } + ); + return; + } +); +$override->replace( + 'Gscan2pdf::Frontend::Image_Sane::_thread_open_device' => sub { + my ( $self, $uuid, $device_name ) = @_; + $self->{return}->enqueue( + { + type => 'finished', + process => 'open-device', + uuid => $uuid, + info => freeze( \$device_name ), + status => SANE_STATUS_GOOD, + } + ); + return; + } +); + +my $options = [ + undef, + { + 'cap' => 37, + 'constraint' => { + 'max' => -444909896, + 'min' => 0, + 'quant' => 32648 + }, + 'constraint_type' => 1, + 'desc' => 'Controls the brightness of the acquired image.', + 'index' => 1, + 'max_values' => 1, + 'name' => 'brightness', + 'title' => 'Brightness', + 'type' => 1, + 'unit' => 0 + }, +]; +$override->replace( + 'Gscan2pdf::Frontend::Image_Sane::_thread_get_options' => sub { + my ( $self, $uuid ) = @_; + $self->{return}->enqueue( + { + type => 'finished', + process => 'get-options', + uuid => $uuid, + info => freeze($options), + status => SANE_STATUS_GOOD, + } + ); + return; + } +); + +# $override->replace( +# 'Gscan2pdf::Frontend::Image_Sane::_thread_set_option' => sub { +# my ( $self, $uuid, $index, $value ) = @_; +# my $info = 0; +# if ( $index == 1 and $value = 'Flatbed' ) { +# $options->[2]{constraint} = [ 75, 100, 200, 300, 600, 1200 ]; +# $info = SANE_INFO_RELOAD_OPTIONS; +# } +# $options->[$index]{val} = $value; +# $self->{return}->enqueue( +# { +# type => 'finished', +# process => 'set-option', +# uuid => $uuid, +# status => SANE_STATUS_GOOD, +# info => $info, +# } +# ); +# return; +# } +# ); + +Gscan2pdf::Frontend::Image_Sane->setup($logger); + +my $dialog = Gscan2pdf::Dialog::Scan::Image_Sane->new( + title => 'title', + 'transient-for' => $window, + 'logger' => $logger +); + +$dialog->{signal} = $dialog->signal_connect( + 'changed-device-list' => sub { + $dialog->signal_handler_disconnect( $dialog->{signal} ); + is_deeply( + $dialog->get('device-list'), + [ + { + 'name' => 'mock_device', + 'model' => 'mock_device', + 'label' => 'mock_device' + } + ], + 'successfully mocked getting device list' + ); + $dialog->set( 'device', 'mock_device' ); + } +); + +$dialog->{reloaded_signal} = $dialog->signal_connect( + 'reloaded-scan-options' => sub { + $dialog->signal_handler_disconnect( $dialog->{reloaded_signal} ); + pass "successfully created dialog, ignoring option with min>max"; + Gtk3->main_quit; + } +); +$dialog->get_devices; + +Gtk3->main; + +Gscan2pdf::Frontend::Image_Sane->quit; +__END__ -- 2.40.1