#include "stdafx.h"

int main(void)
{
	acl::string buf;                                                       
	acl::json json;
	const char* s;

	////////////////////////////////////////////////////////////////////
#if 1
	acl::json_node& root = json.get_root();

	root.add_text("name1", "value1")
		.add_number("name2", 111111)
		.add_bool("name3", true);
	root.add_array(true)
		.add_array_number(100)
		.add_array_number(101)
		.add_array_number(102);
	root.add_array(true)
		.add_array_bool(true)
		.add_array_bool(false)
		.add_array_bool(true);
	root.add_array(true)
		.add_text("name11", "value11")
		.add_number("name12", 1000)
		.add_bool("name13", true);
	root.add_array(true)
		.add_child("node1",
			json.create_node()
				.add_child(json.create_node("name12_1_1", "value12_1_1")))
		.add_child("node2",
			json.create_node()
				.add_child(json.create_node("name12_1_2", "value12_1_2")))
		.add_child(json.create_node()
				.add_child(json.create_node("name12_1_3", "value12_1_3")));

	json.build_json(buf);
	printf("%s\r\n", buf.c_str());
	s = "{\"name1\": \"value1\", \"name2\": 111111, \"name3\": true, "
		"[100, 101, 102], [true, false, true], "
		"[\"name11\": \"value11\", \"name12\": 1000, \"name13\": true], "
		"[\"node1\": {\"name12_1_1\": \"value12_1_1\"}, "
		 "\"node2\": {\"name12_1_2\": \"value12_1_2\"}, "
		 "{\"name12_1_3\": \"value12_1_3\"}]}";
	if (strcmp(s, buf.c_str()) != 0)
	{
		printf("%s\r\n", s);
		printf("%s(%d): Error\r\n", __FUNCTION__, __LINE__);
		return 1;
	}

	////////////////////////////////////////////////////////////////////

	printf("\r\n");
	json.reset();
	buf.clear();
	acl::json_node& array = json.create_array();
	json.get_root().add_child("array", array);

	acl::json_node& node = json.create_node();
	node.add_number("number11", 100);
	node.add_number("number12", 200);
	node.add_number("number13", 300);
	array.add_child(node);

	node = json.create_node();
	node.add_number("number21", 1000)
		.add_number("number22", 2000)
		.add_number("number23", 3000);
	array.add_child(node);

	node = json.create_node();
	node.add_text("number31", "value31")
		.add_text("number32", "value32")
		.add_text("number33", "value33");
	array.add_child(node);

	node = json.create_node();
	node.add_bool("number41", true).add_bool("number42", false);
	array.add_child(node);

	json.build_json(buf);
	printf("%s\r\n", buf.c_str());

	s = "{\"array\": ["
	  "{\"number11\": 100, \"number12\": 200, \"number13\": 300}, "
	  "{\"number21\": 1000, \"number22\": 2000, \"number23\": 3000}, "
	  "{\"number31\": \"value31\", \"number32\": \"value32\", \"number33\": \"value33\"}, "
	  "{\"number41\": true, \"number42\": false}]}";
	if (strcmp(s, buf.c_str()) != 0)
	{
		printf("%s\r\n", s);
		printf("%s(%d): Error\r\n", __FUNCTION__, __LINE__);
		return 1;
	}

	////////////////////////////////////////////////////////////////////

	printf("\r\n");
	json.reset();
	buf.clear();
	json.build_json(buf);
	printf("%s\r\n", buf.c_str());

	s = "{}";
	if (strcmp(s, buf.c_str()) != 0)
	{
		printf("%s\r\n", s);
		printf("%s(%d): Error\r\n", __FUNCTION__, __LINE__);
		return 1;
	}

	////////////////////////////////////////////////////////////////////

	printf("\r\n");
	json.reset();
	buf.clear();
	json.get_root().add_array();
	json.build_json(buf);
	printf("%s\r\n", buf.c_str());

	s = "{[]}";
	if (strcmp(s, buf.c_str()) != 0)
	{
		printf("%s\r\n", s);
		printf("%s(%d): Error\r\n", __FUNCTION__, __LINE__);
		return 1;
	}

	////////////////////////////////////////////////////////////////////

	printf("\r\n");
	json.reset();
	buf.clear();
	json.get_root().add_array(true)
		.add_array_number(10)
		.add_array_number(100)
		.add_array_number(1000);
	json.build_json(buf);
	printf("%s\r\n", buf.c_str());

	s = "{[10, 100, 1000]}";
	if (strcmp(s, buf.c_str()) != 0)
	{
		printf("%s\r\n", s);
		printf("%s(%d): Error\r\n", __FUNCTION__, __LINE__);
		return 1;
	}

	////////////////////////////////////////////////////////////////////

	printf("\r\n");
	json.reset();
	buf.clear();
	acl::json_node& array1 = json.create_array();
	json.get_root().add_child(array1);

	array1.add_array_text("hello").add_array_text("world");
	json.build_json(buf);
	printf("%s\r\n", buf.c_str());
	
	s = "{[\"hello\", \"world\"]}";
	if (strcmp(s, buf.c_str()) != 0)
	{
		printf("%s\r\n", s);
		printf("%s(%d): Error\r\n", __FUNCTION__, __LINE__);
		return 1;
	}


	////////////////////////////////////////////////////////////////////

	printf("\r\n");
	json.reset();
	buf.clear();
	acl::json_node& array2 = json.create_array();
	json.get_root().add_child(array2);

	array2.add_child(json.create_array(), true)
			.add_child(json.create_array(), true)
				.add_child(json.create_array());
	json.build_json(buf);
	printf("%s\r\n", buf.c_str());
	
	s = "{[[[[]]]]}";
	if (strcmp(s, buf.c_str()) != 0)
	{
		printf("%s\r\n", s);
		printf("%s(%d): Error\r\n", __FUNCTION__, __LINE__);
		return 1;
	}

	////////////////////////////////////////////////////////////////////

	printf("\r\n");
	json.reset();
	buf.clear();
	acl::json_node& array3 = json.create_array();
	json.get_root().add_child(array3);

	acl::json_node& n3 = json.create_node();
//	n3.add_child("hello", "world");
	array3.add_child(n3);
	json.build_json(buf);
	printf("%s\r\n", buf.c_str());

	s = "{[{}]}";
	if (strcmp(s, buf.c_str()) != 0)
	{
		printf("%s\r\n", s);
		printf("%s(%d): Error\r\n", __FUNCTION__, __LINE__);
		return 1;
	}

	////////////////////////////////////////////////////////////////////

	printf("\r\n");
	json.reset();
	buf.clear();
	acl::json_node& array4 = json.create_array();
	json.get_root().add_child(array4);

	acl::json_node& n4 = json.create_node();
	n4.add_text("hello", "world");
	array4.add_child(n4);
	json.build_json(buf);
	printf("%s\r\n", buf.c_str());

	s = "{[{\"hello\": \"world\"}]}";
	if (strcmp(s, buf.c_str()) != 0)
	{
		printf("%s\r\n", s);
		printf("%s(%d): Error\r\n", __FUNCTION__, __LINE__);
		return 1;
	}

#endif
	////////////////////////////////////////////////////////////////////

	printf("\r\n");
	json.reset();
	buf.clear();
	acl::json_node& array5 = json.create_array();
	json.get_root().add_child(array5);

	array5.add_child(json.create_node());
	array5.add_child(json.create_node());
	json.build_json(buf);
	printf("%s\r\n", buf.c_str());
	
	s = "{[{}, {}]}";
	if (strcmp(s, buf.c_str()) != 0)
	{
		printf("%s\r\n", s);
		printf("%s(%d): Error\r\n", __FUNCTION__, __LINE__);
		return 1;
	}

	////////////////////////////////////////////////////////////////////

	printf("\r\n");
	json.reset();
	buf.clear();
	acl::json_node& array6 = json.create_array();
	json.get_root().add_child(array6);

	array6.add_array_text("hello").add_array_text("world");
	array6.add_child(json.create_array(), true)
			.add_child(json.create_array(), true)
				.add_child(json.create_array());
	array6.add_child(json.create_node());
	array6.add_child(json.create_node());
	json.build_json(buf);
	printf("%s\r\n", buf.c_str());
	
	s = "{[\"hello\", \"world\", [[[]]], {}, {}]}";
	if (strcmp(s, buf.c_str()) != 0)
	{
		printf("%s\r\n", s);
		printf("%s(%d): Error\r\n", __FUNCTION__, __LINE__);
		return 1;
	}


	////////////////////////////////////////////////////////////////////

	printf("\r\n");
	json.reset();
	buf.clear();
	json.get_root().add_text("name", "value");
	json.build_json(buf);
	printf("%s\r\n", buf.c_str());
	s = "{\"name\": \"value\"}";
	if (strcmp(s, buf.c_str()) != 0)
	{
		printf("%s\r\n", s);
		printf("%s(%d): Error\r\n", __FUNCTION__, __LINE__);
		return 1;
	}

	////////////////////////////////////////////////////////////////////

	printf("\r\n");
	printf("ALL OVER NOW!\r\n\r\n");

#ifdef WIN32
	printf("enter any key to exit!\r\n");
	getchar();
#endif
	return 0;
}
