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