Add CHECK macros for ARGS

This commit is contained in:
Joel Rosdahl 2010-07-16 14:40:21 +02:00
parent 0fa05736bb
commit 033d21e329
4 changed files with 84 additions and 0 deletions

38
args.c
View File

@ -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;
}

View File

@ -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,

View File

@ -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;
}

View File

@ -19,6 +19,7 @@
#ifndef TEST_FRAMEWORK_H
#define TEST_FRAMEWORK_H
#include "ccache.h"
#include <string.h>
#include <stdlib.h>
@ -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