diff options
author | Marc-André Lureau <marcandre.lureau@redhat.com> | 2017-06-07 20:35:58 +0400 |
---|---|---|
committer | Markus Armbruster <armbru@redhat.com> | 2017-06-20 14:31:31 +0200 |
commit | 01b2ffcedd94ad7b42bc870e4c6936c87ad03429 (patch) | |
tree | 39bbadfbbaa229bfbda245840a256fe0132b2390 /tests | |
parent | 58634047b7deeab36e4b07c4744e44d698975561 (diff) | |
download | qemu-01b2ffcedd94ad7b42bc870e4c6936c87ad03429.zip qemu-01b2ffcedd94ad7b42bc870e4c6936c87ad03429.tar.gz qemu-01b2ffcedd94ad7b42bc870e4c6936c87ad03429.tar.bz2 |
qapi: merge QInt and QFloat in QNum
We would like to use a same QObject type to represent numbers, whether
they are int, uint, or floats. Getters will allow some compatibility
between the various types if the number fits other representations.
Add a few more tests while at it.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20170607163635.17635-7-marcandre.lureau@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
[parse_stats_intervals() simplified a bit, comment in
test_visitor_in_int_overflow() tidied up, suppress bogus warnings]
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/.gitignore | 3 | ||||
-rw-r--r-- | tests/Makefile.include | 13 | ||||
-rw-r--r-- | tests/check-qdict.c | 25 | ||||
-rw-r--r-- | tests/check-qfloat.c | 53 | ||||
-rw-r--r-- | tests/check-qint.c | 87 | ||||
-rw-r--r-- | tests/check-qjson.c | 91 | ||||
-rw-r--r-- | tests/check-qlist.c | 17 | ||||
-rw-r--r-- | tests/check-qnum.c | 136 | ||||
-rw-r--r-- | tests/qapi-schema/comments.out | 2 | ||||
-rw-r--r-- | tests/qapi-schema/doc-good.out | 2 | ||||
-rw-r--r-- | tests/qapi-schema/empty.out | 2 | ||||
-rw-r--r-- | tests/qapi-schema/event-case.out | 2 | ||||
-rw-r--r-- | tests/qapi-schema/ident-with-escape.out | 2 | ||||
-rw-r--r-- | tests/qapi-schema/include-relpath.out | 2 | ||||
-rw-r--r-- | tests/qapi-schema/include-repetition.out | 2 | ||||
-rw-r--r-- | tests/qapi-schema/include-simple.out | 2 | ||||
-rw-r--r-- | tests/qapi-schema/indented-expr.out | 2 | ||||
-rw-r--r-- | tests/qapi-schema/qapi-schema-test.out | 2 | ||||
-rw-r--r-- | tests/test-qmp-commands.c | 8 | ||||
-rw-r--r-- | tests/test-qmp-event.c | 9 | ||||
-rw-r--r-- | tests/test-qobject-input-visitor.c | 38 | ||||
-rw-r--r-- | tests/test-qobject-output-visitor.c | 71 | ||||
-rw-r--r-- | tests/test-x86-cpuid-compat.c | 18 |
23 files changed, 307 insertions, 282 deletions
diff --git a/tests/.gitignore b/tests/.gitignore index 40c2e3e..8e01b00 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -1,7 +1,6 @@ atomic_add-bench check-qdict -check-qfloat -check-qint +check-qnum check-qjson check-qlist check-qnull diff --git a/tests/Makefile.include b/tests/Makefile.include index f42f3df..fec5af7 100644 --- a/tests/Makefile.include +++ b/tests/Makefile.include @@ -10,10 +10,8 @@ check-unit-y = tests/check-qdict$(EXESUF) gcov-files-check-qdict-y = qobject/qdict.c check-unit-y += tests/test-char$(EXESUF) gcov-files-check-qdict-y = chardev/char.c -check-unit-y += tests/check-qfloat$(EXESUF) -gcov-files-check-qfloat-y = qobject/qfloat.c -check-unit-y += tests/check-qint$(EXESUF) -gcov-files-check-qint-y = qobject/qint.c +check-unit-y += tests/check-qnum$(EXESUF) +gcov-files-check-qnum-y = qobject/qnum.c check-unit-y += tests/check-qstring$(EXESUF) gcov-files-check-qstring-y = qobject/qstring.c check-unit-y += tests/check-qlist$(EXESUF) @@ -506,8 +504,8 @@ GENERATED_FILES += tests/test-qapi-types.h tests/test-qapi-visit.h \ tests/test-qmp-commands.h tests/test-qapi-event.h \ tests/test-qmp-introspect.h -test-obj-y = tests/check-qint.o tests/check-qstring.o tests/check-qdict.o \ - tests/check-qlist.o tests/check-qfloat.o tests/check-qnull.o \ +test-obj-y = tests/check-qnum.o tests/check-qstring.o tests/check-qdict.o \ + tests/check-qlist.o tests/check-qnull.o \ tests/check-qjson.o \ tests/test-coroutine.o tests/test-string-output-visitor.o \ tests/test-string-input-visitor.o tests/test-qobject-output-visitor.o \ @@ -535,11 +533,10 @@ test-crypto-obj-y = $(crypto-obj-y) $(test-qom-obj-y) test-io-obj-y = $(io-obj-y) $(test-crypto-obj-y) test-block-obj-y = $(block-obj-y) $(test-io-obj-y) tests/iothread.o -tests/check-qint$(EXESUF): tests/check-qint.o $(test-util-obj-y) +tests/check-qnum$(EXESUF): tests/check-qnum.o $(test-util-obj-y) tests/check-qstring$(EXESUF): tests/check-qstring.o $(test-util-obj-y) tests/check-qdict$(EXESUF): tests/check-qdict.o $(test-util-obj-y) tests/check-qlist$(EXESUF): tests/check-qlist.o $(test-util-obj-y) -tests/check-qfloat$(EXESUF): tests/check-qfloat.o $(test-util-obj-y) tests/check-qnull$(EXESUF): tests/check-qnull.o $(test-util-obj-y) tests/check-qjson$(EXESUF): tests/check-qjson.o $(test-util-obj-y) tests/check-qom-interface$(EXESUF): tests/check-qom-interface.o $(test-qom-obj-y) diff --git a/tests/check-qdict.c b/tests/check-qdict.c index be8d81f..f067c63 100644 --- a/tests/check-qdict.c +++ b/tests/check-qdict.c @@ -11,7 +11,6 @@ */ #include "qemu/osdep.h" -#include "qapi/qmp/qint.h" #include "qapi/qmp/qdict.h" #include "qapi/qmp/qstring.h" #include "qapi/error.h" @@ -39,7 +38,7 @@ static void qdict_new_test(void) static void qdict_put_obj_test(void) { - QInt *qi; + QNum *qn; QDict *qdict; QDictEntry *ent; const int num = 42; @@ -51,11 +50,11 @@ static void qdict_put_obj_test(void) g_assert(qdict_size(qdict) == 1); ent = QLIST_FIRST(&qdict->table[12345 % QDICT_BUCKET_MAX]); - qi = qobject_to_qint(ent->value); - g_assert(qint_get_int(qi) == num); + qn = qobject_to_qnum(ent->value); + g_assert_cmpint(qnum_get_int(qn), ==, num); // destroy doesn't exit yet - QDECREF(qi); + QDECREF(qn); g_free(ent->key); g_free(ent); g_free(qdict); @@ -74,7 +73,7 @@ static void qdict_destroy_simple_test(void) static void qdict_get_test(void) { - QInt *qi; + QNum *qn; QObject *obj; const int value = -42; const char *key = "test"; @@ -85,8 +84,8 @@ static void qdict_get_test(void) obj = qdict_get(tests_dict, key); g_assert(obj != NULL); - qi = qobject_to_qint(obj); - g_assert(qint_get_int(qi) == value); + qn = qobject_to_qnum(obj); + g_assert_cmpint(qnum_get_int(qn), ==, value); QDECREF(tests_dict); } @@ -329,7 +328,7 @@ static void qdict_array_split_test(void) { QDict *test_dict = qdict_new(); QDict *dict1, *dict2; - QInt *int1; + QNum *int1; QList *test_list; /* @@ -380,7 +379,7 @@ static void qdict_array_split_test(void) dict1 = qobject_to_qdict(qlist_pop(test_list)); dict2 = qobject_to_qdict(qlist_pop(test_list)); - int1 = qobject_to_qint(qlist_pop(test_list)); + int1 = qobject_to_qnum(qlist_pop(test_list)); g_assert(dict1); g_assert(dict2); @@ -402,7 +401,7 @@ static void qdict_array_split_test(void) QDECREF(dict2); - g_assert(qint_get_int(int1) == 66); + g_assert_cmpint(qnum_get_int(int1), ==, 66); QDECREF(int1); @@ -447,14 +446,14 @@ static void qdict_array_split_test(void) qdict_array_split(test_dict, &test_list); - int1 = qobject_to_qint(qlist_pop(test_list)); + int1 = qobject_to_qnum(qlist_pop(test_list)); g_assert(int1); g_assert(qlist_empty(test_list)); QDECREF(test_list); - g_assert(qint_get_int(int1) == 42); + g_assert_cmpint(qnum_get_int(int1), ==, 42); QDECREF(int1); diff --git a/tests/check-qfloat.c b/tests/check-qfloat.c deleted file mode 100644 index 1da2cda..0000000 --- a/tests/check-qfloat.c +++ /dev/null @@ -1,53 +0,0 @@ -/* - * QFloat unit-tests. - * - * Copyright IBM, Corp. 2009 - * - * Authors: - * Anthony Liguori <aliguori@us.ibm.com> - * - * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. - * See the COPYING.LIB file in the top-level directory. - * - */ -#include "qemu/osdep.h" - -#include "qapi/qmp/qfloat.h" -#include "qemu-common.h" - -/* - * Public Interface test-cases - * - * (with some violations to access 'private' data) - */ - -static void qfloat_from_double_test(void) -{ - QFloat *qf; - const double value = -42.23423; - - qf = qfloat_from_double(value); - g_assert(qf != NULL); - g_assert(qf->value == value); - g_assert(qf->base.refcnt == 1); - g_assert(qobject_type(QOBJECT(qf)) == QTYPE_QFLOAT); - - // destroy doesn't exit yet - g_free(qf); -} - -static void qfloat_destroy_test(void) -{ - QFloat *qf = qfloat_from_double(0.0); - QDECREF(qf); -} - -int main(int argc, char **argv) -{ - g_test_init(&argc, &argv, NULL); - - g_test_add_func("/public/from_double", qfloat_from_double_test); - g_test_add_func("/public/destroy", qfloat_destroy_test); - - return g_test_run(); -} diff --git a/tests/check-qint.c b/tests/check-qint.c deleted file mode 100644 index b6e4555..0000000 --- a/tests/check-qint.c +++ /dev/null @@ -1,87 +0,0 @@ -/* - * QInt unit-tests. - * - * Copyright (C) 2009 Red Hat Inc. - * - * Authors: - * Luiz Capitulino <lcapitulino@redhat.com> - * - * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. - * See the COPYING.LIB file in the top-level directory. - */ -#include "qemu/osdep.h" - -#include "qapi/qmp/qint.h" -#include "qemu-common.h" - -/* - * Public Interface test-cases - * - * (with some violations to access 'private' data) - */ - -static void qint_from_int_test(void) -{ - QInt *qi; - const int value = -42; - - qi = qint_from_int(value); - g_assert(qi != NULL); - g_assert(qi->value == value); - g_assert(qi->base.refcnt == 1); - g_assert(qobject_type(QOBJECT(qi)) == QTYPE_QINT); - - // destroy doesn't exit yet - g_free(qi); -} - -static void qint_destroy_test(void) -{ - QInt *qi = qint_from_int(0); - QDECREF(qi); -} - -static void qint_from_int64_test(void) -{ - QInt *qi; - const int64_t value = 0x1234567890abcdefLL; - - qi = qint_from_int(value); - g_assert((int64_t) qi->value == value); - - QDECREF(qi); -} - -static void qint_get_int_test(void) -{ - QInt *qi; - const int value = 123456; - - qi = qint_from_int(value); - g_assert(qint_get_int(qi) == value); - - QDECREF(qi); -} - -static void qobject_to_qint_test(void) -{ - QInt *qi; - - qi = qint_from_int(0); - g_assert(qobject_to_qint(QOBJECT(qi)) == qi); - - QDECREF(qi); -} - -int main(int argc, char **argv) -{ - g_test_init(&argc, &argv, NULL); - - g_test_add_func("/public/from_int", qint_from_int_test); - g_test_add_func("/public/destroy", qint_destroy_test); - g_test_add_func("/public/from_int64", qint_from_int64_test); - g_test_add_func("/public/get_int", qint_get_int_test); - g_test_add_func("/public/to_qint", qobject_to_qint_test); - - return g_test_run(); -} diff --git a/tests/check-qjson.c b/tests/check-qjson.c index 963dd46..f0a89f7 100644 --- a/tests/check-qjson.c +++ b/tests/check-qjson.c @@ -886,21 +886,23 @@ static void simple_number(void) }; for (i = 0; test_cases[i].encoded; i++) { - QInt *qint; + QNum *qnum; + int64_t val; - qint = qobject_to_qint(qobject_from_json(test_cases[i].encoded, + qnum = qobject_to_qnum(qobject_from_json(test_cases[i].encoded, &error_abort)); - g_assert(qint); - g_assert(qint_get_int(qint) == test_cases[i].decoded); + g_assert(qnum); + g_assert(qnum_get_try_int(qnum, &val)); + g_assert_cmpint(val, ==, test_cases[i].decoded); if (test_cases[i].skip == 0) { QString *str; - str = qobject_to_json(QOBJECT(qint)); + str = qobject_to_json(QOBJECT(qnum)); g_assert(strcmp(qstring_get_str(str), test_cases[i].encoded) == 0); QDECREF(str); } - QDECREF(qint); + QDECREF(qnum); } } @@ -921,12 +923,12 @@ static void float_number(void) for (i = 0; test_cases[i].encoded; i++) { QObject *obj; - QFloat *qfloat; + QNum *qnum; obj = qobject_from_json(test_cases[i].encoded, &error_abort); - qfloat = qobject_to_qfloat(obj); - g_assert(qfloat); - g_assert(qfloat_get_double(qfloat) == test_cases[i].decoded); + qnum = qobject_to_qnum(obj); + g_assert(qnum); + g_assert(qnum_get_double(qnum) == test_cases[i].decoded); if (test_cases[i].skip == 0) { QString *str; @@ -936,29 +938,31 @@ static void float_number(void) QDECREF(str); } - QDECREF(qfloat); + QDECREF(qnum); } } static void vararg_number(void) { - QInt *qint; - QFloat *qfloat; + QNum *qnum; int value = 0x2342; long long value_ll = 0x2342342343LL; double valuef = 2.323423423; + int64_t val; - qint = qobject_to_qint(qobject_from_jsonf("%d", value)); - g_assert(qint_get_int(qint) == value); - QDECREF(qint); + qnum = qobject_to_qnum(qobject_from_jsonf("%d", value)); + g_assert(qnum_get_try_int(qnum, &val)); + g_assert_cmpint(val, ==, value); + QDECREF(qnum); - qint = qobject_to_qint(qobject_from_jsonf("%lld", value_ll)); - g_assert(qint_get_int(qint) == value_ll); - QDECREF(qint); + qnum = qobject_to_qnum(qobject_from_jsonf("%lld", value_ll)); + g_assert(qnum_get_try_int(qnum, &val)); + g_assert_cmpint(val, ==, value_ll); + QDECREF(qnum); - qfloat = qobject_to_qfloat(qobject_from_jsonf("%f", valuef)); - g_assert(qfloat_get_double(qfloat) == valuef); - QDECREF(qfloat); + qnum = qobject_to_qnum(qobject_from_jsonf("%f", valuef)); + g_assert(qnum_get_double(qnum) == valuef); + QDECREF(qnum); } static void keyword_literal(void) @@ -1019,7 +1023,7 @@ struct LiteralQObject { int type; union { - int64_t qint; + int64_t qnum; const char *qstr; LiteralQDictEntry *qdict; LiteralQObject *qlist; @@ -1032,7 +1036,7 @@ struct LiteralQDictEntry LiteralQObject value; }; -#define QLIT_QINT(val) (LiteralQObject){.type = QTYPE_QINT, .value.qint = (val)} +#define QLIT_QNUM(val) (LiteralQObject){.type = QTYPE_QNUM, .value.qnum = (val)} #define QLIT_QSTR(val) (LiteralQObject){.type = QTYPE_QSTRING, .value.qstr = (val)} #define QLIT_QDICT(val) (LiteralQObject){.type = QTYPE_QDICT, .value.qdict = (val)} #define QLIT_QLIST(val) (LiteralQObject){.type = QTYPE_QLIST, .value.qlist = (val)} @@ -1064,13 +1068,16 @@ static void compare_helper(QObject *obj, void *opaque) static int compare_litqobj_to_qobj(LiteralQObject *lhs, QObject *rhs) { + int64_t val; + if (!rhs || lhs->type != qobject_type(rhs)) { return 0; } switch (lhs->type) { - case QTYPE_QINT: - return lhs->value.qint == qint_get_int(qobject_to_qint(rhs)); + case QTYPE_QNUM: + g_assert(qnum_get_try_int(qobject_to_qnum(rhs), &val)); + return lhs->value.qnum == val; case QTYPE_QSTRING: return (strcmp(lhs->value.qstr, qstring_get_str(qobject_to_qstring(rhs))) == 0); case QTYPE_QDICT: { @@ -1114,7 +1121,7 @@ static void simple_dict(void) { .encoded = "{\"foo\": 42, \"bar\": \"hello world\"}", .decoded = QLIT_QDICT(((LiteralQDictEntry[]){ - { "foo", QLIT_QINT(42) }, + { "foo", QLIT_QNUM(42) }, { "bar", QLIT_QSTR("hello world") }, { } })), @@ -1126,7 +1133,7 @@ static void simple_dict(void) }, { .encoded = "{\"foo\": 43}", .decoded = QLIT_QDICT(((LiteralQDictEntry[]){ - { "foo", QLIT_QINT(43) }, + { "foo", QLIT_QNUM(43) }, { } })), }, @@ -1212,15 +1219,15 @@ static void simple_list(void) { .encoded = "[43,42]", .decoded = QLIT_QLIST(((LiteralQObject[]){ - QLIT_QINT(43), - QLIT_QINT(42), + QLIT_QNUM(43), + QLIT_QNUM(42), { } })), }, { .encoded = "[43]", .decoded = QLIT_QLIST(((LiteralQObject[]){ - QLIT_QINT(43), + QLIT_QNUM(43), { } })), }, @@ -1269,35 +1276,35 @@ static void simple_whitespace(void) { .encoded = " [ 43 , 42 ]", .decoded = QLIT_QLIST(((LiteralQObject[]){ - QLIT_QINT(43), - QLIT_QINT(42), + QLIT_QNUM(43), + QLIT_QNUM(42), { } })), }, { .encoded = " [ 43 , { 'h' : 'b' }, [ ], 42 ]", .decoded = QLIT_QLIST(((LiteralQObject[]){ - QLIT_QINT(43), + QLIT_QNUM(43), QLIT_QDICT(((LiteralQDictEntry[]){ { "h", QLIT_QSTR("b") }, { }})), QLIT_QLIST(((LiteralQObject[]){ { }})), - QLIT_QINT(42), + QLIT_QNUM(42), { } })), }, { .encoded = " [ 43 , { 'h' : 'b' , 'a' : 32 }, [ ], 42 ]", .decoded = QLIT_QLIST(((LiteralQObject[]){ - QLIT_QINT(43), + QLIT_QNUM(43), QLIT_QDICT(((LiteralQDictEntry[]){ { "h", QLIT_QSTR("b") }, - { "a", QLIT_QINT(32) }, + { "a", QLIT_QNUM(32) }, { }})), QLIT_QLIST(((LiteralQObject[]){ { }})), - QLIT_QINT(42), + QLIT_QNUM(42), { } })), }, @@ -1327,11 +1334,11 @@ static void simple_varargs(void) QObject *embedded_obj; QObject *obj; LiteralQObject decoded = QLIT_QLIST(((LiteralQObject[]){ - QLIT_QINT(1), - QLIT_QINT(2), + QLIT_QNUM(1), + QLIT_QNUM(2), QLIT_QLIST(((LiteralQObject[]){ - QLIT_QINT(32), - QLIT_QINT(42), + QLIT_QNUM(32), + QLIT_QNUM(42), {}})), {}})); diff --git a/tests/check-qlist.c b/tests/check-qlist.c index 4983867c..a9b65c6 100644 --- a/tests/check-qlist.c +++ b/tests/check-qlist.c @@ -11,7 +11,8 @@ */ #include "qemu/osdep.h" -#include "qapi/qmp/qint.h" +#include "qapi/error.h" +#include "qapi/qmp/qnum.h" #include "qapi/qmp/qlist.h" /* @@ -35,11 +36,11 @@ static void qlist_new_test(void) static void qlist_append_test(void) { - QInt *qi; + QNum *qi; QList *qlist; QListEntry *entry; - qi = qint_from_int(42); + qi = qnum_from_int(42); qlist = qlist_new(); qlist_append(qlist, qi); @@ -84,13 +85,17 @@ static const int iter_max = 42; static void iter_func(QObject *obj, void *opaque) { - QInt *qi; + QNum *qi; + int64_t val; g_assert(opaque == NULL); - qi = qobject_to_qint(obj); + qi = qobject_to_qnum(obj); g_assert(qi != NULL); - g_assert((qint_get_int(qi) >= 0) && (qint_get_int(qi) <= iter_max)); + + g_assert(qnum_get_try_int(qi, &val)); + g_assert_cmpint(val, >=, 0); + g_assert_cmpint(val, <=, iter_max); iter_called++; } diff --git a/tests/check-qnum.c b/tests/check-qnum.c new file mode 100644 index 0000000..d94cea0 --- /dev/null +++ b/tests/check-qnum.c @@ -0,0 +1,136 @@ +/* + * QNum unit-tests. + * + * Copyright (C) 2009 Red Hat Inc. + * Copyright IBM, Corp. 2009 + * + * Authors: + * Luiz Capitulino <lcapitulino@redhat.com> + * Anthony Liguori <aliguori@us.ibm.com> + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + */ + +#include "qemu/osdep.h" + +#include "qapi/qmp/qnum.h" +#include "qapi/error.h" +#include "qemu-common.h" + +/* + * Public Interface test-cases + * + * (with some violations to access 'private' data) + */ + +static void qnum_from_int_test(void) +{ + QNum *qn; + const int value = -42; + + qn = qnum_from_int(value); + g_assert(qn != NULL); + g_assert_cmpint(qn->kind, ==, QNUM_I64); + g_assert_cmpint(qn->u.i64, ==, value); + g_assert_cmpint(qn->base.refcnt, ==, 1); + g_assert_cmpint(qobject_type(QOBJECT(qn)), ==, QTYPE_QNUM); + + // destroy doesn't exit yet + g_free(qn); +} + +static void qnum_from_double_test(void) +{ + QNum *qn; + const double value = -42.23423; + + qn = qnum_from_double(value); + g_assert(qn != NULL); + g_assert_cmpint(qn->kind, ==, QNUM_DOUBLE); + g_assert_cmpfloat(qn->u.dbl, ==, value); + g_assert_cmpint(qn->base.refcnt, ==, 1); + g_assert_cmpint(qobject_type(QOBJECT(qn)), ==, QTYPE_QNUM); + + // destroy doesn't exit yet + g_free(qn); +} + +static void qnum_from_int64_test(void) +{ + QNum *qn; + const int64_t value = 0x1234567890abcdefLL; + + qn = qnum_from_int(value); + g_assert_cmpint((int64_t) qn->u.i64, ==, value); + + QDECREF(qn); +} + +static void qnum_get_int_test(void) +{ + QNum *qn; + const int value = 123456; + + qn = qnum_from_int(value); + g_assert_cmpint(qnum_get_int(qn), ==, value); + + QDECREF(qn); +} + +static void qobject_to_qnum_test(void) +{ + QNum *qn; + + qn = qnum_from_int(0); + g_assert(qobject_to_qnum(QOBJECT(qn)) == qn); + QDECREF(qn); + + qn = qnum_from_double(0); + g_assert(qobject_to_qnum(QOBJECT(qn)) == qn); + QDECREF(qn); +} + +static void qnum_to_string_test(void) +{ + QNum *qn; + char *tmp; + + qn = qnum_from_int(123456); + tmp = qnum_to_string(qn); + g_assert_cmpstr(tmp, ==, "123456"); + g_free(tmp); + QDECREF(qn); + + qn = qnum_from_double(0.42); + tmp = qnum_to_string(qn); + g_assert_cmpstr(tmp, ==, "0.42"); + g_free(tmp); + QDECREF(qn); +} + +static void qnum_destroy_test(void) +{ + QNum *qn; + + qn = qnum_from_int(0); + QDECREF(qn); + + qn = qnum_from_double(0.42); + QDECREF(qn); +} + +int main(int argc, char **argv) +{ + g_test_init(&argc, &argv, NULL); + + g_test_add_func("/qnum/from_int", qnum_from_int_test); + g_test_add_func("/qnum/from_double", qnum_from_double_test); + g_test_add_func("/qnum/destroy", qnum_destroy_test); + g_test_add_func("/qnum/from_int64", qnum_from_int64_test); + g_test_add_func("/qnum/get_int", qnum_get_int_test); + g_test_add_func("/qnum/to_qnum", qobject_to_qnum_test); + g_test_add_func("/qnum/to_string", qnum_to_string_test); + + return g_test_run(); +} diff --git a/tests/qapi-schema/comments.out b/tests/qapi-schema/comments.out index 5d7c13c..17e6525 100644 --- a/tests/qapi-schema/comments.out +++ b/tests/qapi-schema/comments.out @@ -1,4 +1,4 @@ -enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool'] +enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool'] prefix QTYPE enum Status ['good', 'bad', 'ugly'] object q_empty diff --git a/tests/qapi-schema/doc-good.out b/tests/qapi-schema/doc-good.out index 70c1252..63ca25a 100644 --- a/tests/qapi-schema/doc-good.out +++ b/tests/qapi-schema/doc-good.out @@ -6,7 +6,7 @@ object Object tag base1 case one: Variant1 case two: Variant2 -enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool'] +enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool'] prefix QTYPE object SugaredUnion member type: SugaredUnionKind optional=False diff --git a/tests/qapi-schema/empty.out b/tests/qapi-schema/empty.out index 8a5b034..40b886d 100644 --- a/tests/qapi-schema/empty.out +++ b/tests/qapi-schema/empty.out @@ -1,3 +1,3 @@ -enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool'] +enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool'] prefix QTYPE object q_empty diff --git a/tests/qapi-schema/event-case.out b/tests/qapi-schema/event-case.out index 5a0f2bf..313c0fe 100644 --- a/tests/qapi-schema/event-case.out +++ b/tests/qapi-schema/event-case.out @@ -1,4 +1,4 @@ -enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool'] +enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool'] prefix QTYPE event oops None boxed=False diff --git a/tests/qapi-schema/ident-with-escape.out b/tests/qapi-schema/ident-with-escape.out index 1d2722c..b5637cb 100644 --- a/tests/qapi-schema/ident-with-escape.out +++ b/tests/qapi-schema/ident-with-escape.out @@ -1,4 +1,4 @@ -enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool'] +enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool'] prefix QTYPE command fooA q_obj_fooA-arg -> None gen=True success_response=True boxed=False diff --git a/tests/qapi-schema/include-relpath.out b/tests/qapi-schema/include-relpath.out index 5d7c13c..17e6525 100644 --- a/tests/qapi-schema/include-relpath.out +++ b/tests/qapi-schema/include-relpath.out @@ -1,4 +1,4 @@ -enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool'] +enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool'] prefix QTYPE enum Status ['good', 'bad', 'ugly'] object q_empty diff --git a/tests/qapi-schema/include-repetition.out b/tests/qapi-schema/include-repetition.out index 5d7c13c..17e6525 100644 --- a/tests/qapi-schema/include-repetition.out +++ b/tests/qapi-schema/include-repetition.out @@ -1,4 +1,4 @@ -enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool'] +enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool'] prefix QTYPE enum Status ['good', 'bad', 'ugly'] object q_empty diff --git a/tests/qapi-schema/include-simple.out b/tests/qapi-schema/include-simple.out index 5d7c13c..17e6525 100644 --- a/tests/qapi-schema/include-simple.out +++ b/tests/qapi-schema/include-simple.out @@ -1,4 +1,4 @@ -enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool'] +enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool'] prefix QTYPE enum Status ['good', 'bad', 'ugly'] object q_empty diff --git a/tests/qapi-schema/indented-expr.out b/tests/qapi-schema/indented-expr.out index e8171c9..586795f 100644 --- a/tests/qapi-schema/indented-expr.out +++ b/tests/qapi-schema/indented-expr.out @@ -1,4 +1,4 @@ -enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool'] +enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool'] prefix QTYPE command eins None -> None gen=True success_response=True boxed=False diff --git a/tests/qapi-schema/qapi-schema-test.out b/tests/qapi-schema/qapi-schema-test.out index e727a5a..b88b8aa 100644 --- a/tests/qapi-schema/qapi-schema-test.out +++ b/tests/qapi-schema/qapi-schema-test.out @@ -50,7 +50,7 @@ object NestedEnumsOne member enum4: EnumOne optional=True enum QEnumTwo ['value1', 'value2'] prefix QENUM_TWO -enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool'] +enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool'] prefix QTYPE object TestStruct member integer: int optional=False diff --git a/tests/test-qmp-commands.c b/tests/test-qmp-commands.c index acdded4..904c89d 100644 --- a/tests/test-qmp-commands.c +++ b/tests/test-qmp-commands.c @@ -162,7 +162,8 @@ static void test_dispatch_cmd_io(void) QDict *ud1b = qdict_new(); QDict *ret, *ret_dict, *ret_dict_dict, *ret_dict_dict_userdef; QDict *ret_dict_dict2, *ret_dict_dict2_userdef; - QInt *ret3; + QNum *ret3; + int64_t val; qdict_put_int(ud1a, "integer", 42); qdict_put_str(ud1a, "string", "hello"); @@ -194,8 +195,9 @@ static void test_dispatch_cmd_io(void) qdict_put(req, "arguments", args3); qdict_put_str(req, "execute", "guest-get-time"); - ret3 = qobject_to_qint(test_qmp_dispatch(req)); - assert(qint_get_int(ret3) == 66); + ret3 = qobject_to_qnum(test_qmp_dispatch(req)); + g_assert(qnum_get_try_int(ret3, &val)); + g_assert_cmpint(val, ==, 66); QDECREF(ret3); QDECREF(req); diff --git a/tests/test-qmp-event.c b/tests/test-qmp-event.c index 4c0f096..9fb3c5e 100644 --- a/tests/test-qmp-event.c +++ b/tests/test-qmp-event.c @@ -18,7 +18,6 @@ #include "test-qapi-visit.h" #include "test-qapi-event.h" #include "qapi/qmp/types.h" -#include "qapi/qmp/qint.h" #include "qapi/qmp/qobject.h" #include "qapi/qmp-event.h" @@ -41,6 +40,7 @@ void qdict_cmp_do_simple(const char *key, QObject *obj1, void *opaque) { QObject *obj2; QDictCmpData d_new, *d = opaque; + int64_t val1, val2; if (!d->result) { return; @@ -62,9 +62,10 @@ void qdict_cmp_do_simple(const char *key, QObject *obj1, void *opaque) d->result = (qbool_get_bool(qobject_to_qbool(obj1)) == qbool_get_bool(qobject_to_qbool(obj2))); return; - case QTYPE_QINT: - d->result = (qint_get_int(qobject_to_qint(obj1)) == - qint_get_int(qobject_to_qint(obj2))); + case QTYPE_QNUM: + g_assert(qnum_get_try_int(qobject_to_qnum(obj1), &val1)); + g_assert(qnum_get_try_int(qobject_to_qnum(obj2), &val2)); + d->result = val1 == val2; return; case QTYPE_QSTRING: d->result = g_strcmp0(qstring_get_str(qobject_to_qstring(obj1)), diff --git a/tests/test-qobject-input-visitor.c b/tests/test-qobject-input-visitor.c index 4dc9c03..6890ce5 100644 --- a/tests/test-qobject-input-visitor.c +++ b/tests/test-qobject-input-visitor.c @@ -165,9 +165,10 @@ static void test_visitor_in_int_overflow(TestInputVisitorData *data, Error *err = NULL; Visitor *v; - /* this will overflow a Qint/int64, so should be deserialized into - * a QFloat/double field instead, leading to an error if we pass it - * to visit_type_int. confirm this. + /* + * This will overflow a QNUM_I64, so should be deserialized into a + * QNUM_DOUBLE field instead, leading to an error if we pass it to + * visit_type_int(). Confirm this. */ v = visitor_input_test_init(data, "%f", DBL_MAX); @@ -469,17 +470,19 @@ static void test_visitor_in_any(TestInputVisitorData *data, { QObject *res = NULL; Visitor *v; - QInt *qint; + QNum *qnum; QBool *qbool; QString *qstring; QDict *qdict; QObject *qobj; + int64_t val; v = visitor_input_test_init(data, "-42"); visit_type_any(v, NULL, &res, &error_abort); - qint = qobject_to_qint(res); - g_assert(qint); - g_assert_cmpint(qint_get_int(qint), ==, -42); + qnum = qobject_to_qnum(res); + g_assert(qnum); + g_assert(qnum_get_try_int(qnum, &val)); + g_assert_cmpint(val, ==, -42); qobject_decref(res); v = visitor_input_test_init(data, "{ 'integer': -42, 'boolean': true, 'string': 'foo' }"); @@ -488,9 +491,10 @@ static void test_visitor_in_any(TestInputVisitorData *data, g_assert(qdict && qdict_size(qdict) == 3); qobj = qdict_get(qdict, "integer"); g_assert(qobj); - qint = qobject_to_qint(qobj); - g_assert(qint); - g_assert_cmpint(qint_get_int(qint), ==, -42); + qnum = qobject_to_qnum(qobj); + g_assert(qnum); + g_assert(qnum_get_try_int(qnum, &val)); + g_assert_cmpint(val, ==, -42); qobj = qdict_get(qdict, "boolean"); g_assert(qobj); qbool = qobject_to_qbool(qobj); @@ -568,7 +572,7 @@ static void test_visitor_in_alternate(TestInputVisitorData *data, v = visitor_input_test_init(data, "42"); visit_type_UserDefAlternate(v, NULL, &tmp, &error_abort); - g_assert_cmpint(tmp->type, ==, QTYPE_QINT); + g_assert_cmpint(tmp->type, ==, QTYPE_QNUM); g_assert_cmpint(tmp->u.i, ==, 42); qapi_free_UserDefAlternate(tmp); @@ -596,7 +600,7 @@ static void test_visitor_in_alternate(TestInputVisitorData *data, v = visitor_input_test_init(data, "{ 'alt': 42 }"); visit_type_WrapAlternate(v, NULL, &wrap, &error_abort); - g_assert_cmpint(wrap->alt->type, ==, QTYPE_QINT); + g_assert_cmpint(wrap->alt->type, ==, QTYPE_QNUM); g_assert_cmpint(wrap->alt->u.i, ==, 42); qapi_free_WrapAlternate(wrap); @@ -637,19 +641,19 @@ static void test_visitor_in_alternate_number(TestInputVisitorData *data, v = visitor_input_test_init(data, "42"); visit_type_AltEnumNum(v, NULL, &aen, &error_abort); - g_assert_cmpint(aen->type, ==, QTYPE_QFLOAT); + g_assert_cmpint(aen->type, ==, QTYPE_QNUM); g_assert_cmpfloat(aen->u.n, ==, 42); qapi_free_AltEnumNum(aen); v = visitor_input_test_init(data, "42"); visit_type_AltNumEnum(v, NULL, &ans, &error_abort); - g_assert_cmpint(ans->type, ==, QTYPE_QFLOAT); + g_assert_cmpint(ans->type, ==, QTYPE_QNUM); g_assert_cmpfloat(ans->u.n, ==, 42); qapi_free_AltNumEnum(ans); v = visitor_input_test_init(data, "42"); visit_type_AltEnumInt(v, NULL, &asi, &error_abort); - g_assert_cmpint(asi->type, ==, QTYPE_QINT); + g_assert_cmpint(asi->type, ==, QTYPE_QNUM); g_assert_cmpint(asi->u.i, ==, 42); qapi_free_AltEnumInt(asi); @@ -662,13 +666,13 @@ static void test_visitor_in_alternate_number(TestInputVisitorData *data, v = visitor_input_test_init(data, "42.5"); visit_type_AltEnumNum(v, NULL, &aen, &error_abort); - g_assert_cmpint(aen->type, ==, QTYPE_QFLOAT); + g_assert_cmpint(aen->type, ==, QTYPE_QNUM); g_assert_cmpfloat(aen->u.n, ==, 42.5); qapi_free_AltEnumNum(aen); v = visitor_input_test_init(data, "42.5"); visit_type_AltNumEnum(v, NULL, &ans, &error_abort); - g_assert_cmpint(ans->type, ==, QTYPE_QFLOAT); + g_assert_cmpint(ans->type, ==, QTYPE_QNUM); g_assert_cmpfloat(ans->u.n, ==, 42.5); qapi_free_AltNumEnum(ans); diff --git a/tests/test-qobject-output-visitor.c b/tests/test-qobject-output-visitor.c index 4e8fdf1..a16c8f6 100644 --- a/tests/test-qobject-output-visitor.c +++ b/tests/test-qobject-output-visitor.c @@ -58,13 +58,15 @@ static void test_visitor_out_int(TestOutputVisitorData *data, const void *unused) { int64_t value = -42; - QInt *qint; + int64_t val; + QNum *qnum; visit_type_int(data->ov, NULL, &value, &error_abort); - qint = qobject_to_qint(visitor_get(data)); - g_assert(qint); - g_assert_cmpint(qint_get_int(qint), ==, value); + qnum = qobject_to_qnum(visitor_get(data)); + g_assert(qnum); + g_assert(qnum_get_try_int(qnum, &val)); + g_assert_cmpint(val, ==, value); } static void test_visitor_out_bool(TestOutputVisitorData *data, @@ -84,13 +86,13 @@ static void test_visitor_out_number(TestOutputVisitorData *data, const void *unused) { double value = 3.14; - QFloat *qfloat; + QNum *qnum; visit_type_number(data->ov, NULL, &value, &error_abort); - qfloat = qobject_to_qfloat(visitor_get(data)); - g_assert(qfloat); - g_assert(qfloat_get_double(qfloat) == value); + qnum = qobject_to_qnum(visitor_get(data)); + g_assert(qnum); + g_assert(qnum_get_double(qnum) == value); } static void test_visitor_out_string(TestOutputVisitorData *data, @@ -329,16 +331,18 @@ static void test_visitor_out_any(TestOutputVisitorData *data, const void *unused) { QObject *qobj; - QInt *qint; + QNum *qnum; QBool *qbool; QString *qstring; QDict *qdict; + int64_t val; - qobj = QOBJECT(qint_from_int(-42)); + qobj = QOBJECT(qnum_from_int(-42)); visit_type_any(data->ov, NULL, &qobj, &error_abort); - qint = qobject_to_qint(visitor_get(data)); - g_assert(qint); - g_assert_cmpint(qint_get_int(qint), ==, -42); + qnum = qobject_to_qnum(visitor_get(data)); + g_assert(qnum); + g_assert(qnum_get_try_int(qnum, &val)); + g_assert_cmpint(val, ==, -42); qobject_decref(qobj); visitor_reset(data); @@ -351,9 +355,10 @@ static void test_visitor_out_any(TestOutputVisitorData *data, qobject_decref(qobj); qdict = qobject_to_qdict(visitor_get(data)); g_assert(qdict); - qint = qobject_to_qint(qdict_get(qdict, "integer")); - g_assert(qint); - g_assert_cmpint(qint_get_int(qint), ==, -42); + qnum = qobject_to_qnum(qdict_get(qdict, "integer")); + g_assert(qnum); + g_assert(qnum_get_try_int(qnum, &val)); + g_assert_cmpint(val, ==, -42); qbool = qobject_to_qbool(qdict_get(qdict, "boolean")); g_assert(qbool); g_assert(qbool_get_bool(qbool) == true); @@ -388,18 +393,20 @@ static void test_visitor_out_alternate(TestOutputVisitorData *data, const void *unused) { UserDefAlternate *tmp; - QInt *qint; + QNum *qnum; QString *qstr; QDict *qdict; + int64_t val; tmp = g_new0(UserDefAlternate, 1); - tmp->type = QTYPE_QINT; + tmp->type = QTYPE_QNUM; tmp->u.i = 42; visit_type_UserDefAlternate(data->ov, NULL, &tmp, &error_abort); - qint = qobject_to_qint(visitor_get(data)); - g_assert(qint); - g_assert_cmpint(qint_get_int(qint), ==, 42); + qnum = qobject_to_qnum(visitor_get(data)); + g_assert(qnum); + g_assert(qnum_get_try_int(qnum, &val)); + g_assert_cmpint(val, ==, 42); qapi_free_UserDefAlternate(tmp); @@ -603,18 +610,22 @@ static void check_native_list(QObject *qobj, case USER_DEF_NATIVE_LIST_UNION_KIND_U16: case USER_DEF_NATIVE_LIST_UNION_KIND_U32: case USER_DEF_NATIVE_LIST_UNION_KIND_U64: - /* all integer elements in JSON arrays get stored into QInts when - * we convert to QObjects, so we can check them all in the same - * fashion, so simply fall through here + /* + * All integer elements in JSON arrays get stored into QNums + * when we convert to QObjects, so we can check them all in + * the same fashion, so simply fall through here. */ case USER_DEF_NATIVE_LIST_UNION_KIND_INTEGER: for (i = 0; i < 32; i++) { QObject *tmp; - QInt *qvalue; + QNum *qvalue; + int64_t val; + tmp = qlist_peek(qlist); g_assert(tmp); - qvalue = qobject_to_qint(tmp); - g_assert_cmpint(qint_get_int(qvalue), ==, i); + qvalue = qobject_to_qnum(tmp); + g_assert(qnum_get_try_int(qvalue, &val)); + g_assert_cmpint(val, ==, i); qobject_decref(qlist_pop(qlist)); } break; @@ -645,15 +656,15 @@ static void check_native_list(QObject *qobj, case USER_DEF_NATIVE_LIST_UNION_KIND_NUMBER: for (i = 0; i < 32; i++) { QObject *tmp; - QFloat *qvalue; + QNum *qvalue; GString *double_expected = g_string_new(""); GString *double_actual = g_string_new(""); tmp = qlist_peek(qlist); g_assert(tmp); - qvalue = qobject_to_qfloat(tmp); + qvalue = qobject_to_qnum(tmp); g_string_printf(double_expected, "%.6f", (double)i / 3); - g_string_printf(double_actual, "%.6f", qfloat_get_double(qvalue)); + g_string_printf(double_actual, "%.6f", qnum_get_double(qvalue)); g_assert_cmpstr(double_actual->str, ==, double_expected->str); qobject_decref(qlist_pop(qlist)); diff --git a/tests/test-x86-cpuid-compat.c b/tests/test-x86-cpuid-compat.c index 4166ce5..58a2dd9 100644 --- a/tests/test-x86-cpuid-compat.c +++ b/tests/test-x86-cpuid-compat.c @@ -1,9 +1,8 @@ #include "qemu/osdep.h" #include "qemu-common.h" -#include "qapi/qmp/qlist.h" -#include "qapi/qmp/qstring.h" +#include "qapi/error.h" #include "qapi/qmp/qdict.h" -#include "qapi/qmp/qint.h" +#include "qapi/qmp/qnum.h" #include "qapi/qmp/qbool.h" #include "libqtest.h" @@ -57,12 +56,14 @@ static void test_cpuid_prop(const void *data) { const CpuidTestArgs *args = data; char *path; - QInt *value; + QNum *value; + int64_t val; qtest_start(args->cmdline); path = get_cpu0_qom_path(); - value = qobject_to_qint(qom_get(path, args->property)); - g_assert_cmpint(qint_get_int(value), ==, args->expected_value); + value = qobject_to_qnum(qom_get(path, args->property)); + g_assert(qnum_get_try_int(value, &val)); + g_assert_cmpint(val, ==, args->expected_value); qtest_end(); QDECREF(value); @@ -109,12 +110,15 @@ static uint32_t get_feature_word(QList *features, uint32_t eax, uint32_t ecx, uint32_t reax = qdict_get_int(w, "cpuid-input-eax"); bool has_ecx = qdict_haskey(w, "cpuid-input-ecx"); uint32_t recx = 0; + int64_t val; if (has_ecx) { recx = qdict_get_int(w, "cpuid-input-ecx"); } if (eax == reax && (!has_ecx || ecx == recx) && !strcmp(rreg, reg)) { - return qint_get_int(qobject_to_qint(qdict_get(w, "features"))); + g_assert(qnum_get_try_int(qobject_to_qnum(qdict_get(w, "features")), + &val)); + return val; } } return 0; |