2
0

check-qnum.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. /*
  2. * QNum unit-tests.
  3. *
  4. * Copyright (C) 2009 Red Hat Inc.
  5. * Copyright IBM, Corp. 2009
  6. *
  7. * Authors:
  8. * Luiz Capitulino <lcapitulino@redhat.com>
  9. * Anthony Liguori <aliguori@us.ibm.com>
  10. *
  11. * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
  12. * See the COPYING.LIB file in the top-level directory.
  13. */
  14. #include "qemu/osdep.h"
  15. #include "qapi/qmp/qnum.h"
  16. #include "qemu-common.h"
  17. /*
  18. * Public Interface test-cases
  19. *
  20. * (with some violations to access 'private' data)
  21. */
  22. static void qnum_from_int_test(void)
  23. {
  24. QNum *qn;
  25. const int value = -42;
  26. qn = qnum_from_int(value);
  27. g_assert(qn != NULL);
  28. g_assert_cmpint(qn->kind, ==, QNUM_I64);
  29. g_assert_cmpint(qn->u.i64, ==, value);
  30. g_assert_cmpint(qn->base.refcnt, ==, 1);
  31. g_assert_cmpint(qobject_type(QOBJECT(qn)), ==, QTYPE_QNUM);
  32. qobject_unref(qn);
  33. }
  34. static void qnum_from_uint_test(void)
  35. {
  36. QNum *qn;
  37. const uint64_t value = UINT64_MAX;
  38. qn = qnum_from_uint(value);
  39. g_assert(qn != NULL);
  40. g_assert_cmpint(qn->kind, ==, QNUM_U64);
  41. g_assert(qn->u.u64 == value);
  42. g_assert(qn->base.refcnt == 1);
  43. g_assert(qobject_type(QOBJECT(qn)) == QTYPE_QNUM);
  44. qobject_unref(qn);
  45. }
  46. static void qnum_from_double_test(void)
  47. {
  48. QNum *qn;
  49. const double value = -42.23423;
  50. qn = qnum_from_double(value);
  51. g_assert(qn != NULL);
  52. g_assert_cmpint(qn->kind, ==, QNUM_DOUBLE);
  53. g_assert_cmpfloat(qn->u.dbl, ==, value);
  54. g_assert_cmpint(qn->base.refcnt, ==, 1);
  55. g_assert_cmpint(qobject_type(QOBJECT(qn)), ==, QTYPE_QNUM);
  56. qobject_unref(qn);
  57. }
  58. static void qnum_from_int64_test(void)
  59. {
  60. QNum *qn;
  61. const int64_t value = 0x1234567890abcdefLL;
  62. qn = qnum_from_int(value);
  63. g_assert_cmpint((int64_t) qn->u.i64, ==, value);
  64. qobject_unref(qn);
  65. }
  66. static void qnum_get_int_test(void)
  67. {
  68. QNum *qn;
  69. const int value = 123456;
  70. qn = qnum_from_int(value);
  71. g_assert_cmpint(qnum_get_int(qn), ==, value);
  72. qobject_unref(qn);
  73. }
  74. static void qnum_get_uint_test(void)
  75. {
  76. QNum *qn;
  77. const int value = 123456;
  78. uint64_t val;
  79. int64_t ival;
  80. qn = qnum_from_uint(value);
  81. g_assert(qnum_get_try_uint(qn, &val));
  82. g_assert_cmpuint(val, ==, value);
  83. qobject_unref(qn);
  84. qn = qnum_from_int(value);
  85. g_assert(qnum_get_try_uint(qn, &val));
  86. g_assert_cmpuint(val, ==, value);
  87. qobject_unref(qn);
  88. /* invalid cases */
  89. qn = qnum_from_int(-1);
  90. g_assert(!qnum_get_try_uint(qn, &val));
  91. qobject_unref(qn);
  92. qn = qnum_from_uint(-1ULL);
  93. g_assert(!qnum_get_try_int(qn, &ival));
  94. qobject_unref(qn);
  95. qn = qnum_from_double(0.42);
  96. g_assert(!qnum_get_try_uint(qn, &val));
  97. qobject_unref(qn);
  98. }
  99. static void qobject_to_qnum_test(void)
  100. {
  101. QNum *qn;
  102. qn = qnum_from_int(0);
  103. g_assert(qobject_to(QNum, QOBJECT(qn)) == qn);
  104. qobject_unref(qn);
  105. qn = qnum_from_double(0);
  106. g_assert(qobject_to(QNum, QOBJECT(qn)) == qn);
  107. qobject_unref(qn);
  108. }
  109. static void qnum_to_string_test(void)
  110. {
  111. QNum *qn;
  112. char *tmp;
  113. qn = qnum_from_int(123456);
  114. tmp = qnum_to_string(qn);
  115. g_assert_cmpstr(tmp, ==, "123456");
  116. g_free(tmp);
  117. qobject_unref(qn);
  118. qn = qnum_from_double(0.42);
  119. tmp = qnum_to_string(qn);
  120. g_assert_cmpstr(tmp, ==, "0.42");
  121. g_free(tmp);
  122. qobject_unref(qn);
  123. }
  124. int main(int argc, char **argv)
  125. {
  126. g_test_init(&argc, &argv, NULL);
  127. g_test_add_func("/qnum/from_int", qnum_from_int_test);
  128. g_test_add_func("/qnum/from_uint", qnum_from_uint_test);
  129. g_test_add_func("/qnum/from_double", qnum_from_double_test);
  130. g_test_add_func("/qnum/from_int64", qnum_from_int64_test);
  131. g_test_add_func("/qnum/get_int", qnum_get_int_test);
  132. g_test_add_func("/qnum/get_uint", qnum_get_uint_test);
  133. g_test_add_func("/qnum/to_qnum", qobject_to_qnum_test);
  134. g_test_add_func("/qnum/to_string", qnum_to_string_test);
  135. return g_test_run();
  136. }