}
}
}
+
+/*
+ * 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;
+}
+
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,
}
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;
+}
#ifndef TEST_FRAMEWORK_H
#define TEST_FRAMEWORK_H
+#include "ccache.h"
#include <string.h>
#include <stdlib.h>
#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)
/*****************************************************************************/
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