From 189cb50426fc12b55a79c67a00064623ec964383 Mon Sep 17 00:00:00 2001 From: Not Zed Date: Fri, 24 Nov 2000 03:54:55 +0000 Subject: Added at least some explanation of all this stuff. 2000-11-24 Not Zed * tests/README: Added at least some explanation of all this stuff. * tests/lib/camel-test.h (check_msg): Added a non-gcc version of the fail command, we dont get the expression that failed, but no matter. Should be (more) portable now. (check, check_msg): Put the file/lineno in the default message. svn path=/trunk/; revision=6657 --- camel/ChangeLog | 7 +++++++ camel/tests/README | 38 ++++++++++++++++++++++++++++++++++++++ camel/tests/lib/camel-test.c | 20 ++++++++++++-------- camel/tests/lib/camel-test.h | 24 ++++++++++++++++++++---- 4 files changed, 77 insertions(+), 12 deletions(-) create mode 100644 camel/tests/README (limited to 'camel') diff --git a/camel/ChangeLog b/camel/ChangeLog index 6e8fb27fd8..b4b3ca8015 100644 --- a/camel/ChangeLog +++ b/camel/ChangeLog @@ -1,5 +1,12 @@ 2000-11-24 Not Zed + * tests/README: Added at least some explanation of all this stuff. + + * tests/lib/camel-test.h (check_msg): Added a non-gcc version of + the fail command, we dont get the expression that failed, but no + matter. Should be (more) portable now. + (check, check_msg): Put the file/lineno in the default message. + * Makefile.am (SUBDIRS): Add tests. * camel-mime-filter-basic.c (filter): Well, I'll add the extra diff --git a/camel/tests/README b/camel/tests/README new file mode 100644 index 0000000000..e9262541b4 --- /dev/null +++ b/camel/tests/README @@ -0,0 +1,38 @@ + +This directory is to contain regression tests that should be run +before committing anything to camel. + +To write a new test: copy an existing one and replace the contents. + +See camel-test.h for a number of functions and macros which setup and +define the test environmet, and help provide meaningful messages when +something actually fails. + +All tests have the following options: + -v[vvvv] + verbose. more v's more verbose. 2 v's will give you + a simple test backtrace of any partially failed tests. + No v's give you a simple backtrace of any failed tests. + -q + quiet. Dont print anything, unless there is a SEGV. + +See the other files in lib/* for utility functions that help to +write the tests (object comparison, creation, etc functions). + +Tests may fail and be non-fatal. In this case, you will see "Partial +success" on the result of each test line. To get more information +about the test, run the test manually with a -v command line argument. +The more v's you have the more detail you get (upto about -vvvvv), +generally use -vv to find out which parts of a partially successful +test failed, and where. + +Note that if writing tests, non-fatal tests (bracketed by a +camel_test_nonfatal() and camel_test_fatal() pair) should only be +defined where: 1. The test in question should ideally pass, and 2. The +code has known limitations currently that stop it passing, but +otherwise works for nominal input. + +To debug tests, set a breakpoint on camel_test_fail, which will be +called for any failure, even a non-fatal one. + + Michael diff --git a/camel/tests/lib/camel-test.c b/camel/tests/lib/camel-test.c index b60ba1fb34..a913ad78a4 100644 --- a/camel/tests/lib/camel-test.c +++ b/camel/tests/lib/camel-test.c @@ -18,7 +18,7 @@ int camel_test_verbose; static void die(int sig) { - static indie = 0; + static int indie = 0; struct _stack *node; if (!indie) { @@ -118,17 +118,23 @@ void camel_test_pull(void) void camel_test_fail(const char *why, ...) { - struct _stack *node; va_list ap; - char *text; va_start(ap, why); - text = g_strdup_vprintf(why, ap); + camel_test_failv(why, ap); va_end(ap); +} + +void camel_test_failv(const char *why, va_list ap) +{ + struct _stack *node; + char *text; + + text = g_strdup_vprintf(why, ap); if ((nonfatal == NULL && camel_test_verbose > 0) || (nonfatal && camel_test_verbose > 1)) { - printf("Failed: %s\n", text); + printf("Failed.\n%s\n", text); } g_free(text); @@ -174,8 +180,7 @@ void camel_test_nonfatal(const char *why, ...) nonfatal = node; } -/* dont ask me why but the compiler just can't seem to find the prototypes for this */ -void camel_test_fatal() +void camel_test_fatal(void) { struct _stack *node; @@ -209,7 +214,6 @@ void camel_test_end(void) int string_equal(const char *a, const char *b) { const char *ap, *bp; - int cmp; ap = a; bp = b; diff --git a/camel/tests/lib/camel-test.h b/camel/tests/lib/camel-test.h index 8d3c94bd00..6ff8281aeb 100644 --- a/camel/tests/lib/camel-test.h +++ b/camel/tests/lib/camel-test.h @@ -6,9 +6,25 @@ #include #include +void camel_test_failv(const char *why, va_list ap); + /* perform a check assertion */ -#define check(x) do {if (!(x)) { camel_test_fail("%s", #x); } } while (0) -#define check_msg(x, y, z...) do {if (!(x)) { camel_test_fail("%s\n\t" #y, #x, ##z); } } while (0) +#define check(x) do {if (!(x)) { camel_test_fail("%s (%d): %s", __FILE__, __LINE__, #x); } } while (0) +/* check with message */ +#ifdef __GNUC__ +#define check_msg(x, y, z...) do {if (!(x)) { camel_test_fail("%s (%d): %s\n\t" #y, __FILE__, __LINE__, #x, ##z); } } while (0) +#else +static void check_msg(int truth, char *fmt, ...) +{ + /* no gcc, we lose the condition that failed, nm */ + if (!truth) { + va_list ap; + va_start(ap, fmt); + camel_test_failv(fmt, ap); + va_end(ap); + } +} +#endif #define check_count(object, expected) do { \ if (CAMEL_OBJECT(object)->ref_count != expected) { \ @@ -41,11 +57,11 @@ void camel_test_pull(void); /* fail a test, with a reason why */ void camel_test_fail(const char *why, ...); +void camel_test_failv(const char *why, va_list ap); /* Set whether a failed test quits. May be nested, but must be called in nonfatal/fatal pairs */ void camel_test_nonfatal(const char *why, ...); -void camel_test_fatal(); - +void camel_test_fatal(void); /* utility functions */ /* compare strings, ignore whitespace though */ -- cgit v1.2.3