From 9a082140b9331ade729893e2d1e352e90dc6cba5 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Sun, 18 Oct 2015 21:10:58 +1100 Subject: [PATCH] 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 --- ccan/order/order.h | 3 ++ ccan/order/test/fancy_cmp.h | 2 +- ccan/order/test/run-fancy.c | 68 +++++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 ccan/order/test/run-fancy.c diff --git a/ccan/order/order.h b/ccan/order/order.h index edceab55..23f030b2 100644 --- a/ccan/order/order.h +++ b/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 *); \ diff --git a/ccan/order/test/fancy_cmp.h b/ccan/order/test/fancy_cmp.h index b7940377..a3e513d9 100644 --- a/ccan/order/test/fancy_cmp.h +++ b/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, diff --git a/ccan/order/test/run-fancy.c b/ccan/order/test/run-fancy.c new file mode 100644 index 00000000..be5ff3f2 --- /dev/null +++ b/ccan/order/test/run-fancy.c @@ -0,0 +1,68 @@ +#include +#include +#include + +#include + +#include + +#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); +} -- 2.39.2