kopia lustrzana https://gitlab.com/sane-project/backends
657 wiersze
13 KiB
C
657 wiersze
13 KiB
C
#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 constraint */
|
|
static const SANE_Range int_range = {
|
|
3, /* minimum */
|
|
18, /* maximum */
|
|
3 /* 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}
|
|
};
|
|
|
|
#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);
|
|
}
|
|
|
|
|
|
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;
|
|
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 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 non 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: */
|