gnucash/common/test-core/test-stuff.c
Geert Janssens 1238b9d8cd Prevent gcc from searching config.h in the current directory
This will avoid a ninja-build from picking up a config.h generated by the autotools build
(in the root build directory). Picking up the wrong config.h may lead to all kinds of
subtle issues if the autotools run was done with different options than the cmake run.
2017-10-26 14:05:17 +02:00

398 lines
7.9 KiB
C

/*
* Created 20010320 by bstanley to hold only those
* testing functions which are independent of the rest of
* the GNUCash system.
*
* This allows me to compile simple test programs standalone...
*
*/
/********************************************************************\
* 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 2 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, contact: *
* *
* Free Software Foundation Voice: +1-617-542-5942 *
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
* Boston, MA 02110-1301, USA gnu@gnu.org *
* *
\********************************************************************/
#include <config.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <glib.h>
#include <glib/gprintf.h>
#include "test-stuff.h"
void vsuccess_args(
const char *test_title,
const char *file,
int line,
const char *format,
va_list ap);
void vfailure_args(
const char *test_title,
const char *file,
int line,
const char *format,
va_list ap);
static guint successes;
static guint failures;
static gboolean success_should_print = FALSE;
void
success_call(
const char *test_title,
const char* file,
int line )
{
success_args( test_title, file, line, "" );
}
void
success_args(
const char *test_title,
const char *file,
int line,
const char *format,
... )
{
va_list ap;
va_start(ap, format);
vsuccess_args( test_title, file, line, format, ap );
va_end(ap);
}
void
vsuccess_args(
const char *test_title,
const char *file,
int line,
const char *format,
va_list ap)
{
if ( success_should_print )
{
printf("SUCCESS: %s, %s:%d ", test_title, file, line );
vprintf(format, ap);
printf("\n");
fflush(stdout);
}
++successes;
}
void
failure_call(
const char *test_title,
const char *file,
int line)
{
failure_args( test_title, file, line, "" );
}
void
failure_args(
const char *test_title,
const char *file,
int line,
const char *format,
... )
{
va_list ap;
va_start(ap, format);
vfailure_args( test_title, file, line, format, ap );
va_end(ap);
}
void
vfailure_args(
const char *test_title,
const char* file,
int line,
const char *format,
va_list ap)
{
printf("FAILURE %s %s:%d ", test_title, file, line );
vprintf(format, ap);
printf("\n");
fflush(stdout);
++failures;
}
int
get_rv(void)
{
return failures;
}
gboolean
do_test_call(gboolean result, const char* test_title, const char* filename,
int line )
{
if (result)
success_args( test_title, filename, line, "" );
else
failure_args( test_title, filename, line, "" );
return result;
}
gboolean
do_test_args(
gboolean result,
const char* test_title,
const char* filename,
int line,
const char* format,
... )
{
va_list ap;
va_start(ap, format);
if ( result )
{
vsuccess_args( test_title, filename, line, format, ap );
}
else
{
vfailure_args( test_title, filename, line, format, ap );
}
va_end(ap);
return result;
}
void
print_test_results(void)
{
guint total = successes + failures;
if ( total == 1 )
{
printf( "Executed 1 test." );
}
else
{
printf("Executed %d tests.", successes + failures );
}
if ( failures )
{
if ( failures == 1 )
{
printf(" There was 1 failure." );
}
else
{
printf(" There were %d failures.", failures );
}
}
else
{
printf(" All tests passed.");
}
printf("\n");
fflush(stdout);
}
void
set_success_print( gboolean in_should_print )
{
success_should_print = in_should_print;
}
gboolean
get_random_boolean(void)
{
return get_random_int_in_range (0, 1);
}
gint
get_random_int_in_range(int start, int end)
{
return CLAMP (start + (int)((double)(end - start + 1) * rand() /
(RAND_MAX + 1.0)),
start,
end);
}
static char *random_chars = NULL;
static char plain_chars[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"1234567890"
" ";
static char funky_chars[] =
",.'\"`~!@#$%^*(){}[]/=?+-_\\|"
"<>&"
"\n\t";
static int rcend = 0;
void
random_character_include_funky_chars (gboolean use_funky_chars)
{
g_free (random_chars);
if (use_funky_chars)
random_chars = g_strconcat (plain_chars, funky_chars, NULL);
else
random_chars = g_strdup (plain_chars);
rcend = strlen (random_chars) - 1;
}
gchar
get_random_character(void)
{
if (!rcend)
random_character_include_funky_chars (TRUE);
return random_chars[get_random_int_in_range(0, rcend)];
}
gchar *
get_random_string_length_in_range(int minlen, int maxlen)
{
gchar *ret;
int i, len = get_random_int_in_range(minlen, maxlen);
ret = g_new0(gchar, len);
for (i = 0; i < len - 1; i++)
ret[i] = get_random_character ();
return g_strstrip(ret);
}
gchar *
get_random_string_without(const char *exclude_chars)
{
gchar *ret;
int len;
int i;
switch (get_random_int_in_range(0, 9))
{
/* case 0: */
/* return ""; */
/* case 1: */
/* return NULL; */
/* case 2: */
/* len = get_random_int_in_range(1000, 5000); */
/* break; */
case 3:
len = get_random_int_in_range(100, 500);
break;
default:
len = get_random_int_in_range(5, 20);
break;
}
ret = g_new0(gchar, len);
for (i = 0; i < len - 1; i++)
{
char c;
do
{
c = get_random_character ();
}
while (exclude_chars && strchr (exclude_chars, c));
ret[i] = c;
}
return g_strstrip (ret);
}
gchar *
get_random_string(void)
{
return get_random_string_without (NULL);
}
gint32
get_random_gint32 (void)
{
gint32 ret = 0;
if (RAND_MAX > (1 << 15))
return rand ();
if (RAND_MAX > (1 << 7))
{
ret = rand ();
ret <<= 16;
ret += rand ();
return ret;
}
ret = rand ();
ret <<= 8;
ret += rand ();
ret <<= 8;
ret += rand ();
ret <<= 8;
ret += rand ();
return ret;
}
gint64
get_random_gint64(void)
{
gint64 ret = 0;
ret = get_random_gint32 ();
ret <<= 32;
ret += get_random_gint32 ();
return ret;
}
double
get_random_double(void)
{
double d;
guint i;
i = (guint)get_random_int_in_range(8, 13);
/* using 0.9 and 7 increases chances of getting lots of decimals */
d = ((double)get_random_int_in_range(8, 999999) * i * 0.9 / 7);
return d;
}
const char*
get_random_string_in_array(const char* str_list[])
{
int num;
/* count number of items in list */
for (num = 0; str_list[num] != NULL; num++)
;
num = get_random_int_in_range(0, num - 1);
return str_list[num];
}