mirror of https://github.com/GOSTSec/sgminer
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
318 lines
8.2 KiB
318 lines
8.2 KiB
/* |
|
* Copyright (c) 2009-2013 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 <string.h> |
|
#include <jansson.h> |
|
#include "util.h" |
|
|
|
static void test_copy_simple(void) |
|
{ |
|
json_t *value, *copy; |
|
|
|
if(json_copy(NULL)) |
|
fail("copying NULL doesn't return NULL"); |
|
|
|
/* true */ |
|
value = json_true(); |
|
copy = json_copy(value); |
|
if(value != copy) |
|
fail("copying true failed"); |
|
json_decref(value); |
|
json_decref(copy); |
|
|
|
/* false */ |
|
value = json_false(); |
|
copy = json_copy(value); |
|
if(value != copy) |
|
fail("copying false failed"); |
|
json_decref(value); |
|
json_decref(copy); |
|
|
|
/* null */ |
|
value = json_null(); |
|
copy = json_copy(value); |
|
if(value != copy) |
|
fail("copying null failed"); |
|
json_decref(value); |
|
json_decref(copy); |
|
|
|
/* string */ |
|
value = json_string("foo"); |
|
if(!value) |
|
fail("unable to create a string"); |
|
copy = json_copy(value); |
|
if(!copy) |
|
fail("unable to copy a string"); |
|
if(copy == value) |
|
fail("copying a string doesn't copy"); |
|
if(!json_equal(copy, value)) |
|
fail("copying a string produces an inequal copy"); |
|
if(value->refcount != 1 || copy->refcount != 1) |
|
fail("invalid refcounts"); |
|
json_decref(value); |
|
json_decref(copy); |
|
|
|
/* integer */ |
|
value = json_integer(543); |
|
if(!value) |
|
fail("unable to create an integer"); |
|
copy = json_copy(value); |
|
if(!copy) |
|
fail("unable to copy an integer"); |
|
if(copy == value) |
|
fail("copying an integer doesn't copy"); |
|
if(!json_equal(copy, value)) |
|
fail("copying an integer produces an inequal copy"); |
|
if(value->refcount != 1 || copy->refcount != 1) |
|
fail("invalid refcounts"); |
|
json_decref(value); |
|
json_decref(copy); |
|
|
|
/* real */ |
|
value = json_real(123e9); |
|
if(!value) |
|
fail("unable to create a real"); |
|
copy = json_copy(value); |
|
if(!copy) |
|
fail("unable to copy a real"); |
|
if(copy == value) |
|
fail("copying a real doesn't copy"); |
|
if(!json_equal(copy, value)) |
|
fail("copying a real produces an inequal copy"); |
|
if(value->refcount != 1 || copy->refcount != 1) |
|
fail("invalid refcounts"); |
|
json_decref(value); |
|
json_decref(copy); |
|
} |
|
|
|
static void test_deep_copy_simple(void) |
|
{ |
|
json_t *value, *copy; |
|
|
|
if(json_deep_copy(NULL)) |
|
fail("deep copying NULL doesn't return NULL"); |
|
|
|
/* true */ |
|
value = json_true(); |
|
copy = json_deep_copy(value); |
|
if(value != copy) |
|
fail("deep copying true failed"); |
|
json_decref(value); |
|
json_decref(copy); |
|
|
|
/* false */ |
|
value = json_false(); |
|
copy = json_deep_copy(value); |
|
if(value != copy) |
|
fail("deep copying false failed"); |
|
json_decref(value); |
|
json_decref(copy); |
|
|
|
/* null */ |
|
value = json_null(); |
|
copy = json_deep_copy(value); |
|
if(value != copy) |
|
fail("deep copying null failed"); |
|
json_decref(value); |
|
json_decref(copy); |
|
|
|
/* string */ |
|
value = json_string("foo"); |
|
if(!value) |
|
fail("unable to create a string"); |
|
copy = json_deep_copy(value); |
|
if(!copy) |
|
fail("unable to deep copy a string"); |
|
if(copy == value) |
|
fail("deep copying a string doesn't copy"); |
|
if(!json_equal(copy, value)) |
|
fail("deep copying a string produces an inequal copy"); |
|
if(value->refcount != 1 || copy->refcount != 1) |
|
fail("invalid refcounts"); |
|
json_decref(value); |
|
json_decref(copy); |
|
|
|
/* integer */ |
|
value = json_integer(543); |
|
if(!value) |
|
fail("unable to create an integer"); |
|
copy = json_deep_copy(value); |
|
if(!copy) |
|
fail("unable to deep copy an integer"); |
|
if(copy == value) |
|
fail("deep copying an integer doesn't copy"); |
|
if(!json_equal(copy, value)) |
|
fail("deep copying an integer produces an inequal copy"); |
|
if(value->refcount != 1 || copy->refcount != 1) |
|
fail("invalid refcounts"); |
|
json_decref(value); |
|
json_decref(copy); |
|
|
|
/* real */ |
|
value = json_real(123e9); |
|
if(!value) |
|
fail("unable to create a real"); |
|
copy = json_deep_copy(value); |
|
if(!copy) |
|
fail("unable to deep copy a real"); |
|
if(copy == value) |
|
fail("deep copying a real doesn't copy"); |
|
if(!json_equal(copy, value)) |
|
fail("deep copying a real produces an inequal copy"); |
|
if(value->refcount != 1 || copy->refcount != 1) |
|
fail("invalid refcounts"); |
|
json_decref(value); |
|
json_decref(copy); |
|
} |
|
|
|
static void test_copy_array(void) |
|
{ |
|
const char *json_array_text = "[1, \"foo\", 3.141592, {\"foo\": \"bar\"}]"; |
|
|
|
json_t *array, *copy; |
|
size_t i; |
|
|
|
array = json_loads(json_array_text, 0, NULL); |
|
if(!array) |
|
fail("unable to parse an array"); |
|
|
|
copy = json_copy(array); |
|
if(!copy) |
|
fail("unable to copy an array"); |
|
if(copy == array) |
|
fail("copying an array doesn't copy"); |
|
if(!json_equal(copy, array)) |
|
fail("copying an array produces an inequal copy"); |
|
|
|
for(i = 0; i < json_array_size(copy); i++) |
|
{ |
|
if(json_array_get(array, i) != json_array_get(copy, i)) |
|
fail("copying an array modifies its elements"); |
|
} |
|
|
|
json_decref(array); |
|
json_decref(copy); |
|
} |
|
|
|
static void test_deep_copy_array(void) |
|
{ |
|
const char *json_array_text = "[1, \"foo\", 3.141592, {\"foo\": \"bar\"}]"; |
|
|
|
json_t *array, *copy; |
|
size_t i; |
|
|
|
array = json_loads(json_array_text, 0, NULL); |
|
if(!array) |
|
fail("unable to parse an array"); |
|
|
|
copy = json_deep_copy(array); |
|
if(!copy) |
|
fail("unable to deep copy an array"); |
|
if(copy == array) |
|
fail("deep copying an array doesn't copy"); |
|
if(!json_equal(copy, array)) |
|
fail("deep copying an array produces an inequal copy"); |
|
|
|
for(i = 0; i < json_array_size(copy); i++) |
|
{ |
|
if(json_array_get(array, i) == json_array_get(copy, i)) |
|
fail("deep copying an array doesn't copy its elements"); |
|
} |
|
|
|
json_decref(array); |
|
json_decref(copy); |
|
} |
|
|
|
static void test_copy_object(void) |
|
{ |
|
const char *json_object_text = |
|
"{\"foo\": \"bar\", \"a\": 1, \"b\": 3.141592, \"c\": [1,2,3,4]}"; |
|
|
|
json_t *object, *copy; |
|
void *iter; |
|
|
|
object = json_loads(json_object_text, 0, NULL); |
|
if(!object) |
|
fail("unable to parse an object"); |
|
|
|
copy = json_copy(object); |
|
if(!copy) |
|
fail("unable to copy an object"); |
|
if(copy == object) |
|
fail("copying an object doesn't copy"); |
|
if(!json_equal(copy, object)) |
|
fail("copying an object produces an inequal copy"); |
|
|
|
iter = json_object_iter(object); |
|
while(iter) |
|
{ |
|
const char *key; |
|
json_t *value1, *value2; |
|
|
|
key = json_object_iter_key(iter); |
|
value1 = json_object_iter_value(iter); |
|
value2 = json_object_get(copy, key); |
|
|
|
if(value1 != value2) |
|
fail("deep copying an object modifies its items"); |
|
|
|
iter = json_object_iter_next(object, iter); |
|
} |
|
|
|
json_decref(object); |
|
json_decref(copy); |
|
} |
|
|
|
static void test_deep_copy_object(void) |
|
{ |
|
const char *json_object_text = |
|
"{\"foo\": \"bar\", \"a\": 1, \"b\": 3.141592, \"c\": [1,2,3,4]}"; |
|
|
|
json_t *object, *copy; |
|
void *iter; |
|
|
|
object = json_loads(json_object_text, 0, NULL); |
|
if(!object) |
|
fail("unable to parse an object"); |
|
|
|
copy = json_deep_copy(object); |
|
if(!copy) |
|
fail("unable to deep copy an object"); |
|
if(copy == object) |
|
fail("deep copying an object doesn't copy"); |
|
if(!json_equal(copy, object)) |
|
fail("deep copying an object produces an inequal copy"); |
|
|
|
iter = json_object_iter(object); |
|
while(iter) |
|
{ |
|
const char *key; |
|
json_t *value1, *value2; |
|
|
|
key = json_object_iter_key(iter); |
|
value1 = json_object_iter_value(iter); |
|
value2 = json_object_get(copy, key); |
|
|
|
if(value1 == value2) |
|
fail("deep copying an object doesn't copy its items"); |
|
|
|
iter = json_object_iter_next(object, iter); |
|
} |
|
|
|
json_decref(object); |
|
json_decref(copy); |
|
} |
|
|
|
static void run_tests() |
|
{ |
|
test_copy_simple(); |
|
test_deep_copy_simple(); |
|
test_copy_array(); |
|
test_deep_copy_array(); |
|
test_copy_object(); |
|
test_deep_copy_object(); |
|
}
|
|
|