[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 11/14] qlit: improve QLit dict vs qdict comparison
From: |
Marc-André Lureau |
Subject: |
[Qemu-devel] [PATCH 11/14] qlit: improve QLit dict vs qdict comparison |
Date: |
Thu, 24 Aug 2017 12:33:47 +0200 |
Fail if the QLit dict doesn't match exactly the object dict.
To do so, create a copy of the original qdict, and remove the checked
elements. Verify that the dict is empty by the end of the comparison.
Signed-off-by: Marc-André Lureau <address@hidden>
---
qobject/qlit.c | 42 ++++++++++++++++++++++++++++--------------
tests/check-qlit.c | 7 +++++++
2 files changed, 35 insertions(+), 14 deletions(-)
diff --git a/qobject/qlit.c b/qobject/qlit.c
index 7e4bf92862..45ae0635c0 100644
--- a/qobject/qlit.c
+++ b/qobject/qlit.c
@@ -41,6 +41,32 @@ static void compare_helper(QObject *obj, void *opaque)
qlit_equal_qobject(&helper->objs[helper->index++], obj);
}
+static bool qlit_equal_qdict(const QLitObject *lhs, const QDict *qdict)
+{
+ QDict *dict = qdict_clone_shallow(qdict);
+ bool success = false;
+ int i;
+
+ for (i = 0; lhs->value.qdict[i].key; i++) {
+ QObject *obj = qdict_get(dict, lhs->value.qdict[i].key);
+
+ if (!qlit_equal_qobject(&lhs->value.qdict[i].value, obj)) {
+ goto end;
+ }
+ qdict_del(dict, lhs->value.qdict[i].key);
+ }
+
+ if (qdict_size(dict) != 0) {
+ goto end;
+ }
+
+ success = true;
+
+end:
+ QDECREF(dict);
+ return success;
+}
+
bool qlit_equal_qobject(const QLitObject *lhs, const QObject *rhs)
{
int64_t val;
@@ -58,20 +84,8 @@ bool qlit_equal_qobject(const QLitObject *lhs, const QObject
*rhs)
case QTYPE_QSTRING:
return (strcmp(lhs->value.qstr,
qstring_get_str(qobject_to_qstring(rhs))) == 0);
- case QTYPE_QDICT: {
- int i;
-
- for (i = 0; lhs->value.qdict[i].key; i++) {
- QObject *obj = qdict_get(qobject_to_qdict(rhs),
- lhs->value.qdict[i].key);
-
- if (!qlit_equal_qobject(&lhs->value.qdict[i].value, obj)) {
- return false;
- }
- }
-
- return true;
- }
+ case QTYPE_QDICT:
+ return qlit_equal_qdict(lhs, qobject_to_qdict(rhs));
case QTYPE_QLIST: {
QListCompareHelper helper;
diff --git a/tests/check-qlit.c b/tests/check-qlit.c
index 47fde92a46..5d9558dfd9 100644
--- a/tests/check-qlit.c
+++ b/tests/check-qlit.c
@@ -28,6 +28,11 @@ static QLitObject qlit = QLIT_QDICT(((QLitDictEntry[]) {
{ },
}));
+static QLitObject qlit_foo = QLIT_QDICT(((QLitDictEntry[]) {
+ { "foo", QLIT_QNUM(42) },
+ { },
+}));
+
static QObject *make_qobject(void)
{
QDict *qdict = qdict_new();
@@ -51,6 +56,8 @@ static void qlit_equal_qobject_test(void)
g_assert(qlit_equal_qobject(&qlit, qobj));
+ g_assert(!qlit_equal_qobject(&qlit_foo, qobj));
+
qobject_decref(qobj);
}
--
2.14.1.146.gd35faa819
- Re: [Qemu-devel] [PATCH 05/14] qlit: rename compare_litqobj_to_qobj, (continued)
- [Qemu-devel] [PATCH 06/14] qlit: make qlit_equal_qobject return a bool, Marc-André Lureau, 2017/08/24
- [Qemu-devel] [PATCH 08/14] qlit: add QLIT_QNULL and QLIT_BOOL, Marc-André Lureau, 2017/08/24
- [Qemu-devel] [PATCH 07/14] qlit: make qlit_equal_qobject() take const arguments, Marc-André Lureau, 2017/08/24
- [Qemu-devel] [PATCH 09/14] qlit: replace assert(qnum_get_try_int), Marc-André Lureau, 2017/08/24
- [Qemu-devel] [PATCH 11/14] qlit: improve QLit dict vs qdict comparison,
Marc-André Lureau <=
- [Qemu-devel] [PATCH 10/14] tests: add qlit tests, Marc-André Lureau, 2017/08/24
- [Qemu-devel] [PATCH 12/14] qlit: improve QLit list vs qlist comparison, Marc-André Lureau, 2017/08/24
- [Qemu-devel] [PATCH 13/14] qlit: add qobject_form_qlit(), Marc-André Lureau, 2017/08/24
- [Qemu-devel] [PATCH 14/14] qapi: generate a literal qobject for introspection, Marc-André Lureau, 2017/08/24