/*
 * Copyright (C) 2019 Freie Universität Berlin.
 *
 * This file is subject to the terms and conditions of the GNU Lesser
 * General Public License v2.1. See the file LICENSE in the top level
 * directory for more details.
 */

/**
 * @ingroup     unittests
 * @{
 *
 * @file
 * @brief       Test scanf with floating-point numbers (scanf_float).
 *
 * @author      Juan Carrano <j.carrano@fu-berlin.de>
 *
 * @}
 */

#include <stdio.h>

#include "embUnit/embUnit.h"

#include "tests-scanf_float.h"


#define TEST_EASY(name, format, constant) static void test_ ## name (void) \
{\
    int items;\
    float x = 0;\
    items = sscanf(#constant, format, &x);\
    TEST_ASSERT_EQUAL_INT(items, 1); \
    TEST_ASSERT(x == constant##f);\
}

TEST_EASY(f, "%f", 2.71828)
TEST_EASY(e, "%e", 2.71828)
TEST_EASY(E, "%E", 2.71828)
TEST_EASY(g, "%g", 2.71828)

/* This does not seem to be supported in newlib-nano. */
/*TEST_EASY(a, "%a", 2.71828)*/

TEST_EASY(sign, "%f", -.785398)

static void test_scientific(void)
{
    int items;
    float x = 0;

    items = sscanf("-3.21e2", "%f", &x);
    TEST_ASSERT_EQUAL_INT(items, 1);
    TEST_ASSERT(x == -321.0f);
}
/* This does not seem to be supported in newlib-nano. */
/*
static void test_hexa(void)
{
    int items;
    float x = 0;

    items = sscanf("0xA.A", "%f", &x);
    TEST_ASSERT_EQUAL_INT(items, 1);
    TEST_ASSERT(x == 0xA.Ap0f);
}
*/
Test *tests_scanf_float_tests(void)
{
    EMB_UNIT_TESTFIXTURES(fixtures) {
        new_TestFixture(test_f),
        new_TestFixture(test_e),
        new_TestFixture(test_E),
        new_TestFixture(test_g),
    /*  new_TestFixture(test_a),    */
        new_TestFixture(test_sign),
        new_TestFixture(test_scientific),
    /*  new_TestFixture(test_hexa), */
    };

    EMB_UNIT_TESTCALLER(scanf_float_tests,
                        NULL, NULL,
                        fixtures);

    return (Test *)&scanf_float_tests;
}

void tests_scanf_float(void)
{
    TESTS_RUN(tests_scanf_float_tests());
}
