/*
 * QFloat unit-tests.
 *
 * Copyright (C) 2009 Red Hat Inc.
 *
 * Authors:
 *  Luiz Capitulino <lcapitulino@redhat.com>
 *
 * 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 <check.h>

#include "qfloat.h"
#include "qemu-common.h"

/*
 * Public Interface test-cases
 *
 * (with some violations to access 'private' data)
 */

START_TEST(qfloat_from_double_test)
{
    QFloat *qf;
    const double value = -42.23423;

    qf = qfloat_from_double(value);
    fail_unless(qf != NULL);
    fail_unless(qf->value == value);
    fail_unless(qf->base.refcnt == 1);
    fail_unless(qobject_type(QOBJECT(qf)) == QTYPE_QFLOAT);

    // destroy doesn't exit yet
    qemu_free(qf);
}
END_TEST

START_TEST(qfloat_destroy_test)
{
    QFloat *qf = qfloat_from_double(0.0);
    QDECREF(qf);
}
END_TEST

static Suite *qfloat_suite(void)
{
    Suite *s;
    TCase *qfloat_public_tcase;

    s = suite_create("QFloat test-suite");

    qfloat_public_tcase = tcase_create("Public Interface");
    suite_add_tcase(s, qfloat_public_tcase);
    tcase_add_test(qfloat_public_tcase, qfloat_from_double_test);
    tcase_add_test(qfloat_public_tcase, qfloat_destroy_test);

    return s;
}

int main(void)
{
    int nf;
    Suite *s;
    SRunner *sr;

    s = qfloat_suite();
    sr = srunner_create(s);

    srunner_run_all(sr, CK_NORMAL);
    nf = srunner_ntests_failed(sr);
    srunner_free(sr);

    return (nf == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
}
