#include "gtest/gtest.h" #include "conf_io/conf_ini.h" TEST(Ini, group1) { value_t v; str_t str; conf_node_t* node = NULL; conf_doc_t* doc = conf_doc_load_ini("[hello]"); ASSERT_EQ(conf_doc_get(doc, "#size", &v), RET_OK); ASSERT_EQ(value_int(&v), 1); node = conf_node_find_child(doc->root, "hello"); ASSERT_EQ(node != NULL, true); ASSERT_STREQ(conf_node_get_name(node), "hello"); str_init(&str, 100); conf_doc_save_ini(doc, &str); ASSERT_STREQ(str.str, "[hello]\n"); str_reset(&str); conf_doc_destroy(doc); } TEST(Ini, group2) { value_t v; str_t str; conf_node_t* node = NULL; conf_doc_t* doc = conf_doc_load_ini("[hello]\n[ world ]"); node = conf_node_find_child(doc->root, "hello"); ASSERT_EQ(node != NULL, true); ASSERT_STREQ(conf_node_get_name(node), "hello"); node = conf_node_find_child(doc->root, "world"); ASSERT_EQ(node != NULL, true); ASSERT_STREQ(conf_node_get_name(node), "world"); ASSERT_EQ(conf_doc_get(doc, "#size", &v), RET_OK); ASSERT_EQ(value_int(&v), 2); str_init(&str, 100); conf_doc_save_ini(doc, &str); ASSERT_STREQ(str.str, "[hello]\n[world]\n"); str_reset(&str); conf_doc_destroy(doc); } TEST(Ini, long_name) { conf_node_t* node = NULL; conf_doc_t* doc = conf_doc_load_ini( "[helloxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]\n[ " "worldxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ]"); node = conf_node_find_child(doc->root, "helloxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); ASSERT_EQ(node != NULL, true); ASSERT_STREQ(conf_node_get_name(node), "helloxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); node = conf_node_find_child(doc->root, "helloxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); ASSERT_EQ(node != NULL, true); ASSERT_STREQ(conf_node_get_name(node), "helloxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); conf_doc_destroy(doc); } TEST(Ini, key1) { value_t v; str_t str; conf_node_t* node = NULL; conf_node_t* group = NULL; conf_doc_t* doc = conf_doc_load_ini("[hello]\nkey1=value1 \r\nkey2=value2"); group = conf_node_find_child(doc->root, "hello"); ASSERT_EQ(group != NULL, true); ASSERT_STREQ(conf_node_get_name(group), "hello"); node = conf_node_find_child(group, "key1"); ASSERT_EQ(node != NULL, true); ASSERT_STREQ(conf_node_get_name(node), "key1"); ASSERT_EQ(conf_node_get_value(node, &v), RET_OK); ASSERT_STREQ(value_str(&v), "value1"); node = conf_node_find_child(group, "key2"); ASSERT_EQ(node != NULL, true); ASSERT_STREQ(conf_node_get_name(node), "key2"); ASSERT_EQ(conf_node_get_value(node, &v), RET_OK); ASSERT_STREQ(value_str(&v), "value2"); str_init(&str, 100); conf_doc_save_ini(doc, &str); ASSERT_STREQ(str.str, "[hello]\n key1 = value1\n key2 = value2\n"); str_reset(&str); conf_doc_destroy(doc); } TEST(Ini, comment) { value_t v; str_t str; conf_node_t* node = NULL; conf_node_t* group = NULL; conf_doc_t* doc = conf_doc_load_ini("[hello]#comment\nkey1=value1#comment \r\nkey2=\\#ff00ff"); group = conf_node_find_child(doc->root, "hello"); ASSERT_EQ(group != NULL, true); ASSERT_STREQ(conf_node_get_name(group), "hello"); node = conf_node_find_child(group, "key1"); ASSERT_EQ(node != NULL, true); ASSERT_STREQ(conf_node_get_name(node), "key1"); ASSERT_EQ(conf_node_get_value(node, &v), RET_OK); ASSERT_STREQ(value_str(&v), "value1"); node = conf_node_find_child(group, "key2"); ASSERT_EQ(node != NULL, true); ASSERT_STREQ(conf_node_get_name(node), "key2"); ASSERT_EQ(conf_node_get_value(node, &v), RET_OK); ASSERT_STREQ(value_str(&v), "#ff00ff"); str_init(&str, 100); conf_doc_save_ini(doc, &str); ASSERT_STREQ(str.str, "[hello]\n key1 = value1\n key2 = \\#ff00ff\n"); str_reset(&str); conf_doc_destroy(doc); } TEST(Ini, long_key_value) { value_t v; conf_node_t* node = NULL; conf_node_t* group = NULL; conf_doc_t* doc = conf_doc_load_ini( "[hello]\n\tkey111111111111111111111111 = value111111111111111111111111 " "\r\nkey2222222222222222222=value222222222222"); group = conf_node_find_child(doc->root, "hello"); ASSERT_EQ(group != NULL, true); ASSERT_STREQ(conf_node_get_name(group), "hello"); node = conf_node_find_child(group, "key111111111111111111111111"); ASSERT_EQ(node != NULL, true); ASSERT_STREQ(conf_node_get_name(node), "key111111111111111111111111"); ASSERT_EQ(conf_node_get_value(node, &v), RET_OK); ASSERT_STREQ(value_str(&v), "value111111111111111111111111"); node = conf_node_find_child(group, "key2222222222222222222"); ASSERT_EQ(node != NULL, true); ASSERT_STREQ(conf_node_get_name(node), "key2222222222222222222"); ASSERT_EQ(conf_node_get_value(node, &v), RET_OK); ASSERT_STREQ(value_str(&v), "value222222222222"); conf_doc_destroy(doc); } TEST(Ini, nogroup) { value_t v; str_t str; conf_node_t* node = NULL; conf_doc_t* doc = conf_doc_load_ini("\nkey1=value1 \r\nkey2=value2"); node = conf_node_find_child(doc->root, "key1"); ASSERT_EQ(node != NULL, true); ASSERT_STREQ(conf_node_get_name(node), "key1"); ASSERT_EQ(conf_node_get_value(node, &v), RET_OK); ASSERT_STREQ(value_str(&v), "value1"); node = conf_node_find_child(doc->root, "key2"); ASSERT_EQ(node != NULL, true); ASSERT_STREQ(conf_node_get_name(node), "key2"); ASSERT_EQ(conf_node_get_value(node, &v), RET_OK); ASSERT_STREQ(value_str(&v), "value2"); str_init(&str, 100); conf_doc_save_ini(doc, &str); ASSERT_STREQ(str.str, " key1 = value1\n key2 = value2\n"); str_reset(&str); conf_doc_destroy(doc); } TEST(Ini, get_set_remove_exist) { value_t v; conf_doc_t* doc = conf_doc_load_ini("[hello]\nkey1=value1 \r\nkey2=value2\n[world]\nkey1=xxx\nkey2=yyyy\n"); ASSERT_EQ(conf_doc_get(doc, "hello.key1", &v), RET_OK); ASSERT_STREQ(value_str(&v), "value1"); ASSERT_EQ(conf_doc_get(doc, "hello.key2", &v), RET_OK); ASSERT_STREQ(value_str(&v), "value2"); ASSERT_EQ(conf_doc_get(doc, "world.key1", &v), RET_OK); ASSERT_STREQ(value_str(&v), "xxx"); ASSERT_EQ(conf_doc_get(doc, "world.key2", &v), RET_OK); ASSERT_STREQ(value_str(&v), "yyyy"); ASSERT_EQ(conf_doc_get(doc, "world.key3", &v), RET_NOT_FOUND); value_set_str(&v, "foobar"); ASSERT_EQ(conf_doc_set(doc, "world.key3", &v), RET_OK); ASSERT_EQ(conf_doc_get(doc, "world.key3", &v), RET_OK); ASSERT_STREQ(value_str(&v), "foobar"); ASSERT_EQ(conf_doc_set(doc, "foobar.key4", &v), RET_OK); ASSERT_EQ(conf_doc_get(doc, "foobar.key4", &v), RET_OK); ASSERT_STREQ(value_str(&v), "foobar"); ASSERT_EQ(conf_doc_exists(doc, "foobar.key4"), TRUE); ASSERT_EQ(conf_doc_remove(doc, "foobar.key4"), RET_OK); ASSERT_EQ(conf_doc_exists(doc, "foobar.key4"), FALSE); ASSERT_EQ(conf_doc_exists(doc, "world.key3"), TRUE); ASSERT_EQ(conf_doc_remove(doc, "world"), RET_OK); ASSERT_EQ(conf_doc_exists(doc, "world"), FALSE); ASSERT_EQ(conf_doc_exists(doc, "world.key3"), FALSE); conf_doc_destroy(doc); } TEST(Ini, get_set_remove_exist_by_index) { value_t v; conf_doc_t* doc = conf_doc_load_ini("[hello]\nkey1=value1 \r\nkey2=value2\n[world]\nkey1=xxx\nkey2=yyyy\n"); ASSERT_EQ(conf_doc_get(doc, "hello.[0]", &v), RET_OK); ASSERT_STREQ(value_str(&v), "value1"); value_set_str(&v, "test"); ASSERT_EQ(conf_doc_set(doc, "hello.[0]", &v), RET_OK); ASSERT_EQ(conf_doc_get(doc, "hello.[0]", &v), RET_OK); ASSERT_STREQ(value_str(&v), "test"); ASSERT_NE(conf_doc_set(doc, "hello.[4]", &v), RET_OK); ASSERT_EQ(conf_doc_exists(doc, "hello.[0]"), TRUE); ASSERT_EQ(conf_doc_remove(doc, "hello.[0]"), RET_OK); ASSERT_EQ(conf_doc_remove(doc, "hello.[0]"), RET_OK); ASSERT_EQ(conf_doc_exists(doc, "hello.[0]"), FALSE); conf_doc_destroy(doc); } TEST(Ini, deep_level) { value_t v; conf_doc_t* doc = conf_doc_load_ini("[hello]\nkey1=value1 \r\nkey2=value2\n[world]\nkey1=xxx\nkey2=yyyy\n"); value_set_str(&v, "test"); ASSERT_EQ(conf_doc_set(doc, "hello.normal.color", &v), RET_OK); ASSERT_EQ(conf_doc_get(doc, "hello.normal.color", &v), RET_OK); ASSERT_STREQ(value_str(&v), "test"); conf_doc_destroy(doc); } TEST(Ini, file) { object_t* conf = conf_ini_load("file://./tests/testdata/test.ini", TRUE); ASSERT_EQ(conf_obj_save(conf), RET_OK); ASSERT_EQ(object_set_prop_str(conf, "tom.name", "tom"), RET_OK); ASSERT_EQ(object_set_prop_int(conf, "tom.age", 100), RET_OK); ASSERT_EQ(object_set_prop_float(conf, "tom.weight", 60.5), RET_OK); ASSERT_STREQ(object_get_prop_str(conf, "tom.name"), "tom"); ASSERT_EQ(object_get_prop_int(conf, "tom.age", 0), 100); ASSERT_EQ(object_get_prop_float(conf, "tom.weight", 0), 60.5); ASSERT_EQ(conf_obj_save(conf), RET_OK); ASSERT_STREQ(object_get_prop_str(conf, "group.key"), "value"); ASSERT_EQ(object_remove_prop(conf, "group.key"), RET_OK); ASSERT_EQ(object_get_prop_str(conf, "group.key"), (char*)NULL); OBJECT_UNREF(conf); } TEST(Ini, index) { value_t v; conf_doc_t* doc = conf_doc_load_ini("[hello]\n[ world ]\n[awtk]\nname=aaa\n"); ASSERT_EQ(conf_doc_get(doc, "hello.#index", &v), RET_OK); ASSERT_EQ(value_int(&v), 0); ASSERT_EQ(conf_doc_get(doc, "world.#index", &v), RET_OK); ASSERT_EQ(value_int(&v), 1); ASSERT_EQ(conf_doc_get(doc, "awtk.#index", &v), RET_OK); ASSERT_EQ(value_int(&v), 2); conf_doc_destroy(doc); } TEST(Ini, last_first) { conf_doc_t* doc = conf_doc_load_ini("[hello]\n[ world ]\n[awtk]\nname=aaa\n"); ASSERT_EQ(conf_doc_is_last(doc, "hello"), FALSE); ASSERT_EQ(conf_doc_is_last(doc, "world"), FALSE); ASSERT_EQ(conf_doc_is_last(doc, "awtk"), TRUE); ASSERT_EQ(conf_doc_is_first(doc, "hello"), TRUE); ASSERT_EQ(conf_doc_is_first(doc, "world"), FALSE); ASSERT_EQ(conf_doc_is_first(doc, "awtk"), FALSE); conf_doc_destroy(doc); } TEST(Ini, empty) { value_t v; conf_doc_t* doc = conf_doc_load_ini("[hello]\na=\nb=2\nc=3\n"); ASSERT_EQ(conf_doc_get(doc, "hello.a", &v), RET_OK); ASSERT_STREQ(value_str(&v), ""); ASSERT_EQ(conf_doc_get(doc, "hello.b", &v), RET_OK); ASSERT_STREQ(value_str(&v), "2"); ASSERT_EQ(conf_doc_get(doc, "hello.c", &v), RET_OK); ASSERT_STREQ(value_str(&v), "3"); conf_doc_destroy(doc); } TEST(Ini, move_up) { value_t v; conf_doc_t* doc = conf_doc_load_ini("[hello]\n[ world ]\n[awtk]\nname=aaa\n"); ASSERT_EQ(conf_doc_move_up(doc, "hello"), RET_FAIL); ASSERT_EQ(conf_doc_is_first(doc, "hello"), TRUE); ASSERT_EQ(conf_doc_get(doc, "hello.#index", &v), RET_OK); ASSERT_EQ(value_int(&v), 0); ASSERT_EQ(conf_doc_move_down(doc, "hello"), RET_OK); ASSERT_EQ(conf_doc_is_first(doc, "hello"), FALSE); ASSERT_EQ(conf_doc_is_first(doc, "world"), TRUE); ASSERT_EQ(conf_doc_get(doc, "hello.#index", &v), RET_OK); ASSERT_EQ(value_int(&v), 1); ASSERT_EQ(conf_doc_move_down(doc, "hello"), RET_OK); ASSERT_EQ(conf_doc_is_last(doc, "hello"), TRUE); ASSERT_EQ(conf_doc_get(doc, "hello.#index", &v), RET_OK); ASSERT_EQ(value_int(&v), 2); ASSERT_EQ(conf_doc_move_down(doc, "hello"), RET_FAIL); ASSERT_EQ(conf_doc_move_up(doc, "hello"), RET_OK); ASSERT_EQ(conf_doc_is_last(doc, "hello"), FALSE); ASSERT_EQ(conf_doc_get(doc, "hello.#index", &v), RET_OK); ASSERT_EQ(value_int(&v), 1); ASSERT_EQ(conf_doc_move_up(doc, "hello"), RET_OK); ASSERT_EQ(conf_doc_is_last(doc, "hello"), FALSE); ASSERT_EQ(conf_doc_get(doc, "hello.#index", &v), RET_OK); ASSERT_EQ(value_int(&v), 0); ASSERT_EQ(conf_doc_move_up(doc, "hello"), RET_FAIL); conf_doc_destroy(doc); } TEST(Ini, clear) { value_t v; conf_doc_t* doc = conf_doc_load_ini("[hello]\n name=aaa\n"); ASSERT_EQ(conf_doc_get(doc, "hello.#size", &v), RET_OK); ASSERT_EQ(value_int(&v), 1); ASSERT_EQ(conf_doc_clear(doc, "hello"), RET_OK); ASSERT_EQ(conf_doc_get(doc, "hello.#size", &v), RET_OK); ASSERT_EQ(value_int(&v), 0); conf_doc_destroy(doc); } TEST(Ini, readonly) { object_t* conf = conf_ini_load("file://./tests/testdata/test.ini", TRUE); ASSERT_EQ(object_set_prop_str(conf, "tom.name", "tom"), RET_OK); ASSERT_EQ(object_remove_prop(conf, "tom.name"), RET_OK); ASSERT_EQ(conf_obj_set_readonly(conf, TRUE), RET_OK); ASSERT_NE(object_set_prop_str(conf, "tom.name", "tom"), RET_OK); ASSERT_NE(object_remove_prop(conf, "tom.name"), RET_OK); ASSERT_EQ(conf_obj_set_readonly(conf, FALSE), RET_OK); ASSERT_EQ(object_set_prop_str(conf, "tom.name", "tom"), RET_OK); ASSERT_EQ(object_remove_prop(conf, "tom.name"), RET_OK); OBJECT_UNREF(conf); } TEST(Ini, load1) { object_t* conf = conf_ini_load(NULL, FALSE); ASSERT_EQ(conf, (object_t*)NULL); conf = conf_ini_load(NULL, TRUE); ASSERT_NE(conf, (object_t*)NULL); OBJECT_UNREF(conf); } TEST(Ini, create) { object_t* conf = conf_ini_create(); ASSERT_NE(conf, (object_t*)NULL); ASSERT_EQ(object_set_prop_int(conf, "value", 123), RET_OK); ASSERT_EQ(object_get_prop_int(conf, "value", 0), 123); OBJECT_UNREF(conf); } #include "tkc/data_reader_mem.h" #include "tkc/data_writer_wbuffer.h" TEST(Ini, save_as) { wbuffer_t wb; char url[MAX_PATH + 1]; object_t* conf = conf_ini_create(); ASSERT_NE(conf, (object_t*)NULL); ASSERT_EQ(object_set_prop_int(conf, "value", 123), RET_OK); ASSERT_EQ(object_get_prop_int(conf, "value", 0), 123); wbuffer_init_extendable(&wb); data_writer_wbuffer_build_url(&wb, url); ASSERT_EQ(conf_ini_save_as(conf, url), RET_OK); OBJECT_UNREF(conf); data_reader_mem_build_url(wb.data, wb.cursor, url); conf = conf_ini_load(url, FALSE); ASSERT_NE(conf, (object_t*)NULL); ASSERT_EQ(object_get_prop_int(conf, "value", 0), 123); wbuffer_deinit(&wb); OBJECT_UNREF(conf); }