#include "test.h" #include "store_htable.h" #include "assets.h" /** @brief Test hash table store. */ static int test_htstore() { LSUP_HTStore *store = LSUP_htstore_new(); ASSERT (store != NULL, "Error initializing store!"); LSUP_Triple *trp = create_triples(); LSUP_SerTriple ser_trp[NUM_TRP]; for (int i = 0; i < NUM_TRP; i++) { LSUP_striple_init (ser_trp + i, BUF_DUMMY, BUF_DUMMY, BUF_DUMMY); LSUP_triple_serialize (trp + i, ser_trp + i); } // Test adding. LSUP_HTIterator *it = LSUP_htstore_add_init (store); for (size_t i = 0; i < NUM_TRP; i++) { LSUP_rc rc = LSUP_htstore_add_iter (it, ser_trp + i); ASSERT ( (i < 8 && rc == LSUP_OK) || rc == LSUP_NOACTION, "Wrong return code on insert!"); } EXPECT_INT_EQ (LSUP_htiter_cur (it), 8); EXPECT_INT_EQ (LSUP_htstore_size (store), 8); LSUP_htstore_add_done (it); // Test lookups. LSUP_SerTriple lut[12] = { {NULL, NULL, NULL}, {ser_trp[0].s, NULL, NULL}, {ser_trp[2].s, NULL, NULL}, {NULL, ser_trp[0].p, NULL}, {NULL, ser_trp[0].s, NULL}, {NULL, NULL, ser_trp[6].o}, {ser_trp[4].s, ser_trp[4].p, NULL}, {NULL, ser_trp[7].p, ser_trp[7].o}, {ser_trp[5].s, NULL, ser_trp[5].o}, {ser_trp[5].s, NULL, ser_trp[5].o}, {ser_trp[4].s, ser_trp[4].p, ser_trp[4].o}, {ser_trp[4].s, ser_trp[4].p, ser_trp[6].o}, }; size_t results[12] = { 8, 5, 1, 1, 0, 1, 2, 1, 2, 2, 1, 0, }; for (int i = 0; i < NUM_TRP; i++) { size_t ct = 0; TRACE ("Testing triple lookup #%d.\n", i); LSUP_HTIterator *it = LSUP_htstore_lookup(store, lut + i); LSUP_SerTriple *sspo = STRP_DUMMY; while (LSUP_htiter_next (it, sspo) != LSUP_END) { // Verify that the internal counter aligns with an external one. ct ++; EXPECT_INT_EQ (ct, LSUP_htiter_cur(it)); } EXPECT_INT_EQ (ct, results[i]); LSUP_htiter_free (it); } for (int i = 0; i < NUM_TRP; i++) { LSUP_buffer_free (ser_trp[i].s); LSUP_buffer_free (ser_trp[i].p); LSUP_buffer_free (ser_trp[i].o); } LSUP_htstore_free (store); free_triples (trp); return 0; } int store_ht_tests() { RUN(test_htstore); return 0; }