2017-02-20 00:25:19 +00:00
|
|
|
/*
|
|
|
|
Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
|
|
|
|
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
|
|
in the Software without restriction, including without limitation the rights
|
|
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
|
|
furnished to do so, subject to the following conditions:
|
|
|
|
|
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
|
|
all copies or substantial portions of the Software.
|
|
|
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
|
THE SOFTWARE.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "unity/examples/unity_config.h"
|
|
|
|
#include "unity/src/unity.h"
|
|
|
|
#include "common.h"
|
|
|
|
|
|
|
|
static void assert_print_number(const char *expected, double input)
|
|
|
|
{
|
|
|
|
unsigned char printed[1024];
|
|
|
|
cJSON item[1];
|
|
|
|
printbuffer buffer;
|
|
|
|
buffer.buffer = printed;
|
|
|
|
buffer.length = sizeof(printed);
|
|
|
|
buffer.offset = 0;
|
|
|
|
buffer.noalloc = true;
|
|
|
|
|
|
|
|
memset(item, 0, sizeof(item));
|
|
|
|
cJSON_SetNumberValue(item, input);
|
|
|
|
|
2017-03-02 23:26:58 +00:00
|
|
|
TEST_ASSERT_TRUE_MESSAGE(print_number(item, &buffer, &global_hooks), "Failed to print number.");
|
2017-02-20 00:25:19 +00:00
|
|
|
TEST_ASSERT_EQUAL_STRING_MESSAGE(expected, buffer.buffer, "Printed number is not as expected.");
|
|
|
|
}
|
|
|
|
|
|
|
|
static void print_number_should_print_zero(void)
|
|
|
|
{
|
|
|
|
assert_print_number("0", 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void print_number_should_print_negative_integers(void)
|
|
|
|
{
|
|
|
|
assert_print_number("-1", -1);
|
|
|
|
assert_print_number("-32768", -32768);
|
2017-03-18 12:22:08 +00:00
|
|
|
assert_print_number("-2147483648", -2147483648.0);
|
2017-02-20 00:25:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void print_number_should_print_positive_integers(void)
|
|
|
|
{
|
|
|
|
assert_print_number("1", 1);
|
|
|
|
assert_print_number("32767", 32767);
|
|
|
|
assert_print_number("2147483647", 2147483647);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void print_number_should_print_positive_reals(void)
|
|
|
|
{
|
2017-03-01 12:20:14 +00:00
|
|
|
assert_print_number("0.123", 0.123);
|
2017-02-20 00:25:19 +00:00
|
|
|
assert_print_number("1.000000e-09", 10e-10);
|
|
|
|
assert_print_number("1000000000000", 10e11);
|
|
|
|
assert_print_number("1.230000e+129", 123e+127);
|
|
|
|
assert_print_number("0", 123e-128); /* TODO: Maybe this shouldn't be 0 */
|
|
|
|
}
|
|
|
|
|
|
|
|
static void print_number_should_print_negative_reals(void)
|
|
|
|
{
|
2017-03-01 12:20:14 +00:00
|
|
|
assert_print_number("-0.0123", -0.0123);
|
2017-02-20 00:25:19 +00:00
|
|
|
assert_print_number("-1.000000e-09", -10e-10);
|
|
|
|
assert_print_number("-1000000000000000000000", -10e20);
|
|
|
|
assert_print_number("-1.230000e+129", -123e+127);
|
|
|
|
assert_print_number("-1.230000e-126", -123e-128);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void print_number_should_print_non_number(void)
|
|
|
|
{
|
|
|
|
TEST_IGNORE();
|
|
|
|
/* FIXME: Cannot test this easily in C89! */
|
|
|
|
/* assert_print_number("null", NaN); */
|
|
|
|
/* assert_print_number("null", INFTY); */
|
|
|
|
/* assert_print_number("null", -INFTY); */
|
|
|
|
}
|
|
|
|
|
2017-03-01 17:29:01 +00:00
|
|
|
static void trim_trailing_zeroes_should_trim_trailing_zeroes(void)
|
|
|
|
{
|
|
|
|
printbuffer buffer;
|
|
|
|
unsigned char number[100];
|
|
|
|
buffer.length = sizeof(number);
|
|
|
|
buffer.buffer = number;
|
|
|
|
|
|
|
|
strcpy((char*)number, "10.00");
|
|
|
|
buffer.offset = sizeof("10.00") - 1;
|
2017-03-02 23:26:58 +00:00
|
|
|
TEST_ASSERT_TRUE(trim_trailing_zeroes(&buffer));
|
|
|
|
TEST_ASSERT_EQUAL_UINT8('\0', buffer.buffer[buffer.offset]);
|
2017-03-01 17:29:01 +00:00
|
|
|
TEST_ASSERT_EQUAL_STRING("10", number);
|
|
|
|
TEST_ASSERT_EQUAL_UINT(sizeof("10") - 1, buffer.offset);
|
|
|
|
}
|
|
|
|
|
2017-02-20 00:25:19 +00:00
|
|
|
int main(void)
|
|
|
|
{
|
|
|
|
/* initialize cJSON item */
|
|
|
|
UNITY_BEGIN();
|
|
|
|
|
|
|
|
RUN_TEST(print_number_should_print_zero);
|
|
|
|
RUN_TEST(print_number_should_print_negative_integers);
|
|
|
|
RUN_TEST(print_number_should_print_positive_integers);
|
|
|
|
RUN_TEST(print_number_should_print_positive_reals);
|
|
|
|
RUN_TEST(print_number_should_print_negative_reals);
|
|
|
|
RUN_TEST(print_number_should_print_non_number);
|
2017-03-01 17:29:01 +00:00
|
|
|
RUN_TEST(trim_trailing_zeroes_should_trim_trailing_zeroes);
|
2017-02-20 00:25:19 +00:00
|
|
|
|
|
|
|
return UNITY_END();
|
|
|
|
}
|