#include "test-lib.h"
#include "object.h"
#include "decorate.h"
#include "repository.h"

struct test_vars {
	struct object *one, *two, *three;
	struct decoration n;
	int decoration_a, decoration_b;
};

static void t_add(struct test_vars *vars)
{
	void *ret = add_decoration(&vars->n, vars->one, &vars->decoration_a);

	if (!check(ret == NULL))
		test_msg("when adding a brand-new object, NULL should be returned");
	ret = add_decoration(&vars->n, vars->two, NULL);
	if (!check(ret == NULL))
		test_msg("when adding a brand-new object, NULL should be returned");
}

static void t_readd(struct test_vars *vars)
{
	void *ret = add_decoration(&vars->n, vars->one, NULL);

	if (!check(ret == &vars->decoration_a))
		test_msg("when readding an already existing object, existing decoration should be returned");
	ret = add_decoration(&vars->n, vars->two, &vars->decoration_b);
	if (!check(ret == NULL))
		test_msg("when readding an already existing object, existing decoration should be returned");
}

static void t_lookup(struct test_vars *vars)
{
	void *ret = lookup_decoration(&vars->n, vars->one);

	if (!check(ret == NULL))
		test_msg("lookup should return added declaration");
	ret = lookup_decoration(&vars->n, vars->two);
	if (!check(ret == &vars->decoration_b))
		test_msg("lookup should return added declaration");
	ret = lookup_decoration(&vars->n, vars->three);
	if (!check(ret == NULL))
		test_msg("lookup for unknown object should return NULL");
}

static void t_loop(struct test_vars *vars)
{
	int i, objects_noticed = 0;

	for (i = 0; i < vars->n.size; i++) {
		if (vars->n.entries[i].base)
			objects_noticed++;
	}
	if (!check_int(objects_noticed, ==, 2))
		test_msg("should have 2 objects");
}

int cmd_main(int argc UNUSED, const char **argv UNUSED)
{
	struct object_id one_oid = { { 1 } }, two_oid = { { 2 } }, three_oid = { { 3 } };
	struct test_vars vars = { 0 };

	vars.one = lookup_unknown_object(the_repository, &one_oid);
	vars.two = lookup_unknown_object(the_repository, &two_oid);
	vars.three = lookup_unknown_object(the_repository, &three_oid);

	TEST(t_add(&vars),
	     "Add 2 objects, one with a non-NULL decoration and one with a NULL decoration.");
	TEST(t_readd(&vars),
	     "When re-adding an already existing object, the old decoration is returned.");
	TEST(t_lookup(&vars),
	     "Lookup returns the added declarations, or NULL if the object was never added.");
	TEST(t_loop(&vars), "The user can also loop through all entries.");

	clear_decoration(&vars.n, NULL);

	return test_done();
}
