#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);
}
