188 lines
2.9 KiB
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;
|
|
}
|