2014-03-12 20:23:34 -04:00
|
|
|
/*
|
|
|
|
* Copyright 2014 (c) Anna Schumaker.
|
|
|
|
* Test a Database
|
|
|
|
*/
|
2015-11-30 10:01:39 -05:00
|
|
|
#include <core/containers/index.h>
|
2015-11-07 17:02:06 -05:00
|
|
|
#include <tests/test.h>
|
2014-03-12 20:23:34 -04:00
|
|
|
|
|
|
|
|
2015-10-21 10:21:43 -04:00
|
|
|
static void test_entry()
|
2014-05-03 18:42:54 -04:00
|
|
|
{
|
2015-09-30 09:15:15 -04:00
|
|
|
const struct db_ops *index_ops = test_index_ops();
|
2015-11-07 17:02:06 -05:00
|
|
|
struct index_entry *ie;
|
2015-10-21 15:57:21 -04:00
|
|
|
struct set_iter it;
|
|
|
|
unsigned int i;
|
2015-10-21 10:21:43 -04:00
|
|
|
struct file f;
|
|
|
|
|
2015-11-06 09:59:07 -05:00
|
|
|
ie = INDEX_ENTRY(index_ops->dbe_alloc("Link"));
|
|
|
|
test_equal(index_ops->dbe_key(&ie->ie_dbe), "Link");
|
2015-10-21 15:57:21 -04:00
|
|
|
set_insert(&ie->ie_set, 0);
|
|
|
|
set_insert(&ie->ie_set, 1);
|
|
|
|
set_insert(&ie->ie_set, 2);
|
|
|
|
|
|
|
|
i = 0;
|
|
|
|
set_for_each(&ie->ie_set, &it) {
|
|
|
|
test_loop_equal(it.it_val, i, i);
|
|
|
|
i++;
|
|
|
|
} test_loop_passed();
|
2015-10-21 10:21:43 -04:00
|
|
|
|
2016-03-30 11:25:14 -04:00
|
|
|
file_init(&f, "index_entry", 0, 0);
|
2015-10-21 10:21:43 -04:00
|
|
|
file_open(&f, OPEN_WRITE);
|
|
|
|
file_writef(&f, "Zelda\n0 \n");
|
2015-11-06 09:59:07 -05:00
|
|
|
index_ops->dbe_write(&f, &ie->ie_dbe);
|
2015-10-21 10:21:43 -04:00
|
|
|
file_close(&f);
|
2015-11-06 09:59:07 -05:00
|
|
|
g_free(ie->ie_key);
|
|
|
|
index_ops->dbe_free(&ie->ie_dbe);
|
2015-10-21 10:21:43 -04:00
|
|
|
|
|
|
|
file_open(&f, OPEN_READ);
|
2015-11-06 09:59:07 -05:00
|
|
|
ie = INDEX_ENTRY(index_ops->dbe_read(&f));
|
|
|
|
test_equal(index_ops->dbe_key(&ie->ie_dbe), "Zelda");
|
2015-10-21 15:57:21 -04:00
|
|
|
test_equal(set_size(&ie->ie_set), 0);
|
2015-11-06 09:59:07 -05:00
|
|
|
g_free(ie->ie_key);
|
|
|
|
index_ops->dbe_free(&ie->ie_dbe);
|
2015-10-21 10:21:43 -04:00
|
|
|
|
2015-11-06 09:59:07 -05:00
|
|
|
ie = INDEX_ENTRY(index_ops->dbe_read(&f));
|
|
|
|
test_equal(ie->ie_key, "Link");
|
|
|
|
test_equal(index_ops->dbe_key(&ie->ie_dbe), "Link");
|
2015-10-21 15:57:21 -04:00
|
|
|
test_equal(set_size(&ie->ie_set), 3);
|
2015-10-21 10:21:43 -04:00
|
|
|
file_close(&f);
|
|
|
|
|
2015-10-21 15:57:21 -04:00
|
|
|
i = 0;
|
|
|
|
set_for_each(&ie->ie_set, &it) {
|
|
|
|
test_loop_equal(it.it_val, i, i);
|
|
|
|
i++;
|
|
|
|
} test_loop_passed();
|
|
|
|
|
2015-11-06 09:59:07 -05:00
|
|
|
g_free(ie->ie_key);
|
|
|
|
index_ops->dbe_free(&ie->ie_dbe);
|
2014-05-03 18:42:54 -04:00
|
|
|
}
|
2014-03-12 20:23:34 -04:00
|
|
|
|
2015-11-07 17:02:06 -05:00
|
|
|
static void __test_stress(unsigned int N)
|
2014-05-03 18:42:54 -04:00
|
|
|
{
|
2015-09-23 09:33:55 -04:00
|
|
|
const struct db_ops *index_ops = test_index_ops();
|
2015-11-07 17:02:06 -05:00
|
|
|
struct index_entry *ie, *ie2;
|
2015-11-04 12:23:00 -05:00
|
|
|
struct database index;
|
2015-10-21 10:21:43 -04:00
|
|
|
unsigned int i;
|
2015-11-06 09:59:07 -05:00
|
|
|
gchar key[2] = "";
|
2015-10-21 10:21:43 -04:00
|
|
|
char c;
|
|
|
|
|
2015-09-29 16:25:16 -04:00
|
|
|
index_init(&index, "stress.idx", false);
|
|
|
|
|
2015-09-29 16:11:59 -04:00
|
|
|
/* index_insert() */
|
2015-10-21 10:21:43 -04:00
|
|
|
for (c = 'a'; c <= 'z'; c++) {
|
2015-11-06 09:59:07 -05:00
|
|
|
g_strlcpy(key, &c, 2);
|
|
|
|
ie = index_insert(&index, key, 0);
|
2015-11-07 17:02:06 -05:00
|
|
|
test_loop_not_equal((void *)ie, NULL, c - 'a');
|
2015-11-06 09:59:07 -05:00
|
|
|
test_loop_equal(index_ops->dbe_key(&ie->ie_dbe), key, c - 'a');
|
2015-10-21 10:21:43 -04:00
|
|
|
for (i = 0; i < N; i++)
|
2015-11-06 09:59:07 -05:00
|
|
|
ie2 = index_insert(&index, key, i);
|
2015-11-07 17:02:06 -05:00
|
|
|
test_loop_equal((void *)ie, (void *)ie2, c - 'a');
|
2015-10-21 15:57:21 -04:00
|
|
|
test_loop_equal(set_size(&ie->ie_set), N, c - 'a');
|
2015-10-21 10:21:43 -04:00
|
|
|
test_loop_equal(index.db_size, c - 'a' + 1, c - 'a');
|
2015-08-26 08:49:30 -04:00
|
|
|
} test_loop_passed();
|
2015-10-21 10:21:43 -04:00
|
|
|
test_equal(index.db_size, 26);
|
|
|
|
|
2015-09-29 16:40:53 -04:00
|
|
|
/* index_has() */
|
2015-10-21 10:21:43 -04:00
|
|
|
for (c = 'a'; c <= 'z'; c += 4) {
|
2015-11-06 09:59:07 -05:00
|
|
|
g_strlcpy(key, &c, 2);
|
2015-10-21 10:21:43 -04:00
|
|
|
for (i = 0; i < N; i++)
|
2015-11-07 17:02:06 -05:00
|
|
|
test_loop_equal(index_has(&index, key, i), (bool)true, i);
|
|
|
|
test_loop_equal(index_has(&index, key, N), (bool)false, c - 'a');
|
2015-08-26 08:49:30 -04:00
|
|
|
} test_loop_passed();
|
2014-05-03 18:42:54 -04:00
|
|
|
|
2015-09-29 16:07:34 -04:00
|
|
|
/* index_remove() */
|
2015-10-21 10:21:43 -04:00
|
|
|
for (c = 'a'; c <= 'z'; c += 4) {
|
2015-11-06 09:59:07 -05:00
|
|
|
g_strlcpy(key, &c, 2);
|
2015-10-21 10:21:43 -04:00
|
|
|
for (i = 0; i < N; i++)
|
2015-11-06 09:59:07 -05:00
|
|
|
index_remove(&index, key, i);
|
|
|
|
ie = INDEX_ENTRY(db_find(&index, key));
|
2015-11-07 17:02:06 -05:00
|
|
|
test_loop_not_equal((void *)ie, NULL, c - 'a');
|
2015-10-21 15:57:21 -04:00
|
|
|
test_loop_equal(set_size(&ie->ie_set), 0, c - 'a');
|
2015-08-26 08:49:30 -04:00
|
|
|
} test_loop_passed();
|
2015-09-29 16:07:34 -04:00
|
|
|
index_remove(&index, "ZZ", 42);
|
2015-10-21 10:21:43 -04:00
|
|
|
test_equal(index.db_size, 26);
|
2015-09-29 16:25:16 -04:00
|
|
|
|
|
|
|
db_deinit(&index);
|
2014-05-03 18:42:54 -04:00
|
|
|
}
|
2014-03-12 20:23:34 -04:00
|
|
|
|
2015-11-07 17:02:06 -05:00
|
|
|
static void test_basics() { __test_stress(10); }
|
|
|
|
static void test_stress() { __test_stress(100000); }
|
2015-08-26 08:49:30 -04:00
|
|
|
|
|
|
|
DECLARE_UNIT_TESTS(
|
2015-10-21 10:21:43 -04:00
|
|
|
UNIT_TEST("Index Entry", test_entry),
|
|
|
|
UNIT_TEST("Index Basics (N = 10)", test_basics),
|
|
|
|
UNIT_TEST("Index Stress (N = 100,000)", test_stress),
|
2015-08-26 08:49:30 -04:00
|
|
|
);
|