2 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
4 // Licensed under the Flora License, Version 1.0 (the License);
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
8 // http://floralicense.org/license/
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an AS IS BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
19 #include <dali-toolkit-test-suite-utils.h>
20 #include <dali-toolkit/dali-toolkit.h>
21 #include <dali-toolkit/public-api/builder/json-parser.h>
24 using namespace Dali::Toolkit;
26 void utc_json_parser_startup(void)
28 test_return_value = TET_UNDEF;
31 void utc_json_parser_cleanup(void)
33 test_return_value = TET_PASS;
39 std::string ReplaceQuotes(const std::string &in_s)
42 // wrong as no embedded quote but had regex link problems
43 std::replace(s.begin(), s.end(), '\'', '"');
49 int UtcDaliJsonParserMethod01(void)
51 ToolkitTestApplication application;
53 tet_infoline("JSON basic test");
55 std::string s1( ReplaceQuotes(
63 'object':{'key':'value'} \
67 JsonParser parser = JsonParser::New();
71 if(parser.ParseError())
73 std::cout << "Error: " << parser.GetErrorDescription() << std::endl;
74 std::cout << " at: " << parser.GetErrorLineNumber() << "(" << parser.GetErrorPosition() << ")" << std::endl;
77 DALI_TEST_CHECK(!parser.ParseError());
79 const TreeNode* root = parser.GetRoot();
81 DALI_TEST_CHECK(root);
83 DALI_TEST_CHECK(root->Size());
85 TreeNode::ConstIterator iter = root->CBegin();
86 DALI_TEST_CHECK(iter != root->CEnd());
88 const TreeNode* node = NULL;
90 node = &((*iter).second);
91 DALI_TEST_CHECK(node);
92 DALI_TEST_CHECK(node->GetType() == TreeNode::STRING);
93 DALI_TEST_CHECK(std::string((*iter).first) == std::string("string"));
94 DALI_TEST_CHECK(std::string(node->GetString()) == std::string("value2"));
97 DALI_TEST_CHECK(iter != root->CEnd());
98 node = &((*iter).second);
99 DALI_TEST_CHECK(node);
100 DALI_TEST_CHECK(node->GetType() == TreeNode::INTEGER);
101 DALI_TEST_CHECK(std::string((*iter).first) == std::string("integer"));
102 DALI_TEST_CHECK(node->GetInteger() == 2);
105 DALI_TEST_CHECK(iter != root->CEnd());
106 node = &((*iter).second);
107 DALI_TEST_CHECK(node);
108 DALI_TEST_CHECK(node->GetType() == TreeNode::FLOAT);
109 DALI_TEST_CHECK(std::string((*iter).first) == std::string("float"));
110 DALI_TEST_CHECK(node->GetFloat() == 2.0);
113 DALI_TEST_CHECK(iter != root->CEnd());
114 node = &((*iter).second);
115 DALI_TEST_CHECK(node);
116 DALI_TEST_CHECK(node->GetType() == TreeNode::BOOLEAN);
117 DALI_TEST_CHECK(std::string((*iter).first) == std::string("boolean"));
118 DALI_TEST_CHECK(node->GetBoolean());
121 DALI_TEST_CHECK(iter != root->CEnd());
122 node = &((*iter).second);
123 DALI_TEST_CHECK(node);
124 DALI_TEST_CHECK(node->GetType() == TreeNode::IS_NULL);
125 DALI_TEST_CHECK(std::string((*iter).first) == std::string("nil"));
128 DALI_TEST_CHECK(iter != root->CEnd());
129 node = &((*iter).second);
130 DALI_TEST_CHECK(node);
131 DALI_TEST_CHECK(node->GetType() == TreeNode::ARRAY);
132 DALI_TEST_CHECK(node->Size() == 3);
133 TreeNode::ConstIterator iterArray = node->CBegin();
135 DALI_TEST_CHECK(iterArray != node->CEnd());
136 DALI_TEST_CHECK( ((*iterArray).second).GetType() == TreeNode::INTEGER);
137 DALI_TEST_CHECK( (*iterArray).first == NULL );
138 DALI_TEST_CHECK( ((*iterArray).second).GetInteger() == 1);
141 DALI_TEST_CHECK(iterArray != node->CEnd());
142 DALI_TEST_CHECK( ((*iterArray).second).GetType() == TreeNode::INTEGER);
143 DALI_TEST_CHECK( (*iterArray).first == NULL );
144 DALI_TEST_CHECK( ((*iterArray).second).GetInteger() == 2);
147 DALI_TEST_CHECK(iterArray != node->CEnd());
148 DALI_TEST_CHECK( ((*iterArray).second).GetType() == TreeNode::INTEGER);
149 DALI_TEST_CHECK( (*iterArray).first == NULL );
150 DALI_TEST_CHECK( ((*iterArray).second).GetInteger() == 3);
153 DALI_TEST_CHECK(iter != root->CEnd());
154 node = &((*iter).second);
155 DALI_TEST_CHECK(node);
156 DALI_TEST_CHECK(node->GetType() == TreeNode::OBJECT);
157 DALI_TEST_CHECK(node->Size() == 1);
159 TreeNode::ConstIterator iterObject = node->CBegin();
160 DALI_TEST_CHECK(iterObject != node->CEnd());
161 DALI_TEST_CHECK( ((*iterObject).second).GetType() == TreeNode::STRING);
162 DALI_TEST_CHECK( std::string((*iterObject).first) == std::string("key" ));
163 DALI_TEST_CHECK( std::string(((*iterObject).second).GetString()) == std::string("value"));
165 tet_result(TET_PASS);
169 int UtcDaliJsonParserMethod02(void)
171 ToolkitTestApplication application;
173 tet_infoline("JSON Comments");
175 std::string s1( ReplaceQuotes(" \
176 // some comments with empty line above \n\
178 // inline comments \n\
179 'key':'value', // endline comments \n\
180 // more inline comments \n\
185 JsonParser parser = JsonParser::New();
189 if(parser.ParseError())
191 std::cout << "Error: " << parser.GetErrorDescription() << std::endl;
192 std::cout << " at: " << parser.GetErrorLineNumber() << "(" << parser.GetErrorPosition() << ")" << std::endl;
195 DALI_TEST_CHECK(!parser.ParseError());
197 const TreeNode* root = parser.GetRoot();
199 DALI_TEST_CHECK(root);
201 DALI_TEST_CHECK(root->Size());
203 const TreeNode& node = (*root->CBegin()).second;
205 DALI_TEST_CHECK(node.GetType() == TreeNode::STRING);
207 DALI_TEST_CHECK(node.GetString() == std::string("value"));
209 DALI_TEST_CHECK((*root->CBegin()).first == std::string("key"));
211 tet_result(TET_PASS);
216 int UtcDaliJsonParserMethod03(void)
218 ToolkitTestApplication application;
220 tet_infoline("JSON Empty line comment");
222 std::string s1( ReplaceQuotes(
226 "// next empty line comment\n"\
233 JsonParser parser = JsonParser::New();
237 if(parser.ParseError())
239 std::cout << "Error: " << parser.GetErrorDescription() << std::endl;
240 std::cout << " at: " << parser.GetErrorLineNumber() << "(" << parser.GetErrorPosition() << ")" << std::endl;
243 DALI_TEST_CHECK(!parser.ParseError());
245 const TreeNode* root = parser.GetRoot();
247 DALI_TEST_CHECK(root);
249 DALI_TEST_CHECK(root->Size());
251 const TreeNode& node = (*root->CBegin()).second;
253 DALI_TEST_CHECK(node.GetType() == TreeNode::STRING);
255 DALI_TEST_CHECK(node.GetString() == std::string("value"));
257 DALI_TEST_CHECK((*root->CBegin()).first == std::string("key"));
259 tet_result(TET_PASS);
263 int UtcDaliJsonParserMethod04(void)
265 ToolkitTestApplication application;
267 tet_infoline("JSON Merge");
269 std::string s1( ReplaceQuotes(" \
278 'actor':'bump-image', \
279 'property':'uLightPosition', \
280 'value':[0.8, 0.0, -1.5], \
281 'alpha-function': 'BOUNCE', \
282 'time-period': { 'duration': 2.5 } \
290 std::string s2( ReplaceQuotes(" \
298 'end-action':'DISCARD' \
304 JsonParser parser = JsonParser::New();
308 if(parser.ParseError())
310 std::cout << "Error: " << parser.GetErrorDescription() << std::endl;
311 std::cout << " at: " << parser.GetErrorLineNumber() << "(" << parser.GetErrorPosition() << ")" << std::endl;
313 DALI_TEST_CHECK(!parser.ParseError());
317 if(parser.ParseError())
319 std::cout << "Error: " << parser.GetErrorDescription() << std::endl;
320 std::cout << " at: " << parser.GetErrorLineNumber() << "(" << parser.GetErrorPosition() << ")" << std::endl;
323 DALI_TEST_CHECK(!parser.ParseError());
325 const TreeNode* root = parser.GetRoot();
326 DALI_TEST_CHECK(root);
328 const TreeNode *node = root->Find("bump");
329 DALI_TEST_CHECK(node);
331 DALI_TEST_CHECK(static_cast<int>(node->Size()) == 4);
333 DALI_TEST_CHECK( node->GetChild("duration") );
334 DALI_TEST_CHECK( node->GetChild("loop") );
335 DALI_TEST_CHECK( node->GetChild("properties") );
338 tet_result(TET_PASS);
342 int UtcDaliJsonParserMethod05(void)
344 ToolkitTestApplication application;
346 tet_infoline("JSON Pack & Write");
348 std::string s1( ReplaceQuotes(" \
357 'actor':'bump-image', \
358 'property':'uLightPosition', \
359 'value':[0.8, 0.0, -1.5], \
360 'alpha-function': 'BOUNCE', \
361 'time-period': { 'duration': 2.5 } \
369 JsonParser parser = JsonParser::New();
373 if(parser.ParseError())
375 std::cout << "Error: " << parser.GetErrorDescription() << std::endl;
376 std::cout << " at: " << parser.GetErrorLineNumber() << "(" << parser.GetErrorPosition() << ")" << std::endl;
378 DALI_TEST_CHECK(!parser.ParseError());
388 DALI_TEST_CHECK( a.str() == b.str() );
390 tet_result(TET_PASS);
397 static const int NUMBER_OK_TESTS = 36;
398 const char *TEST_OK[NUMBER_OK_TESTS] = {
399 "{ 'hex': '\u0123\u4567\u89AB\uCDEF\uabcd\uef4A' }",
400 "{ 'special': '`1~!@#$%^&*()_+-={:[,]}|;.</>?' }",
401 "{ 'slash': '/ & \' }",
402 "{'object with 1 member':['array with 1 element']}",
403 "[{}, [], -42, true, false, null]",
404 "{ 'integer': 1234567890 }",
405 "{ 'integer': 1234567890 }",
406 "{ 'real': -9876.543210 }",
407 "{ 'e': 0.123456789e-12 }",
408 "{ 'E': 1.234567890E+34 }",
409 "{ '': 23456789012E66 }",
413 "{ 'backslash': '\' }",
414 "{ 'controls': '\\b\\f\\n\\r\\t' }",
415 "{ 'alpha': 'abcdefghijklmnopqrstuvwyz' }",
416 "{ 'ALPHA': 'ABCDEFGHIJKLMNOPQRSTUVWYZ' }",
417 "{ 'digit': '0123456789' }",
418 "{ '0123456789': 'digit' }",
420 "{ 'false': false }",
424 "{ 'address': '1 Communication Centre. South Street' }",
425 "{ 'url': 'http://www.JSON.org/' }",
426 "{ 'comment': '// /* <!-- --' }",
427 "{ '# -- --> */': ' ' }",
428 "{ ' s p a c e d ' :[1,2 , 3,4 , 5 , 6 ,7 ]}",
429 "{ 'compact':[1,2,3,4,5,6,7]}",
430 "{ 'quotes': '" \\u0022 %22 0x22 034 "' }",
431 "{ '\\uCAFE\\uBABE\\uAB98\\uFCDE\\ubcda\\uef4A\\b\\f\\n\\r\\t`1~!@#$%^&*()_+-=[]{}|;:': 'A key can be any string'}",
432 "[ 0.5 ,98.6, 99.44,1066,1e1,0.1e1,1e-1,1e00,2e+00,2e-00, 'rosebud']",
433 "{'JSON Test Pattern pass3': { 'The outermost value': 'must be an object or array.', 'In this test': 'It is an object.' } }",
434 "[[[[[[[[[[[[[[[[[[['Not too deep']]]]]]]]]]]]]]]]]]]",
439 int UtcDaliJsonParserMethod06(void)
441 ToolkitTestApplication application;
443 tet_infoline("JSON Parse Success");
445 JsonParser parser = JsonParser::New();
447 for(int i = 0; i < NUMBER_OK_TESTS; ++i)
449 parser = JsonParser::New();
451 parser.Parse( ReplaceQuotes(TEST_OK[i]) );
453 if(parser.ParseError())
455 tet_printf("Valid JSON parse test %d Failed", i);
456 tet_printf("%s", ReplaceQuotes(TEST_OK[i]).c_str());
458 tet_printf("JSON Error %d:%d: %s (%d)", parser.GetErrorLineNumber(), parser.GetErrorColumn(), parser.GetErrorDescription().c_str(), parser.GetErrorPosition());
461 DALI_TEST_CHECK(!parser.ParseError());
464 tet_result(TET_PASS);
471 static const int NUMBER_FAIL_TESTS = 32;
472 const char *TEST_FAIL[] = {
473 "[' tab\t character \t in\t string ']",
475 "['Colon instead of comma': false]",
476 "{'Numbers cannot have leading zeroes': 013}",
477 "['Bad value', truth]",
478 "['Illegal backslash escape: \017']",
479 "['Bad value', truth]['Illegal backslash escape: \017']",
480 "{'Comma instead if closing brace': true,",
481 "{'Double colon':: null}",
482 "{'Extra comma': true,}",
484 "{'Illegal invocation': alert()}",
485 "{'Missing colon' null}",
487 "{unquoted_key: 'keys must be quoted'}",
488 "'A JSON payload should be an object or array, not a string.'",
490 "{'Illegal expression': 1 + 2}",
491 "{'Extra value after close': true} 'misplaced quoted value'",
495 "['Comma after the close'],",
496 "['double extra comma',,]",
497 "['Illegal backslash escape: \x15']",
499 "{'Comma instead of colon', null}",
503 "{'Numbers cannot be hex': 0x14}",
504 "[ , '<-- missing value']",
508 int UtcDaliJsonParserMethod07(void)
510 ToolkitTestApplication application;
512 tet_infoline("JSON Fail");
514 JsonParser parser = JsonParser::New();
516 for(int i = 0; i < NUMBER_FAIL_TESTS; ++i)
518 parser = JsonParser::New();
520 parser.Parse( ReplaceQuotes(TEST_FAIL[i]) );
522 if(!parser.ParseError())
524 tet_printf("Invalid JSON parse test %d Failed", i);
525 tet_printf("%s", ReplaceQuotes(TEST_FAIL[i]).c_str());
526 tet_printf("JSON Error %d:%d %s (%s)", parser.GetErrorLineNumber(), parser.GetErrorColumn(),
527 parser.GetErrorDescription().c_str(), parser.GetErrorPosition());
530 DALI_TEST_CHECK(parser.ParseError());
534 parser = JsonParser::New();
536 parser.Parse( "['single quote']" );
538 if(!parser.ParseError())
540 tet_printf("['single quote']");
543 DALI_TEST_CHECK(parser.ParseError());
545 tet_result(TET_PASS);
549 int UtcDaliJsonParserMethod08(void)
551 ToolkitTestApplication application;
553 tet_infoline("JSON error reporting");
555 std::string s1( ReplaceQuotes("\
561 JsonParser parser = JsonParser::New();
565 DALI_TEST_CHECK(parser.ParseError());
567 DALI_TEST_CHECK(1 == parser.GetErrorLineNumber());
568 DALI_TEST_CHECK(53 == parser.GetErrorPosition());
569 DALI_TEST_CHECK(11 == parser.GetErrorColumn());
571 tet_result(TET_PASS);
575 int UtcDaliJsonParserMethod09(void)
577 ToolkitTestApplication application;
579 tet_infoline("JSON Pack()");
581 std::string s1( ReplaceQuotes("\
589 'object':{'key':'value'} \
593 JsonParser parser = JsonParser::New();
597 std::stringstream ss1;
598 parser.Write(ss1, 2);
600 parser.Pack(); // Pack() moves strings
602 std::stringstream ss2;
603 parser.Write(ss2, 2);
605 DALI_TEST_CHECK(ss1.str() == ss2.str());
607 tet_result(TET_PASS);
611 int UtcDaliJsonParserMethod10(void)
613 ToolkitTestApplication application;
615 tet_infoline("JSON basic test");
617 std::string s1( "" );
619 JsonParser parser = JsonParser::New();
623 DALI_TEST_CHECK(parser.ParseError());
625 tet_result(TET_PASS);