From: Joel Rosdahl Date: Fri, 16 Jul 2010 12:40:21 +0000 (+0200) Subject: Add CHECK macros for ARGS X-Git-Tag: v3.1~180^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=033d21e329454a93e4a5d3765e3c16c98ae116a7;p=thirdparty%2Fccache.git Add CHECK macros for ARGS --- diff --git a/args.c b/args.c index 81709b8fd..dde787d10 100644 --- a/args.c +++ b/args.c @@ -123,3 +123,41 @@ void args_strip(ARGS *args, const char *prefix) } } } + +/* + * Format args to a space-separated string. Does not quote spaces. Caller + * frees. + */ +char *args_to_string(ARGS *args) +{ + char *result; + char **p; + unsigned size = 0; + int pos; + for (p = args->argv; *p; p++) { + size += strlen(*p) + 1; + } + result = x_malloc(size); + pos = 0; + for (p = args->argv; *p; p++) { + pos += sprintf(&result[pos], "%s ", *p); + } + result[pos - 1] = '\0'; + return result; +} + +/* Returns 1 if args1 equals args2, else 0. */ +int args_equal(ARGS *args1, ARGS *args2) +{ + int i; + if (args1->argc != args2->argc) { + return 0; + } + for (i = 0; i < args1->argc; i++) { + if (strcmp(args1->argv[i], args2->argv[i]) != 0) { + return 0; + } + } + return 1; +} + diff --git a/ccache.h b/ccache.h index 35bfdc605..6c2711ff4 100644 --- a/ccache.h +++ b/ccache.h @@ -165,6 +165,8 @@ void args_add_prefix(ARGS *args, const char *s); void args_pop(ARGS *args, int n); void args_strip(ARGS *args, const char *prefix); void args_remove_first(ARGS *args); +char *args_to_string(ARGS *args); +int args_equal(ARGS *args1, ARGS *args2); int cc_process_args(ARGS *orig_args, diff --git a/test/framework.c b/test/framework.c index 709a8413f..5e01c02ef 100644 --- a/test/framework.c +++ b/test/framework.c @@ -214,3 +214,31 @@ cct_check_str_eq(const char *file, int line, const char *expression, } return result; } + +int +cct_check_args_eq(const char *file, int line, const char *expression, + ARGS *expected, ARGS *actual, int free1, int free2) +{ + int result; + + if (expected && actual && args_equal(actual, expected)) { + cct_check_passed(); + result = 1; + } else { + char *exp_str, *act_str; + exp_str = expected ? args_to_string(expected) : x_strdup("(null)"); + act_str = actual ? args_to_string(actual) : x_strdup("(null)"); + cct_check_failed(file, line, expression, exp_str, act_str); + free(exp_str); + free(act_str); + result = 0; + } + + if (free1) { + args_free(expected); + } + if (free2) { + args_free(actual); + } + return result; +} diff --git a/test/framework.h b/test/framework.h index 2bf0de4c2..1eb66814f 100644 --- a/test/framework.h +++ b/test/framework.h @@ -19,6 +19,7 @@ #ifndef TEST_FRAMEWORK_H #define TEST_FRAMEWORK_H +#include "ccache.h" #include #include @@ -96,6 +97,19 @@ #define CHECK_STR_EQ_FREE12(expected, actual) \ CHECK_POINTER_EQ_BASE(str, expected, actual, 1, 1) +/*****************************************************************************/ + +#define CHECK_ARGS_EQ(expected, actual) \ + CHECK_POINTER_EQ_BASE(args, expected, actual, 0, 0) + +#define CHECK_ARGS_EQ_FREE1(expected, actual) \ + CHECK_POINTER_EQ_BASE(args, expected, actual, 1, 0) + +#define CHECK_ARGS_EQ_FREE2(expected, actual) \ + CHECK_POINTER_EQ_BASE(args, expected, actual, 0, 1) + +#define CHECK_ARGS_EQ_FREE12(expected, actual) \ + CHECK_POINTER_EQ_BASE(args, expected, actual, 1, 1) /*****************************************************************************/ @@ -115,5 +129,7 @@ int cct_check_uns_eq(const char *file, int line, const char *expression, unsigned expected, unsigned actual); int cct_check_str_eq(const char *file, int line, const char *expression, char *expected, char *actual, int free1, int free2); +int cct_check_args_eq(const char *file, int line, const char *expression, + ARGS *expected, ARGS *actual, int free1, int free2); #endif