summaryrefslogtreecommitdiff
path: root/src/tests/eina/eina_test_json.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tests/eina/eina_test_json.c')
-rw-r--r--src/tests/eina/eina_test_json.c613
1 files changed, 613 insertions, 0 deletions
diff --git a/src/tests/eina/eina_test_json.c b/src/tests/eina/eina_test_json.c
new file mode 100644
index 0000000000..815de2603c
--- /dev/null
+++ b/src/tests/eina/eina_test_json.c
@@ -0,0 +1,613 @@
+/* EINA - EFL data type library
+ * Copyright (C) 2013 Yossi Kantor
+ Cedric Bail
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library;
+ * if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include "eina_suite.h"
+#include "Eina.h"
+
+typedef struct
+{
+ unsigned line;
+ unsigned col;
+} TextPos;
+
+typedef struct
+{
+ Eina_Strbuf *text;
+ unsigned long parent_idx;
+} Sax_Parser_Data;
+
+static const char *json_type_string[] = {"NL","NR","STR","BN","PAR","OBJ","ARR"};
+
+static const char jstr_array_before[] =
+"{\
+\"Array1\":[0,1,2,3,4,5,6],\n\
+\"Array2\":[56,\"He\",true,\"Hello\",false,null],\n\
+\"Array3\":[\"\",\"He\",true,\"Hello\",false,null],\n\
+\"Array4\":[]\
+}";
+
+static const char jstr_array_after[] =
+"{\"Array1\":[0,1,2,3,4,5,6],\"Array2\":[57,56,156,\"new\",\
+false,\"Bye\",true,null],\"Array3\":[],\"Array4\":[1]}";
+
+static const char jstr_object_before[] =
+"{\
+\"Object1\":{\"0\":0,\"1\":1,\"2\":2,\"3\":3,\"4\":4,\"5\":5,\"6\":6},\n\
+\"Object2\":{\"Num1\":56,\"Str1\":\"Str1\",\"Bool1\":true,\"Str2\":\"Hello\",\"Null\":null},\n\
+\"Object3\":{\"Num1\":56,\"Bool1\":true,\"String1\":\"String\",\"Null\":null},\
+\"Object4\":{}\
+}";
+
+static const char jstr_object_after[] =
+"{\"Object1\":{\"0\":0,\"1\":1,\"2\":2,\"3\":3,\"4\":4,\"5\":5,\"6\":6},\
+\"Object2\":{\"Num3\":57,\"Num2\":56,\"Num1\":156,\"Str3\":\"new\",\"Bool1\":false,\
+\"Str2\":\"HelloStr2\",\"Null\":null},\"Object3\":{},\"Object4\":{\"NumberOne\":1},\
+\"Object5\":true}";
+
+static const char jstr_object_tree[] =
+"{ \"Obj1\":{ \"Obj1_1\":11, \"Obj1_2\":12 },\"Obj2\":2 }";
+
+static const TextPos pos_full = {32,2};
+static const char jstr_full[] =
+"{\n\
+ \"Type1\":\"John\",\n\
+ \"Type2\":\"Smith\",\n\
+ \"Type3\":25,\n\
+ \"Type4\":null,\n\
+ \"Type5\":true,\n\
+ \"Type6\":false,\n\
+ \"Type7\":\n\
+ {\n\
+ \"Type1\":\"John\",\n\
+ \"Type2\":\"Smith\",\n\
+ \"Type3\":25,\n\
+ \"Type4\":null,\n\
+ \"Type5\":true,\n\
+ \"Type6\":false\n\
+ },\n\
+ \"Type8\":[\"John\",\"Smith\",\" Escaped \\\" \",25,null,true,false],\n\
+ \"TypeNum\":[0,-1,1,2.0,3.45,-4.67e2,5e-1,6e3,5e+1,-5.6e+2],\n\
+ \"TypeMix\":\n\
+ [\n\
+ 67,null,[],{\"Hello\":[true]},false,\"Bye\",\n\
+ {\n\
+ \"Type21\":\"John\",\n\
+ \"Type22\":\"Smith\",\n\
+ \"Type23\":{}\n\
+ },\n\
+ {\n\
+ \"type\":\"fax\",\n\
+ \"number\":\"646 555-4567\"\n\
+ }\n\
+ ]\n\
+}";
+
+static const char jstr_double_root[] =
+"{\n\
+ \"Type1\":\"John\",\n\
+ \"Type2\":\"Smith\",\n\
+ \"Type3\":25,\n\
+ \"Type4\":null,\n\
+ \"Type5\":true,\n\
+ \"Type6\":false,\n\
+ \"Type7\":\n\
+ {\n\
+ \"Type1\":\"John\",\n\
+ \"Type2\":\"Smith\",\n\
+ \"Type3\":25,\n\
+ \"Type4\":null,\n\
+ \"Type5\":true,\n\
+ \"Type6\":false\n\
+ },\n\
+ \"Type8\":[\"John\",\"Smith\",\" Escaped \\\" \",25,null,true,false],\n\
+ \"TypeNum\":[0,-1,1,2.0,3.45,-4.67e2,5e-1,6e3,5e+1,-5.6e+2],\n\
+ \"TypeMix\":\n\
+ [\n\
+ 67,null,[],{\"Hello\":[true]},false,\"Bye\",\n\
+ {\n\
+ \"Type21\":\"John\",\n\
+ \"Type22\":\"Smith\",\n\
+ \"Type23\":{}\n\
+ },\n\
+ {\n\
+ \"type\":\"fax\",\n\
+ \"number\":\"646 555-4567\"\n\
+ }\n\
+ ]\n\
+} \n\
+{ \"DoubleRoot\":null }\n\
+";
+
+static const TextPos pos_lex_error = {4,13};
+char jstr_lex_error[] =
+"{\n\
+ \"Type1\":\"John\",\n\
+ \"Type2\":\"Smith\",\n\
+ \"Type3\":25a,\n\
+ \"Type4\":null,\n\
+ \"Type5\":true,\n\
+}";
+
+static const TextPos pos_syntax_error = {3,17};
+char jstr_syntax_error[] =
+"{\n\
+ \"Type1\":\"John\",\n\
+ \"Type2\" \"Smith\",\n\
+ \"Type3\":25,\n\
+ \"Type4\":null,\n\
+ \"Type5\":true,\n\
+}";
+
+static const TextPos pos_incomplete = {6,15};
+char jstr_incomplete[]=
+"{\n\
+ \"Type1\":\"John\",\n\
+ \"Type2\":\"Smith\",\n\
+ \"Type3\":25,\n\
+ \"Type4\":null,\n\
+ \"Type5\":true";
+
+
+static const char jstr_full_packed[] =
+"\
+{\"Type1\":\"John\",\"Type2\":\"Smith\",\"Type3\":25,\"Type4\":null,\
+\"Type5\":true,\"Type6\":false,\"Type7\":{\"Type1\":\"John\",\
+\"Type2\":\"Smith\",\"Type3\":25,\"Type4\":null,\"Type5\":true,\
+\"Type6\":false},\"Type8\":[\"John\",\"Smith\",\
+\" Escaped \\\" \",25,null,true,false],\
+\"TypeNum\":[0,-1,1,2,3.45,-467,0.50,6000,50,-560],\
+\"TypeMix\":[67,null,[],{\"Hello\":[true]},false,\"Bye\",\
+{\"Type21\":\"John\",\"Type22\":\"Smith\",\"Type23\":{}},\
+{\"type\":\"fax\",\"number\":\"646 555-4567\"}]}\
+";
+
+static const char jstr_sax_result[] =
+"\
+(0x2)PR((nil)):OBJ(0x3)PR(0x2):PAR(\"Type1\")(0x4)PR(0x3):STR(\"John\")\
+(0x5)PR(0x2):PAR(\"Type2\")(0x6)PR(0x5):STR(\"Smith\")(0x7)PR(0x2):\
+PAR(\"Type3\")(0x8)PR(0x7):NR(\"25\")(0x9)PR(0x2):PAR(\"Type4\")(0xa)PR\
+(0x9):NL(0xb)PR(0x2):PAR(\"Type5\")(0xc)PR(0xb):BN(\"true\")(0xd)PR(0x2):\
+PAR(\"Type6\")(0xe)PR(0xd):BN(\"false\")(0xf)PR(0x2):PAR(\"Type7\")\
+(0x10)PR(0xf):OBJ(0x11)PR(0x10):PAR(\"Type1\")(0x12)PR(0x11):\
+STR(\"John\")(0x13)PR(0x10):PAR(\"Type2\")(0x14)PR(0x13):STR(\"Smith\")\
+(0x15)PR(0x10):PAR(\"Type3\")(0x16)PR(0x15):NR(\"25\")(0x17)PR(0x10):\
+PAR(\"Type4\")(0x18)PR(0x17):NL(0x19)PR(0x10):PAR(\"Type5\")(0x1a)PR(0x19)\
+:BN(\"true\")(0x1b)PR(0x10):PAR(\"Type6\")(0x1c)PR(0x1b):BN(\"false\")\
+(0x1d)PR(0x2):PAR(\"Type8\")(0x1e)PR(0x1d):ARR(0x1f)PR(0x1e):STR(\"John\")\
+(0x20)PR(0x1e):STR(\"Smith\")(0x21)PR(0x1e):STR(\" Escaped \\\" \")\
+(0x22)PR(0x1e):NR(\"25\")(0x23)PR(0x1e):NL(0x24)PR(0x1e):BN(\"true\")\
+(0x25)PR(0x1e):BN(\"false\")(0x26)PR(0x2):PAR(\"TypeNum\")(0x27)PR(0x26)\
+:ARR(0x28)PR(0x27):NR(\"0\")(0x29)PR(0x27):NR(\"-1\")(0x2a)PR(0x27):\
+NR(\"1\")(0x2b)PR(0x27):NR(\"2.0\")(0x2c)PR(0x27):NR(\"3.45\")(0x2d)\
+PR(0x27):NR(\"-4.67e2\")(0x2e)PR(0x27):NR(\"5e-1\")(0x2f)PR(0x27):\
+NR(\"6e3\")(0x30)PR(0x27):NR(\"5e+1\")(0x31)PR(0x27):NR(\"-5.6e+2\")\
+(0x32)PR(0x2):PAR(\"TypeMix\")(0x33)PR(0x32):ARR(0x34)PR(0x33):\
+NR(\"67\")(0x35)PR(0x33):NL(0x36)PR(0x33):ARR(0x37)PR(0x33):OBJ(0x38)\
+PR(0x37):PAR(\"Hello\")(0x39)PR(0x38):ARR(0x3a)PR(0x39):BN(\"true\")\
+(0x3b)PR(0x33):BN(\"false\")(0x3c)PR(0x33):STR(\"Bye\")(0x3d)PR(0x33):\
+OBJ(0x3e)PR(0x3d):PAR(\"Type21\")(0x3f)PR(0x3e):STR(\"John\")(0x40)\
+PR(0x3d):PAR(\"Type22\")(0x41)PR(0x40):STR(\"Smith\")(0x42)PR(0x3d)\
+:PAR(\"Type23\")(0x43)PR(0x42):OBJ(0x44)PR(0x33):OBJ(0x45)PR(0x44)\
+:PAR(\"type\")(0x46)PR(0x45):STR(\"fax\")(0x47)PR(0x44):PAR(\"number\")\
+(0x48)PR(0x47):STR(\"646 555-4567\")\
+";
+
+static void *
+sax_parser_cb(Eina_Json_Type type, void *parent, const char *text, void *data)
+{
+ Sax_Parser_Data *saxdata = (Sax_Parser_Data *)data;
+ const char* strval = NULL;
+
+ switch(type)
+ {
+ case EINA_JSON_TYPE_NUMBER:
+ case EINA_JSON_TYPE_STRING:
+ case EINA_JSON_TYPE_PAIR:
+ strval = text;
+ break;
+ case EINA_JSON_TYPE_BOOLEAN:
+ strval = (*text == 't') ? "true" : "false";
+ break;
+ default:
+ break;
+ }
+
+ saxdata->parent_idx++;
+ eina_strbuf_append_printf(saxdata->text,
+ "(%p)PR(%p):%s",
+ (void*)saxdata->parent_idx,
+ parent,
+ json_type_string[type]);
+
+ if (strval) eina_strbuf_append_printf(saxdata->text, "(\"%s\")", strval);
+
+ return (void*)saxdata->parent_idx;
+}
+
+START_TEST(eina_json_parse_test)
+{
+ eina_init();
+
+ Eina_Json_Value* jval = eina_json_parse(jstr_full);
+ fail_unless(jval != NULL);
+ char* jval_str = eina_json_format_string_get(jval, EINA_JSON_FORMAT_PACKED);
+ fail_if(strcmp(jstr_full_packed, jval_str));
+ free(jval_str);
+ eina_json_value_free(jval);
+
+ fail_if(eina_json_parse(jstr_lex_error));
+ fail_if(eina_json_parse(jstr_syntax_error));
+ fail_if(eina_json_parse(jstr_incomplete));
+ fail_if(eina_json_parse(jstr_double_root));
+
+ int json_full_len = strlen(jstr_full);
+
+ jval = eina_json_parse_n(jstr_double_root, json_full_len);
+ fail_unless(jval != NULL);
+ jval_str = eina_json_format_string_get(jval, EINA_JSON_FORMAT_PACKED);
+ fail_if(strcmp(jstr_full_packed, jval_str));
+ free(jval_str);
+ eina_json_value_free(jval);
+
+ jval = eina_json_parse_n(jstr_full, 0xFFFF);
+ fail_unless(jval != NULL);
+ jval_str = eina_json_format_string_get(jval, EINA_JSON_FORMAT_PACKED);
+ fail_if(strcmp(jstr_full_packed, jval_str));
+ free(jval_str);
+ eina_json_value_free(jval);
+
+ fail_if(eina_json_parse_n(jstr_full, json_full_len / 2));
+ fail_if(eina_json_parse_n(jstr_full, 0));
+
+ eina_shutdown();
+}
+END_TEST
+
+START_TEST(eina_json_context_dom_parse_test)
+{
+ eina_init();
+
+ Eina_Bool res;
+ Eina_Json_Context *ctx = eina_json_context_dom_new();
+ fail_if(eina_json_context_dom_tree_take(ctx));
+ res = eina_json_context_parse(ctx, jstr_full);
+ fail_unless(res);
+ fail_unless(eina_json_context_completed_get(ctx));
+ fail_if(eina_json_context_unfinished_get(ctx));
+ fail_if(eina_json_context_line_get(ctx) != pos_full.line);
+ fail_if(eina_json_context_column_get(ctx) != pos_full.col);
+ fail_unless(eina_json_context_error_get(ctx) == EINA_JSON_ERROR_NONE);
+
+ res = eina_json_context_parse(ctx, "{");
+ fail_if(res);
+ fail_if(eina_json_context_completed_get(ctx));
+ fail_if(eina_json_context_dom_tree_take(ctx));
+ fail_if(eina_json_context_unfinished_get(ctx));
+ fail_if(eina_json_context_line_get(ctx) != pos_full.line);
+ fail_if(eina_json_context_column_get(ctx) != pos_full.col);
+ fail_unless(eina_json_context_error_get(ctx) == EINA_JSON_ERROR_PAST_END);
+
+ eina_json_context_reset(ctx);
+
+ res = eina_json_context_parse(ctx, jstr_incomplete);
+ fail_unless(res);
+ fail_if(eina_json_context_completed_get(ctx));
+ fail_if(eina_json_context_line_get(ctx) != pos_incomplete.line);
+ fail_if(eina_json_context_column_get(ctx) != pos_incomplete.col);
+ fail_unless(eina_json_context_error_get(ctx) == EINA_JSON_ERROR_NONE);
+
+ res = eina_json_context_parse(ctx, "}");
+ fail_unless(res);
+ fail_unless(eina_json_context_completed_get(ctx));
+ fail_if(eina_json_context_line_get(ctx) != pos_incomplete.line);
+ fail_if(eina_json_context_column_get(ctx) != pos_incomplete.col+1);
+ fail_unless(eina_json_context_error_get(ctx) == EINA_JSON_ERROR_NONE);
+
+ eina_json_context_reset(ctx);
+
+ res = eina_json_context_parse(ctx, jstr_lex_error);
+ fail_if(res);
+ fail_if(eina_json_context_completed_get(ctx));
+ fail_if(eina_json_context_line_get(ctx) != pos_lex_error.line);
+ fail_if(eina_json_context_column_get(ctx) != pos_lex_error.col);
+ fail_unless(eina_json_context_error_get(ctx) == EINA_JSON_ERROR_LEX_TOKEN);
+
+ eina_json_context_reset(ctx);
+
+ res = eina_json_context_parse(ctx, jstr_syntax_error);
+ fail_if(res);
+ fail_if(eina_json_context_completed_get(ctx));
+ fail_if(eina_json_context_line_get(ctx) != pos_syntax_error.line);
+ fail_if(eina_json_context_column_get(ctx) != pos_syntax_error.col);
+ fail_unless(eina_json_context_error_get(ctx) == EINA_JSON_ERROR_SYNTAX_TOKEN);
+
+ eina_json_context_reset(ctx);
+
+ int len = strlen(jstr_double_root);
+ const int bsize = 3;
+ int head = 0;
+
+ while (eina_json_context_unfinished_get(ctx))
+ {
+ eina_json_context_parse_n(ctx, &jstr_double_root[head], bsize);
+ head += bsize;
+ fail_if(len-head < bsize);
+ }
+
+ Eina_Json_Value *jval = eina_json_context_dom_tree_take(ctx);
+ fail_unless(jval != NULL);
+ fail_if(eina_json_context_dom_tree_take(ctx));
+ char *jval_str = eina_json_format_string_get(jval, EINA_JSON_FORMAT_PACKED);
+ fail_if(strcmp(jstr_full_packed, jval_str));
+ free(jval_str);
+ eina_json_value_free(jval);
+
+ eina_json_context_free(ctx);
+ eina_shutdown();
+}
+END_TEST
+
+START_TEST(eina_json_context_sax_parse_test)
+{
+ eina_init();
+
+ Sax_Parser_Data testsax;
+
+ testsax.text = eina_strbuf_new();
+ testsax.parent_idx = 1;
+
+ Eina_Json_Context *ctx = eina_json_context_sax_new(sax_parser_cb, &testsax);
+
+ Eina_Bool res = eina_json_context_parse(ctx, jstr_full);
+ fail_unless(res);
+ fail_unless(eina_json_context_completed_get(ctx));
+ fail_if(eina_json_context_dom_tree_take(ctx));
+
+ fail_if(strcmp(eina_strbuf_string_get(testsax.text), jstr_sax_result));
+
+ eina_strbuf_free(testsax.text);
+ eina_json_context_free(ctx);
+ eina_shutdown();
+}
+END_TEST
+
+START_TEST(eina_json_object_test)
+{
+ eina_init();
+
+ Eina_Json_Value * jobj = eina_json_parse(jstr_object_before);
+ fail_if(!jobj);
+
+ Eina_Json_Value * tmp;
+
+ Eina_Json_Value *obj1 = eina_json_pair_value_get(eina_json_object_nth_get(jobj, 0));
+ Eina_Json_Value *obj2 = eina_json_pair_value_get(eina_json_object_nth_get(jobj, 1));
+ Eina_Json_Value *obj3 = eina_json_pair_value_get(eina_json_object_nth_get(jobj, 2));
+ Eina_Json_Value *obj4 = eina_json_pair_value_get(eina_json_object_nth_get(jobj, 3));
+
+ fail_if(eina_json_object_nth_get(obj4, 0));
+
+ tmp = eina_json_number_new(1);
+ fail_if(eina_json_object_insert(obj4, 1, "tmp", tmp));
+ eina_json_value_free(tmp);
+
+ fail_unless(eina_json_object_insert(obj4, 0, "NumberOne",
+ eina_json_number_new(1)) != NULL);
+
+ fail_unless(eina_json_object_nth_get(obj4, 0) != NULL );
+
+ tmp = eina_json_number_new(1);
+ fail_if(eina_json_object_insert(obj4, 1, "tmp", tmp));
+ eina_json_value_free(tmp);
+
+ fail_if(eina_json_object_nth_get(obj3, 11));
+ fail_if(eina_json_object_nth_remove(obj3, 11));
+ fail_if(eina_json_object_nth_remove(obj3, 7));
+ fail_if(eina_json_object_count_get(obj3) != 4);
+ while(eina_json_object_count_get(obj3))
+ fail_unless(eina_json_object_nth_remove(obj3, 0));
+
+ fail_if(eina_json_object_nth_remove(obj3, 0));
+ fail_if(eina_json_object_nth_get(obj3, 0));
+
+ tmp = eina_json_pair_value_get(eina_json_object_nth_get(obj2, 4));
+ fail_unless(eina_json_type_get(tmp) == EINA_JSON_TYPE_NULL);
+
+ fail_unless(eina_json_object_nth_remove(obj2, 1));
+
+ tmp = eina_json_pair_value_get(eina_json_object_nth_get(obj2, 3));
+ fail_unless(eina_json_type_get(tmp) == EINA_JSON_TYPE_NULL);
+
+ tmp = eina_json_pair_value_get(eina_json_object_nth_get(obj2, 1));
+ fail_unless(eina_json_boolean_set(tmp, !eina_json_boolean_get(tmp)));
+
+ tmp = eina_json_pair_value_get(eina_json_object_nth_get(obj2, 0));
+ fail_unless(eina_json_number_set(tmp, eina_json_number_get(tmp) + 100));
+
+ tmp = eina_json_object_nth_get(obj2, 2);
+ Eina_Strbuf *joinstr = eina_strbuf_new();
+ eina_strbuf_append(joinstr,
+ eina_json_string_get(eina_json_pair_value_get(tmp)));
+
+ eina_strbuf_append(joinstr, eina_json_pair_name_get(tmp));
+ fail_unless(eina_json_string_set(eina_json_pair_value_get(tmp),
+ eina_strbuf_string_get(joinstr)));
+
+ eina_strbuf_free(joinstr);
+
+ fail_unless(eina_json_object_insert(obj2, 0, "Num2",
+ eina_json_number_new(56)) != NULL );
+ fail_unless(eina_json_object_insert(obj2, 0, "Num3",
+ eina_json_number_new(57)) != NULL);
+ fail_unless(eina_json_object_insert(obj2, 3, "Str3",
+ eina_json_string_new("new")) != NULL);
+
+ tmp = eina_json_string_new("fail");
+ fail_if(eina_json_object_insert(obj2, 10, "fail", tmp));
+ eina_json_value_free(tmp);
+
+ int serial;
+ fail_unless(eina_json_object_count_get(obj1) == 7);
+ for (serial=0;serial<(int)eina_json_object_count_get(obj1);serial++)
+ {
+ tmp = eina_json_object_nth_get(obj1, serial);
+ fail_unless(eina_json_number_get(eina_json_pair_value_get(tmp)) == serial);
+ fail_unless((int)atof(eina_json_pair_name_get(tmp)) == serial);
+ }
+
+ serial = 0;
+ Eina_Iterator *it = eina_json_object_iterator_new(obj1);
+ Eina_Json_Value * data;
+ EINA_ITERATOR_FOREACH(it, data)
+ {
+ fail_unless(eina_json_number_get(eina_json_pair_value_get(data)) == serial);
+ fail_unless((int)atof(eina_json_pair_name_get(data)) == serial);
+ serial++;
+ }
+ eina_iterator_free(it);
+
+ Eina_Json_Value* japd;
+ japd = eina_json_object_append(jobj, "Object5", eina_json_boolean_new(EINA_TRUE));
+ fail_unless(eina_json_type_get(japd) == EINA_JSON_TYPE_PAIR);
+ fail_unless(eina_json_boolean_get(eina_json_pair_value_get(japd)));
+
+ char* fstr = eina_json_format_string_get(jobj, EINA_JSON_FORMAT_PACKED);
+ fail_if(strcmp(fstr, jstr_object_after));
+ free(fstr);
+
+ Eina_Json_Value *treeobj = eina_json_parse(jstr_object_tree);
+ fail_if(eina_json_object_value_get(treeobj));
+ fail_if(eina_json_object_value_get(treeobj, "Obj"));
+ fail_if(eina_json_object_value_get(treeobj, "Obj1", "Obj"));
+ tmp = eina_json_object_value_get(treeobj, "Obj1", "Obj1_2");
+ fail_unless((tmp != NULL));
+ fail_unless((eina_json_number_get(tmp) == 12));
+ tmp = eina_json_object_value_get(treeobj, "Obj2" );
+ fail_unless((tmp != NULL));
+ fail_unless((eina_json_number_get(tmp) == 2));
+ tmp = eina_json_null_new();
+ eina_json_object_insert(treeobj, 0, "Ent", tmp);
+ fail_if(eina_json_object_insert(jobj, 0, "Ent", tmp));
+ fail_if(eina_json_object_append(jobj, "Ent", tmp));
+ fail_if(eina_json_string_new(NULL));
+ eina_json_value_free(treeobj);
+
+ eina_json_value_free(jobj);
+ eina_shutdown();
+}
+END_TEST
+
+START_TEST(eina_json_array_test)
+{
+ eina_init();
+
+ Eina_Json_Value * jobj = eina_json_parse(jstr_array_before);
+ fail_if(!jobj);
+
+ Eina_Json_Value * tmp;
+
+ Eina_Json_Value *arr1 = eina_json_pair_value_get(eina_json_object_nth_get(jobj, 0));
+ Eina_Json_Value *arr2 = eina_json_pair_value_get(eina_json_object_nth_get(jobj, 1));
+ Eina_Json_Value *arr3 = eina_json_pair_value_get(eina_json_object_nth_get(jobj, 2));
+ Eina_Json_Value *arr4 = eina_json_pair_value_get(eina_json_object_nth_get(jobj, 3));
+
+ fail_if(eina_json_array_nth_get(arr4, 0));
+
+ tmp = eina_json_number_new(1);
+ fail_if(eina_json_array_insert(arr4, 1, tmp));
+ eina_json_value_free(tmp);
+
+ fail_unless(eina_json_array_insert(arr4, 0, eina_json_number_new(1)) != NULL);
+ fail_unless(eina_json_array_nth_get(arr4, 0) != NULL);
+
+ tmp = eina_json_number_new(1);
+ fail_if(eina_json_array_insert(arr4, 1, tmp));
+ eina_json_value_free(tmp);
+
+ fail_if(eina_json_array_nth_get(arr3, 11));
+ fail_if(eina_json_array_nth_remove(arr3, 11));
+ fail_if(eina_json_array_nth_remove(arr3, 7));
+ fail_if(eina_json_array_count_get(arr3)!=6);
+ while(eina_json_array_count_get(arr3))
+ fail_unless(eina_json_array_nth_remove(arr3, 0));
+
+ fail_if(eina_json_array_nth_remove(arr3, 0));
+ fail_if(eina_json_array_nth_get(arr3, 0));
+
+ fail_if(eina_json_type_get(eina_json_array_nth_get(arr2, 5)) != EINA_JSON_TYPE_NULL);
+ fail_unless(eina_json_array_nth_remove(arr2, 1));
+ fail_if(eina_json_type_get(eina_json_array_nth_get(arr2, 4)) != EINA_JSON_TYPE_NULL);
+
+ tmp = eina_json_array_nth_get(arr2, 1);
+ fail_unless(eina_json_boolean_set(tmp, !eina_json_boolean_get(tmp)));
+
+ tmp = eina_json_array_nth_get(arr2, 3);
+ fail_unless(eina_json_boolean_set(tmp, !eina_json_boolean_get(tmp)));
+
+ tmp = eina_json_array_nth_get(arr2, 0);
+ fail_unless(eina_json_number_set(tmp, eina_json_number_get(tmp)+100));
+
+ tmp = eina_json_array_nth_get(arr2, 2);
+ fail_if(strcmp(eina_json_string_get(tmp), "Hello"));
+ fail_unless(eina_json_string_set(tmp, "Bye"));
+
+ fail_unless(eina_json_array_insert(arr2, 0, eina_json_number_new(56)) != NULL);
+ fail_unless(eina_json_array_insert(arr2, 0, eina_json_number_new(57)) != NULL);
+ fail_unless(eina_json_array_insert(arr2, 3, eina_json_string_new("new")) != NULL);
+
+ tmp = eina_json_string_new("fail");
+ fail_if(eina_json_array_insert(arr2, 10, tmp));
+ eina_json_value_free(tmp);
+
+ int serial;
+ fail_unless(eina_json_array_count_get(arr1) == 7);
+ for (serial=0;serial<(int)eina_json_array_count_get(arr1);serial++)
+ fail_if(eina_json_number_get(eina_json_array_nth_get(arr1, serial)) != serial);
+
+ serial = 0;
+ Eina_Iterator *it = eina_json_array_iterator_new(arr1);
+ Eina_Json_Value * data;
+ EINA_ITERATOR_FOREACH(it, data)
+ fail_if(eina_json_number_get(data) != serial++);
+
+ eina_iterator_free(it);
+ char* fstr = eina_json_format_string_get(jobj, EINA_JSON_FORMAT_PACKED);
+ fail_if(strcmp(fstr, jstr_array_after));
+ free(fstr);
+
+ eina_json_value_free(jobj);
+ eina_shutdown();
+}
+END_TEST
+
+void
+eina_test_json(TCase *tc)
+{
+ tcase_add_test(tc, eina_json_parse_test);
+ tcase_add_test(tc, eina_json_context_dom_parse_test);
+ tcase_add_test(tc, eina_json_context_sax_parse_test);
+ tcase_add_test(tc, eina_json_object_test);
+ tcase_add_test(tc, eina_json_array_test);
+}