bfac1972e2
As of now, the parameter is unused, but may be needed in the future. I'm adding it now so that in the future both API and ABI remain backwards compatible as long as possible. This is a backwards incompatible change.
191 lines
5.2 KiB
C
191 lines
5.2 KiB
C
/*
|
|
* Copyright (c) 2009, 2010 Petri Lehtinen <petri@digip.org>
|
|
*
|
|
* Jansson is free software; you can redistribute it and/or modify
|
|
* it under the terms of the MIT license. See LICENSE for details.
|
|
*/
|
|
|
|
#include <jansson.h>
|
|
#include "util.h"
|
|
|
|
static void test_equal_simple()
|
|
{
|
|
json_t *value1, *value2;
|
|
|
|
if(json_equal(NULL, NULL))
|
|
fail("json_equal fails for two NULLs");
|
|
|
|
value1 = json_true();
|
|
if(json_equal(value1, NULL) || json_equal(NULL, value1))
|
|
fail("json_equal fails for NULL");
|
|
|
|
/* this covers true, false and null as they are singletons */
|
|
if(!json_equal(value1, value1))
|
|
fail("identical objects are not equal");
|
|
json_decref(value1);
|
|
|
|
/* integer */
|
|
value1 = json_integer(1);
|
|
value2 = json_integer(1);
|
|
if(!value1 || !value2)
|
|
fail("unable to create integers");
|
|
if(!json_equal(value1, value2))
|
|
fail("json_equal fails for two equal integers");
|
|
json_decref(value2);
|
|
|
|
value2 = json_integer(2);
|
|
if(!value2)
|
|
fail("unable to create an integer");
|
|
if(json_equal(value1, value2))
|
|
fail("json_equal fails for two inequal integers");
|
|
|
|
json_decref(value1);
|
|
json_decref(value2);
|
|
|
|
/* real */
|
|
value1 = json_real(1.2);
|
|
value2 = json_real(1.2);
|
|
if(!value1 || !value2)
|
|
fail("unable to create reals");
|
|
if(!json_equal(value1, value2))
|
|
fail("json_equal fails for two equal reals");
|
|
json_decref(value2);
|
|
|
|
value2 = json_real(3.141592);
|
|
if(!value2)
|
|
fail("unable to create an real");
|
|
if(json_equal(value1, value2))
|
|
fail("json_equal fails for two inequal reals");
|
|
|
|
json_decref(value1);
|
|
json_decref(value2);
|
|
|
|
/* string */
|
|
value1 = json_string("foo");
|
|
value2 = json_string("foo");
|
|
if(!value1 || !value2)
|
|
fail("unable to create strings");
|
|
if(!json_equal(value1, value2))
|
|
fail("json_equal fails for two equal strings");
|
|
json_decref(value2);
|
|
|
|
value2 = json_string("bar");
|
|
if(!value2)
|
|
fail("unable to create an string");
|
|
if(json_equal(value1, value2))
|
|
fail("json_equal fails for two inequal strings");
|
|
|
|
json_decref(value1);
|
|
json_decref(value2);
|
|
}
|
|
|
|
static void test_equal_array()
|
|
{
|
|
json_t *array1, *array2;
|
|
|
|
array1 = json_array();
|
|
array2 = json_array();
|
|
if(!array1 || !array2)
|
|
fail("unable to create arrays");
|
|
|
|
if(!json_equal(array1, array2))
|
|
fail("json_equal fails for two empty arrays");
|
|
|
|
json_array_append_new(array1, json_integer(1));
|
|
json_array_append_new(array2, json_integer(1));
|
|
json_array_append_new(array1, json_string("foo"));
|
|
json_array_append_new(array2, json_string("foo"));
|
|
json_array_append_new(array1, json_integer(2));
|
|
json_array_append_new(array2, json_integer(2));
|
|
if(!json_equal(array1, array2))
|
|
fail("json_equal fails for two equal arrays");
|
|
|
|
json_array_remove(array2, 2);
|
|
if(json_equal(array1, array2))
|
|
fail("json_equal fails for two inequal arrays");
|
|
|
|
json_array_append_new(array2, json_integer(3));
|
|
if(json_equal(array1, array2))
|
|
fail("json_equal fails for two inequal arrays");
|
|
|
|
json_decref(array1);
|
|
json_decref(array2);
|
|
}
|
|
|
|
static void test_equal_object()
|
|
{
|
|
json_t *object1, *object2;
|
|
|
|
object1 = json_object();
|
|
object2 = json_object();
|
|
if(!object1 || !object2)
|
|
fail("unable to create objects");
|
|
|
|
if(!json_equal(object1, object2))
|
|
fail("json_equal fails for two empty objects");
|
|
|
|
json_object_set_new(object1, "a", json_integer(1));
|
|
json_object_set_new(object2, "a", json_integer(1));
|
|
json_object_set_new(object1, "b", json_string("foo"));
|
|
json_object_set_new(object2, "b", json_string("foo"));
|
|
json_object_set_new(object1, "c", json_integer(2));
|
|
json_object_set_new(object2, "c", json_integer(2));
|
|
if(!json_equal(object1, object2))
|
|
fail("json_equal fails for two equal objects");
|
|
|
|
json_object_del(object2, "c");
|
|
if(json_equal(object1, object2))
|
|
fail("json_equal fails for two inequal objects");
|
|
|
|
json_object_set_new(object2, "c", json_integer(3));
|
|
if(json_equal(object1, object2))
|
|
fail("json_equal fails for two inequal objects");
|
|
|
|
json_object_del(object2, "c");
|
|
json_object_set_new(object2, "d", json_integer(2));
|
|
if(json_equal(object1, object2))
|
|
fail("json_equal fails for two inequal objects");
|
|
|
|
json_decref(object1);
|
|
json_decref(object2);
|
|
}
|
|
|
|
static void test_equal_complex()
|
|
{
|
|
json_t *value1, *value2;
|
|
|
|
const char *complex_json =
|
|
"{"
|
|
" \"integer\": 1, "
|
|
" \"real\": 3.141592, "
|
|
" \"string\": \"foobar\", "
|
|
" \"true\": true, "
|
|
" \"object\": {"
|
|
" \"array-in-object\": [1,true,\"foo\",{}],"
|
|
" \"object-in-object\": {\"foo\": \"bar\"}"
|
|
" },"
|
|
" \"array\": [\"foo\", false, null, 1.234]"
|
|
"}";
|
|
|
|
value1 = json_loads(complex_json, 0, NULL);
|
|
value2 = json_loads(complex_json, 0, NULL);
|
|
if(!value1 || !value2)
|
|
fail("unable to parse JSON");
|
|
if(!json_equal(value1, value2))
|
|
fail("json_equal fails for two inequal strings");
|
|
|
|
json_decref(value1);
|
|
json_decref(value2);
|
|
|
|
/* TODO: There's no negative test case here */
|
|
}
|
|
|
|
int main()
|
|
{
|
|
test_equal_simple();
|
|
test_equal_array();
|
|
test_equal_object();
|
|
test_equal_complex();
|
|
return 0;
|
|
}
|