Commit 4fe84f20 authored by Emmanuele Bassi's avatar Emmanuele Bassi 👣

Merge branch 'issue-28' into 'master'

Use fuzzy comparisons for floating point values

Closes #27 and #28

See merge request GNOME/json-glib!2
parents da70483c 675e2750
Pipeline #672 passed with stage
in 2 minutes and 46 seconds
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <glib.h>
#include <json-glib/json-glib.h>
#include "json-test-utils.h"
static void
test_empty_array (void)
......@@ -37,7 +32,7 @@ test_add_element (void)
json_array_add_double_element (array, 3.14);
g_assert_cmpint (json_array_get_length (array), ==, 3);
g_assert_cmpfloat (json_array_get_double_element (array, 2), ==, 3.14);
json_assert_fuzzy_equals (json_array_get_double_element (array, 2), 3.14, 0.001);
json_array_add_boolean_element (array, TRUE);
g_assert_cmpint (json_array_get_length (array), ==, 4);
......
#include <string.h>
#include <math.h>
#include <float.h>
#include <glib.h>
#include <json-glib/json-glib.h>
#define json_fuzzy_equals(n1,n2,epsilon) \
(((n1) > (n2) ? ((n1) - (n2)) : ((n2) - (n1))) < (epsilon))
#define json_assert_fuzzy_equals(n1,n2,epsilon) \
G_STMT_START { \
double __n1 = (n1), __n2 = (n2), __epsilon = (epsilon); \
if (json_fuzzy_equals (__n1, __n2, __epsilon)) ; else { \
g_assertion_message_cmpnum (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
#n1 " == " #n2 " (+/- " #epsilon ")", \
__n1, "==", __n2, 'f'); \
} \
} G_STMT_END
#define json_assert_almost_equals(n1,n2) \
json_assert_fuzzy_equals (n1, n2, DBL_EPSILON)
#include <glib.h>
#include <json-glib/json-glib.h>
#include <string.h>
#include "json-test-utils.h"
static void
test_init_int (void)
......@@ -19,7 +17,7 @@ test_init_double (void)
JsonNode *node = json_node_new (JSON_NODE_VALUE);
json_node_set_double (node, 3.14159);
g_assert_cmpfloat (json_node_get_double (node), ==, 3.14159);
json_assert_fuzzy_equals (json_node_get_double (node), 3.14159, 0.00001);
json_node_free (node);
}
......@@ -119,13 +117,13 @@ test_get_int (void)
json_node_set_int (node, 0);
g_assert_cmpint (json_node_get_int (node), ==, 0);
g_assert_cmpfloat (json_node_get_double (node), ==, 0.0);
json_assert_almost_equals (json_node_get_double (node), 0.0);
g_assert (!json_node_get_boolean (node));
g_assert (!json_node_is_null (node));
json_node_set_int (node, 42);
g_assert_cmpint (json_node_get_int (node), ==, 42);
g_assert_cmpfloat (json_node_get_double (node), ==, 42.0);
json_assert_almost_equals (json_node_get_double (node), 42.0);
g_assert (json_node_get_boolean (node));
g_assert (!json_node_is_null (node));
......@@ -138,7 +136,7 @@ test_get_double (void)
JsonNode *node = json_node_new (JSON_NODE_VALUE);
json_node_set_double (node, 3.14);
g_assert_cmpfloat (json_node_get_double (node), ==, 3.14);
json_assert_fuzzy_equals (json_node_get_double (node), 3.14, 0.001);
g_assert_cmpint (json_node_get_int (node), ==, 3);
g_assert (json_node_get_boolean (node));
......@@ -232,9 +230,9 @@ test_gvalue_autopromotion (void)
g_print ("Expecting a gdouble, got a %s\n", g_type_name (G_VALUE_TYPE (&check)));
g_assert_cmpint (G_VALUE_TYPE (&check), ==, G_TYPE_DOUBLE);
g_assert_cmpfloat ((float) g_value_get_double (&check), ==, 3.14159f);
json_assert_fuzzy_equals (g_value_get_double (&check), 3.14159, 0.00001);
g_assert_cmpint (G_VALUE_TYPE (&value), !=, G_VALUE_TYPE (&check));
g_assert_cmpfloat ((gdouble) g_value_get_float (&value), ==, g_value_get_double (&check));
json_assert_almost_equals (g_value_get_float (&value), g_value_get_double (&check));
g_value_unset (&value);
g_value_unset (&check);
......
#include "config.h"
#include "json-test-utils.h"
#include <stdlib.h>
#include <stdio.h>
#include <glib.h>
#include <json-glib/json-glib.h>
static const gchar *test_empty_string = "";
static const gchar *test_empty_array_string = "[ ]";
......@@ -38,13 +32,13 @@ verify_string_value (JsonNode *node)
static void
verify_double_value (JsonNode *node)
{
g_assert_cmpfloat (10.2e3, ==, json_node_get_double (node));
json_assert_fuzzy_equals (10.2e3, json_node_get_double (node), 0.1);
}
static void
verify_negative_double_value (JsonNode *node)
{
g_assert_cmpfloat (-3.14, ==, json_node_get_double (node));
json_assert_fuzzy_equals (-3.14, json_node_get_double (node), 0.01);
}
static const struct {
......
#include <stdlib.h>
#include <stdio.h>
#include <glib.h>
#include <json-glib/json-glib.h>
#include "json-test-utils.h"
static const gchar *test_base_array_data =
"[ 0, true, null, \"foo\", 3.14, [ false ], { \"bar\" : 42 } ]";
......@@ -78,7 +73,7 @@ test_base_object (void)
g_assert (json_reader_get_error (reader) == NULL);
json_reader_read_member (reader, "double");
g_assert_cmpfloat (json_reader_get_double_value (reader), ==, 42.47);
json_assert_fuzzy_equals (json_reader_get_double_value (reader), 42.47, 0.01);
json_reader_end_element (reader);
g_object_unref (reader);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment