Browse Source

order: total_order_cmp() helper and better tests

Add a wrapper macro total_order_cmp() to more conveniently use the
total_order structures.  Add some tests for it, which also improve tests
the "fancy_cmp" function.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson 10 years ago
parent
commit
9a082140b9
3 changed files with 72 additions and 1 deletions
  1. 3 0
      ccan/order/order.h
  2. 1 1
      ccan/order/test/fancy_cmp.h
  3. 68 0
      ccan/order/test/run-fancy.c

+ 3 - 0
ccan/order/order.h

@@ -31,6 +31,9 @@ struct _total_order {
 		_ctx ctx;				\
 	} _name
 
+#define total_order_cmp(_order, _a, _b)					\
+	((_order).cb((_a), (_b), (_order).ctx))
+
 #define _DECL_ONAME(_oname, _itype)					\
 	extern int _order_##_oname(const void *, const void *, void *);	\
 	extern int order_##_oname(const _itype *, const _itype *, void *); \

+ 1 - 1
ccan/order/test/fancy_cmp.h

@@ -8,7 +8,7 @@ struct cmp_info {
 
 struct item {
 	unsigned value;
-	char *str;
+	const char *str;
 };
 
 static inline int fancy_cmp(const struct item *a, const struct item *b,

+ 68 - 0
ccan/order/test/run-fancy.c

@@ -0,0 +1,68 @@
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <ccan/order/order.h>
+
+#include <ccan/tap/tap.h>
+
+#include "fancy_cmp.h"
+
+int main(int argc, char *argv[])
+{
+	struct item item1 = {
+		.value = 0,
+		.str = "aaa",
+	};
+	struct item item2 = {
+		.value = 0,
+		.str = "abb",
+	};
+	struct item item3 = {
+		.value = 0x1000,
+		.str = "baa",
+	};
+	struct cmp_info ctx1 = {
+		.xcode = 0,
+		.offset = 0,
+	};
+	struct cmp_info ctx2 = {
+		.xcode = 0x1000,
+		.offset = 1,
+	};
+	total_order(order1, struct item, struct cmp_info *) = {
+		fancy_cmp, &ctx1,
+	};
+	total_order(order2, struct item, struct cmp_info *) = {
+		fancy_cmp, &ctx2,
+	};
+
+	plan_tests(18);
+
+	ok1(total_order_cmp(order1, &item1, &item1) == 0);
+	ok1(total_order_cmp(order1, &item2, &item2) == 0);
+	ok1(total_order_cmp(order1, &item3, &item3) == 0);
+
+	ok1(total_order_cmp(order1, &item1, &item2) == -1);
+	ok1(total_order_cmp(order1, &item2, &item3) == -1);
+	ok1(total_order_cmp(order1, &item1, &item3) == -1);
+
+	ok1(total_order_cmp(order1, &item2, &item1) == 1);
+	ok1(total_order_cmp(order1, &item3, &item2) == 1);
+	ok1(total_order_cmp(order1, &item3, &item1) == 1);
+
+
+	ok1(total_order_cmp(order2, &item1, &item1) == 0);
+	ok1(total_order_cmp(order2, &item2, &item2) == 0);
+	ok1(total_order_cmp(order2, &item3, &item3) == 0);
+
+	ok1(total_order_cmp(order2, &item1, &item2) == 1);
+	ok1(total_order_cmp(order2, &item2, &item3) == 1);
+	ok1(total_order_cmp(order2, &item1, &item3) == 1);
+
+	ok1(total_order_cmp(order2, &item2, &item1) == -1);
+	ok1(total_order_cmp(order2, &item3, &item2) == -1);
+	ok1(total_order_cmp(order2, &item3, &item1) == -1);
+	
+	exit(0);
+}