xref: /qemu/tests/unit/check-qnum.c (revision 1a9076919f5367309ee8d89b91aae5330dec37d6)
101b2ffceSMarc-André Lureau /*
201b2ffceSMarc-André Lureau  * QNum unit-tests.
301b2ffceSMarc-André Lureau  *
401b2ffceSMarc-André Lureau  * Copyright (C) 2009 Red Hat Inc.
501b2ffceSMarc-André Lureau  * Copyright IBM, Corp. 2009
601b2ffceSMarc-André Lureau  *
701b2ffceSMarc-André Lureau  * Authors:
801b2ffceSMarc-André Lureau  *  Luiz Capitulino <lcapitulino@redhat.com>
901b2ffceSMarc-André Lureau  *  Anthony Liguori <aliguori@us.ibm.com>
1001b2ffceSMarc-André Lureau  *
1101b2ffceSMarc-André Lureau  * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
1201b2ffceSMarc-André Lureau  * See the COPYING.LIB file in the top-level directory.
1301b2ffceSMarc-André Lureau  */
1401b2ffceSMarc-André Lureau 
1501b2ffceSMarc-André Lureau #include "qemu/osdep.h"
1601b2ffceSMarc-André Lureau 
1701b2ffceSMarc-André Lureau #include "qapi/qmp/qnum.h"
1801b2ffceSMarc-André Lureau #include "qemu-common.h"
1901b2ffceSMarc-André Lureau 
2001b2ffceSMarc-André Lureau /*
2101b2ffceSMarc-André Lureau  * Public Interface test-cases
2201b2ffceSMarc-André Lureau  *
2301b2ffceSMarc-André Lureau  * (with some violations to access 'private' data)
2401b2ffceSMarc-André Lureau  */
2501b2ffceSMarc-André Lureau 
2601b2ffceSMarc-André Lureau static void qnum_from_int_test(void)
2701b2ffceSMarc-André Lureau {
2801b2ffceSMarc-André Lureau     QNum *qn;
2901b2ffceSMarc-André Lureau     const int value = -42;
3001b2ffceSMarc-André Lureau 
3101b2ffceSMarc-André Lureau     qn = qnum_from_int(value);
3201b2ffceSMarc-André Lureau     g_assert(qn != NULL);
3301b2ffceSMarc-André Lureau     g_assert_cmpint(qn->kind, ==, QNUM_I64);
3401b2ffceSMarc-André Lureau     g_assert_cmpint(qn->u.i64, ==, value);
3501b2ffceSMarc-André Lureau     g_assert_cmpint(qn->base.refcnt, ==, 1);
3601b2ffceSMarc-André Lureau     g_assert_cmpint(qobject_type(QOBJECT(qn)), ==, QTYPE_QNUM);
3701b2ffceSMarc-André Lureau 
38cb3e7f08SMarc-André Lureau     qobject_unref(qn);
3901b2ffceSMarc-André Lureau }
4001b2ffceSMarc-André Lureau 
4161a8f418SMarc-André Lureau static void qnum_from_uint_test(void)
4261a8f418SMarc-André Lureau {
4361a8f418SMarc-André Lureau     QNum *qn;
4461a8f418SMarc-André Lureau     const uint64_t value = UINT64_MAX;
4561a8f418SMarc-André Lureau 
4661a8f418SMarc-André Lureau     qn = qnum_from_uint(value);
4761a8f418SMarc-André Lureau     g_assert(qn != NULL);
4861a8f418SMarc-André Lureau     g_assert_cmpint(qn->kind, ==, QNUM_U64);
4961a8f418SMarc-André Lureau     g_assert(qn->u.u64 == value);
5061a8f418SMarc-André Lureau     g_assert(qn->base.refcnt == 1);
5161a8f418SMarc-André Lureau     g_assert(qobject_type(QOBJECT(qn)) == QTYPE_QNUM);
5261a8f418SMarc-André Lureau 
53cb3e7f08SMarc-André Lureau     qobject_unref(qn);
5461a8f418SMarc-André Lureau }
5561a8f418SMarc-André Lureau 
5601b2ffceSMarc-André Lureau static void qnum_from_double_test(void)
5701b2ffceSMarc-André Lureau {
5801b2ffceSMarc-André Lureau     QNum *qn;
5901b2ffceSMarc-André Lureau     const double value = -42.23423;
6001b2ffceSMarc-André Lureau 
6101b2ffceSMarc-André Lureau     qn = qnum_from_double(value);
6201b2ffceSMarc-André Lureau     g_assert(qn != NULL);
6301b2ffceSMarc-André Lureau     g_assert_cmpint(qn->kind, ==, QNUM_DOUBLE);
6401b2ffceSMarc-André Lureau     g_assert_cmpfloat(qn->u.dbl, ==, value);
6501b2ffceSMarc-André Lureau     g_assert_cmpint(qn->base.refcnt, ==, 1);
6601b2ffceSMarc-André Lureau     g_assert_cmpint(qobject_type(QOBJECT(qn)), ==, QTYPE_QNUM);
6701b2ffceSMarc-André Lureau 
68cb3e7f08SMarc-André Lureau     qobject_unref(qn);
6901b2ffceSMarc-André Lureau }
7001b2ffceSMarc-André Lureau 
7101b2ffceSMarc-André Lureau static void qnum_from_int64_test(void)
7201b2ffceSMarc-André Lureau {
7301b2ffceSMarc-André Lureau     QNum *qn;
7401b2ffceSMarc-André Lureau     const int64_t value = 0x1234567890abcdefLL;
7501b2ffceSMarc-André Lureau 
7601b2ffceSMarc-André Lureau     qn = qnum_from_int(value);
7701b2ffceSMarc-André Lureau     g_assert_cmpint((int64_t) qn->u.i64, ==, value);
7801b2ffceSMarc-André Lureau 
79cb3e7f08SMarc-André Lureau     qobject_unref(qn);
8001b2ffceSMarc-André Lureau }
8101b2ffceSMarc-André Lureau 
8201b2ffceSMarc-André Lureau static void qnum_get_int_test(void)
8301b2ffceSMarc-André Lureau {
8401b2ffceSMarc-André Lureau     QNum *qn;
8501b2ffceSMarc-André Lureau     const int value = 123456;
8601b2ffceSMarc-André Lureau 
8701b2ffceSMarc-André Lureau     qn = qnum_from_int(value);
8801b2ffceSMarc-André Lureau     g_assert_cmpint(qnum_get_int(qn), ==, value);
8901b2ffceSMarc-André Lureau 
90cb3e7f08SMarc-André Lureau     qobject_unref(qn);
9101b2ffceSMarc-André Lureau }
9201b2ffceSMarc-André Lureau 
9361a8f418SMarc-André Lureau static void qnum_get_uint_test(void)
9461a8f418SMarc-André Lureau {
9561a8f418SMarc-André Lureau     QNum *qn;
9661a8f418SMarc-André Lureau     const int value = 123456;
9761a8f418SMarc-André Lureau     uint64_t val;
9861a8f418SMarc-André Lureau     int64_t ival;
9961a8f418SMarc-André Lureau 
10061a8f418SMarc-André Lureau     qn = qnum_from_uint(value);
10161a8f418SMarc-André Lureau     g_assert(qnum_get_try_uint(qn, &val));
10261a8f418SMarc-André Lureau     g_assert_cmpuint(val, ==, value);
103cb3e7f08SMarc-André Lureau     qobject_unref(qn);
10461a8f418SMarc-André Lureau 
10561a8f418SMarc-André Lureau     qn = qnum_from_int(value);
10661a8f418SMarc-André Lureau     g_assert(qnum_get_try_uint(qn, &val));
10761a8f418SMarc-André Lureau     g_assert_cmpuint(val, ==, value);
108cb3e7f08SMarc-André Lureau     qobject_unref(qn);
10961a8f418SMarc-André Lureau 
11061a8f418SMarc-André Lureau     /* invalid cases */
11161a8f418SMarc-André Lureau     qn = qnum_from_int(-1);
11261a8f418SMarc-André Lureau     g_assert(!qnum_get_try_uint(qn, &val));
113cb3e7f08SMarc-André Lureau     qobject_unref(qn);
11461a8f418SMarc-André Lureau 
11561a8f418SMarc-André Lureau     qn = qnum_from_uint(-1ULL);
11661a8f418SMarc-André Lureau     g_assert(!qnum_get_try_int(qn, &ival));
117cb3e7f08SMarc-André Lureau     qobject_unref(qn);
11861a8f418SMarc-André Lureau 
11961a8f418SMarc-André Lureau     qn = qnum_from_double(0.42);
12061a8f418SMarc-André Lureau     g_assert(!qnum_get_try_uint(qn, &val));
121cb3e7f08SMarc-André Lureau     qobject_unref(qn);
12261a8f418SMarc-André Lureau }
12361a8f418SMarc-André Lureau 
12401b2ffceSMarc-André Lureau static void qobject_to_qnum_test(void)
12501b2ffceSMarc-André Lureau {
12601b2ffceSMarc-André Lureau     QNum *qn;
12701b2ffceSMarc-André Lureau 
12801b2ffceSMarc-André Lureau     qn = qnum_from_int(0);
1297dc847ebSMax Reitz     g_assert(qobject_to(QNum, QOBJECT(qn)) == qn);
130cb3e7f08SMarc-André Lureau     qobject_unref(qn);
13101b2ffceSMarc-André Lureau 
13201b2ffceSMarc-André Lureau     qn = qnum_from_double(0);
1337dc847ebSMax Reitz     g_assert(qobject_to(QNum, QOBJECT(qn)) == qn);
134cb3e7f08SMarc-André Lureau     qobject_unref(qn);
13501b2ffceSMarc-André Lureau }
13601b2ffceSMarc-André Lureau 
13701b2ffceSMarc-André Lureau static void qnum_to_string_test(void)
13801b2ffceSMarc-André Lureau {
13901b2ffceSMarc-André Lureau     QNum *qn;
14001b2ffceSMarc-André Lureau     char *tmp;
14101b2ffceSMarc-André Lureau 
14201b2ffceSMarc-André Lureau     qn = qnum_from_int(123456);
14301b2ffceSMarc-André Lureau     tmp = qnum_to_string(qn);
14401b2ffceSMarc-André Lureau     g_assert_cmpstr(tmp, ==, "123456");
14501b2ffceSMarc-André Lureau     g_free(tmp);
146cb3e7f08SMarc-André Lureau     qobject_unref(qn);
14701b2ffceSMarc-André Lureau 
14801b2ffceSMarc-André Lureau     qn = qnum_from_double(0.42);
14901b2ffceSMarc-André Lureau     tmp = qnum_to_string(qn);
15001b2ffceSMarc-André Lureau     g_assert_cmpstr(tmp, ==, "0.42");
15101b2ffceSMarc-André Lureau     g_free(tmp);
152cb3e7f08SMarc-André Lureau     qobject_unref(qn);
153*1a907691SMarkus Armbruster 
154*1a907691SMarkus Armbruster     qn = qnum_from_double(2.718281828459045);
155*1a907691SMarkus Armbruster     tmp = qnum_to_string(qn);
156*1a907691SMarkus Armbruster     g_assert_cmpstr(tmp, ==, "2.718282"); /* BUG */
157*1a907691SMarkus Armbruster     g_free(tmp);
158*1a907691SMarkus Armbruster     qobject_unref(qn);
15901b2ffceSMarc-André Lureau }
16001b2ffceSMarc-André Lureau 
16101b2ffceSMarc-André Lureau int main(int argc, char **argv)
16201b2ffceSMarc-André Lureau {
16301b2ffceSMarc-André Lureau     g_test_init(&argc, &argv, NULL);
16401b2ffceSMarc-André Lureau 
16501b2ffceSMarc-André Lureau     g_test_add_func("/qnum/from_int", qnum_from_int_test);
16661a8f418SMarc-André Lureau     g_test_add_func("/qnum/from_uint", qnum_from_uint_test);
16701b2ffceSMarc-André Lureau     g_test_add_func("/qnum/from_double", qnum_from_double_test);
16801b2ffceSMarc-André Lureau     g_test_add_func("/qnum/from_int64", qnum_from_int64_test);
16901b2ffceSMarc-André Lureau     g_test_add_func("/qnum/get_int", qnum_get_int_test);
17061a8f418SMarc-André Lureau     g_test_add_func("/qnum/get_uint", qnum_get_uint_test);
17101b2ffceSMarc-André Lureau     g_test_add_func("/qnum/to_qnum", qobject_to_qnum_test);
17201b2ffceSMarc-André Lureau     g_test_add_func("/qnum/to_string", qnum_to_string_test);
17301b2ffceSMarc-André Lureau 
17401b2ffceSMarc-André Lureau     return g_test_run();
17501b2ffceSMarc-André Lureau }
176