fontconfig/test/test-hash.c

188 lines
2.9 KiB
C

#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, FcChar8 *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, FcChar8 *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;
uuid_t uuid;
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;
}