]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
Add CHECK macros for ARGS
authorJoel Rosdahl <joel@rosdahl.net>
Fri, 16 Jul 2010 12:40:21 +0000 (14:40 +0200)
committerJoel Rosdahl <joel@rosdahl.net>
Fri, 16 Jul 2010 12:40:21 +0000 (14:40 +0200)
args.c
ccache.h
test/framework.c
test/framework.h

diff --git a/args.c b/args.c
index 81709b8fd6f01b0fb4c150dcdd44701dc41a1a96..dde787d10817ecad13eb9d78a2c6ca51d31c3d99 100644 (file)
--- 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;
+}
+
index 35bfdc605bab1ced7c548502ce10c1a5501f2aef..6c2711ff4ae3a8e8b059f629697563a6ea9aee16 100644 (file)
--- 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,
index 709a8413f50c91f3f71c2f88bfb9c20c7d25cd1c..5e01c02ef248ebe9e7d6892b952e47cb973d493d 100644 (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;
+}
index 2bf0de4c28fa82f456580d8d2fd3284dcff9b760..1eb66814fbec6394067c6f1d129159803055345b 100644 (file)
@@ -19,6 +19,7 @@
 #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)
 
 /*****************************************************************************/
 
@@ -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