Object *user_creatable_add(const QDict *qdict, Visitor *v, Error **errp) { char *type = NULL; char *id = NULL; Object *obj = NULL; Error *local_err = NULL; QDict *pdict; pdict = qdict_clone_shallow(qdict); visit_start_struct(v, NULL, NULL, 0, &local_err); if (local_err) { goto out; } qdict_del(pdict, "qom-type"); visit_type_str(v, "qom-type", &type, &local_err); if (local_err) { goto out_visit; } qdict_del(pdict, "id"); visit_type_str(v, "id", &id, &local_err); if (local_err) { goto out_visit; } visit_check_struct(v, &local_err); if (local_err) { goto out_visit; } obj = user_creatable_add_type(type, id, pdict, v, &local_err); out_visit: visit_end_struct(v, NULL); out: QDECREF(pdict); g_free(id); g_free(type); if (local_err) { error_propagate(errp, local_err); object_unref(obj); return NULL; } return obj; }
static void qobject_is_equal_dict_test(void) { Error *local_err = NULL; QDict *dict_0, *dict_1, *dict_cloned; QDict *dict_different_key, *dict_different_value, *dict_different_null_key; QDict *dict_longer, *dict_shorter, *dict_nested; QDict *dict_crumpled; dict_0 = qdict_new(); dict_1 = qdict_new(); dict_different_key = qdict_new(); dict_different_value = qdict_new(); dict_different_null_key = qdict_new(); dict_longer = qdict_new(); dict_shorter = qdict_new(); dict_nested = qdict_new(); qdict_put_int(dict_0, "f.o", 1); qdict_put_int(dict_0, "bar", 2); qdict_put_int(dict_0, "baz", 3); qdict_put_null(dict_0, "null"); qdict_put_int(dict_1, "f.o", 1); qdict_put_int(dict_1, "bar", 2); qdict_put_int(dict_1, "baz", 3); qdict_put_null(dict_1, "null"); qdict_put_int(dict_different_key, "F.o", 1); qdict_put_int(dict_different_key, "bar", 2); qdict_put_int(dict_different_key, "baz", 3); qdict_put_null(dict_different_key, "null"); qdict_put_int(dict_different_value, "f.o", 42); qdict_put_int(dict_different_value, "bar", 2); qdict_put_int(dict_different_value, "baz", 3); qdict_put_null(dict_different_value, "null"); qdict_put_int(dict_different_null_key, "f.o", 1); qdict_put_int(dict_different_null_key, "bar", 2); qdict_put_int(dict_different_null_key, "baz", 3); qdict_put_null(dict_different_null_key, "none"); qdict_put_int(dict_longer, "f.o", 1); qdict_put_int(dict_longer, "bar", 2); qdict_put_int(dict_longer, "baz", 3); qdict_put_int(dict_longer, "xyz", 4); qdict_put_null(dict_longer, "null"); qdict_put_int(dict_shorter, "f.o", 1); qdict_put_int(dict_shorter, "bar", 2); qdict_put_int(dict_shorter, "baz", 3); qdict_put(dict_nested, "f", qdict_new()); qdict_put_int(qdict_get_qdict(dict_nested, "f"), "o", 1); qdict_put_int(dict_nested, "bar", 2); qdict_put_int(dict_nested, "baz", 3); qdict_put_null(dict_nested, "null"); dict_cloned = qdict_clone_shallow(dict_0); check_equal(dict_0, dict_1, dict_cloned); check_unequal(dict_0, dict_different_key, dict_different_value, dict_different_null_key, dict_longer, dict_shorter, dict_nested); dict_crumpled = qobject_to(QDict, qdict_crumple(dict_1, &local_err)); g_assert(!local_err); check_equal(dict_crumpled, dict_nested); qdict_flatten(dict_nested); check_equal(dict_0, dict_nested); /* Containing an NaN value will make this dict compare unequal to * itself */ qdict_put(dict_0, "NaN", qnum_from_double(NAN)); g_assert(qobject_is_equal(QOBJECT(dict_0), QOBJECT(dict_0)) == false); free_all(dict_0, dict_1, dict_cloned, dict_different_key, dict_different_value, dict_different_null_key, dict_longer, dict_shorter, dict_nested, dict_crumpled); }
static void qdict_rename_keys_test(void) { QDict *dict = qdict_new(); QDict *copy; QDictRenames *renames; Error *local_err = NULL; qdict_put_str(dict, "abc", "foo"); qdict_put_str(dict, "abcdef", "bar"); qdict_put_int(dict, "number", 42); qdict_put_bool(dict, "flag", true); qdict_put_null(dict, "nothing"); /* Empty rename list */ renames = (QDictRenames[]) { { NULL, "this can be anything" } }; copy = qdict_clone_shallow(dict); qdict_rename_keys(copy, renames, &error_abort); g_assert_cmpstr(qdict_get_str(copy, "abc"), ==, "foo"); g_assert_cmpstr(qdict_get_str(copy, "abcdef"), ==, "bar"); g_assert_cmpint(qdict_get_int(copy, "number"), ==, 42); g_assert_cmpint(qdict_get_bool(copy, "flag"), ==, true); g_assert(qobject_type(qdict_get(copy, "nothing")) == QTYPE_QNULL); g_assert_cmpint(qdict_count_entries(copy), ==, 5); qobject_unref(copy); /* Simple rename of all entries */ renames = (QDictRenames[]) { { "abc", "str1" }, { "abcdef", "str2" }, { "number", "int" }, { "flag", "bool" }, { "nothing", "null" }, { NULL , NULL } }; copy = qdict_clone_shallow(dict); qdict_rename_keys(copy, renames, &error_abort); g_assert(!qdict_haskey(copy, "abc")); g_assert(!qdict_haskey(copy, "abcdef")); g_assert(!qdict_haskey(copy, "number")); g_assert(!qdict_haskey(copy, "flag")); g_assert(!qdict_haskey(copy, "nothing")); g_assert_cmpstr(qdict_get_str(copy, "str1"), ==, "foo"); g_assert_cmpstr(qdict_get_str(copy, "str2"), ==, "bar"); g_assert_cmpint(qdict_get_int(copy, "int"), ==, 42); g_assert_cmpint(qdict_get_bool(copy, "bool"), ==, true); g_assert(qobject_type(qdict_get(copy, "null")) == QTYPE_QNULL); g_assert_cmpint(qdict_count_entries(copy), ==, 5); qobject_unref(copy); /* Renames are processed top to bottom */ renames = (QDictRenames[]) { { "abc", "tmp" }, { "abcdef", "abc" }, { "number", "abcdef" }, { "flag", "number" }, { "nothing", "flag" }, { "tmp", "nothing" }, { NULL , NULL } }; copy = qdict_clone_shallow(dict); qdict_rename_keys(copy, renames, &error_abort); g_assert_cmpstr(qdict_get_str(copy, "nothing"), ==, "foo"); g_assert_cmpstr(qdict_get_str(copy, "abc"), ==, "bar"); g_assert_cmpint(qdict_get_int(copy, "abcdef"), ==, 42); g_assert_cmpint(qdict_get_bool(copy, "number"), ==, true); g_assert(qobject_type(qdict_get(copy, "flag")) == QTYPE_QNULL); g_assert(!qdict_haskey(copy, "tmp")); g_assert_cmpint(qdict_count_entries(copy), ==, 5); qobject_unref(copy); /* Conflicting rename */ renames = (QDictRenames[]) { { "abcdef", "abc" }, { NULL , NULL } }; copy = qdict_clone_shallow(dict); qdict_rename_keys(copy, renames, &local_err); g_assert(local_err != NULL); error_free(local_err); local_err = NULL; g_assert_cmpstr(qdict_get_str(copy, "abc"), ==, "foo"); g_assert_cmpstr(qdict_get_str(copy, "abcdef"), ==, "bar"); g_assert_cmpint(qdict_get_int(copy, "number"), ==, 42); g_assert_cmpint(qdict_get_bool(copy, "flag"), ==, true); g_assert(qobject_type(qdict_get(copy, "nothing")) == QTYPE_QNULL); g_assert_cmpint(qdict_count_entries(copy), ==, 5); qobject_unref(copy); /* Renames in an empty dict */ renames = (QDictRenames[]) { { "abcdef", "abc" }, { NULL , NULL } }; qobject_unref(dict); dict = qdict_new(); qdict_rename_keys(dict, renames, &error_abort); g_assert(qdict_first(dict) == NULL); qobject_unref(dict); }