2014-03-12 20:23:34 -04:00
|
|
|
/*
|
|
|
|
* Copyright 2014 (c) Anna Schumaker.
|
|
|
|
* Test a Database
|
|
|
|
*/
|
2014-06-05 10:19:22 -04:00
|
|
|
#include <core/index.h>
|
2015-01-04 17:56:54 -05:00
|
|
|
#include <core/print.h>
|
2015-01-26 09:40:48 -05:00
|
|
|
#include <core/string.h>
|
2015-08-26 08:49:30 -04:00
|
|
|
#include "test.h"
|
2014-03-12 20:23:34 -04:00
|
|
|
|
|
|
|
|
2015-01-04 19:50:40 -05:00
|
|
|
static Index *INDEX = NULL;
|
2014-03-12 20:23:34 -04:00
|
|
|
|
|
|
|
|
2014-05-03 18:42:54 -04:00
|
|
|
static void test_single_item()
|
|
|
|
{
|
|
|
|
Index index("index.idx", false);
|
|
|
|
|
2014-03-12 20:23:34 -04:00
|
|
|
index.insert("a", 0);
|
2015-10-20 10:10:26 -04:00
|
|
|
IndexEntry *it = db_get(&index, "a");
|
2014-03-12 20:23:34 -04:00
|
|
|
|
2015-01-04 19:50:40 -05:00
|
|
|
test_not_equal(it, (IndexEntry *)NULL);
|
2015-10-17 14:59:06 -04:00
|
|
|
test_equal(index.db_size, (unsigned)1);
|
2014-11-06 08:24:13 -05:00
|
|
|
test_equal(it->size(), (size_t)1);
|
|
|
|
test_equal(*(it->begin()), (unsigned)0);
|
2014-03-12 20:23:34 -04:00
|
|
|
|
|
|
|
index.remove("a", 0);
|
2015-10-17 14:59:06 -04:00
|
|
|
test_equal(index.db_size, (unsigned)1);
|
2014-11-06 08:24:13 -05:00
|
|
|
test_equal(it->size(), (size_t)0);
|
2014-05-03 18:42:54 -04:00
|
|
|
}
|
2014-03-12 20:23:34 -04:00
|
|
|
|
2015-01-04 17:56:54 -05:00
|
|
|
|
2015-08-26 08:49:30 -04:00
|
|
|
static void test_insertion(unsigned int n)
|
2014-05-03 18:42:54 -04:00
|
|
|
{
|
2015-08-26 08:49:30 -04:00
|
|
|
test_rm_data_dir();
|
|
|
|
INDEX = new Index("index.idx", false);
|
2014-03-12 20:23:34 -04:00
|
|
|
|
2015-01-04 17:56:54 -05:00
|
|
|
for (char c = 'a'; c <= 'z'; c++) {
|
2015-08-26 08:49:30 -04:00
|
|
|
for (unsigned int i = 0; i < n; i++)
|
2015-01-04 17:56:54 -05:00
|
|
|
INDEX->insert(std::string(1, c), i);
|
2014-03-12 20:23:34 -04:00
|
|
|
}
|
2014-05-03 18:42:54 -04:00
|
|
|
|
2015-10-17 14:59:06 -04:00
|
|
|
test_equal(INDEX->db_size, (n == 0) ? 0 : 26);
|
2015-08-26 08:49:30 -04:00
|
|
|
|
|
|
|
for (char c = 'a'; c <= 'z'; c++) {
|
2015-10-20 10:10:26 -04:00
|
|
|
IndexEntry *it = db_get(INDEX, std::string(1, c).c_str());
|
2015-08-26 08:49:30 -04:00
|
|
|
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_loop_passed();
|
2015-01-04 17:56:54 -05:00
|
|
|
}
|
2014-05-03 18:42:54 -04:00
|
|
|
|
2015-01-04 17:56:54 -05:00
|
|
|
|
2015-08-26 08:49:30 -04:00
|
|
|
static void test_removal(unsigned int n)
|
2015-01-04 17:56:54 -05:00
|
|
|
{
|
|
|
|
IndexEntry *it;
|
2014-03-12 20:23:34 -04:00
|
|
|
|
2015-08-26 08:49:30 -04:00
|
|
|
for (char c = 'a'; c <= 'z'; c++) {
|
|
|
|
for (unsigned int i = 0; i < n; i++)
|
|
|
|
INDEX->remove(std::string(1, c), i);
|
|
|
|
|
2015-10-20 10:10:26 -04:00
|
|
|
it = db_get(INDEX, std::string(1, c).c_str());
|
2015-08-26 08:49:30 -04:00
|
|
|
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();
|
2015-01-04 17:56:54 -05:00
|
|
|
}
|
2014-05-03 18:42:54 -04:00
|
|
|
|
|
|
|
|
2015-08-26 08:49:30 -04:00
|
|
|
static void test_save_load(unsigned int n)
|
2014-05-03 18:42:54 -04:00
|
|
|
{
|
|
|
|
Index idx2("index.idx", false);
|
2015-08-26 08:49:30 -04:00
|
|
|
IndexEntry *it1, *it2;
|
|
|
|
|
2015-09-17 08:12:25 -04:00
|
|
|
db_load(&idx2);
|
2015-10-17 14:59:06 -04:00
|
|
|
test_equal(idx2.db_size, (unsigned)0);
|
2014-05-03 18:42:54 -04:00
|
|
|
|
2015-10-18 10:11:24 -04:00
|
|
|
db_save(INDEX);
|
2015-09-17 08:12:25 -04:00
|
|
|
db_load(&idx2);
|
2014-05-03 18:42:54 -04:00
|
|
|
|
2015-10-17 14:59:06 -04:00
|
|
|
test_equal(idx2.db_size, INDEX->db_size);
|
2015-10-17 15:12:40 -04:00
|
|
|
test_equal(db_actual_size(&idx2), db_actual_size(INDEX));
|
2014-05-03 18:42:54 -04:00
|
|
|
|
2015-08-26 08:49:30 -04:00
|
|
|
for (char c = 'a'; c <= 'z'; c++) {
|
2015-10-20 10:10:26 -04:00
|
|
|
it1 = db_get(INDEX, std::string(1, c).c_str());
|
|
|
|
it2 = db_get(&idx2, std::string(1, c).c_str());
|
2015-08-26 08:49:30 -04:00
|
|
|
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');
|
|
|
|
}
|
|
|
|
} test_loop_passed();
|
|
|
|
|
|
|
|
delete INDEX;
|
2014-05-03 18:42:54 -04:00
|
|
|
}
|
2014-03-12 20:23:34 -04:00
|
|
|
|
2015-01-04 19:50:40 -05:00
|
|
|
|
2015-08-26 08:49:30 -04:00
|
|
|
#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); }
|
2014-03-25 17:48:55 -04:00
|
|
|
|
2014-03-12 20:23:34 -04:00
|
|
|
|
2015-08-26 08:49:30 -04:00
|
|
|
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)
|
|
|
|
|
|
|
|
|
|
|
|
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),
|
|
|
|
);
|