diff options
author | Sébastien Helleu <flashcode@flashtux.org> | 2021-11-05 20:04:10 +0100 |
---|---|---|
committer | Sébastien Helleu <flashcode@flashtux.org> | 2021-11-05 20:04:10 +0100 |
commit | 9c5837d143b68853e84a7cf12e1abcc82c350100 (patch) | |
tree | d50c35e3717738e5e85abb34ef573f48309db080 /tests/unit | |
parent | 5e08f9876a471654a62eb818b2e4d1ef27f4648e (diff) | |
download | weechat-9c5837d143b68853e84a7cf12e1abcc82c350100.zip |
core: add unit tests on hdata
Diffstat (limited to 'tests/unit')
-rw-r--r-- | tests/unit/core/test-core-hdata.cpp | 2158 |
1 files changed, 2146 insertions, 12 deletions
diff --git a/tests/unit/core/test-core-hdata.cpp b/tests/unit/core/test-core-hdata.cpp index 50b895181..008a5c4f0 100644 --- a/tests/unit/core/test-core-hdata.cpp +++ b/tests/unit/core/test-core-hdata.cpp @@ -24,6 +24,104 @@ extern "C" { #include "src/core/wee-hdata.h" +#include "src/core/wee-config.h" +#include "src/core/wee-hashtable.h" +#include "src/core/wee-hook.h" +#include "src/core/wee-string.h" +#include "src/gui/gui-buffer.h" +#include "src/plugins/plugin.h" +} + +struct t_test_item +{ + /* char */ + char test_char; + char test_count_char; + char test_array_2_char_fixed_size[2]; + char *test_ptr_2_char; + + /* integer */ + int test_int; + int test_count_int; + int test_array_2_int_fixed_size[2]; + int *test_ptr_3_int; + int *test_ptr_1_int_fixed_size; + + /* long */ + long test_long; + long test_count_long; + long test_array_2_long_fixed_size[2]; + long *test_ptr_2_long; + + /* string */ + char *test_string; + char *test_string2; + char *test_string3; + char *test_string_null; + const char *test_shared_string; + int test_count_words; + char test_array_2_words_fixed_size[2][32]; + char **test_ptr_words; + char **test_ptr_words_dyn; + char **test_ptr_words_dyn_shared; + + /* pointer */ + void *test_pointer; + int test_count_pointer; + void *test_array_2_pointer_fixed_size[2]; + void **test_ptr_3_pointer; + void **test_ptr_0_pointer_dyn; + void **test_ptr_1_pointer_dyn; + + /* time */ + time_t test_time; + int test_count_time; + time_t test_array_2_time_fixed_size[2]; + time_t *test_ptr_2_time; + + /* hashtable */ + struct t_hashtable *test_hashtable; + int test_count_hashtable; + struct t_hashtable *test_array_2_hashtable_fixed_size[2]; + struct t_hashtable **test_ptr_2_hashtable; + struct t_hashtable **test_ptr_1_hashtable_dyn; + + /* other */ + void *test_other; + int test_count_other; + void *test_ptr_3_other[3]; + + /* invalid */ + char *test_count_invalid; + int *test_ptr_invalid; + + struct t_test_item *prev_item; + struct t_test_item *next_item; +}; + +struct t_test_item *items = NULL; +struct t_test_item *last_item = NULL; +struct t_test_item *ptr_item1 = NULL; +struct t_test_item *ptr_item2 = NULL; +struct t_hdata *ptr_hdata = NULL; + +/* + * Test of update callback. + */ + +int +callback_update_dummy (void *data, + struct t_hdata *hdata, + void *pointer, + struct t_hashtable *hashtable) +{ + /* make C++ compiler happy */ + (void) data; + (void) hdata; + (void) pointer; + (void) hashtable; + + return 0; } TEST_GROUP(CoreHdata) @@ -33,31 +131,1114 @@ TEST_GROUP(CoreHdata) /* * Tests functions: * hdata_new + */ + +TEST(CoreHdata, New) +{ + struct t_hdata *hdata; + + POINTERS_EQUAL(NULL, hdata_new (NULL, NULL, NULL, NULL, 0, 0, NULL, NULL)); + POINTERS_EQUAL(NULL, hdata_new (NULL, "", NULL, NULL, 0, 0, NULL, NULL)); + + hdata = hdata_new (NULL, "test_hdata", NULL, NULL, 1, 0, NULL, NULL); + CHECK(hdata); + POINTERS_EQUAL(hdata, hashtable_get (weechat_hdata, "test_hdata")); + STRCMP_EQUAL("test_hdata", hdata->name); + POINTERS_EQUAL(NULL, hdata->plugin); + POINTERS_EQUAL(NULL, hdata->var_prev); + POINTERS_EQUAL(NULL, hdata->var_next); + CHECK(hdata->hash_var); + LONGS_EQUAL(0, hdata->hash_var->items_count); + CHECK(hdata->hash_list); + LONGS_EQUAL(0, hdata->hash_list->items_count); + LONGS_EQUAL(1, hdata->create_allowed); + LONGS_EQUAL(0, hdata->delete_allowed); + POINTERS_EQUAL(NULL, hdata->callback_update); + POINTERS_EQUAL(NULL, hdata->callback_update_data); + LONGS_EQUAL(0, hdata->update_pending); + hashtable_remove (weechat_hdata, "test_hdata"); + POINTERS_EQUAL(NULL, hashtable_get (weechat_hdata, "test_hdata")); + + hdata = hdata_new (NULL, "test_hdata", "prev", "next", 1, 0, + &callback_update_dummy, (void *)0x123); + CHECK(hdata); + POINTERS_EQUAL(hdata, hashtable_get (weechat_hdata, "test_hdata")); + STRCMP_EQUAL("test_hdata", hdata->name); + POINTERS_EQUAL(NULL, hdata->plugin); + STRCMP_EQUAL("prev", hdata->var_prev); + STRCMP_EQUAL("next", hdata->var_next); + CHECK(hdata->hash_var); + LONGS_EQUAL(0, hdata->hash_var->items_count); + CHECK(hdata->hash_list); + LONGS_EQUAL(0, hdata->hash_list->items_count); + LONGS_EQUAL(1, hdata->create_allowed); + LONGS_EQUAL(0, hdata->delete_allowed); + POINTERS_EQUAL(&callback_update_dummy, hdata->callback_update); + POINTERS_EQUAL(0x123, hdata->callback_update_data); + LONGS_EQUAL(0, hdata->update_pending); + hashtable_remove (weechat_hdata, "test_hdata"); + POINTERS_EQUAL(NULL, hashtable_get (weechat_hdata, "test_hdata")); +} + +/* + * Tests functions: * hdata_new_var + */ + +TEST(CoreHdata, NewVar) +{ + struct t_hdata *hdata; + struct t_hdata_var *var; + + hdata = hdata_new (NULL, "test_hdata", "prev", "next", 1, 0, + &callback_update_dummy, (void *)0x123); + CHECK(hdata); + CHECK(hdata->hash_var); + LONGS_EQUAL(0, hdata->hash_var->items_count); + + hdata_new_var (NULL, NULL, 0, 0, 0, NULL, NULL); + hdata_new_var (hdata, NULL, 0, 0, 0, NULL, NULL); + hdata_new_var (NULL, "var", 0, 0, 0, NULL, NULL); + + LONGS_EQUAL(0, hdata->hash_var->items_count); + + /* simple variable */ + hdata_new_var (hdata, "var1", 0, WEECHAT_HDATA_STRING, 0, NULL, NULL); + LONGS_EQUAL(1, hdata->hash_var->items_count); + var = (struct t_hdata_var *)hashtable_get (hdata->hash_var, "var1"); + CHECK(var); + LONGS_EQUAL(0, var->offset); + LONGS_EQUAL(WEECHAT_HDATA_STRING, var->type); + LONGS_EQUAL(0, var->update_allowed); + POINTERS_EQUAL(NULL, var->array_size); + POINTERS_EQUAL(NULL, var->hdata_name); + + /* variable with size as variable name */ + hdata_new_var (hdata, "var2", 8, WEECHAT_HDATA_INTEGER, 1, + "size", "other_hdata"); + LONGS_EQUAL(2, hdata->hash_var->items_count); + var = (struct t_hdata_var *)hashtable_get (hdata->hash_var, "var2"); + CHECK(var); + LONGS_EQUAL(8, var->offset); + LONGS_EQUAL(WEECHAT_HDATA_INTEGER, var->type); + LONGS_EQUAL(1, var->update_allowed); + STRCMP_EQUAL("size", var->array_size); + STRCMP_EQUAL("other_hdata", var->hdata_name); + + /* variable with size as integer (fixed size) */ + hdata_new_var (hdata, "var3", 16, WEECHAT_HDATA_INTEGER, 1, + "8", "other_hdata"); + LONGS_EQUAL(3, hdata->hash_var->items_count); + var = (struct t_hdata_var *)hashtable_get (hdata->hash_var, "var3"); + CHECK(var); + LONGS_EQUAL(16, var->offset); + LONGS_EQUAL(WEECHAT_HDATA_INTEGER, var->type); + LONGS_EQUAL(1, var->update_allowed); + STRCMP_EQUAL("8", var->array_size); + STRCMP_EQUAL("other_hdata", var->hdata_name); + + /* variable with size "*" (automatic) */ + hdata_new_var (hdata, "var4", 24, WEECHAT_HDATA_INTEGER, 1, + "*", "other_hdata"); + LONGS_EQUAL(4, hdata->hash_var->items_count); + var = (struct t_hdata_var *)hashtable_get (hdata->hash_var, "var4"); + CHECK(var); + LONGS_EQUAL(24, var->offset); + LONGS_EQUAL(WEECHAT_HDATA_INTEGER, var->type); + LONGS_EQUAL(1, var->update_allowed); + STRCMP_EQUAL("*", var->array_size); + STRCMP_EQUAL("other_hdata", var->hdata_name); + + hashtable_remove (weechat_hdata, "test_hdata"); +} + +/* + * Tests functions: * hdata_new_list */ -TEST(CoreHdata, New) +TEST(CoreHdata, NewList) { - /* TODO: write tests */ + struct t_hdata *hdata; + struct t_hdata_list *list; + + hdata = hdata_new (NULL, "test_hdata", "prev", "next", 1, 0, + &callback_update_dummy, (void *)0x123); + CHECK(hdata); + CHECK(hdata->hash_list); + LONGS_EQUAL(0, hdata->hash_list->items_count); + + hdata_new_list (NULL, NULL, NULL, 0); + hdata_new_list (hdata, NULL, NULL, 0); + hdata_new_list (NULL, "list", NULL, 0); + + LONGS_EQUAL(0, hdata->hash_list->items_count); + + hdata_new_list (hdata, "list1", (void *)0x123, 0); + LONGS_EQUAL(1, hdata->hash_list->items_count); + list = (struct t_hdata_list *)hashtable_get (hdata->hash_list, "list1"); + CHECK(list); + POINTERS_EQUAL(0x123, list->pointer); + LONGS_EQUAL(0, list->flags); + + hdata_new_list (hdata, "list2", (void *)0x456, + WEECHAT_HDATA_LIST_CHECK_POINTERS); + LONGS_EQUAL(2, hdata->hash_list->items_count); + list = (struct t_hdata_list *)hashtable_get (hdata->hash_list, "list2"); + CHECK(list); + POINTERS_EQUAL(0x456, list->pointer); + LONGS_EQUAL(WEECHAT_HDATA_LIST_CHECK_POINTERS, list->flags); + + hashtable_remove (weechat_hdata, "test_hdata"); } +TEST_GROUP(CoreHdataWithList) +{ + static int callback_update (void *data, + struct t_hdata *hdata, + void *pointer, + struct t_hashtable *hashtable) + { + const char *ptr_keys; + char **keys; + int rc, i, num_keys; + + /* make C++ compiler happy */ + (void) data; + (void) hdata; + (void) pointer; + + rc = 0; + + ptr_keys = hashtable_get_string (hashtable, "keys"); + if (!ptr_keys || !ptr_keys[0]) + return rc; + + keys = string_split (ptr_keys, ",", NULL, 0, 0, &num_keys); + if (!keys) + return rc; + + for (i = 0; i < num_keys; i++) + { + if (hashtable_has_key (hashtable, keys[i])) + { + rc += hdata_set ( + hdata, pointer, keys[i], + (const char *)hashtable_get (hashtable, keys[i])); + } + } + + string_free_split (keys); + + return rc; + } + + struct t_test_item *get_item1 () + { + struct t_test_item *item; + + item = (struct t_test_item *)malloc (sizeof (*item)); + + /* char */ + item->test_char = 'A'; + item->test_count_char = 2; + item->test_array_2_char_fixed_size[0] = 'A'; + item->test_array_2_char_fixed_size[1] = 'B'; + item->test_ptr_2_char = (char *)malloc ( + 2 * sizeof (item->test_ptr_2_char[0])); + item->test_ptr_2_char[0] = 'B'; + item->test_ptr_2_char[1] = 'C'; + + /* integer */ + item->test_int = 123; + item->test_count_int = 3; + item->test_array_2_int_fixed_size[0] = 111; + item->test_array_2_int_fixed_size[1] = 222; + item->test_ptr_3_int = (int *)malloc ( + 3 * sizeof (item->test_ptr_3_int[0])); + item->test_ptr_3_int[0] = 1; + item->test_ptr_3_int[1] = 2; + item->test_ptr_3_int[2] = 3; + item->test_ptr_1_int_fixed_size = (int *)malloc ( + 1 * sizeof (item->test_ptr_1_int_fixed_size[0])); + item->test_ptr_1_int_fixed_size[0] = 111; + + /* long */ + item->test_long = 123456789L; + item->test_count_long = 2; + item->test_array_2_long_fixed_size[0] = 111L; + item->test_array_2_long_fixed_size[1] = 222L; + item->test_ptr_2_long = (long *)malloc ( + 2 * sizeof (item->test_ptr_2_long[0])); + item->test_ptr_2_long[0] = 123456L; + item->test_ptr_2_long[1] = 234567L; + + /* string */ + item->test_string = strdup ("item1"); + item->test_string2 = strdup ("STRING2"); + item->test_string3 = strdup ("test"); + item->test_string_null = NULL; + item->test_shared_string = string_shared_get ("item1_shared"); + strcpy (item->test_array_2_words_fixed_size[0], "item1-word1"); + strcpy (item->test_array_2_words_fixed_size[1], "item1-word2"); + item->test_ptr_words = string_split ( + "a,b,c", ",", NULL, 0, 0, &(item->test_count_words)); + item->test_ptr_words_dyn = string_split ( + "aa,bb,cc", ",", NULL, 0, 0, NULL); + item->test_ptr_words_dyn_shared = string_split_shared ( + "aaa,bbb,ccc", ",", NULL, 0, 0, NULL); + + /* pointer */ + item->test_pointer = (void *)0x123; + item->test_count_pointer = 3; + item->test_array_2_pointer_fixed_size[0] = (void *)0x112233; + item->test_array_2_pointer_fixed_size[1] = (void *)0x445566; + item->test_ptr_3_pointer = (void **)malloc ( + 3 * sizeof (item->test_ptr_3_pointer[0])); + item->test_ptr_3_pointer[0] = (void *)0x123; + item->test_ptr_3_pointer[1] = (void *)0x456; + item->test_ptr_3_pointer[2] = (void *)0x789; + item->test_ptr_0_pointer_dyn = NULL; + item->test_ptr_1_pointer_dyn = (void **)malloc ( + 2 * sizeof (item->test_ptr_1_pointer_dyn[0])); + item->test_ptr_1_pointer_dyn[0] = (void *)0x123; + item->test_ptr_1_pointer_dyn[1] = NULL; + + /* time */ + item->test_time = 123456; + item->test_count_time = 2; + item->test_array_2_time_fixed_size[0] = 112; + item->test_array_2_time_fixed_size[1] = 334; + item->test_ptr_2_time = (time_t *)malloc ( + 2 * sizeof (item->test_ptr_2_time[0])); + item->test_ptr_2_time[0] = 1234; + item->test_ptr_2_time[1] = 5678; + + /* hashtable */ + item->test_hashtable = hashtable_new ( + 8, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING, + NULL, + NULL); + hashtable_set (item->test_hashtable, "key1", "value1"); + item->test_count_hashtable = 2; + item->test_array_2_hashtable_fixed_size[0] = hashtable_new ( + 8, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING, + NULL, + NULL); + hashtable_set (item->test_array_2_hashtable_fixed_size[0], + "key_array_1.1", "value_array_1.1"); + item->test_array_2_hashtable_fixed_size[1] = hashtable_new ( + 8, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING, + NULL, + NULL); + hashtable_set (item->test_array_2_hashtable_fixed_size[1], + "key_array_1.2", "value_array_1.2"); + item->test_ptr_2_hashtable = (struct t_hashtable **)malloc ( + 2 * sizeof (item->test_ptr_2_hashtable[0])); + item->test_ptr_2_hashtable[0] = hashtable_new ( + 8, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING, + NULL, + NULL); + hashtable_set (item->test_ptr_2_hashtable[0], + "key1.1", "value1.1"); + item->test_ptr_2_hashtable[1] = hashtable_new ( + 8, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING, + NULL, + NULL); + hashtable_set (item->test_ptr_2_hashtable[1], + "key1.2", "value1.2"); + item->test_ptr_1_hashtable_dyn = (struct t_hashtable **)malloc ( + 1 * sizeof (item->test_ptr_2_hashtable[0])); + item->test_ptr_1_hashtable_dyn[0] = hashtable_new ( + 8, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING, + NULL, + NULL); + item->test_ptr_1_hashtable_dyn[1] = NULL; + + /* other */ + item->test_other = (void *)0x123abc; + item->test_count_other = 3; + item->test_ptr_3_other[0] = (void *)0x1a; + item->test_ptr_3_other[1] = (void *)0x2b; + item->test_ptr_3_other[2] = (void *)0x3c; + + /* invalid */ + item->test_count_invalid = NULL; + item->test_ptr_invalid = NULL; + + return item; + } + + struct t_test_item *get_item2 () + { + struct t_test_item *item; + + item = (struct t_test_item *)malloc (sizeof (*item)); + + /* char */ + item->test_char = 'a'; + item->test_count_char = 2; + item->test_array_2_char_fixed_size[0] = 'a'; + item->test_array_2_char_fixed_size[1] = 'b'; + item->test_ptr_2_char = (char *)malloc ( + 2 * sizeof (item->test_ptr_2_char[0])); + item->test_ptr_2_char[0] = 'b'; + item->test_ptr_2_char[1] = 'c'; + + /* integer */ + item->test_int = 456; + item->test_count_int = 3; + item->test_array_2_int_fixed_size[0] = 444; + item->test_array_2_int_fixed_size[1] = 555; + item->test_ptr_3_int = (int *)malloc ( + 3 * sizeof (item->test_ptr_3_int[0])); + item->test_ptr_3_int[0] = 4; + item->test_ptr_3_int[1] = 5; + item->test_ptr_3_int[2] = 6; + item->test_ptr_1_int_fixed_size = (int *)malloc ( + 1 * sizeof (item->test_ptr_1_int_fixed_size[0])); + item->test_ptr_1_int_fixed_size[0] = 222; + + /* long */ + item->test_long = 987654321L; + item->test_count_long = 2; + item->test_array_2_long_fixed_size[0] = 333L; + item->test_array_2_long_fixed_size[1] = 444L; + item->test_ptr_2_long = (long *)malloc ( + 2 * sizeof (item->test_ptr_2_long[0])); + item->test_ptr_2_long[0] = 789123L; + item->test_ptr_2_long[1] = 891234L; + + /* string */ + item->test_string = strdup ("item2"); + item->test_string2 = strdup ("string2"); + item->test_string3 = NULL; + ptr_item1->test_string_null = NULL; + item->test_shared_string = string_shared_get ("item2_shared"); + strcpy (item->test_array_2_words_fixed_size[0], "item2-word1"); + strcpy (item->test_array_2_words_fixed_size[1], "item2-word2"); + item->test_ptr_words = string_split ( + "e,f,g,h", ",", NULL, 0, 0, &(item->test_count_words)); + item->test_ptr_words_dyn = string_split ( + "ee,ff,gg,hh", ",", NULL, 0, 0, NULL); + item->test_ptr_words_dyn_shared = string_split_shared ( + "eee,fff,ggg,hhh", ",", NULL, 0, 0, NULL); + + /* pointer */ + item->test_pointer = (void *)0x456; + item->test_count_pointer = 3; + item->test_array_2_pointer_fixed_size[0] = (void *)0x778899; + item->test_array_2_pointer_fixed_size[1] = (void *)0xaabbcc; + item->test_ptr_3_pointer = (void **)malloc ( + 3 * sizeof (item->test_ptr_3_pointer[0])); + item->test_ptr_3_pointer[0] = (void *)0x123abc; + item->test_ptr_3_pointer[1] = (void *)0x456def; + item->test_ptr_3_pointer[2] = (void *)0x789abc; + item->test_ptr_0_pointer_dyn = NULL; + item->test_ptr_1_pointer_dyn = (void **)malloc ( + 2 * sizeof (item->test_ptr_1_pointer_dyn[0])); + item->test_ptr_1_pointer_dyn[0] = (void *)0x456; + item->test_ptr_1_pointer_dyn[1] = NULL; + + /* time */ + item->test_time = 789123; + item->test_count_time = 2; + item->test_array_2_time_fixed_size[0] = 556; + item->test_array_2_time_fixed_size[1] = 778; + item->test_ptr_2_time = (time_t *)malloc ( + 2 * sizeof (item->test_ptr_2_time[0])); + item->test_ptr_2_time[0] = 123456; + item->test_ptr_2_time[1] = 789123; + + /* hashtable */ + item->test_hashtable = hashtable_new ( + 8, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING, + NULL, + NULL); + hashtable_set (item->test_hashtable, "key2", "value2"); + item->test_count_hashtable = 2; + item->test_array_2_hashtable_fixed_size[0] = hashtable_new ( + 8, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING, + NULL, + NULL); + hashtable_set (item->test_array_2_hashtable_fixed_size[0], + "key_array_2.1", "value_array_2.1"); + item->test_array_2_hashtable_fixed_size[1] = hashtable_new ( + 8, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING, + NULL, + NULL); + hashtable_set (item->test_array_2_hashtable_fixed_size[1], + "key_array_2.2", "value_array_2.2"); + item->test_ptr_2_hashtable = (struct t_hashtable **)malloc ( + 2 * sizeof (item->test_ptr_2_hashtable[0])); + item->test_ptr_2_hashtable[0] = hashtable_new ( + 8, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING, + NULL, + NULL); + hashtable_set (item->test_ptr_2_hashtable[0], + "key2.1", "value2.1"); + item->test_ptr_2_hashtable[1] = hashtable_new ( + 8, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING, + NULL, + NULL); + hashtable_set (item->test_ptr_2_hashtable[1], + "key2.2", "value2.2"); + item->test_ptr_1_hashtable_dyn = (struct t_hashtable **)malloc ( + 1 * sizeof (item->test_ptr_2_hashtable[0])); + item->test_ptr_1_hashtable_dyn[0] = hashtable_new ( + 8, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING, + NULL, + NULL); + item->test_ptr_1_hashtable_dyn[1] = NULL; + + /* other */ + item->test_other = (void *)0x456def; + item->test_count_other = 3; + item->test_ptr_3_other[0] = (void *)0x4d; + item->test_ptr_3_other[1] = (void *)0x5e; + item->test_ptr_3_other[2] = (void *)0x6f; + + /* invalid */ + item->test_count_invalid = NULL; + item->test_ptr_invalid = NULL; + + return item; + } + + struct t_hdata *get_hdata () + { + struct t_hdata *hdata; + + hdata = hdata_new (NULL, "test_item", "prev_item", "next_item", + 1, 1, + &callback_update, NULL); + + /* char */ + HDATA_VAR(struct t_test_item, test_char, CHAR, 1, NULL, NULL); + HDATA_VAR(struct t_test_item, test_count_char, CHAR, 0, NULL, NULL); + HDATA_VAR(struct t_test_item, test_array_2_char_fixed_size, CHAR, 0, "2", NULL); + HDATA_VAR(struct t_test_item, test_ptr_2_char, CHAR, 0, "*,test_count_char", NULL); + + /* integer */ + HDATA_VAR(struct t_test_item, test_int, INTEGER, 1, NULL, NULL); + HDATA_VAR(struct t_test_item, test_count_int, INTEGER, 0, NULL, NULL); + HDATA_VAR(struct t_test_item, test_array_2_int_fixed_size, INTEGER, 0, "2", NULL); + HDATA_VAR(struct t_test_item, test_ptr_3_int, INTEGER, 0, "*,test_count_int", NULL); + HDATA_VAR(struct t_test_item, test_ptr_1_int_fixed_size, INTEGER, 0, "*,1", NULL); + + /* long */ + HDATA_VAR(struct t_test_item, test_long, LONG, 1, NULL, NULL); + HDATA_VAR(struct t_test_item, test_count_long, LONG, 0, NULL, NULL); + HDATA_VAR(struct t_test_item, test_array_2_long_fixed_size, LONG, 0, "2", NULL); + HDATA_VAR(struct t_test_item, test_ptr_2_long, LONG, 0, "*,test_count_long", NULL); + + /* string */ + HDATA_VAR(struct t_test_item, test_string, STRING, 1, NULL, NULL); + HDATA_VAR(struct t_test_item, test_string2, STRING, 0, NULL, NULL); + HDATA_VAR(struct t_test_item, test_string3, STRING, 0, NULL, NULL); + HDATA_VAR(struct t_test_item, test_string_null, STRING, 0, NULL, NULL); + HDATA_VAR(struct t_test_item, test_shared_string, SHARED_STRING, 1, NULL, NULL); + HDATA_VAR(struct t_test_item, test_count_words, INTEGER, 0, NULL, NULL); + HDATA_VAR(struct t_test_item, test_array_2_words_fixed_size, STRING, 0, "2", NULL); + HDATA_VAR(struct t_test_item, test_ptr_words, STRING, 0, "*,test_count_words", NULL); + HDATA_VAR(struct t_test_item, test_ptr_words_dyn, STRING, 0, "*,*", NULL); + HDATA_VAR(struct t_test_item, test_ptr_words_dyn_shared, SHARED_STRING, 0, "*,*", NULL); + + /* pointer */ + HDATA_VAR(struct t_test_item, test_pointer, POINTER, 1, NULL, NULL); + HDATA_VAR(struct t_test_item, test_count_pointer, INTEGER, 0, NULL, NULL); + HDATA_VAR(struct t_test_item, test_array_2_pointer_fixed_size, POINTER, 0, "2", NULL); + HDATA_VAR(struct t_test_item, test_ptr_3_pointer, POINTER, 0, "*,test_count_pointer", NULL); + HDATA_VAR(struct t_test_item, test_ptr_0_pointer_dyn, POINTER, 0, "*,*", NULL); + HDATA_VAR(struct t_test_item, test_ptr_1_pointer_dyn, POINTER, 0, "*,*", NULL); + + /* time */ + HDATA_VAR(struct t_test_item, test_time, TIME, 1, NULL, NULL); + HDATA_VAR(struct t_test_item, test_count_time, INTEGER, 0, NULL, NULL); + HDATA_VAR(struct t_test_item, test_array_2_time_fixed_size, TIME, 0, "2", NULL); + HDATA_VAR(struct t_test_item, test_ptr_2_time, TIME, 0, "*,test_count_time", NULL); + + /* hashtable */ + HDATA_VAR(struct t_test_item, test_hashtable, HASHTABLE, 1, NULL, NULL); + HDATA_VAR(struct t_test_item, test_count_hashtable, INTEGER, 0, NULL, NULL); + HDATA_VAR(struct t_test_item, test_array_2_hashtable_fixed_size, HASHTABLE, 0, "2", NULL); + HDATA_VAR(struct t_test_item, test_ptr_2_hashtable, HASHTABLE, 0, "*,test_count_hashtable", NULL); + HDATA_VAR(struct t_test_item, test_ptr_1_hashtable_dyn, HASHTABLE, 0, "*,*", NULL); + + /* other */ + HDATA_VAR(struct t_test_item, test_other, OTHER, 1, NULL, NULL); + HDATA_VAR(struct t_test_item, test_count_other, INTEGER, 0, NULL, NULL); + HDATA_VAR(struct t_test_item, test_ptr_3_other, OTHER, 0, "test_count_other", NULL); + + /* invalid */ + HDATA_VAR(struct t_test_item, test_count_invalid, STRING, 0, NULL, NULL); + HDATA_VAR(struct t_test_item, test_ptr_invalid, STRING, 0, "test_count_invalid", NULL); + + /* prev/next item */ + HDATA_VAR(struct t_test_item, prev_item, POINTER, 0, NULL, "test_item"); + HDATA_VAR(struct t_test_item, next_item, POINTER, 0, NULL, "test_item"); + + /* lists */ + HDATA_LIST(items, WEECHAT_HDATA_LIST_CHECK_POINTERS); + HDATA_LIST(last_item, 0); + + return hdata; + } + + void setup () + { + /* build items */ + ptr_item1 = get_item1 (); + ptr_item2 = get_item2 (); + + /* build a linked list: items: ptr_item1 -> ptr_item2 -> NULL */ + ptr_item1->prev_item = NULL; + ptr_item1->next_item = ptr_item2; + ptr_item2->prev_item = ptr_item1; + ptr_item2->next_item = NULL; + items = ptr_item1; + last_item = ptr_item2; + + /* build hdata */ + ptr_hdata = get_hdata (); + } + + void free_item (struct t_test_item *item) + { + /* char */ + free (item->test_ptr_2_char); + + /* integer */ + free (item->test_ptr_3_int); + free (item->test_ptr_1_int_fixed_size); + + /* long */ + free (item->test_ptr_2_long); + + /* string */ + free (item->test_string); + free (item->test_string2); + free (item->test_string3); + string_shared_free (item->test_shared_string); + hashtable_free (item->test_hashtable); + string_free_split (item->test_ptr_words); + string_free_split (item->test_ptr_words_dyn); + string_free_split_shared (item->test_ptr_words_dyn_shared); + + /* pointer */ + free (item->test_ptr_3_pointer); + + /* time */ + free (item->test_ptr_2_time); + + /* hashtable */ + hashtable_free (item->test_array_2_hashtable_fixed_size[0]); + hashtable_free (item->test_array_2_hashtable_fixed_size[1]); + hashtable_free (item->test_ptr_2_hashtable[0]); + hashtable_free (item->test_ptr_2_hashtable[1]); + free (item->test_ptr_2_hashtable); + hashtable_free (item->test_ptr_1_hashtable_dyn[0]); + free (item->test_ptr_1_hashtable_dyn); + + free (item); + } + + void teardown () + { + free_item (ptr_item1); + free_item (ptr_item2); + + ptr_item1 = NULL; + ptr_item2 = NULL; + + items = NULL; + last_item = NULL; + + hashtable_remove (weechat_hdata, "test_item"); + } +}; + /* * Tests functions: * hdata_get_var_offset + */ + +TEST(CoreHdataWithList, GetVarOffset) +{ + LONGS_EQUAL(-1, hdata_get_var_offset (NULL, NULL)); + LONGS_EQUAL(-1, hdata_get_var_offset (ptr_hdata, NULL)); + LONGS_EQUAL(-1, hdata_get_var_offset (NULL, "test_char")); + LONGS_EQUAL(-1, hdata_get_var_offset (ptr_hdata, "zzz")); + + LONGS_EQUAL(offsetof (struct t_test_item, test_char), + hdata_get_var_offset (ptr_hdata, "test_char")); + LONGS_EQUAL(offsetof (struct t_test_item, test_int), + hdata_get_var_offset (ptr_hdata, "test_int")); + LONGS_EQUAL(offsetof (struct t_test_item, test_string), + hdata_get_var_offset (ptr_hdata, "test_string")); +} + +/* + * Tests functions: * hdata_get_var_type + */ + +TEST(CoreHdataWithList, GetVarType) +{ + LONGS_EQUAL(-1, hdata_get_var_type (NULL, NULL)); + LONGS_EQUAL(-1, hdata_get_var_type (ptr_hdata, NULL)); + LONGS_EQUAL(-1, hdata_get_var_type (NULL, "test_char")); + LONGS_EQUAL(-1, hdata_get_var_type (ptr_hdata, "zzz")); + + LONGS_EQUAL(WEECHAT_HDATA_CHAR, + hdata_get_var_type (ptr_hdata, "test_char")); + LONGS_EQUAL(WEECHAT_HDATA_INTEGER, + hdata_get_var_type (ptr_hdata, "test_int")); + LONGS_EQUAL(WEECHAT_HDATA_LONG, + hdata_get_var_type (ptr_hdata, "test_long")); + LONGS_EQUAL(WEECHAT_HDATA_STRING, + hdata_get_var_type (ptr_hdata, "test_string")); + LONGS_EQUAL(WEECHAT_HDATA_SHARED_STRING, + hdata_get_var_type (ptr_hdata, "test_shared_string")); + LONGS_EQUAL(WEECHAT_HDATA_POINTER, + hdata_get_var_type (ptr_hdata, "test_pointer")); + LONGS_EQUAL(WEECHAT_HDATA_TIME, + hdata_get_var_type (ptr_hdata, "test_time")); + LONGS_EQUAL(WEECHAT_HDATA_HASHTABLE, + hdata_get_var_type (ptr_hdata, "test_hashtable")); + LONGS_EQUAL(WEECHAT_HDATA_OTHER, + hdata_get_var_type (ptr_hdata, "test_other")); +} + +/* + * Tests functions: * hdata_get_var_type_string + */ + +TEST(CoreHdataWithList, GetVarTypeString) +{ + POINTERS_EQUAL(NULL, hdata_get_var_type_string (NULL, NULL)); + POINTERS_EQUAL(NULL, hdata_get_var_type_string (ptr_hdata, NULL)); + POINTERS_EQUAL(NULL, hdata_get_var_type_string (NULL, "test_char")); + POINTERS_EQUAL(NULL, hdata_get_var_type_string (ptr_hdata, "zzz")); + + STRCMP_EQUAL("char", + hdata_get_var_type_string (ptr_hdata, "test_char")); + STRCMP_EQUAL("integer", + hdata_get_var_type_string (ptr_hdata, "test_int")); + STRCMP_EQUAL("long", + hdata_get_var_type_string (ptr_hdata, "test_long")); + STRCMP_EQUAL("string", + hdata_get_var_type_string (ptr_hdata, "test_string")); + STRCMP_EQUAL("shared_string", + hdata_get_var_type_string (ptr_hdata, "test_shared_string")); + STRCMP_EQUAL("pointer", + hdata_get_var_type_string (ptr_hdata, "test_pointer")); + STRCMP_EQUAL("time", + hdata_get_var_type_string (ptr_hdata, "test_time")); + STRCMP_EQUAL("hashtable", + hdata_get_var_type_string (ptr_hdata, "test_hashtable")); + STRCMP_EQUAL("other", + hdata_get_var_type_string (ptr_hdata, "test_other")); +} + +/* + * Tests functions: * hdata_get_var_array_size + */ + +TEST(CoreHdataWithList, GetVarArraySize) +{ + LONGS_EQUAL(-1, hdata_get_var_array_size (NULL, NULL, NULL)); + LONGS_EQUAL(-1, hdata_get_var_array_size (ptr_hdata, NULL, NULL)); + LONGS_EQUAL(-1, hdata_get_var_array_size (NULL, NULL, "test_char")); + LONGS_EQUAL(-1, hdata_get_var_array_size (ptr_hdata, NULL, "zzz")); + LONGS_EQUAL(-1, hdata_get_var_array_size (ptr_hdata, ptr_item1, "zzz")); + + /* not an array */ + LONGS_EQUAL(-1, hdata_get_var_array_size (ptr_hdata, ptr_item1, "test_char")); + + /* item 1 */ + LONGS_EQUAL(2, hdata_get_var_array_size (ptr_hdata, ptr_item1, + "test_array_2_char_fixed_size")); + LONGS_EQUAL(2, hdata_get_var_array_size (ptr_hdata, ptr_item1, + "test_ptr_2_char")); + LONGS_EQUAL(2, hdata_get_var_array_size (ptr_hdata, ptr_item1, + "test_array_2_int_fixed_size")); + LONGS_EQUAL(3, hdata_get_var_array_size (ptr_hdata, ptr_item1, + "test_ptr_3_int")); + LONGS_EQUAL(1, hdata_get_var_array_size (ptr_hdata, ptr_item1, + "test_ptr_1_int_fixed_size")); + LONGS_EQUAL(2, hdata_get_var_array_size (ptr_hdata, ptr_item1, + "test_array_2_long_fixed_size")); + LONGS_EQUAL(2, hdata_get_var_array_size (ptr_hdata, ptr_item1, + "test_ptr_2_long")); + LONGS_EQUAL(2, hdata_get_var_array_size (ptr_hdata, ptr_item1, + "test_array_2_words_fixed_size")); + LONGS_EQUAL(3, hdata_get_var_array_size (ptr_hdata, ptr_item1, + "test_ptr_words")); + LONGS_EQUAL(3, hdata_get_var_array_size (ptr_hdata, ptr_item1, + "test_ptr_words_dyn")); + LONGS_EQUAL(3, hdata_get_var_array_size (ptr_hdata, ptr_item1, + "test_ptr_words_dyn_shared")); + LONGS_EQUAL(2, hdata_get_var_array_size (ptr_hdata, ptr_item1, + "test_array_2_pointer_fixed_size")); + LONGS_EQUAL(3, hdata_get_var_array_size (ptr_hdata, ptr_item1, + "test_ptr_3_pointer")); + LONGS_EQUAL(0, hdata_get_var_array_size (ptr_hdata, ptr_item1, + "test_ptr_0_pointer_dyn")); + LONGS_EQUAL(1, hdata_get_var_array_size (ptr_hdata, ptr_item1, + "test_ptr_1_pointer_dyn")); + LONGS_EQUAL(2, hdata_get_var_array_size (ptr_hdata, ptr_item1, + "test_array_2_time_fixed_size")); + LONGS_EQUAL(2, hdata_get_var_array_size (ptr_hdata, ptr_item1, + "test_ptr_2_time")); + LONGS_EQUAL(2, hdata_get_var_array_size (ptr_hdata, ptr_item1, + "test_array_2_hashtable_fixed_size")); + LONGS_EQUAL(2, hdata_get_var_array_size (ptr_hdata, ptr_item1, + "test_ptr_2_hashtable")); + LONGS_EQUAL(1, hdata_get_var_array_size (ptr_hdata, ptr_item1, + "test_ptr_1_hashtable_dyn")); + LONGS_EQUAL(3, hdata_get_var_array_size (ptr_hdata, ptr_item1, + "test_ptr_3_other")); + LONGS_EQUAL(-1, hdata_get_var_array_size (ptr_hdata, ptr_item1, + "test_ptr_invalid")); + + /* item 2 */ + LONGS_EQUAL(2, hdata_get_var_array_size (ptr_hdata, ptr_item2, + "test_array_2_char_fixed_size")); + LONGS_EQUAL(2, hdata_get_var_array_size (ptr_hdata, ptr_item2, + "test_ptr_2_char")); + LONGS_EQUAL(2, hdata_get_var_array_size (ptr_hdata, ptr_item2, + "test_array_2_int_fixed_size")); + LONGS_EQUAL(3, hdata_get_var_array_size (ptr_hdata, ptr_item2, + "test_ptr_3_int")); + LONGS_EQUAL(1, hdata_get_var_array_size (ptr_hdata, ptr_item2, + "test_ptr_1_int_fixed_size")); + LONGS_EQUAL(2, hdata_get_var_array_size (ptr_hdata, ptr_item2, + "test_array_2_long_fixed_size")); + LONGS_EQUAL(2, hdata_get_var_array_size (ptr_hdata, ptr_item2, + "test_ptr_2_long")); + LONGS_EQUAL(2, hdata_get_var_array_size (ptr_hdata, ptr_item2, + "test_array_2_words_fixed_size")); + LONGS_EQUAL(4, hdata_get_var_array_size (ptr_hdata, ptr_item2, + "test_ptr_words")); + LONGS_EQUAL(4, hdata_get_var_array_size (ptr_hdata, ptr_item2, + "test_ptr_words_dyn")); + LONGS_EQUAL(4, hdata_get_var_array_size (ptr_hdata, ptr_item2, + "test_ptr_words_dyn_shared")); + LONGS_EQUAL(2, hdata_get_var_array_size (ptr_hdata, ptr_item2, + "test_array_2_pointer_fixed_size")); + LONGS_EQUAL(3, hdata_get_var_array_size (ptr_hdata, ptr_item2, + "test_ptr_3_pointer")); + LONGS_EQUAL(0, hdata_get_var_array_size (ptr_hdata, ptr_item2, + "test_ptr_0_pointer_dyn")); + LONGS_EQUAL(1, hdata_get_var_array_size (ptr_hdata, ptr_item2, + "test_ptr_1_pointer_dyn")); + LONGS_EQUAL(2, hdata_get_var_array_size (ptr_hdata, ptr_item2, + "test_array_2_time_fixed_size")); + LONGS_EQUAL(2, hdata_get_var_array_size (ptr_hdata, ptr_item2, + "test_ptr_2_time")); + LONGS_EQUAL(2, hdata_get_var_array_size (ptr_hdata, ptr_item2, + "test_array_2_hashtable_fixed_size")); + LONGS_EQUAL(2, hdata_get_var_array_size (ptr_hdata, ptr_item2, + "test_ptr_2_hashtable")); + LONGS_EQUAL(1, hdata_get_var_array_size (ptr_hdata, ptr_item2, + "test_ptr_1_hashtable_dyn")); + LONGS_EQUAL(3, hdata_get_var_array_size (ptr_hdata, ptr_item2, + "test_ptr_3_other")); + LONGS_EQUAL(-1, hdata_get_var_array_size (ptr_hdata, ptr_item2, + "test_ptr_invalid")); +} + +/* + * Tests functions: * hdata_get_var_array_size_string + */ + +TEST(CoreHdataWithList, GetVarArraySizeString) +{ + POINTERS_EQUAL(NULL, hdata_get_var_array_size_string (NULL, NULL, + NULL)); + POINTERS_EQUAL(NULL, hdata_get_var_array_size_string (ptr_hdata, NULL, + NULL)); + POINTERS_EQUAL(NULL, hdata_get_var_array_size_string (NULL, NULL, + "test_char")); + POINTERS_EQUAL(NULL, hdata_get_var_array_size_string (ptr_hdata, NULL, + "zzz")); + POINTERS_EQUAL(NULL, hdata_get_var_array_size_string (ptr_hdata, ptr_item1, + "zzz")); + + /* not an array */ + POINTERS_EQUAL(NULL, hdata_get_var_array_size_string (ptr_hdata, ptr_item1, + "test_char")); + + /* item 1 */ + STRCMP_EQUAL("2", + hdata_get_var_array_size_string (ptr_hdata, ptr_item1, + "test_array_2_char_fixed_size")); + STRCMP_EQUAL("test_count_char", + hdata_get_var_array_size_string (ptr_hdata, ptr_item1, + "test_ptr_2_char")); + STRCMP_EQUAL("2", + hdata_get_var_array_size_string (ptr_hdata, ptr_item1, + "test_array_2_int_fixed_size")); + STRCMP_EQUAL("test_count_int", + hdata_get_var_array_size_string (ptr_hdata, ptr_item1, + "test_ptr_3_int")); + STRCMP_EQUAL("1", + hdata_get_var_array_size_string (ptr_hdata, ptr_item1, + "test_ptr_1_int_fixed_size")); + STRCMP_EQUAL("2", + hdata_get_var_array_size_string (ptr_hdata, ptr_item1, + "test_array_2_long_fixed_size")); + STRCMP_EQUAL("test_count_long", + hdata_get_var_array_size_string (ptr_hdata, ptr_item1, + "test_ptr_2_long")); + STRCMP_EQUAL("2", + hdata_get_var_array_size_string (ptr_hdata, ptr_item1, + "test_array_2_words_fixed_size")); + STRCMP_EQUAL("test_count_words", + hdata_get_var_array_size_string (ptr_hdata, ptr_item1, + "test_ptr_words")); + STRCMP_EQUAL("*", hdata_get_var_array_size_string (ptr_hdata, ptr_item1, + "test_ptr_words_dyn")); + STRCMP_EQUAL("*", hdata_get_var_array_size_string (ptr_hdata, ptr_item1, + "test_ptr_words_dyn_shared")); + STRCMP_EQUAL("2", + hdata_get_var_array_size_string (ptr_hdata, ptr_item1, + "test_array_2_pointer_fixed_size")); + STRCMP_EQUAL("test_count_pointer", + hdata_get_var_array_size_string (ptr_hdata, ptr_item1, + "test_ptr_3_pointer")); + STRCMP_EQUAL("*", hdata_get_var_array_size_string (ptr_hdata, ptr_item1, + "test_ptr_0_pointer_dyn")); + STRCMP_EQUAL("*", hdata_get_var_array_size_string (ptr_hdata, ptr_item1, + "test_ptr_1_pointer_dyn")); + STRCMP_EQUAL("2", + hdata_get_var_array_size_string (ptr_hdata, ptr_item1, + "test_array_2_time_fixed_size")); + STRCMP_EQUAL("test_count_time", + hdata_get_var_array_size_string (ptr_hdata, ptr_item1, + "test_ptr_2_time")); + STRCMP_EQUAL("2", + hdata_get_var_array_size_string (ptr_hdata, ptr_item1, + "test_array_2_hashtable_fixed_size")); + STRCMP_EQUAL("test_count_hashtable", + hdata_get_var_array_size_string (ptr_hdata, ptr_item1, + "test_ptr_2_hashtable")); + STRCMP_EQUAL("*", + hdata_get_var_array_size_string (ptr_hdata, ptr_item1, + "test_ptr_1_hashtable_dyn")); + STRCMP_EQUAL("test_count_other", + hdata_get_var_array_size_string (ptr_hdata, ptr_item1, + "test_ptr_3_other")); + STRCMP_EQUAL("test_count_invalid", + hdata_get_var_array_size_string (ptr_hdata, ptr_item1, + "test_ptr_invalid")); + + /* item 2 */ + STRCMP_EQUAL("2", + hdata_get_var_array_size_string (ptr_hdata, ptr_item2, + "test_array_2_char_fixed_size")); + STRCMP_EQUAL("test_count_char", + hdata_get_var_array_size_string (ptr_hdata, ptr_item2, + "test_ptr_2_char")); + STRCMP_EQUAL("2", + hdata_get_var_array_size_string (ptr_hdata, ptr_item2, + "test_array_2_int_fixed_size")); + STRCMP_EQUAL("test_count_int", + hdata_get_var_array_size_string (ptr_hdata, ptr_item2, + "test_ptr_3_int")); + STRCMP_EQUAL("1", + hdata_get_var_array_size_string (ptr_hdata, ptr_item2, + "test_ptr_1_int_fixed_size")); + STRCMP_EQUAL("2", + hdata_get_var_array_size_string (ptr_hdata, ptr_item2, + "test_array_2_long_fixed_size")); + STRCMP_EQUAL("test_count_long", + hdata_get_var_array_size_string (ptr_hdata, ptr_item2, + "test_ptr_2_long")); + STRCMP_EQUAL("2", + hdata_get_var_array_size_string (ptr_hdata, ptr_item2, + "test_array_2_words_fixed_size")); + STRCMP_EQUAL("test_count_words", + hdata_get_var_array_size_string (ptr_hdata, ptr_item2, + "test_ptr_words")); + STRCMP_EQUAL("*", hdata_get_var_array_size_string (ptr_hdata, ptr_item2, + "test_ptr_words_dyn")); + STRCMP_EQUAL("*", hdata_get_var_array_size_string (ptr_hdata, ptr_item2, + "test_ptr_words_dyn_shared")); + STRCMP_EQUAL("2", + hdata_get_var_array_size_string (ptr_hdata, ptr_item2, + "test_array_2_pointer_fixed_size")); + STRCMP_EQUAL("test_count_pointer", + hdata_get_var_array_size_string (ptr_hdata, ptr_item2, + "test_ptr_3_pointer")); + STRCMP_EQUAL("*", hdata_get_var_array_size_string (ptr_hdata, ptr_item2, + "test_ptr_0_pointer_dyn")); + STRCMP_EQUAL("*", hdata_get_var_array_size_string (ptr_hdata, ptr_item2, + "test_ptr_1_pointer_dyn")); + STRCMP_EQUAL("2", + hdata_get_var_array_size_string (ptr_hdata, ptr_item2, + "test_array_2_time_fixed_size")); + STRCMP_EQUAL("test_count_time", + hdata_get_var_array_size_string (ptr_hdata, ptr_item2, + "test_ptr_2_time")); + STRCMP_EQUAL("2", + hdata_get_var_array_size_string (ptr_hdata, ptr_item2, + "test_array_2_hashtable_fixed_size")); + STRCMP_EQUAL("test_count_hashtable", + hdata_get_var_array_size_string (ptr_hdata, ptr_item2, + "test_ptr_2_hashtable")); + STRCMP_EQUAL("*", + hdata_get_var_array_size_string (ptr_hdata, ptr_item2, + "test_ptr_1_hashtable_dyn")); + STRCMP_EQUAL("test_count_other", + hdata_get_var_array_size_string (ptr_hdata, ptr_item2, + "test_ptr_3_other")); + STRCMP_EQUAL("test_count_invalid", + hdata_get_var_array_size_string (ptr_hdata, ptr_item2, + "test_ptr_invalid")); +} + +/* + * Tests functions: * hdata_get_var_hdata + */ + +TEST(CoreHdataWithList, GetVarHdata) +{ + POINTERS_EQUAL(NULL, hdata_get_var_hdata (NULL, NULL)); + POINTERS_EQUAL(NULL, hdata_get_var_hdata (ptr_hdata, NULL)); + POINTERS_EQUAL(NULL, hdata_get_var_hdata (NULL, "test_char")); + POINTERS_EQUAL(NULL, hdata_get_var_hdata (ptr_hdata, "zzz")); + + /* no reference to hdata */ + POINTERS_EQUAL(NULL, hdata_get_var_hdata (ptr_hdata, "test_char")); + + /* check prev/next item variables */ + STRCMP_EQUAL("test_item", hdata_get_var_hdata (ptr_hdata, "prev_item")); + STRCMP_EQUAL("test_item", hdata_get_var_hdata (ptr_hdata, "next_item")); +} + +/* + * Tests functions: * hdata_get_var + */ + +TEST(CoreHdataWithList, GetVar) +{ + POINTERS_EQUAL(NULL, hdata_get_var (NULL, NULL, NULL)); + POINTERS_EQUAL(NULL, hdata_get_var (ptr_hdata, NULL, NULL)); + POINTERS_EQUAL(NULL, hdata_get_var (NULL, ptr_item1, NULL)); + POINTERS_EQUAL(NULL, hdata_get_var (NULL, NULL, "test_char")); + POINTERS_EQUAL(NULL, hdata_get_var (ptr_hdata, ptr_item1, NULL)); + POINTERS_EQUAL(NULL, hdata_get_var (NULL, ptr_item1, "test_char")); + POINTERS_EQUAL(NULL, hdata_get_var (ptr_hdata, NULL, "test_char")); + POINTERS_EQUAL(NULL, hdata_get_var (ptr_hdata, ptr_item1, "zzz")); + + /* item 1 */ + POINTERS_EQUAL(&(ptr_item1->test_char), + hdata_get_var (ptr_hdata, ptr_item1, "test_char")); + POINTERS_EQUAL(&(ptr_item1->test_int), + hdata_get_var (ptr_hdata, ptr_item1, "test_int")); + POINTERS_EQUAL(&(ptr_item1->test_string), + hdata_get_var (ptr_hdata, ptr_item1, "test_string")); + + /* item 2 */ + POINTERS_EQUAL(&(ptr_item2->test_char), + hdata_get_var (ptr_hdata, ptr_item2, "test_char")); + POINTERS_EQUAL(&(ptr_item2->test_int), + hdata_get_var (ptr_hdata, ptr_item2, "test_int")); + POINTERS_EQUAL(&(ptr_item2->test_string), + hdata_get_var (ptr_hdata, ptr_item2, "test_string")); +} + +/* + * Tests functions: * hdata_get_var_at_offset + */ + +TEST(CoreHdataWithList, GetVarAtOffset) +{ + POINTERS_EQUAL(NULL, hdata_get_var_at_offset (NULL, NULL, 0)); + POINTERS_EQUAL(NULL, hdata_get_var_at_offset (ptr_hdata, NULL, 0)); + POINTERS_EQUAL(NULL, hdata_get_var_at_offset (NULL, ptr_item1, 0)); + + /* item 1 */ + POINTERS_EQUAL(&(ptr_item1->test_char), + hdata_get_var_at_offset ( + ptr_hdata, + ptr_item1, + offsetof (struct t_test_item, test_char))); + POINTERS_EQUAL(&(ptr_item1->test_int), + hdata_get_var_at_offset ( + ptr_hdata, + ptr_item1, + offsetof (struct t_test_item, test_int))); + POINTERS_EQUAL(&(ptr_item1->test_string), + hdata_get_var_at_offset ( + ptr_hdata, + ptr_item1, + offsetof (struct t_test_item, test_string))); + + /* item 2 */ + POINTERS_EQUAL(&(ptr_item2->test_char), + hdata_get_var_at_offset ( + ptr_hdata, + ptr_item2, + offsetof (struct t_test_item, test_char))); + POINTERS_EQUAL(&(ptr_item2->test_int), + hdata_get_var_at_offset ( + ptr_hdata, + ptr_item2, + offsetof (struct t_test_item, test_int))); + POINTERS_EQUAL(&(ptr_item2->test_string), + hdata_get_var_at_offset ( + ptr_hdata, + ptr_item2, + offsetof (struct t_test_item, test_string))); +} + +/* + * Tests functions: * hdata_get_list */ -TEST(CoreHdata, Get) +TEST(CoreHdataWithList, GetList) { - /* TODO: write tests */ + POINTERS_EQUAL(NULL, hdata_get_list (NULL, NULL)); + POINTERS_EQUAL(NULL, hdata_get_list (ptr_hdata, NULL)); + POINTERS_EQUAL(NULL, hdata_get_list (NULL, "items")); + POINTERS_EQUAL(NULL, hdata_get_list (ptr_hdata, "zzz")); + + POINTERS_EQUAL(ptr_item1, hdata_get_list (ptr_hdata, "items")); + POINTERS_EQUAL(ptr_item2, hdata_get_list (ptr_hdata, "last_item")); } /* @@ -65,44 +1246,997 @@ TEST(CoreHdata, Get) * hdata_check_pointer */ -TEST(CoreHdata, Check) +TEST(CoreHdataWithList, Check) { - /* TODO: write tests */ + LONGS_EQUAL(0, hdata_check_pointer (NULL, NULL, NULL)); + LONGS_EQUAL(0, hdata_check_pointer (ptr_hdata, NULL, NULL)); + LONGS_EQUAL(0, hdata_check_pointer (NULL, NULL, ptr_item1)); + + /* pointer not found */ + LONGS_EQUAL(0, hdata_check_pointer (ptr_hdata, NULL, (void *)0x1)); + LONGS_EQUAL(0, hdata_check_pointer (ptr_hdata, items, (void *)0x1)); + + /* valid pointer */ + LONGS_EQUAL(1, hdata_check_pointer (ptr_hdata, NULL, ptr_item1)); + LONGS_EQUAL(1, hdata_check_pointer (ptr_hdata, NULL, ptr_item2)); + LONGS_EQUAL(1, hdata_check_pointer (ptr_hdata, items, ptr_item1)); + LONGS_EQUAL(1, hdata_check_pointer (ptr_hdata, items, ptr_item2)); } /* * Tests functions: * hdata_move + */ + +TEST(CoreHdataWithList, Move) +{ + POINTERS_EQUAL(NULL, hdata_move (NULL, NULL, 0)); + POINTERS_EQUAL(NULL, hdata_move (ptr_hdata, NULL, 0)); + POINTERS_EQUAL(NULL, hdata_move (NULL, ptr_item1, 0)); + POINTERS_EQUAL(NULL, hdata_move (NULL, NULL, 1)); + POINTERS_EQUAL(NULL, hdata_move (ptr_hdata, ptr_item1, 0)); + POINTERS_EQUAL(NULL, hdata_move (ptr_hdata, NULL, 1)); + POINTERS_EQUAL(NULL, hdata_move (NULL, ptr_item1, 1)); + + /* move from item1 */ + POINTERS_EQUAL(NULL, hdata_move (ptr_hdata, ptr_item1, -1)); + POINTERS_EQUAL(NULL, hdata_move (ptr_hdata, ptr_item1, -42)); + POINTERS_EQUAL(ptr_item2, hdata_move (ptr_hdata, ptr_item1, 1)); + POINTERS_EQUAL(NULL, hdata_move (ptr_hdata, ptr_item1, 42)); + + /* move from item2 */ + POINTERS_EQUAL(ptr_item1, hdata_move (ptr_hdata, ptr_item2, -1)); + POINTERS_EQUAL(NULL, hdata_move (ptr_hdata, ptr_item2, -42)); + POINTERS_EQUAL(NULL, hdata_move (ptr_hdata, ptr_item2, 1)); + POINTERS_EQUAL(NULL, hdata_move (ptr_hdata, ptr_item2, 42)); +} + +/* + * Tests functions: * hdata_search */ -TEST(CoreHdata, Move) +TEST(CoreHdataWithList, Search) { - /* TODO: write tests */ + POINTERS_EQUAL(NULL, hdata_search (NULL, NULL, NULL, 0)); + POINTERS_EQUAL(NULL, hdata_search (ptr_hdata, NULL, NULL, 0)); + POINTERS_EQUAL(NULL, hdata_search (NULL, items, NULL, 0)); + POINTERS_EQUAL(NULL, hdata_search (NULL, NULL, "${test_char} == A", 0)); + POINTERS_EQUAL(NULL, hdata_search (NULL, NULL, NULL, 1)); + POINTERS_EQUAL(NULL, hdata_search (ptr_hdata, items, NULL, 0)); + POINTERS_EQUAL(NULL, hdata_search (ptr_hdata, NULL, "${test_char} == A", 0)); + POINTERS_EQUAL(NULL, hdata_search (ptr_hdata, NULL, NULL, 1)); + POINTERS_EQUAL(NULL, hdata_search (NULL, items, "${test_char} == A", 0)); + POINTERS_EQUAL(NULL, hdata_search (NULL, items, NULL, 1)); + POINTERS_EQUAL(NULL, hdata_search (NULL, NULL, "${test_char} == A", 1)); + POINTERS_EQUAL(NULL, hdata_search (ptr_hdata, items, "${test_char} == A", 0)); + POINTERS_EQUAL(NULL, hdata_search (ptr_hdata, items, NULL, 1)); + POINTERS_EQUAL(NULL, hdata_search (ptr_hdata, NULL, "${test_char} == A", 1)); + POINTERS_EQUAL(NULL, hdata_search (NULL, items, "${test_char} == A", 1)); + + /* search char */ + POINTERS_EQUAL(NULL, + hdata_search (ptr_hdata, items, + "${test_item.test_char} == Z", 1)); + POINTERS_EQUAL(NULL, + hdata_search (ptr_hdata, items, + "${test_item.test_char} == X", 2)); + POINTERS_EQUAL(ptr_item1, + hdata_search (ptr_hdata, items, + "${test_item.test_char} == A", 1)); + POINTERS_EQUAL(ptr_item2, + hdata_search (ptr_hdata, items, + "${test_item.test_char} == a", 1)); + POINTERS_EQUAL(ptr_item1, + hdata_search (ptr_hdata, last_item, + "${test_item.test_char} == A", -1)); + + /* search integer */ + POINTERS_EQUAL(NULL, + hdata_search (ptr_hdata, items, + "${test_item.test_int} == 999", 1)); + POINTERS_EQUAL(NULL, + hdata_search (ptr_hdata, items, + "${test_item.test_int} == 456", 2)); + POINTERS_EQUAL(ptr_item1, + hdata_search (ptr_hdata, items, + "${test_item.test_int} == 123", 1)); + POINTERS_EQUAL(ptr_item2, + hdata_search (ptr_hdata, items, + "${test_item.test_int} == 456", 1)); + POINTERS_EQUAL(ptr_item1, + hdata_search (ptr_hdata, last_item, + "${test_item.test_int} == 123", -1)); + + /* search long */ + POINTERS_EQUAL(NULL, + hdata_search (ptr_hdata, items, + "${test_item.test_long} == 999", 1)); + POINTERS_EQUAL(NULL, + hdata_search (ptr_hdata, items, + "${test_item.test_long} == 987654321", 2)); + POINTERS_EQUAL(ptr_item1, + hdata_search (ptr_hdata, items, + "${test_item.test_long} == 123456789", 1)); + POINTERS_EQUAL(ptr_item2, + hdata_search (ptr_hdata, items, + "${test_item.test_long} == 987654321", 1)); + POINTERS_EQUAL(ptr_item1, + hdata_search (ptr_hdata, last_item, + "${test_item.test_long} == 123456789", -1)); + + /* search string */ + POINTERS_EQUAL(NULL, + hdata_search (ptr_hdata, items, + "${test_item.test_string} == zzz", 1)); + POINTERS_EQUAL(NULL, + hdata_search (ptr_hdata, items, + "${test_item.test_string} == item2", 2)); + POINTERS_EQUAL(ptr_item1, + hdata_search (ptr_hdata, items, + "${test_item.test_string} == item1", 1)); + POINTERS_EQUAL(ptr_item2, + hdata_search (ptr_hdata, items, + "${test_item.test_string} == item2", 1)); + POINTERS_EQUAL(ptr_item1, + hdata_search (ptr_hdata, last_item, + "${test_item.test_string} == item1", -1)); + + /* search shared string */ + POINTERS_EQUAL( + NULL, + hdata_search (ptr_hdata, items, + "${test_item.test_shared_string} == zzz", 1)); + POINTERS_EQUAL( + NULL, + hdata_search (ptr_hdata, items, + "${test_item.test_shared_string} == item2_shared", 2)); + POINTERS_EQUAL( + ptr_item1, + hdata_search (ptr_hdata, items, + "${test_item.test_shared_string} == item1_shared", 1)); + POINTERS_EQUAL( + ptr_item2, + hdata_search (ptr_hdata, items, + "${test_item.test_shared_string} == item2_shared", 1)); + POINTERS_EQUAL( + ptr_item1, + hdata_search (ptr_hdata, last_item, + "${test_item.test_shared_string} == item1_shared", -1)); + + /* search pointer */ + POINTERS_EQUAL(NULL, + hdata_search (ptr_hdata, items, + "${test_item.test_pointer} == 0x999", 1)); + POINTERS_EQUAL(NULL, + hdata_search (ptr_hdata, items, + "${test_item.test_pointer} == 0x456", 2)); + POINTERS_EQUAL(ptr_item1, + hdata_search (ptr_hdata, items, + "${test_item.test_pointer} == 0x123", 1)); + POINTERS_EQUAL(ptr_item2, + hdata_search (ptr_hdata, items, + "${test_item.test_pointer} == 0x456", 1)); + POINTERS_EQUAL(ptr_item1, + hdata_search (ptr_hdata, last_item, + "${test_item.test_pointer} == 0x123", -1)); + + /* search time */ + POINTERS_EQUAL(NULL, + hdata_search (ptr_hdata, items, + "${test_item.test_time} == 999", 1)); + POINTERS_EQUAL(NULL, + hdata_search (ptr_hdata, items, + "${test_item.test_time} == 789123", 2)); + POINTERS_EQUAL(ptr_item1, + hdata_search (ptr_hdata, items, + "${test_item.test_time} == 123456", 1)); + POINTERS_EQUAL(ptr_item2, + hdata_search (ptr_hdata, items, + "${test_item.test_time} == 789123", 1)); + POINTERS_EQUAL(ptr_item1, + hdata_search (ptr_hdata, last_item, + "${test_item.test_time} == 123456", -1)); +} + +/* + * Tests functions: + * hdata_get_index_and_name + */ + +TEST(CoreHdataWithList, GetIndexAndName) +{ + int index; + const char *ptr_name; + + hdata_get_index_and_name (NULL, NULL, NULL); + hdata_get_index_and_name ("test", NULL, NULL); + hdata_get_index_and_name ("123|test", NULL, NULL); + + index = -999; + ptr_name = (const char *)0x1; + hdata_get_index_and_name (NULL, &index, &ptr_name); + LONGS_EQUAL(-1, index); + POINTERS_EQUAL(NULL, ptr_name); + + index = -999; + ptr_name = (const char *)0x1; + hdata_get_index_and_name ("test", &index, &ptr_name); + LONGS_EQUAL(-1, index); + STRCMP_EQUAL("test", ptr_name); + + index = -999; + ptr_name = (const char *)0x1; + hdata_get_index_and_name ("abc|test", &index, &ptr_name); + LONGS_EQUAL(-1, index); + STRCMP_EQUAL("abc|test", ptr_name); + + index = -999; + ptr_name = (const char *)0x1; + hdata_get_index_and_name ("123|test", &index, &ptr_name); + LONGS_EQUAL(123, index); + STRCMP_EQUAL("test", ptr_name); + + index = -999; + ptr_name = (const char *)0x1; + hdata_get_index_and_name ("123|", &index, &ptr_name); + LONGS_EQUAL(123, index); + STRCMP_EQUAL("", ptr_name); } /* * Tests functions: * hdata_char + */ + +TEST(CoreHdataWithList, Char) +{ + LONGS_EQUAL('\0', hdata_char (NULL, NULL, NULL)); + LONGS_EQUAL('\0', hdata_char (ptr_hdata, NULL, NULL)); + LONGS_EQUAL('\0', hdata_char (NULL, ptr_item1, NULL)); + LONGS_EQUAL('\0', hdata_char (NULL, NULL, "test_char")); + LONGS_EQUAL('\0', hdata_char (ptr_hdata, ptr_item1, NULL)); + LONGS_EQUAL('\0', hdata_char (ptr_hdata, NULL, "test_char")); + LONGS_EQUAL('\0', hdata_char (NULL, ptr_item1, "test_char")); + + /* variable not found */ + LONGS_EQUAL('\0', hdata_char (ptr_hdata, ptr_item1, "zzz")); + LONGS_EQUAL('\0', hdata_char (ptr_hdata, ptr_item1, "1|zzz")); + + /* item 1 */ + LONGS_EQUAL('A', hdata_char (ptr_hdata, ptr_item1, "test_char")); + LONGS_EQUAL('A', hdata_char (ptr_hdata, ptr_item1, + "0|test_array_2_char_fixed_size")); + LONGS_EQUAL('B', hdata_char (ptr_hdata, ptr_item1, + "1|test_array_2_char_fixed_size")); + LONGS_EQUAL('B', hdata_char (ptr_hdata, ptr_item1, "0|test_ptr_2_char")); + LONGS_EQUAL('C', hdata_char (ptr_hdata, ptr_item1, "1|test_ptr_2_char")); + + /* item 2 */ + LONGS_EQUAL('a', hdata_char (ptr_hdata, ptr_item2, "test_char")); + LONGS_EQUAL('b', hdata_char (ptr_hdata, ptr_item2, "0|test_ptr_2_char")); + LONGS_EQUAL('c', hdata_char (ptr_hdata, ptr_item2, "1|test_ptr_2_char")); +} + +/* + * Tests functions: * hdata_integer + */ + +TEST(CoreHdataWithList, Integer) +{ + LONGS_EQUAL(0, hdata_integer (NULL, NULL, NULL)); + LONGS_EQUAL(0, hdata_integer (ptr_hdata, NULL, NULL)); + LONGS_EQUAL(0, hdata_integer (NULL, ptr_item1, NULL)); + LONGS_EQUAL(0, hdata_integer (NULL, NULL, "test_int")); + LONGS_EQUAL(0, hdata_integer (ptr_hdata, ptr_item1, NULL)); + LONGS_EQUAL(0, hdata_integer (ptr_hdata, NULL, "test_int")); + LONGS_EQUAL(0, hdata_integer (NULL, ptr_item1, "test_int")); + + /* variable not found */ + LONGS_EQUAL(0, hdata_integer (ptr_hdata, ptr_item1, "zzz")); + LONGS_EQUAL(0, hdata_integer (ptr_hdata, ptr_item1, "1|zzz")); + + /* item 1 */ + LONGS_EQUAL(123, hdata_integer (ptr_hdata, ptr_item1, "test_int")); + LONGS_EQUAL(111, hdata_integer (ptr_hdata, ptr_item1, + "0|test_array_2_int_fixed_size")); + LONGS_EQUAL(222, hdata_integer (ptr_hdata, ptr_item1, + "1|test_array_2_int_fixed_size")); + LONGS_EQUAL(1, hdata_integer (ptr_hdata, ptr_item1, "0|test_ptr_3_int")); + LONGS_EQUAL(2, hdata_integer (ptr_hdata, ptr_item1, "1|test_ptr_3_int")); + LONGS_EQUAL(3, hdata_integer (ptr_hdata, ptr_item1, "2|test_ptr_3_int")); + LONGS_EQUAL(111, hdata_integer (ptr_hdata, ptr_item1, + "0|test_ptr_1_int_fixed_size")); + + /* item 2 */ + LONGS_EQUAL(456, hdata_integer (ptr_hdata, ptr_item2, "test_int")); + LONGS_EQUAL(444, hdata_integer (ptr_hdata, ptr_item2, + "0|test_array_2_int_fixed_size")); + LONGS_EQUAL(555, hdata_integer (ptr_hdata, ptr_item2, + "1|test_array_2_int_fixed_size")); + LONGS_EQUAL(4, hdata_integer (ptr_hdata, ptr_item2, "0|test_ptr_3_int")); + LONGS_EQUAL(5, hdata_integer (ptr_hdata, ptr_item2, "1|test_ptr_3_int")); + LONGS_EQUAL(6, hdata_integer (ptr_hdata, ptr_item2, "2|test_ptr_3_int")); + LONGS_EQUAL(222, hdata_integer (ptr_hdata, ptr_item2, + "0|test_ptr_1_int_fixed_size")); +} + +/* + * Tests functions: * hdata_long + */ + +TEST(CoreHdataWithList, Long) +{ + LONGS_EQUAL(0, hdata_long (NULL, NULL, NULL)); + LONGS_EQUAL(0, hdata_long (ptr_hdata, NULL, NULL)); + LONGS_EQUAL(0, hdata_long (NULL, ptr_item1, NULL)); + LONGS_EQUAL(0, hdata_long (NULL, NULL, "test_long")); + LONGS_EQUAL(0, hdata_long (ptr_hdata, ptr_item1, NULL)); + LONGS_EQUAL(0, hdata_long (ptr_hdata, NULL, "test_long")); + LONGS_EQUAL(0, hdata_long (NULL, ptr_item1, "test_long")); + + /* variable not found */ + LONGS_EQUAL(0, hdata_long (ptr_hdata, ptr_item1, "zzz")); + LONGS_EQUAL(0, hdata_long (ptr_hdata, ptr_item1, "1|zzz")); + + /* item 1 */ + LONGS_EQUAL(123456789L, hdata_long (ptr_hdata, ptr_item1, "test_long")); + LONGS_EQUAL(111L, hdata_long (ptr_hdata, ptr_item1, + "0|test_array_2_long_fixed_size")); + LONGS_EQUAL(222L, hdata_long (ptr_hdata, ptr_item1, + "1|test_array_2_long_fixed_size")); + LONGS_EQUAL(123456L, hdata_long (ptr_hdata, ptr_item1, + "0|test_ptr_2_long")); + LONGS_EQUAL(234567L, hdata_long (ptr_hdata, ptr_item1, + "1|test_ptr_2_long")); + + /* item 2 */ + LONGS_EQUAL(987654321L, hdata_long (ptr_hdata, ptr_item2, "test_long")); + LONGS_EQUAL(333L, hdata_long (ptr_hdata, ptr_item2, + "0|test_array_2_long_fixed_size")); + LONGS_EQUAL(444L, hdata_long (ptr_hdata, ptr_item2, + "1|test_array_2_long_fixed_size")); + LONGS_EQUAL(789123L, hdata_long (ptr_hdata, ptr_item2, + "0|test_ptr_2_long")); + LONGS_EQUAL(891234L, hdata_long (ptr_hdata, ptr_item2, + "1|test_ptr_2_long")); +} + +/* + * Tests functions: * hdata_string + */ + +TEST(CoreHdataWithList, String) +{ + POINTERS_EQUAL(NULL, hdata_string (NULL, NULL, NULL)); + POINTERS_EQUAL(NULL, hdata_string (ptr_hdata, NULL, NULL)); + POINTERS_EQUAL(NULL, hdata_string (NULL, ptr_item1, NULL)); + POINTERS_EQUAL(NULL, hdata_string (NULL, NULL, "test_string")); + POINTERS_EQUAL(NULL, hdata_string (ptr_hdata, ptr_item1, NULL)); + POINTERS_EQUAL(NULL, hdata_string (ptr_hdata, NULL, "test_string")); + POINTERS_EQUAL(NULL, hdata_string (NULL, ptr_item1, "test_string")); + + /* variable not found */ + POINTERS_EQUAL(NULL, hdata_string (ptr_hdata, ptr_item1, "zzz")); + POINTERS_EQUAL(NULL, hdata_string (ptr_hdata, ptr_item1, "1|zzz")); + + /* item 1 */ + STRCMP_EQUAL("item1", hdata_string (ptr_hdata, ptr_item1, "test_string")); + STRCMP_EQUAL("item1_shared", hdata_string (ptr_hdata, ptr_item1, + "test_shared_string")); + POINTERS_EQUAL( + NULL, + hdata_string (ptr_hdata, ptr_item1, "0|test_array_2_words_fixed_size")); + POINTERS_EQUAL( + NULL, + hdata_string (ptr_hdata, ptr_item1, "1|test_array_2_words_fixed_size")); + STRCMP_EQUAL( + "a", + hdata_string (ptr_hdata, ptr_item1, "0|test_ptr_words")); + STRCMP_EQUAL( + "b", + hdata_string (ptr_hdata, ptr_item1, "1|test_ptr_words")); + STRCMP_EQUAL( + "c", + hdata_string (ptr_hdata, ptr_item1, "2|test_ptr_words")); + POINTERS_EQUAL( + NULL, + hdata_string (ptr_hdata, ptr_item1, "3|test_ptr_words")); + STRCMP_EQUAL( + "aa", + hdata_string (ptr_hdata, ptr_item1, "0|test_ptr_words_dyn")); + STRCMP_EQUAL( + "bb", + hdata_string (ptr_hdata, ptr_item1, "1|test_ptr_words_dyn")); + STRCMP_EQUAL( + "cc", + hdata_string (ptr_hdata, ptr_item1, "2|test_ptr_words_dyn")); + POINTERS_EQUAL( + NULL, + hdata_string (ptr_hdata, ptr_item1, "3|test_ptr_words_dyn")); + STRCMP_EQUAL( + "aaa", + hdata_string (ptr_hdata, ptr_item1, "0|test_ptr_words_dyn_shared")); + STRCMP_EQUAL( + "bbb", + hdata_string (ptr_hdata, ptr_item1, "1|test_ptr_words_dyn_shared")); + STRCMP_EQUAL( + "ccc", + hdata_string (ptr_hdata, ptr_item1, "2|test_ptr_words_dyn_shared")); + POINTERS_EQUAL( + NULL, + hdata_string (ptr_hdata, ptr_item1, "3|test_ptr_words_dyn_shared")); + + /* item 2 */ + STRCMP_EQUAL("item2", hdata_string (ptr_hdata, ptr_item2, "test_string")); + STRCMP_EQUAL("item2_shared", hdata_string (ptr_hdata, ptr_item2, + "test_shared_string")); + POINTERS_EQUAL( + NULL, + hdata_string (ptr_hdata, ptr_item2, "0|test_array_2_words_fixed_size")); + POINTERS_EQUAL( + NULL, + hdata_string (ptr_hdata, ptr_item2, "1|test_array_2_words_fixed_size")); + STRCMP_EQUAL( + "e", + hdata_string (ptr_hdata, ptr_item2, "0|test_ptr_words")); + STRCMP_EQUAL( + "f", + hdata_string (ptr_hdata, ptr_item2, "1|test_ptr_words")); + STRCMP_EQUAL( + "g", + hdata_string (ptr_hdata, ptr_item2, "2|test_ptr_words")); + STRCMP_EQUAL( + "h", + hdata_string (ptr_hdata, ptr_item2, "3|test_ptr_words")); + POINTERS_EQUAL( + NULL, + hdata_string (ptr_hdata, ptr_item2, "4|test_ptr_words")); + STRCMP_EQUAL( + "ee", + hdata_string (ptr_hdata, ptr_item2, "0|test_ptr_words_dyn")); + STRCMP_EQUAL( + "ff", + hdata_string (ptr_hdata, ptr_item2, "1|test_ptr_words_dyn")); + STRCMP_EQUAL( + "gg", + hdata_string (ptr_hdata, ptr_item2, "2|test_ptr_words_dyn")); + STRCMP_EQUAL( + "hh", + hdata_string (ptr_hdata, ptr_item2, "3|test_ptr_words_dyn")); + POINTERS_EQUAL( + NULL, + hdata_string (ptr_hdata, ptr_item2, "4|test_ptr_words_dyn")); + STRCMP_EQUAL( + "eee", + hdata_string (ptr_hdata, ptr_item2, "0|test_ptr_words_dyn_shared")); + STRCMP_EQUAL( + "fff", + hdata_string (ptr_hdata, ptr_item2, "1|test_ptr_words_dyn_shared")); + STRCMP_EQUAL( + "ggg", + hdata_string (ptr_hdata, ptr_item2, "2|test_ptr_words_dyn_shared")); + STRCMP_EQUAL( + "hhh", + hdata_string (ptr_hdata, ptr_item2, "3|test_ptr_words_dyn_shared")); + POINTERS_EQUAL( + NULL, + hdata_string (ptr_hdata, ptr_item2, "4|test_ptr_words_dyn_shared")); +} + +/* + * Tests functions: * hdata_pointer + */ + +TEST(CoreHdataWithList, Pointer) +{ + POINTERS_EQUAL(NULL, hdata_pointer (NULL, NULL, NULL)); + POINTERS_EQUAL(NULL, hdata_pointer (ptr_hdata, NULL, NULL)); + POINTERS_EQUAL(NULL, hdata_pointer (NULL, ptr_item1, NULL)); + POINTERS_EQUAL(NULL, hdata_pointer (NULL, NULL, "test_pointer")); + POINTERS_EQUAL(NULL, hdata_pointer (ptr_hdata, ptr_item1, NULL)); + POINTERS_EQUAL(NULL, hdata_pointer (ptr_hdata, NULL, "test_pointer")); + POINTERS_EQUAL(NULL, hdata_pointer (NULL, ptr_item1, "test_pointer")); + + /* variable not found */ + POINTERS_EQUAL(NULL, hdata_pointer (ptr_hdata, ptr_item1, "zzz")); + POINTERS_EQUAL(NULL, hdata_pointer (ptr_hdata, ptr_item1, "1|zzz")); + + /* item 1 */ + LONGS_EQUAL(0x123, hdata_pointer (ptr_hdata, ptr_item1, "test_pointer")); + LONGS_EQUAL( + 0x112233, + hdata_pointer (ptr_hdata, ptr_item1, "0|test_array_2_pointer_fixed_size")); + LONGS_EQUAL( + 0x445566, + hdata_pointer (ptr_hdata, ptr_item1, "1|test_array_2_pointer_fixed_size")); + LONGS_EQUAL( + 0x123, + hdata_pointer (ptr_hdata, ptr_item1, "0|test_ptr_3_pointer")); + LONGS_EQUAL( + 0x456, + hdata_pointer (ptr_hdata, ptr_item1, "1|test_ptr_3_pointer")); + LONGS_EQUAL( + 0x789, + hdata_pointer (ptr_hdata, ptr_item1, "2|test_ptr_3_pointer")); + + /* item 2 */ + LONGS_EQUAL(0x456, hdata_pointer (ptr_hdata, ptr_item2, "test_pointer")); + LONGS_EQUAL( + 0x778899, + hdata_pointer (ptr_hdata, ptr_item2, "0|test_array_2_pointer_fixed_size")); + LONGS_EQUAL( + 0xaabbcc, + hdata_pointer (ptr_hdata, ptr_item2, "1|test_array_2_pointer_fixed_size")); + LONGS_EQUAL( + 0x123abc, + hdata_pointer (ptr_hdata, ptr_item2, "0|test_ptr_3_pointer")); + LONGS_EQUAL( + 0x456def, + hdata_pointer (ptr_hdata, ptr_item2, "1|test_ptr_3_pointer")); + LONGS_EQUAL( + 0x789abc, + hdata_pointer (ptr_hdata, ptr_item2, "2|test_ptr_3_pointer")); +} + +/* + * Tests functions: * hdata_time */ -TEST(CoreHdata, Read) +TEST(CoreHdataWithList, Time) { - /* TODO: write tests */ + LONGS_EQUAL(0, hdata_time (NULL, NULL, NULL)); + LONGS_EQUAL(0, hdata_time (ptr_hdata, NULL, NULL)); + LONGS_EQUAL(0, hdata_time (NULL, ptr_item1, NULL)); + LONGS_EQUAL(0, hdata_time (NULL, NULL, "test_time")); + LONGS_EQUAL(0, hdata_time (ptr_hdata, ptr_item1, NULL)); + LONGS_EQUAL(0, hdata_time (ptr_hdata, NULL, "test_time")); + LONGS_EQUAL(0, hdata_time (NULL, ptr_item1, "test_time")); + + /* variable not found */ + LONGS_EQUAL(0, hdata_time (ptr_hdata, ptr_item1, "zzz")); + LONGS_EQUAL(0, hdata_time (ptr_hdata, ptr_item1, "1|zzz")); + + /* item 1 */ + LONGS_EQUAL(123456, hdata_time (ptr_hdata, ptr_item1, "test_time")); + LONGS_EQUAL(112, + hdata_time (ptr_hdata, ptr_item1, "0|test_array_2_time_fixed_size")); + LONGS_EQUAL(334, + hdata_time (ptr_hdata, ptr_item1, "1|test_array_2_time_fixed_size")); + LONGS_EQUAL(1234, + hdata_time (ptr_hdata, ptr_item1, "0|test_ptr_2_time")); + LONGS_EQUAL(5678, + hdata_time (ptr_hdata, ptr_item1, "1|test_ptr_2_time")); + + /* item 2 */ + LONGS_EQUAL(789123, hdata_time (ptr_hdata, ptr_item2, "test_time")); + LONGS_EQUAL(556, + hdata_time (ptr_hdata, ptr_item2, "0|test_array_2_time_fixed_size")); + LONGS_EQUAL(778, + hdata_time (ptr_hdata, ptr_item2, "1|test_array_2_time_fixed_size")); + LONGS_EQUAL(123456, + hdata_time (ptr_hdata, ptr_item2, "0|test_ptr_2_time")); + LONGS_EQUAL(789123, + hdata_time (ptr_hdata, ptr_item2, "1|test_ptr_2_time")); +} + +/* + * Tests functions: + * hdata_hashtable + */ + +TEST(CoreHdataWithList, Hashtable) +{ + struct t_hashtable *ptr_hashtable; + + POINTERS_EQUAL(NULL, hdata_hashtable (NULL, NULL, NULL)); + POINTERS_EQUAL(NULL, hdata_hashtable (ptr_hdata, NULL, NULL)); + POINTERS_EQUAL(NULL, hdata_hashtable (NULL, ptr_item1, NULL)); + POINTERS_EQUAL(NULL, hdata_hashtable (NULL, NULL, "test_hashtable")); + POINTERS_EQUAL(NULL, hdata_hashtable (ptr_hdata, ptr_item1, NULL)); + POINTERS_EQUAL(NULL, hdata_hashtable (ptr_hdata, NULL, "test_hashtable")); + POINTERS_EQUAL(NULL, hdata_hashtable (NULL, ptr_item1, "test_hashtable")); + + /* variable not found */ + POINTERS_EQUAL(NULL, hdata_hashtable (ptr_hdata, ptr_item1, "zzz")); + POINTERS_EQUAL(NULL, hdata_hashtable (ptr_hdata, ptr_item1, "1|zzz")); + + /* item 1 */ + ptr_hashtable = hdata_hashtable (ptr_hdata, ptr_item1, "test_hashtable"); + CHECK(ptr_hashtable); + STRCMP_EQUAL("value1", (const char *)hashtable_get (ptr_hashtable, "key1")); + ptr_hashtable = hdata_hashtable (ptr_hdata, ptr_item1, + "0|test_array_2_hashtable_fixed_size"); + CHECK(ptr_hashtable); + STRCMP_EQUAL("value_array_1.1", + (const char *)hashtable_get (ptr_hashtable, "key_array_1.1")); + ptr_hashtable = hdata_hashtable (ptr_hdata, ptr_item1, + "1|test_array_2_hashtable_fixed_size"); + CHECK(ptr_hashtable); + STRCMP_EQUAL("value_array_1.2", + (const char *)hashtable_get (ptr_hashtable, "key_array_1.2")); + ptr_hashtable = hdata_hashtable (ptr_hdata, ptr_item1, + "0|test_ptr_2_hashtable"); + CHECK(ptr_hashtable); + STRCMP_EQUAL("value1.1", + (const char *)hashtable_get (ptr_hashtable, "key1.1")); + ptr_hashtable = hdata_hashtable (ptr_hdata, ptr_item1, + "1|test_ptr_2_hashtable"); + CHECK(ptr_hashtable); + STRCMP_EQUAL("value1.2", + (const char *)hashtable_get (ptr_hashtable, "key1.2")); + + /* item 2 */ + ptr_hashtable = hdata_hashtable (ptr_hdata, ptr_item2, "test_hashtable"); + CHECK(ptr_hashtable); + STRCMP_EQUAL("value2", (const char *)hashtable_get (ptr_hashtable, "key2")); + ptr_hashtable = hdata_hashtable (ptr_hdata, ptr_item2, + "0|test_array_2_hashtable_fixed_size"); + CHECK(ptr_hashtable); + STRCMP_EQUAL("value_array_2.1", + (const char *)hashtable_get (ptr_hashtable, "key_array_2.1")); + ptr_hashtable = hdata_hashtable (ptr_hdata, ptr_item2, + "1|test_array_2_hashtable_fixed_size"); + CHECK(ptr_hashtable); + STRCMP_EQUAL("value_array_2.2", + (const char *)hashtable_get (ptr_hashtable, "key_array_2.2")); + ptr_hashtable = hdata_hashtable (ptr_hdata, ptr_item2, + "0|test_ptr_2_hashtable"); + CHECK(ptr_hashtable); + STRCMP_EQUAL("value2.1", + (const char *)hashtable_get (ptr_hashtable, "key2.1")); + ptr_hashtable = hdata_hashtable (ptr_hdata, ptr_item2, + "1|test_ptr_2_hashtable"); + CHECK(ptr_hashtable); + STRCMP_EQUAL("value2.2", + (const char *)hashtable_get (ptr_hashtable, "key2.2")); +} + +/* + * Tests functions: + * hdata_compare + */ + +TEST(CoreHdataWithList, Compare) +{ + LONGS_EQUAL(0, hdata_compare (NULL, NULL, NULL, NULL, 0)); + LONGS_EQUAL(0, hdata_compare (ptr_hdata, NULL, NULL, NULL, 0)); + + /* one or two pointers are missing */ + LONGS_EQUAL(0, hdata_compare (ptr_hdata, NULL, NULL, "test_char", 0)); + LONGS_EQUAL(1, hdata_compare (ptr_hdata, ptr_item1, NULL, "test_char", 0)); + LONGS_EQUAL(-1, hdata_compare (ptr_hdata, NULL, ptr_item2, "test_char", 0)); + + /* compare chars: 'A' and 'a' */ + LONGS_EQUAL(0, hdata_compare (ptr_hdata, ptr_item1, ptr_item1, + "test_char", 0)); + LONGS_EQUAL(-1, hdata_compare (ptr_hdata, ptr_item1, ptr_item2, + "test_char", 0)); + LONGS_EQUAL(1, hdata_compare (ptr_hdata, ptr_item2, ptr_item1, + "test_char", 0)); + + /* compare strings: "STRING2" and "string2" */ + LONGS_EQUAL(0, hdata_compare (ptr_hdata, ptr_item1, ptr_item2, + "test_string2", 0)); + LONGS_EQUAL(-1, hdata_compare (ptr_hdata, ptr_item1, ptr_item2, + "test_string2", 1)); + LONGS_EQUAL(1, hdata_compare (ptr_hdata, ptr_item2, ptr_item1, + "test_string2", 1)); + + /* compare strings: "test" and NULL */ + LONGS_EQUAL(1, hdata_compare (ptr_hdata, ptr_item1, ptr_item2, + "test_string3", 0)); + LONGS_EQUAL(-1, hdata_compare (ptr_hdata, ptr_item2, ptr_item1, + "test_string3", 0)); + + /* compare strings: NULL and NULL */ + LONGS_EQUAL(0, hdata_compare (ptr_hdata, ptr_item2, ptr_item1, + "test_string_null", 0)); + + /* compare integers: 123 and 456 */ + LONGS_EQUAL(0, hdata_compare (ptr_hdata, ptr_item1, ptr_item1, + "test_int", 0)); + LONGS_EQUAL(-1, hdata_compare (ptr_hdata, ptr_item1, ptr_item2, + "test_int", 0)); + LONGS_EQUAL(1, hdata_compare (ptr_hdata, ptr_item2, ptr_item1, + "test_int", 0)); + + /* compare long integers: 123456789L and 987654321L */ + LONGS_EQUAL(0, hdata_compare (ptr_hdata, ptr_item1, ptr_item1, + "test_long", 0)); + LONGS_EQUAL(-1, hdata_compare (ptr_hdata, ptr_item1, ptr_item2, + "test_long", 0)); + LONGS_EQUAL(1, hdata_compare (ptr_hdata, ptr_item2, ptr_item1, + "test_long", 0)); + + /* compare pointers: 0x123 and 0x456 */ + LONGS_EQUAL(0, hdata_compare (ptr_hdata, ptr_item1, ptr_item1, + "test_pointer", 0)); + LONGS_EQUAL(-1, hdata_compare (ptr_hdata, ptr_item1, ptr_item2, + "test_pointer", 0)); + LONGS_EQUAL(1, hdata_compare (ptr_hdata, ptr_item2, ptr_item1, + "test_pointer", 0)); + + /* compare times: 123456 and 789123 */ + LONGS_EQUAL(0, hdata_compare (ptr_hdata, ptr_item1, ptr_item1, + "test_time", 0)); + LONGS_EQUAL(-1, hdata_compare (ptr_hdata, ptr_item1, ptr_item2, + "test_time", 0)); + LONGS_EQUAL(1, hdata_compare (ptr_hdata, ptr_item2, ptr_item1, + "test_time", 0)); + + /* compare hashtables: not possible */ + LONGS_EQUAL(0, hdata_compare (ptr_hdata, ptr_item1, ptr_item2, + "test_hashtable", 0)); + + /* compare "other" type: not possible */ + LONGS_EQUAL(0, hdata_compare (ptr_hdata, ptr_item1, ptr_item2, + "test_other", 0)); +} + +/* + * Tests functions: + * hdata_set + * hdata_update + */ + +TEST(CoreHdataWithList, Update) +{ + struct t_hashtable *hashtable, *ptr_old_hashtable; + void *ptr_old_pointer; + + hashtable = hashtable_new (8, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING, + NULL, + NULL); + + LONGS_EQUAL(0, hdata_update (NULL, NULL, NULL)); + LONGS_EQUAL(0, hdata_update (ptr_hdata, NULL, NULL)); + LONGS_EQUAL(0, hdata_update (NULL, ptr_item1, NULL)); + LONGS_EQUAL(0, hdata_update (NULL, NULL, hashtable)); + LONGS_EQUAL(0, hdata_update (ptr_hdata, ptr_item1, NULL)); + LONGS_EQUAL(0, hdata_update (ptr_hdata, NULL, hashtable)); + LONGS_EQUAL(0, hdata_update (NULL, ptr_item1, hashtable)); + + /* check update without update callback */ + hdata_new (NULL, "test_item2", "prev_item", "next_item", 1, 1, NULL, NULL); + LONGS_EQUAL(0, hdata_update (ptr_hdata, ptr_item1, hashtable)); + hashtable_remove (weechat_hdata, "test_item2"); + + /* check if create is allowed */ + hashtable_remove_all (hashtable); + hashtable_set (hashtable, "__create_allowed", "1"); + LONGS_EQUAL(1, hdata_update (ptr_hdata, ptr_item1, hashtable)); + + /* check if delete is allowed */ + hashtable_remove_all (hashtable); + hashtable_set (hashtable, "__delete_allowed", "1"); + LONGS_EQUAL(1, hdata_update (ptr_hdata, ptr_item1, hashtable)); + + /* check if update is allowed on a variable */ + hashtable_remove_all (hashtable); + hashtable_set (hashtable, "__update_allowed", "zzz"); + LONGS_EQUAL(0, hdata_update (ptr_hdata, ptr_item1, hashtable)); + hashtable_remove_all (hashtable); + hashtable_set (hashtable, "__update_allowed", "test_string"); + LONGS_EQUAL(1, hdata_update (ptr_hdata, ptr_item1, hashtable)); + hashtable_remove_all (hashtable); + hashtable_set (hashtable, "__update_allowed", "test_string2"); + LONGS_EQUAL(0, hdata_update (ptr_hdata, ptr_item1, hashtable)); + + /* variable not found */ + hashtable_remove_all (hashtable); + hashtable_set (hashtable, "zzz", "test"); + LONGS_EQUAL(0, hdata_update (ptr_hdata, ptr_item1, hashtable)); + + /* update not allowed on the variable */ + hashtable_remove_all (hashtable); + hashtable_set (hashtable, "test_string2", "test"); + LONGS_EQUAL(0, hdata_update (ptr_hdata, ptr_item1, hashtable)); + STRCMP_EQUAL("STRING2", ptr_item1->test_string2); + + /* set empty char */ + hashtable_remove_all (hashtable); + hashtable_set (hashtable, "test_char", ""); + LONGS_EQUAL(1, hdata_update (ptr_hdata, ptr_item1, hashtable)); + LONGS_EQUAL('\0', ptr_item1->test_char); + + /* set char to 'M' */ + hashtable_remove_all (hashtable); + hashtable_set (hashtable, "test_char", "M"); + LONGS_EQUAL(1, hdata_update (ptr_hdata, ptr_item1, hashtable)); + LONGS_EQUAL('M', ptr_item1->test_char); + + /* set string to NULL */ + hashtable_remove_all (hashtable); + hashtable_set (hashtable, "test_string", NULL); + LONGS_EQUAL(1, hdata_update (ptr_hdata, ptr_item1, hashtable)); + POINTERS_EQUAL(NULL, ptr_item1->test_string); + + /* set string to empty string */ + hashtable_remove_all (hashtable); + hashtable_set (hashtable, "test_string", ""); + LONGS_EQUAL(1, hdata_update (ptr_hdata, ptr_item1, hashtable)); + STRCMP_EQUAL("", ptr_item1->test_string); + + /* set string to "test" */ + hashtable_remove_all (hashtable); + hashtable_set (hashtable, "test_string", "test"); + LONGS_EQUAL(1, hdata_update (ptr_hdata, ptr_item1, hashtable)); + STRCMP_EQUAL("test", ptr_item1->test_string); + + /* set shared string to NULL */ + hashtable_remove_all (hashtable); + hashtable_set (hashtable, "test_shared_string", NULL); + LONGS_EQUAL(1, hdata_update (ptr_hdata, ptr_item1, hashtable)); + POINTERS_EQUAL(NULL, ptr_item1->test_shared_string); + + /* set shared string to empty string */ + hashtable_remove_all (hashtable); + hashtable_set (hashtable, "test_shared_string", ""); + LONGS_EQUAL(1, hdata_update (ptr_hdata, ptr_item1, hashtable)); + STRCMP_EQUAL("", ptr_item1->test_shared_string); + + /* set shared string to "test_shared" */ + hashtable_remove_all (hashtable); + hashtable_set (hashtable, "test_shared_string", "test_shared"); + LONGS_EQUAL(1, hdata_update (ptr_hdata, ptr_item1, hashtable)); + STRCMP_EQUAL("test_shared", ptr_item1->test_shared_string); + + /* set int to invalid value */ + hashtable_remove_all (hashtable); + hashtable_set (hashtable, "test_int", "abc"); + LONGS_EQUAL(0, hdata_update (ptr_hdata, ptr_item1, hashtable)); + LONGS_EQUAL(123, ptr_item1->test_int); + + /* set int to -5 */ + hashtable_remove_all (hashtable); + hashtable_set (hashtable, "test_int", "-5"); + LONGS_EQUAL(1, hdata_update (ptr_hdata, ptr_item1, hashtable)); + LONGS_EQUAL(-5, ptr_item1->test_int); + + /* set int to 77 */ + hashtable_remove_all (hashtable); + hashtable_set (hashtable, "test_int", "77"); + LONGS_EQUAL(1, hdata_update (ptr_hdata, ptr_item1, hashtable)); + LONGS_EQUAL(77, ptr_item1->test_int); + + /* set long to invalid value */ + hashtable_remove_all (hashtable); + hashtable_set (hashtable, "test_long", "abc"); + LONGS_EQUAL(0, hdata_update (ptr_hdata, ptr_item1, hashtable)); + LONGS_EQUAL(123456789L, ptr_item1->test_long); + + /* set long to -55 */ + hashtable_remove_all (hashtable); + hashtable_set (hashtable, "test_long", "-55"); + LONGS_EQUAL(1, hdata_update (ptr_hdata, ptr_item1, hashtable)); + LONGS_EQUAL(-55, ptr_item1->test_long); + + /* set long to 777 */ + hashtable_remove_all (hashtable); + hashtable_set (hashtable, "test_long", "777"); + LONGS_EQUAL(1, hdata_update (ptr_hdata, ptr_item1, hashtable)); + LONGS_EQUAL(777, ptr_item1->test_long); + + /* set pointer to invalid value */ + hashtable_remove_all (hashtable); + hashtable_set (hashtable, "test_pointer", "zzz"); + LONGS_EQUAL(0, hdata_update (ptr_hdata, ptr_item1, hashtable)); + POINTERS_EQUAL(0x123, ptr_item1->test_pointer); + + /* set pointer to NULL */ + hashtable_remove_all (hashtable); + hashtable_set (hashtable, "test_pointer", NULL); + LONGS_EQUAL(1, hdata_update (ptr_hdata, ptr_item1, hashtable)); + POINTERS_EQUAL(NULL, ptr_item1->test_pointer); + + /* set pointer to 0x1a2b3c */ + hashtable_remove_all (hashtable); + hashtable_set (hashtable, "test_pointer", "0x1a2b3c"); + LONGS_EQUAL(1, hdata_update (ptr_hdata, ptr_item1, hashtable)); + POINTERS_EQUAL(0x1a2b3c, ptr_item1->test_pointer); + + /* set time to invalid value */ + hashtable_remove_all (hashtable); + hashtable_set (hashtable, "test_time", "-10"); + LONGS_EQUAL(0, hdata_update (ptr_hdata, ptr_item1, hashtable)); + LONGS_EQUAL(123456, ptr_item1->test_time); + + /* set time to 112233 */ + hashtable_remove_all (hashtable); + hashtable_set (hashtable, "test_time", "112233"); + LONGS_EQUAL(1, hdata_update (ptr_hdata, ptr_item1, hashtable)); + LONGS_EQUAL(112233, ptr_item1->test_time); + + /* set hashtable to NULL (not possible) */ + ptr_old_hashtable = ptr_item1->test_hashtable; + hashtable_remove_all (hashtable); + hashtable_set (hashtable, "test_hashtable", NULL); + LONGS_EQUAL(0, hdata_update (ptr_hdata, ptr_item1, hashtable)); + POINTERS_EQUAL(ptr_old_hashtable, ptr_item1->test_hashtable); + + /* set other to NULL (not possible) */ + ptr_old_pointer = ptr_item1->test_other; + hashtable_remove_all (hashtable); + hashtable_set (hashtable, "test_other", NULL); + LONGS_EQUAL(0, hdata_update (ptr_hdata, ptr_item1, hashtable)); + POINTERS_EQUAL(ptr_old_pointer, ptr_item1->test_other); +} + +/* + * Tests functions: + * hdata_get_string + */ + +TEST(CoreHdataWithList, GetString) +{ + const char *prop; + char **items; + int num_items; + + POINTERS_EQUAL(NULL, hdata_get_string (NULL, NULL)); + POINTERS_EQUAL(NULL, hdata_get_string (ptr_hdata, NULL)); + POINTERS_EQUAL(NULL, hdata_get_string (NULL, "var_keys")); + + POINTERS_EQUAL(NULL, hdata_get_string (ptr_hdata, "zzz")); + + STRCMP_EQUAL( + "test_char,test_count_char,test_array_2_char_fixed_size," + "test_ptr_2_char,test_int,test_count_int,test_array_2_int_fixed_size," + "test_ptr_3_int,test_ptr_1_int_fixed_size,test_long,test_count_long," + "test_array_2_long_fixed_size,test_ptr_2_long,test_string," + "test_string2,test_string3,test_string_null,test_shared_string," + "test_count_words,test_array_2_words_fixed_size,test_ptr_words," + "test_ptr_words_dyn,test_ptr_words_dyn_shared,test_pointer," + "test_count_pointer,test_array_2_pointer_fixed_size," + "test_ptr_3_pointer,test_ptr_0_pointer_dyn,test_ptr_1_pointer_dyn," + "test_time,test_count_time,test_array_2_time_fixed_size," + "test_ptr_2_time,test_hashtable,test_count_hashtable," + "test_array_2_hashtable_fixed_size,test_ptr_2_hashtable," + "test_ptr_1_hashtable_dyn,test_other,test_count_other," + "test_ptr_3_other,test_count_invalid,test_ptr_invalid,prev_item," + "next_item", + hdata_get_string (ptr_hdata, "var_keys")); + + prop = hdata_get_string (ptr_hdata, "var_values"); + items = string_split (prop, ",", NULL, 0, 0, &num_items); + LONGS_EQUAL(45, num_items); + string_free_split (items); + + prop = hdata_get_string (ptr_hdata, "var_keys_values"); + items = string_split (prop, ",", NULL, 0, 0, &num_items); + LONGS_EQUAL(45, num_items); + string_free_split (items); + + STRCMP_EQUAL("prev_item", hdata_get_string (ptr_hdata, "var_prev")); + STRCMP_EQUAL("next_item", hdata_get_string (ptr_hdata, "var_next")); + + STRCMP_EQUAL("items,last_item", hdata_get_string (ptr_hdata, "list_keys")); + prop = hdata_get_string (ptr_hdata, "list_values"); + items = string_split (prop, ",", NULL, 0, 0, &num_items); + LONGS_EQUAL(2, num_items); + string_free_split (items); + prop = hdata_get_string (ptr_hdata, "list_keys_values"); + items = string_split (prop, ",", NULL, 0, 0, &num_items); + LONGS_EQUAL(2, num_items); + string_free_split (items); } /* * Tests functions: + * hdata_free * hdata_free_all_plugin * hdata_free_all */ -TEST(CoreHdata, Free) +TEST(CoreHdataWithList, Free) { /* TODO: write tests */ } @@ -112,7 +2246,7 @@ TEST(CoreHdata, Free) * hdata_print_log */ -TEST(CoreHdata, PrintLog) +TEST(CoreHdataWithList, PrintLog) { /* TODO: write tests */ } |