xref: /qemu/tests/unit/check-qnum.c (revision 407bc4bf9027f7ac4333e47cd900d773b99a23e3)
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 
17*407bc4bfSDaniel P. Berrangé #include "qobject/qnum.h"
1801b2ffceSMarc-André Lureau 
1901b2ffceSMarc-André Lureau /*
2001b2ffceSMarc-André Lureau  * Public Interface test-cases
2101b2ffceSMarc-André Lureau  *
2201b2ffceSMarc-André Lureau  * (with some violations to access 'private' data)
2301b2ffceSMarc-André Lureau  */
2401b2ffceSMarc-André Lureau 
qnum_from_int_test(void)2501b2ffceSMarc-André Lureau static void qnum_from_int_test(void)
2601b2ffceSMarc-André Lureau {
2701b2ffceSMarc-André Lureau     QNum *qn;
2801b2ffceSMarc-André Lureau     const int value = -42;
2901b2ffceSMarc-André Lureau 
3001b2ffceSMarc-André Lureau     qn = qnum_from_int(value);
3101b2ffceSMarc-André Lureau     g_assert(qn != NULL);
3201b2ffceSMarc-André Lureau     g_assert_cmpint(qn->kind, ==, QNUM_I64);
3301b2ffceSMarc-André Lureau     g_assert_cmpint(qn->u.i64, ==, value);
3401b2ffceSMarc-André Lureau     g_assert_cmpint(qn->base.refcnt, ==, 1);
3501b2ffceSMarc-André Lureau     g_assert_cmpint(qobject_type(QOBJECT(qn)), ==, QTYPE_QNUM);
3601b2ffceSMarc-André Lureau 
37cb3e7f08SMarc-André Lureau     qobject_unref(qn);
3801b2ffceSMarc-André Lureau }
3901b2ffceSMarc-André Lureau 
qnum_from_uint_test(void)4061a8f418SMarc-André Lureau static void qnum_from_uint_test(void)
4161a8f418SMarc-André Lureau {
4261a8f418SMarc-André Lureau     QNum *qn;
4361a8f418SMarc-André Lureau     const uint64_t value = UINT64_MAX;
4461a8f418SMarc-André Lureau 
4561a8f418SMarc-André Lureau     qn = qnum_from_uint(value);
4661a8f418SMarc-André Lureau     g_assert(qn != NULL);
4761a8f418SMarc-André Lureau     g_assert_cmpint(qn->kind, ==, QNUM_U64);
4861a8f418SMarc-André Lureau     g_assert(qn->u.u64 == value);
4961a8f418SMarc-André Lureau     g_assert(qn->base.refcnt == 1);
5061a8f418SMarc-André Lureau     g_assert(qobject_type(QOBJECT(qn)) == QTYPE_QNUM);
5161a8f418SMarc-André Lureau 
52cb3e7f08SMarc-André Lureau     qobject_unref(qn);
5361a8f418SMarc-André Lureau }
5461a8f418SMarc-André Lureau 
qnum_from_double_test(void)5501b2ffceSMarc-André Lureau static void qnum_from_double_test(void)
5601b2ffceSMarc-André Lureau {
5701b2ffceSMarc-André Lureau     QNum *qn;
5801b2ffceSMarc-André Lureau     const double value = -42.23423;
5901b2ffceSMarc-André Lureau 
6001b2ffceSMarc-André Lureau     qn = qnum_from_double(value);
6101b2ffceSMarc-André Lureau     g_assert(qn != NULL);
6201b2ffceSMarc-André Lureau     g_assert_cmpint(qn->kind, ==, QNUM_DOUBLE);
6301b2ffceSMarc-André Lureau     g_assert_cmpfloat(qn->u.dbl, ==, value);
6401b2ffceSMarc-André Lureau     g_assert_cmpint(qn->base.refcnt, ==, 1);
6501b2ffceSMarc-André Lureau     g_assert_cmpint(qobject_type(QOBJECT(qn)), ==, QTYPE_QNUM);
6601b2ffceSMarc-André Lureau 
67cb3e7f08SMarc-André Lureau     qobject_unref(qn);
6801b2ffceSMarc-André Lureau }
6901b2ffceSMarc-André Lureau 
qnum_from_int64_test(void)7001b2ffceSMarc-André Lureau static void qnum_from_int64_test(void)
7101b2ffceSMarc-André Lureau {
7201b2ffceSMarc-André Lureau     QNum *qn;
7301b2ffceSMarc-André Lureau     const int64_t value = 0x1234567890abcdefLL;
7401b2ffceSMarc-André Lureau 
7501b2ffceSMarc-André Lureau     qn = qnum_from_int(value);
7601b2ffceSMarc-André Lureau     g_assert_cmpint((int64_t) qn->u.i64, ==, value);
7701b2ffceSMarc-André Lureau 
78cb3e7f08SMarc-André Lureau     qobject_unref(qn);
7901b2ffceSMarc-André Lureau }
8001b2ffceSMarc-André Lureau 
qnum_get_int_test(void)8101b2ffceSMarc-André Lureau static void qnum_get_int_test(void)
8201b2ffceSMarc-André Lureau {
8301b2ffceSMarc-André Lureau     QNum *qn;
8401b2ffceSMarc-André Lureau     const int value = 123456;
8501b2ffceSMarc-André Lureau 
8601b2ffceSMarc-André Lureau     qn = qnum_from_int(value);
8701b2ffceSMarc-André Lureau     g_assert_cmpint(qnum_get_int(qn), ==, value);
8801b2ffceSMarc-André Lureau 
89cb3e7f08SMarc-André Lureau     qobject_unref(qn);
9001b2ffceSMarc-André Lureau }
9101b2ffceSMarc-André Lureau 
qnum_get_uint_test(void)9261a8f418SMarc-André Lureau static void qnum_get_uint_test(void)
9361a8f418SMarc-André Lureau {
9461a8f418SMarc-André Lureau     QNum *qn;
9561a8f418SMarc-André Lureau     const int value = 123456;
9661a8f418SMarc-André Lureau     uint64_t val;
9761a8f418SMarc-André Lureau     int64_t ival;
9861a8f418SMarc-André Lureau 
9961a8f418SMarc-André Lureau     qn = qnum_from_uint(value);
10061a8f418SMarc-André Lureau     g_assert(qnum_get_try_uint(qn, &val));
10161a8f418SMarc-André Lureau     g_assert_cmpuint(val, ==, value);
102cb3e7f08SMarc-André Lureau     qobject_unref(qn);
10361a8f418SMarc-André Lureau 
10461a8f418SMarc-André Lureau     qn = qnum_from_int(value);
10561a8f418SMarc-André Lureau     g_assert(qnum_get_try_uint(qn, &val));
10661a8f418SMarc-André Lureau     g_assert_cmpuint(val, ==, value);
107cb3e7f08SMarc-André Lureau     qobject_unref(qn);
10861a8f418SMarc-André Lureau 
10961a8f418SMarc-André Lureau     /* invalid cases */
11061a8f418SMarc-André Lureau     qn = qnum_from_int(-1);
11161a8f418SMarc-André Lureau     g_assert(!qnum_get_try_uint(qn, &val));
112cb3e7f08SMarc-André Lureau     qobject_unref(qn);
11361a8f418SMarc-André Lureau 
11461a8f418SMarc-André Lureau     qn = qnum_from_uint(-1ULL);
11561a8f418SMarc-André Lureau     g_assert(!qnum_get_try_int(qn, &ival));
116cb3e7f08SMarc-André Lureau     qobject_unref(qn);
11761a8f418SMarc-André Lureau 
11861a8f418SMarc-André Lureau     qn = qnum_from_double(0.42);
11961a8f418SMarc-André Lureau     g_assert(!qnum_get_try_uint(qn, &val));
120cb3e7f08SMarc-André Lureau     qobject_unref(qn);
12161a8f418SMarc-André Lureau }
12261a8f418SMarc-André Lureau 
qobject_to_qnum_test(void)12301b2ffceSMarc-André Lureau static void qobject_to_qnum_test(void)
12401b2ffceSMarc-André Lureau {
12501b2ffceSMarc-André Lureau     QNum *qn;
12601b2ffceSMarc-André Lureau 
12701b2ffceSMarc-André Lureau     qn = qnum_from_int(0);
1287dc847ebSMax Reitz     g_assert(qobject_to(QNum, QOBJECT(qn)) == qn);
129cb3e7f08SMarc-André Lureau     qobject_unref(qn);
13001b2ffceSMarc-André Lureau 
13101b2ffceSMarc-André Lureau     qn = qnum_from_double(0);
1327dc847ebSMax Reitz     g_assert(qobject_to(QNum, QOBJECT(qn)) == qn);
133cb3e7f08SMarc-André Lureau     qobject_unref(qn);
13401b2ffceSMarc-André Lureau }
13501b2ffceSMarc-André Lureau 
qnum_to_string_test(void)13601b2ffceSMarc-André Lureau static void qnum_to_string_test(void)
13701b2ffceSMarc-André Lureau {
13801b2ffceSMarc-André Lureau     QNum *qn;
13901b2ffceSMarc-André Lureau     char *tmp;
14001b2ffceSMarc-André Lureau 
14101b2ffceSMarc-André Lureau     qn = qnum_from_int(123456);
14201b2ffceSMarc-André Lureau     tmp = qnum_to_string(qn);
14301b2ffceSMarc-André Lureau     g_assert_cmpstr(tmp, ==, "123456");
14401b2ffceSMarc-André Lureau     g_free(tmp);
145cb3e7f08SMarc-André Lureau     qobject_unref(qn);
14601b2ffceSMarc-André Lureau 
14701b2ffceSMarc-André Lureau     qn = qnum_from_double(0.42);
14801b2ffceSMarc-André Lureau     tmp = qnum_to_string(qn);
149f917eed3SMarkus Armbruster     g_assert_cmpstr(tmp, ==, "0.41999999999999998");
15001b2ffceSMarc-André Lureau     g_free(tmp);
151cb3e7f08SMarc-André Lureau     qobject_unref(qn);
1521a907691SMarkus Armbruster 
1531a907691SMarkus Armbruster     qn = qnum_from_double(2.718281828459045);
1541a907691SMarkus Armbruster     tmp = qnum_to_string(qn);
155f917eed3SMarkus Armbruster     g_assert_cmpstr(tmp, ==, "2.7182818284590451");
1561a907691SMarkus Armbruster     g_free(tmp);
1571a907691SMarkus Armbruster     qobject_unref(qn);
15801b2ffceSMarc-André Lureau }
15901b2ffceSMarc-André Lureau 
main(int argc,char ** argv)16001b2ffceSMarc-André Lureau int main(int argc, char **argv)
16101b2ffceSMarc-André Lureau {
16201b2ffceSMarc-André Lureau     g_test_init(&argc, &argv, NULL);
16301b2ffceSMarc-André Lureau 
16401b2ffceSMarc-André Lureau     g_test_add_func("/qnum/from_int", qnum_from_int_test);
16561a8f418SMarc-André Lureau     g_test_add_func("/qnum/from_uint", qnum_from_uint_test);
16601b2ffceSMarc-André Lureau     g_test_add_func("/qnum/from_double", qnum_from_double_test);
16701b2ffceSMarc-André Lureau     g_test_add_func("/qnum/from_int64", qnum_from_int64_test);
16801b2ffceSMarc-André Lureau     g_test_add_func("/qnum/get_int", qnum_get_int_test);
16961a8f418SMarc-André Lureau     g_test_add_func("/qnum/get_uint", qnum_get_uint_test);
17001b2ffceSMarc-André Lureau     g_test_add_func("/qnum/to_qnum", qobject_to_qnum_test);
17101b2ffceSMarc-André Lureau     g_test_add_func("/qnum/to_string", qnum_to_string_test);
17201b2ffceSMarc-André Lureau 
17301b2ffceSMarc-André Lureau     return g_test_run();
17401b2ffceSMarc-André Lureau }
175