Max Bruckner 7 лет назад
Родитель
Сommit
deca87b071
2 измененных файлов с 24 добавлено и 2 удалено
  1. 4 2
      cJSON.c
  2. 20 0
      tests/misc_tests.c

+ 4 - 2
cJSON.c

@@ -471,6 +471,9 @@ static void update_offset(printbuffer * const buffer)
     buffer->offset += strlen((const char*)buffer_pointer);
 }
 
+#define is_nan(number) (number != number)
+#define is_infinity(number) (!is_nan(number) && (number * 0) != 0)
+
 /* Render the number nicely from the given item into a string. */
 static cJSON_bool print_number(const cJSON * const item, printbuffer * const output_buffer)
 {
@@ -487,8 +490,7 @@ static cJSON_bool print_number(const cJSON * const item, printbuffer * const out
         return false;
     }
 
-    /* This checks for NaN and Infinity */
-    if ((d * 0) != 0)
+    if (is_nan(d) || is_infinity(d))
     {
         length = sprintf((char*)number_buffer, "null");
     }

+ 20 - 0
tests/misc_tests.c

@@ -508,6 +508,24 @@ static void cjson_create_array_reference_should_create_an_array_reference(void)
     cJSON_Delete(number_reference);
 }
 
+static void is_nan_should_detect_nan(void)
+{
+    double nan = 0.0/0.0;
+
+    TEST_ASSERT_TRUE(is_nan(nan));
+    TEST_ASSERT_FALSE(is_nan(1));
+}
+
+static void is_infinity_should_detect_infinity(void)
+{
+    double negative_infinity = -1.0/0.0;
+    double positive_infinity = 1.0/0.0;
+
+    TEST_ASSERT_TRUE(is_infinity(negative_infinity));
+    TEST_ASSERT_TRUE(is_infinity(positive_infinity));
+    TEST_ASSERT_FALSE(is_infinity(1));
+}
+
 int main(void)
 {
     UNITY_BEGIN();
@@ -530,6 +548,8 @@ int main(void)
     RUN_TEST(cjson_create_string_reference_should_create_a_string_reference);
     RUN_TEST(cjson_create_object_reference_should_create_an_object_reference);
     RUN_TEST(cjson_create_array_reference_should_create_an_array_reference);
+    RUN_TEST(is_nan_should_detect_nan);
+    RUN_TEST(is_infinity_should_detect_infinity);
 
     return UNITY_END();
 }