summaryrefslogtreecommitdiff
path: root/testsuite/sanei/sanei_constrain_test.c
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/sanei/sanei_constrain_test.c')
-rw-r--r--testsuite/sanei/sanei_constrain_test.c795
1 files changed, 795 insertions, 0 deletions
diff --git a/testsuite/sanei/sanei_constrain_test.c b/testsuite/sanei/sanei_constrain_test.c
new file mode 100644
index 0000000..0f66bbb
--- /dev/null
+++ b/testsuite/sanei/sanei_constrain_test.c
@@ -0,0 +1,795 @@
+#include "../../include/sane/config.h"
+
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
+#include <assert.h>
+
+/* sane includes for the sanei functions called */
+#include "../include/sane/sane.h"
+#include "../include/sane/saneopts.h"
+#include "../include/sane/sanei.h"
+
+static SANE_Option_Descriptor none_opt = {
+ SANE_NAME_SCAN_TL_X,
+ SANE_TITLE_SCAN_TL_X,
+ SANE_DESC_SCAN_TL_X,
+ SANE_TYPE_INT,
+ SANE_UNIT_NONE,
+ sizeof (SANE_Word),
+ 0,
+ SANE_CONSTRAINT_NONE,
+ {NULL}
+};
+
+
+static SANE_Option_Descriptor none_bool_opt = {
+ SANE_NAME_SCAN_TL_X,
+ SANE_TITLE_SCAN_TL_X,
+ SANE_DESC_SCAN_TL_X,
+ SANE_TYPE_BOOL,
+ SANE_UNIT_NONE,
+ sizeof (SANE_Word),
+ 0,
+ SANE_CONSTRAINT_NONE,
+ {NULL}
+};
+
+/* range for int constraint */
+static const SANE_Range int_range = {
+ 3, /* minimum */
+ 18, /* maximum */
+ 3 /* quantization */
+};
+
+/* range for sane fixed constraint */
+static const SANE_Range fixed_range = {
+ SANE_FIX(1.0), /* minimum */
+ SANE_FIX(431.8), /* maximum */
+ SANE_FIX(0.01) /* quantization */
+};
+
+static SANE_Option_Descriptor int_opt = {
+ SANE_NAME_SCAN_TL_X,
+ SANE_TITLE_SCAN_TL_X,
+ SANE_DESC_SCAN_TL_X,
+ SANE_TYPE_FIXED,
+ SANE_UNIT_MM,
+ sizeof (SANE_Word),
+ 0,
+ SANE_CONSTRAINT_RANGE,
+ {NULL}
+};
+
+static SANE_Option_Descriptor fixed_opt = {
+ SANE_NAME_SCAN_TL_X,
+ SANE_TITLE_SCAN_TL_X,
+ SANE_DESC_SCAN_TL_X,
+ SANE_TYPE_FIXED,
+ SANE_UNIT_MM,
+ sizeof (SANE_Word),
+ 0,
+ SANE_CONSTRAINT_RANGE,
+ {NULL}
+};
+
+#define ARRAY_SIZE 7
+
+static SANE_Option_Descriptor array_opt = {
+ SANE_NAME_SCAN_TL_X,
+ SANE_TITLE_SCAN_TL_X,
+ SANE_DESC_SCAN_TL_X,
+ SANE_TYPE_FIXED,
+ SANE_UNIT_MM,
+ sizeof (SANE_Word) * ARRAY_SIZE,
+ 0,
+ SANE_CONSTRAINT_RANGE,
+ {NULL}
+};
+
+#define WORD_SIZE 9
+static const SANE_Int dpi_list[] =
+ { WORD_SIZE - 1, 100, 200, 300, 400, 500, 600, 700, 800 };
+
+static SANE_Option_Descriptor word_array_opt = {
+ SANE_NAME_SCAN_RESOLUTION,
+ SANE_TITLE_SCAN_RESOLUTION,
+ SANE_DESC_SCAN_RESOLUTION,
+ SANE_TYPE_INT,
+ SANE_UNIT_DPI,
+ sizeof (SANE_Word) * WORD_SIZE,
+ 100,
+ SANE_CONSTRAINT_WORD_LIST,
+ {NULL}
+};
+
+static const SANE_String_Const string_list[] = {
+ SANE_VALUE_SCAN_MODE_LINEART,
+ SANE_VALUE_SCAN_MODE_HALFTONE,
+ SANE_VALUE_SCAN_MODE_GRAY,
+ "linelength",
+ 0
+};
+
+static SANE_Option_Descriptor string_array_opt = {
+ SANE_NAME_SCAN_MODE,
+ SANE_TITLE_SCAN_MODE,
+ SANE_DESC_SCAN_MODE,
+ SANE_TYPE_STRING,
+ SANE_UNIT_NONE,
+ 8,
+ 0,
+ SANE_CONSTRAINT_STRING_LIST,
+ {NULL}
+};
+
+
+/******************************/
+/* start of tests definitions */
+/******************************/
+
+/*
+ * constrained int
+ */
+static void
+min_int_value (void)
+{
+ SANE_Int value = int_range.min;
+ SANE_Word info = 0;
+ SANE_Status status;
+
+ status = sanei_constrain_value (&int_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+ assert (info == 0);
+ assert (value == int_range.min);
+}
+
+static void
+max_int_value (void)
+{
+ SANE_Int value = int_range.max;
+ SANE_Word info = 0;
+ SANE_Status status;
+
+ status = sanei_constrain_value (&int_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+ assert (info == 0);
+ assert (value == int_range.max);
+}
+
+static void
+below_min_int_value (void)
+{
+ SANE_Int value = int_range.min - 1;
+ SANE_Word info = 0;
+ SANE_Status status;
+
+ status = sanei_constrain_value (&int_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+ assert (info == SANE_INFO_INEXACT);
+ assert (value == int_range.min);
+}
+
+/* rounded to lower value */
+static void
+quant1_int_value (void)
+{
+ SANE_Int value = int_range.min + 1;
+ SANE_Word info = 0;
+ SANE_Status status;
+
+ status = sanei_constrain_value (&int_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+ assert (info == SANE_INFO_INEXACT);
+ assert (value == int_range.min);
+}
+
+/* rounded to higher value */
+static void
+quant2_int_value (void)
+{
+ SANE_Int value = int_range.min + int_range.quant - 1;
+ SANE_Word info = 0;
+ SANE_Status status;
+
+ status = sanei_constrain_value (&int_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+ assert (info == SANE_INFO_INEXACT);
+ assert (value == int_range.min + int_range.quant);
+}
+
+static void
+in_range_int_value (void)
+{
+ SANE_Int value = int_range.min + int_range.quant;
+ SANE_Word info = 0;
+ SANE_Status status;
+
+ status = sanei_constrain_value (&int_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+ assert (info == 0);
+ assert (value == int_range.min + int_range.quant);
+}
+
+static void
+above_max_int_value (void)
+{
+ SANE_Int value = int_range.max + 1;
+ SANE_Word info = 0;
+ SANE_Status status;
+
+ status = sanei_constrain_value (&int_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+ assert (info == SANE_INFO_INEXACT);
+ assert (value == int_range.max);
+}
+
+/*
+ * constrained fixed value
+ */
+static void
+min_fixed_value (void)
+{
+ SANE_Int value = fixed_range.min;
+ SANE_Word info = 0;
+ SANE_Status status;
+
+ status = sanei_constrain_value (&fixed_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+ assert (info == 0);
+ assert (value == fixed_range.min);
+}
+
+static void
+max_fixed_value (void)
+{
+ SANE_Int value = fixed_range.max;
+ SANE_Word info = 0;
+ SANE_Status status;
+
+ status = sanei_constrain_value (&fixed_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+ assert (info == 0);
+ assert (value == fixed_range.max);
+}
+
+static void
+below_min_fixed_value (void)
+{
+ SANE_Int value = fixed_range.min - 1;
+ SANE_Word info = 0;
+ SANE_Status status;
+
+ status = sanei_constrain_value (&fixed_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+ assert (info == SANE_INFO_INEXACT);
+ assert (value == fixed_range.min);
+}
+
+/* rounded to lower value */
+static void
+quant1_fixed_value (void)
+{
+ SANE_Int value = fixed_range.min + fixed_range.quant/3;
+ SANE_Word info = 0;
+ SANE_Status status;
+
+ status = sanei_constrain_value (&fixed_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+ assert (info == SANE_INFO_INEXACT);
+ assert (value == fixed_range.min);
+}
+
+/* rounded to higher value */
+static void
+quant2_fixed_value (void)
+{
+ SANE_Int value = fixed_range.min + fixed_range.quant - fixed_range.quant/3;
+ SANE_Word info = 0;
+ SANE_Status status;
+
+ status = sanei_constrain_value (&fixed_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+ assert (info == SANE_INFO_INEXACT);
+ assert (value == fixed_range.min + fixed_range.quant);
+}
+
+static void
+in_range_fixed_value (void)
+{
+ SANE_Int value = fixed_range.min + fixed_range.quant;
+ SANE_Word info = 0;
+ SANE_Status status;
+
+ status = sanei_constrain_value (&fixed_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+ assert (info == 0);
+ assert (value == fixed_range.min + fixed_range.quant);
+}
+
+static void
+above_max_fixed_value (void)
+{
+ SANE_Int value = fixed_range.max + 1;
+ SANE_Word info = 0;
+ SANE_Status status;
+
+ status = sanei_constrain_value (&fixed_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+ assert (info == SANE_INFO_INEXACT);
+ assert (value == fixed_range.max);
+}
+
+
+static void
+above_max_word (void)
+{
+ SANE_Word value = 25000;
+ SANE_Word info = 0;
+ SANE_Status status;
+
+ status = sanei_constrain_value (&word_array_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+ assert (info == SANE_INFO_INEXACT);
+ assert (value == 800);
+}
+
+
+static void
+below_max_word (void)
+{
+ SANE_Word value = 1;
+ SANE_Word info = 0;
+ SANE_Status status;
+
+ status = sanei_constrain_value (&word_array_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+ assert (info == SANE_INFO_INEXACT);
+ assert (value == 100);
+}
+
+static void
+closest_200_word (void)
+{
+ SANE_Word value = 249;
+ SANE_Word info = 0;
+ SANE_Status status;
+
+ status = sanei_constrain_value (&word_array_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+ assert (info == SANE_INFO_INEXACT);
+ assert (value == 200);
+}
+
+
+static void
+closest_300_word (void)
+{
+ SANE_Word value = 251;
+ SANE_Word info = 0;
+ SANE_Status status;
+
+ status = sanei_constrain_value (&word_array_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+ assert (info == SANE_INFO_INEXACT);
+ assert (value == 300);
+}
+
+
+static void
+exact_400_word (void)
+{
+ SANE_Word value = 400;
+ SANE_Word info = 0;
+ SANE_Status status;
+
+ status = sanei_constrain_value (&word_array_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+ assert (info == 0);
+ assert (value == 400);
+}
+
+/*
+ * constrained int array
+ */
+static void
+min_int_array (void)
+{
+ SANE_Int value[ARRAY_SIZE];
+ SANE_Word info = 0;
+ SANE_Status status;
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE; i++)
+ {
+ value[i] = int_range.min;
+ }
+ status = sanei_constrain_value (&array_opt, value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+ assert (info == 0);
+ for (i = 0; i < ARRAY_SIZE; i++)
+ {
+ assert (value[i] == int_range.min);
+ }
+}
+
+static void
+max_int_array (void)
+{
+ SANE_Int value[ARRAY_SIZE];
+ SANE_Word info = 0;
+ SANE_Status status;
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE; i++)
+ {
+ value[i] = int_range.max;
+ }
+
+ status = sanei_constrain_value (&array_opt, value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+ assert (info == 0);
+ for (i = 0; i < ARRAY_SIZE; i++)
+ {
+ assert (value[i] == int_range.max);
+ }
+}
+
+static void
+below_min_int_array (void)
+{
+ SANE_Int value[ARRAY_SIZE];
+ SANE_Word info = 0;
+ SANE_Status status;
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE; i++)
+ {
+ value[i] = int_range.min - 1;
+ }
+
+ status = sanei_constrain_value (&array_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+ assert (info == SANE_INFO_INEXACT);
+ for (i = 0; i < ARRAY_SIZE; i++)
+ {
+ assert (value[i] == int_range.min);
+ }
+}
+
+/* rounded to lower value */
+static void
+quant1_int_array (void)
+{
+ SANE_Int value[ARRAY_SIZE];
+ SANE_Word info = 0;
+ SANE_Status status;
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE; i++)
+ {
+ value[i] = int_range.min + 1;
+ }
+ status = sanei_constrain_value (&array_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+ assert (info == SANE_INFO_INEXACT);
+ for (i = 0; i < ARRAY_SIZE; i++)
+ {
+ assert (value[i] == int_range.min);
+ }
+}
+
+/* rounded to higher value */
+static void
+quant2_int_array (void)
+{
+ SANE_Int value[ARRAY_SIZE];
+ SANE_Word info = 0;
+ SANE_Status status;
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE; i++)
+ {
+ value[i] = int_range.min + int_range.quant - 1;
+ }
+ status = sanei_constrain_value (&array_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+ assert (info == SANE_INFO_INEXACT);
+ for (i = 0; i < ARRAY_SIZE; i++)
+ {
+ assert (value[i] == int_range.min + int_range.quant);
+ }
+}
+
+static void
+in_range_int_array (void)
+{
+ SANE_Int value[ARRAY_SIZE];
+ SANE_Word info = 0;
+ SANE_Status status;
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE; i++)
+ {
+ value[i] = int_range.min + int_range.quant;
+ }
+
+ status = sanei_constrain_value (&array_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+ assert (info == 0);
+ for (i = 0; i < ARRAY_SIZE; i++)
+ {
+ assert (value[i] == int_range.min + int_range.quant);
+ }
+}
+
+static void
+above_max_int_array (void)
+{
+ SANE_Int value[ARRAY_SIZE];
+ SANE_Word info = 0;
+ SANE_Status status;
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE; i++)
+ {
+ value[i] = int_range.max + 1;
+ }
+ status = sanei_constrain_value (&array_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+ assert (info == SANE_INFO_INEXACT);
+ for (i = 0; i < ARRAY_SIZE; i++)
+ {
+ assert (value[i] == int_range.max);
+ }
+}
+
+static void
+wrong_string_array (void)
+{
+ SANE_Char value[9] = "wrong";
+ SANE_Word info = 0;
+ SANE_Status status;
+
+ status = sanei_constrain_value (&string_array_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_INVAL);
+ assert (info == 0);
+}
+
+
+static void
+none_int (void)
+{
+ SANE_Int value = 555;
+ SANE_Word info = 0;
+ SANE_Status status;
+
+ status = sanei_constrain_value (&none_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+ assert (info == 0);
+}
+
+
+static void
+none_bool_nok (void)
+{
+ SANE_Bool value = 555;
+ SANE_Word info = 0;
+ SANE_Status status;
+
+ status = sanei_constrain_value (&none_bool_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_INVAL);
+ assert (info == 0);
+}
+
+
+static void
+none_bool_ok (void)
+{
+ SANE_Bool value = SANE_FALSE;
+ SANE_Word info = 0;
+ SANE_Status status;
+
+ status = sanei_constrain_value (&none_bool_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+ assert (info == 0);
+}
+
+/**
+ * several partial match
+ */
+static void
+string_array_several (void)
+{
+ SANE_Char value[9] = "Line";
+ SANE_Word info = 0;
+ SANE_Status status;
+
+ status = sanei_constrain_value (&string_array_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_INVAL);
+ assert (info == 0);
+}
+
+/**
+ * unique partial match
+ */
+static void
+partial_string_array (void)
+{
+ SANE_Char value[9] = "Linea";
+ SANE_Word info = 0;
+ SANE_Status status;
+
+ status = sanei_constrain_value (&string_array_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+ assert (info == 0);
+}
+
+static void
+string_array_ignorecase (void)
+{
+ SANE_Char value[9] = "lineart";
+ SANE_Word info = 0;
+ SANE_Status status;
+
+ status = sanei_constrain_value (&string_array_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+ assert (info == 0);
+}
+
+static void
+string_array_ok (void)
+{
+ SANE_Char value[9] = "Lineart";
+ SANE_Word info = 0;
+ SANE_Status status;
+
+ status = sanei_constrain_value (&string_array_opt, &value, &info);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+ assert (info == 0);
+}
+
+/**
+ * run the test suite for sanei constrain related tests
+ */
+static void
+sanei_constrain_suite (void)
+{
+ /* to be compatible with pre-C99 compilers */
+ int_opt.constraint.range = &int_range;
+ fixed_opt.constraint.range = &fixed_range;
+ array_opt.constraint.range = &int_range;
+ word_array_opt.constraint.word_list = dpi_list;
+ string_array_opt.constraint.string_list = string_list;
+
+ /* tests for constrained int value */
+ min_int_value ();
+ max_int_value ();
+ below_min_int_value ();
+ above_max_int_value ();
+ quant1_int_value ();
+ quant2_int_value ();
+ in_range_int_value ();
+
+ /* tests for sane fixed constrained value */
+ min_fixed_value ();
+ max_fixed_value ();
+ below_min_fixed_value ();
+ above_max_fixed_value ();
+ quant1_fixed_value ();
+ quant2_fixed_value ();
+ in_range_fixed_value ();
+
+ /* tests for constrained int array */
+ min_int_array ();
+ max_int_array ();
+ below_min_int_array ();
+ above_max_int_array ();
+ quant1_int_array ();
+ quant2_int_array ();
+ in_range_int_array ();
+
+ /* tests for word lists */
+ above_max_word ();
+ below_max_word ();
+ closest_200_word ();
+ closest_300_word ();
+ exact_400_word ();
+
+ /* tests for string lists */
+ wrong_string_array ();
+ partial_string_array ();
+ string_array_ok ();
+ string_array_ignorecase ();
+ string_array_several ();
+
+ /* constraint none tests */
+ none_int ();
+ none_bool_nok ();
+ none_bool_ok ();
+}
+
+/**
+ * main function to run the test suites
+ */
+int
+main (void)
+{
+ /* run suites */
+ sanei_constrain_suite ();
+
+ return 0;
+}
+
+/* vim: set sw=2 cino=>2se-1sn-1s{s^-1st0(0u0 smarttab expandtab: */