2012-08-28 18:09:43 +01:00
|
|
|
#include <assert.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include "jv.h"
|
|
|
|
|
|
|
|
int main(){
|
|
|
|
/// Arrays and numbers
|
|
|
|
{
|
|
|
|
jv a = jv_array();
|
|
|
|
assert(jv_get_kind(a) == JV_KIND_ARRAY);
|
|
|
|
assert(jv_array_length(jv_copy(a)) == 0);
|
|
|
|
assert(jv_array_length(jv_copy(a)) == 0);
|
|
|
|
|
|
|
|
a = jv_array_append(a, jv_number(42));
|
|
|
|
assert(jv_array_length(jv_copy(a)) == 1);
|
|
|
|
assert(jv_number_value(jv_array_get(jv_copy(a), 0)) == 42);
|
|
|
|
|
|
|
|
jv a2 = jv_array_append(jv_array(), jv_number(42));
|
|
|
|
assert(jv_equal(jv_copy(a), jv_copy(a)));
|
|
|
|
assert(jv_equal(jv_copy(a2), jv_copy(a2)));
|
|
|
|
assert(jv_equal(jv_copy(a), jv_copy(a2)));
|
|
|
|
assert(jv_equal(jv_copy(a2), jv_copy(a)));
|
|
|
|
jv_free(a2);
|
|
|
|
|
|
|
|
a2 = jv_array_append(jv_array(), jv_number(19));
|
|
|
|
assert(!jv_equal(jv_copy(a), jv_copy(a2)));
|
|
|
|
assert(!jv_equal(jv_copy(a2), jv_copy(a)));
|
|
|
|
jv_free(a2);
|
|
|
|
|
|
|
|
|
|
|
|
assert(a.val.complex.ptr->count == 1);
|
|
|
|
a = jv_array_append(a, jv_copy(a));
|
|
|
|
assert(a.val.complex.ptr->count == 1);
|
|
|
|
|
|
|
|
assert(jv_array_length(jv_copy(a)) == 2);
|
|
|
|
assert(jv_number_value(jv_array_get(jv_copy(a), 0)) == 42);
|
|
|
|
|
|
|
|
for (int i=0; i<10; i++) {
|
|
|
|
jv subarray = jv_array_get(jv_copy(a), 1);
|
|
|
|
assert(jv_get_kind(subarray) == JV_KIND_ARRAY);
|
|
|
|
assert(jv_array_length(jv_copy(subarray)) == 1);
|
|
|
|
assert(jv_number_value(jv_array_get(jv_copy(subarray), 0)) == 42);
|
|
|
|
jv_free(subarray);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
jv subarray = jv_array_get(jv_copy(a), 1);
|
|
|
|
assert(jv_get_kind(subarray) == JV_KIND_ARRAY);
|
|
|
|
assert(jv_array_length(jv_copy(subarray)) == 1);
|
|
|
|
assert(jv_number_value(jv_array_get(jv_copy(subarray), 0)) == 42);
|
|
|
|
|
|
|
|
jv sub2 = jv_copy(subarray);
|
|
|
|
sub2 = jv_array_append(sub2, jv_number(19));
|
|
|
|
|
|
|
|
assert(jv_get_kind(sub2) == JV_KIND_ARRAY);
|
|
|
|
assert(jv_array_length(jv_copy(sub2)) == 2);
|
|
|
|
assert(jv_number_value(jv_array_get(jv_copy(sub2), 0)) == 42);
|
|
|
|
assert(jv_number_value(jv_array_get(jv_copy(sub2), 1)) == 19);
|
|
|
|
|
|
|
|
assert(jv_get_kind(subarray) == JV_KIND_ARRAY);
|
|
|
|
assert(jv_array_length(jv_copy(subarray)) == 1);
|
|
|
|
assert(jv_number_value(jv_array_get(jv_copy(subarray), 0)) == 42);
|
|
|
|
|
|
|
|
jv_free(subarray);
|
|
|
|
|
|
|
|
void* before = sub2.val.complex.ptr;
|
|
|
|
sub2 = jv_array_append(sub2, jv_number(200));
|
|
|
|
void* after = sub2.val.complex.ptr;
|
|
|
|
assert(before == after);
|
|
|
|
jv_free(sub2);
|
|
|
|
|
|
|
|
jv a3 = jv_array_append(jv_copy(a), jv_number(19));
|
|
|
|
assert(jv_array_length(jv_copy(a3)) == 3);
|
|
|
|
assert(jv_number_value(jv_array_get(jv_copy(a3), 0)) == 42);
|
|
|
|
assert(jv_array_length(jv_array_get(jv_copy(a3), 1)) == 1);
|
|
|
|
assert(jv_number_value(jv_array_get(jv_copy(a3), 2)) == 19);
|
|
|
|
jv_free(a3);
|
|
|
|
|
|
|
|
|
|
|
|
assert(jv_array_length(jv_copy(a)) == 2);
|
|
|
|
assert(jv_number_value(jv_array_get(jv_copy(a), 0)) == 42);
|
|
|
|
assert(jv_array_length(jv_array_get(jv_copy(a), 1)) == 1);
|
|
|
|
|
|
|
|
|
|
|
|
jv_dump(jv_copy(a)); printf("\n");
|
|
|
|
jv_free(a);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// Strings
|
|
|
|
{
|
|
|
|
assert(jv_equal(jv_string("foo"), jv_string_sized("foo", 3)));
|
|
|
|
char nasty[] = "foo\0";
|
|
|
|
jv shortstr = jv_string(nasty), longstr = jv_string_sized(nasty, sizeof(nasty));
|
|
|
|
assert(jv_string_length(shortstr) == strlen(nasty));
|
|
|
|
assert(jv_string_length(longstr) == sizeof(nasty));
|
|
|
|
|
|
|
|
|
|
|
|
char a1s[] = "hello", a2s[] = "hello", bs[] = "goodbye";
|
|
|
|
jv a1 = jv_string(a1s), a2 = jv_string(a2s), b = jv_string(bs);
|
|
|
|
assert(jv_equal(jv_copy(a1), jv_copy(a2)));
|
|
|
|
assert(jv_equal(jv_copy(a2), jv_copy(a1)));
|
|
|
|
assert(!jv_equal(jv_copy(a1), jv_copy(b)));
|
|
|
|
|
|
|
|
assert(jv_string_hash(jv_copy(a1)) == jv_string_hash(jv_copy(a1)));
|
|
|
|
assert(jv_string_hash(jv_copy(a1)) == jv_string_hash(jv_copy(a2)));
|
|
|
|
assert(jv_string_hash(jv_copy(b)) != jv_string_hash(jv_copy(a1)));
|
|
|
|
jv_free(a1);
|
|
|
|
jv_free(a2);
|
|
|
|
jv_free(b);
|
2012-09-10 16:01:56 +01:00
|
|
|
|
|
|
|
assert(jv_equal(jv_string("hello42!"), jv_string_fmt("hello%d%s", 42, "!")));
|
|
|
|
char big[20000];
|
|
|
|
for (int i=0; i<sizeof(big); i++) big[i] = 'a';
|
|
|
|
big[sizeof(big)-1] = 0;
|
|
|
|
jv str = jv_string_fmt("%s", big);
|
|
|
|
assert(jv_string_length(jv_copy(str)) == sizeof(big) - 1);
|
|
|
|
assert(!strcmp(big, jv_string_value(str)));
|
|
|
|
jv_free(str);
|
2012-08-28 18:09:43 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Objects
|
|
|
|
{
|
|
|
|
jv o1 = jv_object();
|
|
|
|
o1 = jv_object_set(o1, jv_string("foo"), jv_number(42));
|
|
|
|
o1 = jv_object_set(o1, jv_string("bar"), jv_number(24));
|
|
|
|
assert(jv_number_value(jv_object_get(jv_copy(o1), jv_string("foo"))) == 42);
|
|
|
|
assert(jv_number_value(jv_object_get(jv_copy(o1), jv_string("bar"))) == 24);
|
|
|
|
|
|
|
|
jv o2 = jv_object_set(jv_copy(o1), jv_string("foo"), jv_number(420));
|
|
|
|
o2 = jv_object_set(o2, jv_string("bar"), jv_number(240));
|
|
|
|
assert(jv_number_value(jv_object_get(jv_copy(o1), jv_string("foo"))) == 42);
|
|
|
|
assert(jv_number_value(jv_object_get(jv_copy(o1), jv_string("bar"))) == 24);
|
|
|
|
assert(jv_number_value(jv_object_get(jv_copy(o2), jv_string("foo"))) == 420);
|
|
|
|
jv_free(o1);
|
|
|
|
assert(jv_number_value(jv_object_get(jv_copy(o2), jv_string("bar"))) == 240);
|
|
|
|
|
|
|
|
jv_dump(jv_copy(o2)); printf("\n");
|
|
|
|
|
|
|
|
jv_free(o2);
|
|
|
|
}
|
|
|
|
}
|