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