#include "../src/fchash.c"
#include "../src/fcstr.c"

FcChar8 *
FcLangNormalize (const FcChar8 *lang)
{
    return NULL;
}

FcChar8 *
FcConfigHome (void)
{
    return NULL;
}

typedef struct _Test
{
    FcHashTable *table;
} Test;

static Test *
init (void)
{
    Test *ret;

    ret = malloc (sizeof (Test));
    if (ret)
    {
	ret->table = FcHashTableCreate ((FcHashFunc) FcStrHashIgnoreCase,
					(FcCompareFunc) FcStrCmp,
					FcHashStrCopy,
					FcHashUuidCopy,
					(FcDestroyFunc) FcStrFree,
					FcHashUuidFree);
    }

    return ret;
}

static void
fini (Test *test)
{
    FcHashTableDestroy (test->table);
    free (test);
}

static FcBool
test_add (Test *test, char *key, FcBool replace)
{
    uuid_t uuid;
    void *u;
    FcBool (*hash_add) (FcHashTable *, void *, void *);
    FcBool ret = FcFalse;

    uuid_generate_random (uuid);
    if (replace)
	hash_add = FcHashTableReplace;
    else
	hash_add = FcHashTableAdd;
    if (!hash_add (test->table, key, uuid))
	return FcFalse;
    if (!FcHashTableFind (test->table, key, &u))
	return FcFalse;
    ret = (uuid_compare (uuid, u) == 0);
    FcHashUuidFree (u);

    return ret;
}

static FcBool
test_remove (Test *test, char *key)
{
    void *u;

    if (!FcHashTableFind (test->table, key, &u))
	return FcFalse;
    FcHashUuidFree (u);
    if (!FcHashTableRemove (test->table, key))
	return FcFalse;
    if (FcHashTableFind (test->table, key, &u))
	return FcFalse;

    return FcTrue;
}

int
main (void)
{
    Test *test;
    int ret = 0;

    test = init ();
    /* first op to add */
    if (!test_add (test, "foo", FcFalse))
    {
	ret = 1;
	goto bail;
    }
    /* second op to add */
    if (!test_add (test, "bar", FcFalse))
    {
	ret = 1;
	goto bail;
    }
    /* dup not allowed */
    if (test_add (test, "foo", FcFalse))
    {
	ret = 1;
	goto bail;
    }
    /* replacement */
    if (!test_add (test, "foo", FcTrue))
    {
	ret = 1;
	goto bail;
    }
    /* removal */
    if (!test_remove (test, "foo"))
    {
	ret = 1;
	goto bail;
    }
    /* not found to remove */
    if (test_remove (test, "foo"))
    {
	ret = 1;
	goto bail;
    }
    /* complex op in pointer */
    if (!test_add (test, "foo", FcFalse))
    {
	ret = 1;
	goto bail;
    }
    if (test_add (test, "foo", FcFalse))
    {
	ret = 1;
	goto bail;
    }
    if (!test_remove (test, "foo"))
    {
	ret = 1;
	goto bail;
    }
    if (!test_add (test, "foo", FcFalse))
    {
	ret = 1;
	goto bail;
    }
    if (!test_remove (test, "bar"))
    {
	ret = 1;
	goto bail;
    }
    /* completely remove */
    if (!test_remove (test, "foo"))
    {
	ret = 1;
	goto bail;
    }
    /* completely remove from the last one */
    if (!test_add (test, "foo", FcFalse))
    {
	ret = 1;
	goto bail;
    }
    if (!test_add (test, "bar", FcFalse))
    {
	ret = 1;
	goto bail;
    }
    if (!test_remove (test, "bar"))
    {
	ret = 1;
	goto bail;
    }
    if (!test_remove (test, "foo"))
    {
	ret = 1;
	goto bail;
    }
bail:
    fini (test);

    return ret;
}
