diff --git a/core/index.cpp b/core/index.cpp index 87b012b2..8cbbccd5 100644 --- a/core/index.cpp +++ b/core/index.cpp @@ -57,7 +57,7 @@ void IndexEntry :: read(file &file) unsigned int num, val; gchar *key = file_readl(&file); - file_readf(&file, "%u", &num); + file_readf(&file, "%u ", &num); _key = key; g_free(key); diff --git a/tests/core/index.cpp b/tests/core/index.cpp index 8b2bd9e8..a2daa401 100644 --- a/tests/core/index.cpp +++ b/tests/core/index.cpp @@ -3,131 +3,101 @@ * Test a Database */ #include -#include -#include #include "test.h" -static Index *INDEX = NULL; - - -static void test_single_item() +static void test_entry() { - Index index("index.idx", false); + IndexEntry *ie = new struct IndexEntry("Link"); + unsigned int i; + struct file f; - index.insert("a", 0); - IndexEntry *it = db_get(&index, "a"); + ie->insert(0); + ie->insert(1); + ie->insert(2); - test_not_equal(it, (IndexEntry *)NULL); - test_equal(index.db_size, (unsigned)1); - test_equal(it->size(), (size_t)1); - test_equal(*(it->begin()), (unsigned)0); - - index.remove("a", 0); - test_equal(index.db_size, (unsigned)1); - test_equal(it->size(), (size_t)0); -} - - -static void test_insertion(unsigned int n) -{ - test_rm_data_dir(); - INDEX = new Index("index.idx", false); - - for (char c = 'a'; c <= 'z'; c++) { - for (unsigned int i = 0; i < n; i++) - INDEX->insert(std::string(1, c), i); - } - - test_equal(INDEX->db_size, (n == 0) ? 0 : 26); - - for (char c = 'a'; c <= 'z'; c++) { - IndexEntry *it = db_get(INDEX, std::string(1, c).c_str()); - if (n == 0) { - test_loop_equal(it, NULL, c - 'a'); - return; - } - test_loop_not_equal(it, NULL, c - 'a'); - test_loop_equal(it->size(), n, c - 'a'); + test_equal(ie->primary_key(), "Link"); + test_equal(ie->size(), 3); + for (i = 0; i < 3; i++) { + test_loop_equal(ie->has(i), true, i); } test_loop_passed(); -} + test_equal(ie->has(3), false); + file_init(&f, "index_entry", 0); + file_open(&f, OPEN_WRITE); + file_writef(&f, "Zelda\n0 \n"); + ie->write(f); + file_close(&f); + delete ie; -static void test_removal(unsigned int n) -{ - IndexEntry *it; + ie = new IndexEntry(); + test_equal(ie->primary_key(), ""); + test_equal(ie->size(), 0); + test_equal(ie->has(42), false); - for (char c = 'a'; c <= 'z'; c++) { - for (unsigned int i = 0; i < n; i++) - INDEX->remove(std::string(1, c), i); + file_open(&f, OPEN_READ); + ie->read(f); + test_equal(ie->primary_key(), "Zelda"); + test_equal(ie->size(), 0); - it = db_get(INDEX, std::string(1, c).c_str()); - if (n == 0) { - test_loop_equal(it, NULL, c - 'a'); - return; - } - test_loop_not_equal(it, NULL, c - 'a'); - test_loop_equal(it->size(), 0, c - 'a'); - } test_loop_passed(); -} + ie->read(f); + test_equal(ie->primary_key(), "Link"); + test_equal(ie->size(), 3); + file_close(&f); - -static void test_save_load(unsigned int n) -{ - Index idx2("index.idx", false); - IndexEntry *it1, *it2; - - db_load(&idx2); - test_equal(idx2.db_size, (unsigned)0); - - db_save(INDEX); - db_load(&idx2); - - test_equal(idx2.db_size, INDEX->db_size); - test_equal(db_actual_size(&idx2), db_actual_size(INDEX)); - - for (char c = 'a'; c <= 'z'; c++) { - it1 = db_get(INDEX, std::string(1, c).c_str()); - it2 = db_get(&idx2, std::string(1, c).c_str()); - if (n == 0) { - test_loop_equal(it1, NULL, c - 'a'); - test_loop_equal(it2, NULL, c - 'a'); - } else { - test_loop_not_equal(it1, NULL, c - 'a'); - test_loop_not_equal(it2, NULL, c - 'a'); - test_loop_equal(it1->size(), it2->size(), c - 'a'); - } + for (i = 0; i < 3; i++) { + test_loop_equal(ie->has(i), true, i); } test_loop_passed(); - delete INDEX; + delete ie; } +static void test_stress(unsigned int N) +{ + Index index("stress.idx", false); + std::string key; + IndexEntry *ie; + unsigned int i; + char c; -#define INDEX_TEST_FUNCS(n) \ - static void test_insertion_##n() { test_insertion(n); } \ - static void test_removal_##n() { test_removal(n); } \ - static void test_save_load_##n() { test_save_load(n); } + /* index.insert() */ + for (c = 'a'; c <= 'z'; c++) { + key = c; + index.insert(key, 0); + for (i = 0; i < N; i++) + index.insert(key, i); + test_loop_equal(index.db_size, c - 'a' + 1, c - 'a'); + } test_loop_passed(); + test_equal(index.db_size, 26); + /* index.has() */ + for (c = 'a'; c <= 'z'; c += 4) { + key = c; + ie = db_find(&index, key.c_str()); + test_loop_not_equal(ie, NULL, i); + for (i = 0; i < N; i++) + test_loop_equal(ie->has(i), true, i); + test_loop_equal(ie->has(N), false, c - 'a'); + } test_loop_passed(); -INDEX_TEST_FUNCS(0) -INDEX_TEST_FUNCS(10) -INDEX_TEST_FUNCS(100) -INDEX_TEST_FUNCS(1000) -INDEX_TEST_FUNCS(10000) -INDEX_TEST_FUNCS(100000) - -#define INDEX_UNIT_TESTS(n) \ - UNIT_TEST("Index Insertion (n = " #n ")", test_insertion_##n), \ - UNIT_TEST("Index Removal (n = " #n ")", test_removal_##n), \ - UNIT_TEST("Index Save and Load (n = " #n ")", test_save_load_##n) + /* index.remove() */ + for (c = 'a'; c <= 'z'; c += 4) { + key = c; + for (i = 0; i < N; i++) + index.remove(key, i); + ie = db_find(&index, key.c_str()); + test_loop_not_equal(ie, NULL, c - 'a'); + test_loop_equal(ie->size(), 0, c - 'a'); + } test_loop_passed(); + index.remove("ZZ", 42); + test_equal(index.db_size, 26); +} +static void test_basics() { test_stress(10); } +static void test_stress() { test_stress(100000); } DECLARE_UNIT_TESTS( - UNIT_TEST("Index Single Item", test_single_item), - INDEX_UNIT_TESTS(0), - INDEX_UNIT_TESTS(10), - INDEX_UNIT_TESTS(100), - INDEX_UNIT_TESTS(1000), - INDEX_UNIT_TESTS(10000), - INDEX_UNIT_TESTS(100000), + UNIT_TEST("Index Entry", test_entry), + UNIT_TEST("Index Basics (N = 10)", test_basics), + UNIT_TEST("Index Stress (N = 100,000)", test_stress), );