From a55d3f25a88c3557fc14a71c1b78c01c1972581f Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Tue, 26 May 2009 22:02:48 -0700 Subject: [PATCH] Move datasheet test out of PSPP into a separate binary. When it's not difficult to do so, it is better to put tests in separate binaries instead of in the PSPP binaries, so that the binaries are not burdened with code that is not of real interest to users and to make the main PSPP binaries build faster. --- src/language/command.def | 3 +- src/language/tests/automake.mk | 11 - src/language/tests/check-model.h | 37 --- src/language/tests/check-model.q | 210 ------------------ src/language/tests/datasheet-check.h | 89 -------- src/language/tests/datasheet-test.c | 103 --------- tests/automake.mk | 7 +- tests/command/datasheet.sh | 84 ------- .../data/datasheet-test.c | 153 +++++++++++-- tests/data/datasheet-test.sh | 13 ++ 10 files changed, 155 insertions(+), 555 deletions(-) delete mode 100644 src/language/tests/check-model.h delete mode 100644 src/language/tests/check-model.q delete mode 100644 src/language/tests/datasheet-check.h delete mode 100644 src/language/tests/datasheet-test.c delete mode 100755 tests/command/datasheet.sh rename src/language/tests/datasheet-check.c => tests/data/datasheet-test.c (84%) create mode 100755 tests/data/datasheet-test.sh diff --git a/src/language/command.def b/src/language/command.def index f87747d8..4c8df335 100644 --- a/src/language/command.def +++ b/src/language/command.def @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2006 Free Software Foundation, Inc. + Copyright (C) 2006, 2009 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -132,7 +132,6 @@ DEF_CMD (S_INPUT_PROGRAM, 0, "END INPUT PROGRAM", cmd_end_input_program) DEF_CMD (S_INPUT_PROGRAM, 0, "REREAD", cmd_reread) /* Commands for testing PSPP. */ -DEF_CMD (S_ANY, F_TESTING, "DEBUG DATASHEET", cmd_debug_datasheet) DEF_CMD (S_ANY, F_TESTING, "DEBUG EVALUATE", cmd_debug_evaluate) DEF_CMD (S_ANY, F_TESTING, "DEBUG FORMAT GUESSER", cmd_debug_format_guesser) DEF_CMD (S_ANY, F_TESTING, "DEBUG MOMENTS", cmd_debug_moments) diff --git a/src/language/tests/automake.mk b/src/language/tests/automake.mk index 6268422e..5f025cd5 100644 --- a/src/language/tests/automake.mk +++ b/src/language/tests/automake.mk @@ -1,21 +1,10 @@ ## Process this file with automake to produce Makefile.in -*- makefile -*- -language_tests_built_sources = \ - src/language/tests/check-model.c - language_tests_sources = \ - src/language/tests/check-model.h \ - src/language/tests/datasheet-test.c \ - src/language/tests/datasheet-check.c \ - src/language/tests/datasheet-check.h \ src/language/tests/format-guesser-test.c \ src/language/tests/float-format.c \ src/language/tests/moments-test.c \ src/language/tests/paper-size.c \ src/language/tests/pool-test.c -all_q_sources += $(language_tests_built_sources:.c=.q) -EXTRA_DIST += $(language_tests_built_sources:.c=.q) -CLEANFILES += $(language_tests_built_sources) - EXTRA_DIST += src/language/tests/OChangeLog diff --git a/src/language/tests/check-model.h b/src/language/tests/check-model.h deleted file mode 100644 index 2c93355a..00000000 --- a/src/language/tests/check-model.h +++ /dev/null @@ -1,37 +0,0 @@ -/* PSPP - a program for statistical analysis. - Copyright (C) 2007 Free Software Foundation, Inc. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . */ - -/* PSPP syntax interface to model checker. - - A model checker is a software testing tool. PSPP includes a - generic model checker in libpspp/model-checker.[ch]. This - module layers a PSPP syntax interface on top of the model - checker's options. */ - -#ifndef LANGUAGE_TESTS_CHECK_MODEL -#define LANGUAGE_TESTS_CHECK_MODEL 1 - -#include - -struct lexer; -struct mc_options; -struct mc_results; - -bool check_model (struct lexer *lexer, - struct mc_results *(*checker) (struct mc_options *, void *), - void *aux); - -#endif /* check-model.h */ diff --git a/src/language/tests/check-model.q b/src/language/tests/check-model.q deleted file mode 100644 index f9ab6f2e..00000000 --- a/src/language/tests/check-model.q +++ /dev/null @@ -1,210 +0,0 @@ -/* PSPP - a program for statistical analysis. - Copyright (C) 2007, 2009 Free Software Foundation, Inc. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . */ - -#include -#include - -#include - -#include - -#include -#include - -#include "error.h" -#include "fwriteerror.h" - -#include "gettext.h" -#define _(msgid) gettext (msgid) -#define N_(msgid) msgid - -/* (headers) */ - -/* (specification) - "CHECK MODEL" (chm_): - search=strategy:broad/deep/random, - :mxd(n:max_depth), - :hash(n:hash_bits); - path=integer list; - queue=:limit(n:queue_limit,"%s>0"), - drop:newest/oldest/random; - seed=integer; - stop=:states(n:max_unique_states,"%s>0"), - :errors(n:max_errors), - :timeout(d:time_limit,"%s>0"); - progress=progress:none/dots/fancy/verbose; - output=:verbosity(n:verbosity), - :errverbosity(n:err_verbosity), - :file(s:output_file). -*/ -/* (declarations) */ -/* (functions) */ - -static struct mc_options *parse_options (struct lexer *); - -/* Parses a syntax description of model checker options from - LEXER and passes them, along with AUX, to the CHECKER - function, which must wrap a call to mc_run and return the - mc_results that it returned. This function then prints a - description of the mc_results to the output file. Returns - true if the model checker run found no errors, false - otherwise. */ -bool -check_model (struct lexer *lexer, - struct mc_results *(*checker) (struct mc_options *, void *aux), - void *aux) -{ - struct mc_options *options; - struct mc_results *results; - FILE *output_file; - bool ok; - - options = parse_options (lexer); - if (options == NULL) - return false; - output_file = mc_options_get_output_file (options); - - results = checker (options, aux); - - mc_results_print (results, output_file); - - if (output_file != stdout && output_file != stderr) - { - if (fwriteerror (output_file) < 0) - { - /* We've already discarded the name of the output file. - Oh well. */ - error (0, errno, "error closing output file"); - } - } - - ok = mc_results_get_error_count (results) == 0; - mc_results_destroy (results); - - return ok; -} - -/* Parses options from LEXER and returns a corresponding - mc_options, or a null pointer if parsing fails. */ -static struct mc_options * -parse_options (struct lexer *lexer) -{ - struct cmd_check_model cmd; - struct mc_options *options; - - if (!parse_check_model (lexer, NULL, &cmd, NULL)) - return NULL; - - options = mc_options_create (); - if (cmd.strategy != -1) - mc_options_set_strategy (options, - cmd.strategy == CHM_BROAD ? MC_BROAD - : cmd.strategy == CHM_DEEP ? MC_DEEP - : cmd.strategy == CHM_RANDOM ? MC_RANDOM - : -1); - if (cmd.sbc_path > 0) - { - if (cmd.sbc_search > 0) - msg (SW, _("PATH and SEARCH subcommands are mutually exclusive. " - "Ignoring PATH.")); - else - { - struct subc_list_int *list = &cmd.il_path[0]; - int count = subc_list_int_count (list); - if (count > 0) - { - struct mc_path path; - int i; - - mc_path_init (&path); - for (i = 0; i < count; i++) - mc_path_push (&path, subc_list_int_at (list, i)); - mc_options_set_follow_path (options, &path); - mc_path_destroy (&path); - } - else - msg (SW, _("At least one value must be specified on PATH.")); - } - } - if (cmd.max_depth != LONG_MIN) - mc_options_set_max_depth (options, cmd.max_depth); - if (cmd.hash_bits != LONG_MIN) - { - int hash_bits; - mc_options_set_hash_bits (options, cmd.hash_bits); - hash_bits = mc_options_get_hash_bits (options); - if (hash_bits != cmd.hash_bits) - msg (SW, _("Hash bits adjusted to %d."), hash_bits); - } - if (cmd.queue_limit != LONG_MIN) - mc_options_set_queue_limit (options, cmd.queue_limit); - if (cmd.drop != -1) - { - enum mc_queue_limit_strategy drop - = (cmd.drop == CHM_NEWEST ? MC_DROP_NEWEST - : cmd.drop == CHM_OLDEST ? MC_DROP_OLDEST - : cmd.drop == CHM_RANDOM ? MC_DROP_RANDOM - : -1); - mc_options_set_queue_limit_strategy (options, drop); - } - if (cmd.sbc_search > 0) - mc_options_set_seed (options, cmd.n_seed[0]); - if (cmd.max_unique_states != LONG_MIN) - mc_options_set_max_unique_states (options, cmd.max_unique_states); - if (cmd.max_errors != LONG_MIN) - mc_options_set_max_errors (options, cmd.max_errors); - if (cmd.time_limit != SYSMIS) - mc_options_set_time_limit (options, cmd.time_limit); - if (cmd.verbosity != LONG_MIN) - mc_options_set_verbosity (options, cmd.verbosity); - if (cmd.err_verbosity != LONG_MIN) - mc_options_set_failure_verbosity (options, cmd.err_verbosity); - if (cmd.progress != -1) - { - if (cmd.progress == CHM_NONE) - mc_options_set_progress_usec (options, 0); - else if (cmd.progress == CHM_DOTS) - mc_options_set_progress_func (options, mc_progress_dots); - else if (cmd.progress == CHM_FANCY) - mc_options_set_progress_func (options, mc_progress_fancy); - else if (cmd.progress == CHM_VERBOSE) - mc_options_set_progress_func (options, mc_progress_verbose); - } - if (cmd.output_file != NULL) - { - FILE *output_file = fopen (cmd.output_file, "w"); - if (output_file == NULL) - { - error (0, errno, _("error opening \"%s\" for writing"), - cmd.output_file); - free_check_model (&cmd); - mc_options_destroy (options); - return NULL; - } - mc_options_set_output_file (options, output_file); - } - - - free_check_model (&cmd); - - return options; -} - -/* - Local Variables: - mode: c - End: -*/ diff --git a/src/language/tests/datasheet-check.h b/src/language/tests/datasheet-check.h deleted file mode 100644 index d5a1c096..00000000 --- a/src/language/tests/datasheet-check.h +++ /dev/null @@ -1,89 +0,0 @@ -/* PSPP - a program for statistical analysis. - Copyright (C) 2007, 2009 Free Software Foundation, Inc. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . */ - -#ifndef DATA_DATASHEET_TEST_H -#define DATA_DATASHEET_TEST_H 1 - -#if 0 -#include -#include - -struct casereader; - -/* A datasheet is a 2-d array of data that may be stored in - memory or on disk. It efficiently supports data storage and - retrieval, as well as adding, removing, and rearranging both - rows and columns. */ - -struct datasheet *datasheet_create (struct casereader *); -void datasheet_destroy (struct datasheet *); -struct datasheet *datasheet_rename (struct datasheet *); - -bool datasheet_error (const struct datasheet *); -void datasheet_force_error (struct datasheet *); -const struct taint *datasheet_get_taint (const struct datasheet *); - -struct casereader *datasheet_make_reader (struct datasheet *); - -/* Columns. */ -size_t datasheet_get_column_cnt (const struct datasheet *); -bool datasheet_insert_columns (struct datasheet *, - const union value[], size_t cnt, - size_t before); -void datasheet_delete_columns (struct datasheet *, size_t start, size_t cnt); -void datasheet_move_columns (struct datasheet *, - size_t old_start, size_t new_start, - size_t cnt); - -/* Rows. */ -casenumber datasheet_get_row_cnt (const struct datasheet *); -bool datasheet_insert_rows (struct datasheet *, - casenumber before, struct ccase *rows[], - casenumber cnt); -void datasheet_delete_rows (struct datasheet *, - casenumber first, casenumber cnt); -void datasheet_move_rows (struct datasheet *, - size_t old_start, size_t new_start, - size_t cnt); - -/* Data. */ -struct ccase *datasheet_get_row (const struct datasheet *, casenumber); -bool datasheet_put_row (struct datasheet *, casenumber, struct ccase *); -bool datasheet_get_value (const struct datasheet *, casenumber, size_t column, - union value *, int width); -bool datasheet_put_value (struct datasheet *, casenumber, size_t column, - const union value *, int width); - -#endif - -/* Testing. */ -struct mc_options; - -struct datasheet_test_params - { - /* Parameters. */ - int max_rows; - int max_cols; - int backing_rows; - int backing_cols; - - /* State. */ - int next_value; - }; - -struct mc_results *datasheet_test (struct mc_options *options, void *params); - -#endif /* data/datasheet.h */ diff --git a/src/language/tests/datasheet-test.c b/src/language/tests/datasheet-test.c deleted file mode 100644 index dfe8b6b2..00000000 --- a/src/language/tests/datasheet-test.c +++ /dev/null @@ -1,103 +0,0 @@ -/* PSPP - a program for statistical analysis. - Copyright (C) 2007 Free Software Foundation, Inc. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . */ - -#include - -#include "datasheet-check.h" - -#include -#include -#include -#include -#include - -#include "error.h" -#include "xalloc.h" - -static bool parse_coordinates (struct lexer *, int *rows, int *cols); - -/* Parses and executes the DEBUG DATASHEET command, which runs - the model checker on the datasheet data structure. The - command may include a specification of the form - MAX=(ROWS,COLS) to specify the maximum size of the data sheet - during the model checker run (default: 4x4) or - BACKING=(ROWS,COLS) to specify the size of the casereader - backing the datasheet (default: no backing). These may be - optionally followed by any of the common model checker option - specifications (see check-model.q). */ -int -cmd_debug_datasheet (struct lexer *lexer, struct dataset *dataset UNUSED) -{ - struct datasheet_test_params params; - bool ok; - - params.max_rows = 4; - params.max_cols = 4; - params.backing_rows = 0; - params.backing_cols = 0; - - - for (;;) - { - if (lex_match_id (lexer, "MAX")) - { - if (!parse_coordinates (lexer, ¶ms.max_rows, ¶ms.max_cols)) - return CMD_FAILURE; - } - else if (lex_match_id (lexer, "BACKING")) - { - if (!parse_coordinates (lexer, - ¶ms.backing_rows, ¶ms.backing_cols)) - return CMD_FAILURE; - } - else - break; - lex_match (lexer, '/'); - } - - ok = check_model (lexer, datasheet_test, ¶ms); - printf ("Datasheet test max(%d,%d) backing(%d,%d) %s.\n", - params.max_rows, params.max_cols, - params.backing_rows, params.backing_cols, - ok ? "successful" : "failed"); - return ok ? lex_end_of_command (lexer) : CMD_FAILURE; -} - -/* Parses a pair of coordinates with the syntax =(ROWS,COLS), - where all of the delimiters are optional, into *ROWS and - *COLS. Returns true if successful, false on parse failure. */ -static bool -parse_coordinates (struct lexer *lexer, int *rows, int *cols) -{ - lex_match (lexer, '='); - lex_match (lexer, '('); - - if (!lex_force_int (lexer)) - return false; - *rows = lex_integer (lexer); - lex_get (lexer); - - lex_match (lexer, ','); - - if (!lex_force_int (lexer)) - return false; - *cols = lex_integer (lexer); - lex_get (lexer); - - lex_match (lexer, ')'); - return true; -} - diff --git a/tests/automake.mk b/tests/automake.mk index 0dbfcc60..7dda26df 100644 --- a/tests/automake.mk +++ b/tests/automake.mk @@ -16,7 +16,6 @@ dist_TESTS = \ tests/command/beg-data.sh \ tests/command/bignum.sh \ tests/command/count.sh \ - tests/command/datasheet.sh \ tests/command/data-list.sh \ tests/command/do-if.sh \ tests/command/do-repeat.sh \ @@ -151,6 +150,7 @@ dist_TESTS = \ tests/bugs/temp-freq.sh \ tests/bugs/print-crash.sh \ tests/bugs/keep-all.sh \ + tests/data/datasheet-test.sh \ tests/libpspp/sparse-xarray-test.sh \ tests/output/paper-size.sh \ tests/xforms/recode.sh \ @@ -194,9 +194,14 @@ TESTS = $(dist_TESTS) $(nodist_TESTS) check_PROGRAMS += \ $(nodist_TESTS) \ + tests/data/datasheet-test \ tests/formats/inexactify \ tests/libpspp/sparse-xarray-test +tests_data_datasheet_test_SOURCES = \ + tests/data/datasheet-test.c +tests_data_datasheet_test_LDADD = src/libpspp-core.la @LIBINTL@ + tests_libpspp_ll_test_SOURCES = \ src/libpspp/ll.c \ src/libpspp/ll.h \ diff --git a/tests/command/datasheet.sh b/tests/command/datasheet.sh deleted file mode 100755 index 2ad30d73..00000000 --- a/tests/command/datasheet.sh +++ /dev/null @@ -1,84 +0,0 @@ -#!/bin/sh - -# This program tests datasheet support. - -TEMPDIR=/tmp/pspp-tst-$$ -TESTFILE=$TEMPDIR/`basename $0`.sps - -# ensure that top_builddir are absolute -if [ -z "$top_builddir" ] ; then top_builddir=. ; fi -if [ -z "$top_srcdir" ] ; then top_srcdir=. ; fi -top_builddir=`cd $top_builddir; pwd` -PSPP=$top_builddir/src/ui/terminal/pspp - -# ensure that top_srcdir is absolute -top_srcdir=`cd $top_srcdir; pwd` - -STAT_CONFIG_PATH=$top_srcdir/config -export STAT_CONFIG_PATH - -LANG=C -export LANG - -cleanup() -{ - if [ x"$PSPP_TEST_NO_CLEANUP" != x ] ; then - echo "NOT cleaning $TEMPDIR" - return ; - fi - cd / - rm -rf $TEMPDIR -} - - -fail() -{ - echo $activity - echo FAILED - cleanup; - exit 1; -} - - -no_result() -{ - echo $activity - echo NO RESULT; - cleanup; - exit 2; -} - -pass() -{ - cleanup; - exit 0; -} - -mkdir -p $TEMPDIR - -cd $TEMPDIR - -activity="Create File 1" -cat > $TESTFILE < datasheet.out -if [ $? -ne 0 ] ; then no_result ; fi - -activity="compare results" -diff -b $TEMPDIR/datasheet.out - < #include -#include "datasheet-check.h" #include #include @@ -26,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -37,9 +37,9 @@ #include #include "minmax.h" +#include "progname.h" #include "xalloc.h" - /* lazy_casereader callback function to instantiate a casereader from the datasheet. */ static struct casereader * @@ -55,6 +55,18 @@ lazy_callback (void *ds_) #define MAX_ROWS 5 #define MAX_COLS 5 +/* Test params. */ +struct datasheet_test_params + { + /* Parameters. */ + int max_rows; /* Maximum number of rows. */ + int max_cols; /* Maximum number of columns. */ + int backing_rows; /* Number of rows of backing store. */ + int backing_cols; /* Number of columns of backing store. */ + + /* State. */ + int next_value; + }; static bool check_caseproto (struct mc *mc, const struct caseproto *benchmark, @@ -662,18 +674,81 @@ datasheet_mc_destroy (const struct mc *mc UNUSED, void *ds_) struct datasheet *ds = ds_; datasheet_destroy (ds); } + +enum + { + OPT_MAX_ROWS, + OPT_MAX_COLUMNS, + OPT_BACKING_ROWS, + OPT_BACKING_COLUMNS, + OPT_HELP, + N_DATASHEET_OPTIONS + }; + +static struct argv_option datasheet_argv_options[N_DATASHEET_OPTIONS] = + { + {"max-rows", 0, required_argument, OPT_MAX_ROWS}, + {"max-columns", 0, required_argument, OPT_MAX_COLUMNS}, + {"backing-rows", 0, required_argument, OPT_BACKING_ROWS}, + {"backing-columns", 0, required_argument, OPT_BACKING_COLUMNS}, + {"help", 'h', no_argument, OPT_HELP}, + }; + +static void usage (void); -/* Executes the model checker on the datasheet test driver with - the given OPTIONS and passing in the given PARAMS, which must - point to a modifiable "struct datasheet_test_params". If any - value in PARAMS is out of range, it will be adjusted into the - valid range before running the test. - - Returns the results of the model checking run. */ -struct mc_results * -datasheet_test (struct mc_options *options UNUSED, void *params_ UNUSED) +static void +datasheet_option_callback (int id, void *params_) { struct datasheet_test_params *params = params_; + switch (id) + { + case OPT_MAX_ROWS: + params->max_rows = atoi (optarg); + break; + + case OPT_MAX_COLUMNS: + params->max_cols = atoi (optarg); + break; + + case OPT_BACKING_ROWS: + params->backing_rows = atoi (optarg); + break; + + case OPT_BACKING_COLUMNS: + params->backing_cols = atoi (optarg); + break; + + case OPT_HELP: + usage (); + break; + + default: + NOT_REACHED (); + } +} + +static void +usage (void) +{ + printf ("%s, for testing the datasheet implementation.\n" + "Usage: %s [OPTION]...\n" + "\nTest state space parameters (min...max, default):\n" + " --max-rows=N Maximum number of rows (0...5, 3)\n" + " --max-rows=N Maximum number of columns (0...5, 3)\n" + " --backing-rows=N Rows of backing store (0...max_rows, 0)\n" + " --backing-columns=N Columns of backing store (0...max_cols, 0)\n", + program_name, program_name); + mc_options_usage (); + fputs ("\nOther options:\n" + " --help Display this help message\n" + "\nReport bugs to \n", + stdout); + exit (0); +} + +int +main (int argc, char *argv[]) +{ static const struct mc_class datasheet_mc_class = { datasheet_mc_init, @@ -681,12 +756,54 @@ datasheet_test (struct mc_options *options UNUSED, void *params_ UNUSED) datasheet_mc_destroy, }; - params->next_value = 1; - params->max_rows = MIN (params->max_rows, MAX_ROWS); - params->max_cols = MIN (params->max_cols, MAX_COLS); - params->backing_rows = MIN (params->backing_rows, params->max_rows); - params->backing_cols = MIN (params->backing_cols, params->max_cols); + struct datasheet_test_params params; + struct mc_options *options; + struct mc_results *results; + struct argv_parser *parser; + int verbosity; + bool success; + + set_program_name (argv[0]); + + /* Default parameters. */ + params.max_rows = 3; + params.max_cols = 3; + params.backing_rows = 0; + params.backing_cols = 0; + params.next_value = 1; + + /* Parse comand line. */ + parser = argv_parser_create (); + options = mc_options_create (); + mc_options_register_argv_parser (options, parser); + argv_parser_add_options (parser, datasheet_argv_options, N_DATASHEET_OPTIONS, + datasheet_option_callback, ¶ms); + if (!argv_parser_run (parser, argc, argv)) + exit (EXIT_FAILURE); + argv_parser_destroy (parser); + verbosity = mc_options_get_verbosity (options); + + /* Force parameters into allowed ranges. */ + params.max_rows = MIN (params.max_rows, MAX_ROWS); + params.max_cols = MIN (params.max_cols, MAX_COLS); + params.backing_rows = MIN (params.backing_rows, params.max_rows); + params.backing_cols = MIN (params.backing_cols, params.max_cols); + mc_options_set_aux (options, ¶ms); + results = mc_run (&datasheet_mc_class, options); + + /* Output results. */ + success = (mc_results_get_stop_reason (results) != MC_MAX_ERROR_COUNT + && mc_results_get_stop_reason (results) != MC_INTERRUPTED); + if (verbosity > 0 || !success) + { + printf ("Parameters: " + "--max-rows=%d --max-columns=%d " + "--backing-rows=%d --backing-columns=%d\n\n", + params.max_rows, params.max_cols, + params.backing_rows, params.backing_cols); + mc_results_print (results, stdout); + } + mc_results_destroy (results); - mc_options_set_aux (options, params); - return mc_run (&datasheet_mc_class, options); + return success ? 0 : EXIT_FAILURE; } diff --git a/tests/data/datasheet-test.sh b/tests/data/datasheet-test.sh new file mode 100755 index 00000000..42bb8bac --- /dev/null +++ b/tests/data/datasheet-test.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +# This program tests the datasheet implementation. + +set -e + +: ${top_builddir:=.} +RUN_TEST="${top_builddir}/tests/data/datasheet-test --verbosity=0" + +$RUN_TEST --max-rows=3 --max-columns=3 --backing-rows=0 --backing-columns=0 +$RUN_TEST --max-rows=3 --max-columns=3 --backing-rows=3 --backing-columns=3 +$RUN_TEST --max-rows=3 --max-columns=3 --backing-rows=3 --backing-columns=1 +$RUN_TEST --max-rows=3 --max-columns=3 --backing-rows=1 --backing-columns=3 -- 2.30.2