Json.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. #include "pch.h"
  2. #include "CppUnitTest.h"
  3. #include <Json.h>
  4. using namespace Microsoft::VisualStudio::CppUnitTestFramework;
  5. namespace FrameworkTests
  6. {
  7. TEST_CLASS(JSONParserTests)
  8. {
  9. public:
  10. TEST_METHOD(NullTest)
  11. {
  12. Framework::JSON::JSONValue* value = Framework::JSON::Parser::getValue("null");
  13. Assert::IsTrue(value != 0, L"Framework::JSON::Parser::getValue('null') should not return 0");
  14. Assert::IsTrue(value->getType() == Framework::JSON::JSONType::NULL_, L"Framework::JSON::Parser::getValue('null') should return a json null value");
  15. value->release();
  16. }
  17. TEST_METHOD(BooleanTest)
  18. {
  19. Framework::JSON::JSONValue* value = Framework::JSON::Parser::getValue("false");
  20. Assert::IsTrue(value != 0, L"Framework::JSON::Parser::getValue('false') should not return 0");
  21. Assert::IsTrue(value->getType() == Framework::JSON::JSONType::BOOLEAN, L"Framework::JSON::Parser::getValue('false') should return a boolean");
  22. Assert::IsTrue(((Framework::JSON::JSONBool*)value)->getBool() == false, L"Framework::JSON::Parser::getValue('false') should return a boolean with value false");
  23. value->release();
  24. value = Framework::JSON::Parser::getValue("true");
  25. Assert::IsTrue(value != 0, L"Framework::JSON::Parser::getValue('true') should not return 0");
  26. Assert::IsTrue(value->getType() == Framework::JSON::JSONType::BOOLEAN, L"Framework::JSON::Parser::getValue('true') should return a boolean");
  27. Assert::IsTrue(((Framework::JSON::JSONBool*)value)->getBool() == true, L"Framework::JSON::Parser::getValue('true') should return a boolean with value true");
  28. value->release();
  29. }
  30. TEST_METHOD(StringTest)
  31. {
  32. Framework::JSON::JSONValue* value = Framework::JSON::Parser::getValue("\"test\"");
  33. Assert::IsTrue(value != 0, L"Framework::JSON::Parser::getValue('\"test\"') should not return 0");
  34. Assert::IsTrue(value->getType() == Framework::JSON::JSONType::STRING, L"Framework::JSON::Parser::getValue('\"test\"') should return a string");
  35. Assert::IsTrue(((Framework::JSON::JSONString*)value)->getString().istGleich("test"), L"Framework::JSON::Parser::getValue('\"test\"') should return a string with value 'test'");
  36. value->release();
  37. value = Framework::JSON::Parser::getValue("\"\"");
  38. Assert::IsTrue(value != 0, L"Framework::JSON::Parser::getValue('\"\"') should not return 0");
  39. Assert::IsTrue(value->getType() == Framework::JSON::JSONType::STRING, L"Framework::JSON::Parser::getValue('\"\"') should return a string");
  40. Assert::IsTrue(((Framework::JSON::JSONString*)value)->getString().istGleich(""), L"Framework::JSON::Parser::getValue('\"\"') should return a string with value ''");
  41. value->release();
  42. }
  43. TEST_METHOD(NumberTest)
  44. {
  45. Framework::JSON::JSONValue* value = Framework::JSON::Parser::getValue("0");
  46. Assert::IsTrue(value != 0, L"Framework::JSON::Parser::getValue('0') should not return 0");
  47. Assert::IsTrue(value->getType() == Framework::JSON::JSONType::NUMBER, L"Framework::JSON::Parser::getValue('0') should return a number");
  48. Assert::IsTrue(((Framework::JSON::JSONNumber*)value)->getNumber() == 0.0, L"Framework::JSON::Parser::getValue('0') should return a number with value '0'");
  49. value->release();
  50. value = Framework::JSON::Parser::getValue("1.5");
  51. Assert::IsTrue(value != 0, L"Framework::JSON::Parser::getValue('1.5') should not return 0");
  52. Assert::IsTrue(value->getType() == Framework::JSON::JSONType::NUMBER, L"Framework::JSON::Parser::getValue('1.5') should return a number");
  53. Assert::IsTrue(((Framework::JSON::JSONNumber*)value)->getNumber() == 1.5, L"Framework::JSON::Parser::getValue('1.5') should return a number with value '1.5'");
  54. value->release();
  55. value = Framework::JSON::Parser::getValue("-1.5");
  56. Assert::IsTrue(value != 0, L"Framework::JSON::Parser::getValue('-1.5') should not return 0");
  57. Assert::IsTrue(value->getType() == Framework::JSON::JSONType::NUMBER, L"Framework::JSON::Parser::getValue('-1.5') should return a number");
  58. Assert::IsTrue(((Framework::JSON::JSONNumber*)value)->getNumber() == -1.5, L"Framework::JSON::Parser::getValue('-1.5') should return a number with value '-1.5'");
  59. value->release();
  60. value = Framework::JSON::Parser::getValue("-5.0");
  61. Assert::IsTrue(value != 0, L"Framework::JSON::Parser::getValue('-5.0') should not return 0");
  62. Assert::IsTrue(value->getType() == Framework::JSON::JSONType::NUMBER, L"Framework::JSON::Parser::getValue('-5.0') should return a number");
  63. Assert::IsTrue(((Framework::JSON::JSONNumber*)value)->getNumber() == -5.0, L"Framework::JSON::Parser::getValue('-5.0') should return a number with value '-5.0'");
  64. value->release();
  65. }
  66. TEST_METHOD(ArrayTest)
  67. {
  68. Framework::JSON::JSONValue* value = Framework::JSON::Parser::getValue("[]");
  69. Assert::IsTrue(value != 0, L"Framework::JSON::Parser::getValue('[]') should not return 0");
  70. Assert::IsTrue(value->getType() == Framework::JSON::JSONType::ARRAY, L"Framework::JSON::Parser::getValue('[]') should return an array");
  71. Assert::IsTrue(((Framework::JSON::JSONArray*)value)->getLength() == 0, L"Framework::JSON::Parser::getValue('[]') should return an array with length 0");
  72. value->release();
  73. value = Framework::JSON::Parser::getValue(" \t[ \r\n\tnull , \r\n\t 1,true , \"\" ] ");
  74. Assert::IsTrue(value != 0, L"Framework::JSON::Parser::getValue('[null, 1, true, \"\"]') should not return 0");
  75. Assert::IsTrue(value->getType() == Framework::JSON::JSONType::ARRAY, L"Framework::JSON::Parser::getValue('[null, 1, true, \"\"]') should return an array");
  76. Assert::IsTrue(((Framework::JSON::JSONArray*)value)->getLength() == 4, L"Framework::JSON::Parser::getValue('[null, 1, true, \"\"]') should return an array with length 4");
  77. Assert::IsTrue(((Framework::JSON::JSONArray*)value)->isValueOfType(0, Framework::JSON::JSONType::NULL_), L"Framework::JSON::Parser::getValue('[null, 1, true, \"\"]') should contain null at index 0");
  78. Assert::IsTrue(((Framework::JSON::JSONArray*)value)->isValueOfType(1, Framework::JSON::JSONType::NUMBER), L"Framework::JSON::Parser::getValue('[null, 1, true, \"\"]') should contain a number at index 1");
  79. Assert::IsTrue(((Framework::JSON::JSONArray*)value)->isValueOfType(2, Framework::JSON::JSONType::BOOLEAN), L"Framework::JSON::Parser::getValue('[null, 1, true, \"\"]') should contain a boolean at index 2");
  80. Assert::IsTrue(((Framework::JSON::JSONArray*)value)->isValueOfType(3, Framework::JSON::JSONType::STRING), L"Framework::JSON::Parser::getValue('[null, 1, true, \"\"]') should contain a boolean at index 3");
  81. value->release();
  82. }
  83. TEST_METHOD(MultipleArrayTest)
  84. {
  85. Framework::JSON::JSONValue* value = Framework::JSON::Parser::getValue("[[1],2,[[]]]");
  86. Assert::IsTrue(value != 0, L"Framework::JSON::Parser::getValue('[[1],2,[[]]]') should not return 0");
  87. Assert::IsTrue(value->getType() == Framework::JSON::JSONType::ARRAY, L"Framework::JSON::Parser::getValue('[[1],2,[[]]]') should return an array");
  88. Assert::IsTrue(((Framework::JSON::JSONArray*)value)->getLength() == 3, L"Framework::JSON::Parser::getValue('[[1],2,[[]]]') should return an array with length 3");
  89. Assert::IsTrue(((Framework::JSON::JSONArray*)value)->isValueOfType(0, Framework::JSON::JSONType::ARRAY), L"Framework::JSON::Parser::getValue('[null, 1, true, \"\"]') should contain an array at index 0");
  90. Assert::IsTrue(((Framework::JSON::JSONArray*)value)->isValueOfType(1, Framework::JSON::JSONType::NUMBER), L"Framework::JSON::Parser::getValue('[null, 1, true, \"\"]') should contain a number at index 1");
  91. Assert::IsTrue(((Framework::JSON::JSONArray*)value)->isValueOfType(2, Framework::JSON::JSONType::ARRAY), L"Framework::JSON::Parser::getValue('[null, 1, true, \"\"]') should contain an array at index 2");
  92. value->release();
  93. }
  94. TEST_METHOD(ObjectTest)
  95. {
  96. Framework::JSON::JSONValue* value = Framework::JSON::Parser::getValue("{\" \": []}");
  97. Assert::IsTrue(value != 0, L"Framework::JSON::Parser::getValue('{\"\": []}') should not return 0");
  98. Assert::IsTrue(value->getType() == Framework::JSON::JSONType::OBJECT, L"Framework::JSON::Parser::getValue('{\" \": []}') should return an object");
  99. Assert::IsTrue(((Framework::JSON::JSONObject*)value)->getFieldCount() == 1, L"Framework::JSON::Parser::getValue('{\" \": []}') should return an object with one attribute");
  100. Assert::IsTrue(((Framework::JSON::JSONObject*)value)->isValueOfType(" ", Framework::JSON::JSONType::ARRAY), L"Framework::JSON::Parser::getValue('{\" \": []}') should contain an array at attribute ' '");
  101. value->release();
  102. }
  103. TEST_METHOD(ToStringTest)
  104. {
  105. Framework::JSON::JSONValue* value = Framework::JSON::Parser::getValue("{\" \": [1, true, false, 0.0, {}], \"t\": null}");
  106. Framework::JSON::JSONValue* value2 = Framework::JSON::Parser::getValue(value->toString());
  107. Assert::IsTrue(isEqual(value, value2), L"Framework::JSON::Parser::getValue(value.toString()) should return a json value eqal to value");
  108. value->release();
  109. value2->release();
  110. }
  111. bool isEqual(Framework::JSON::JSONValue* a, Framework::JSON::JSONValue* b)
  112. {
  113. if (a->getType() != b->getType()) return 0;
  114. switch (a->getType())
  115. {
  116. case Framework::JSON::JSONType::NUMBER:
  117. return ((Framework::JSON::JSONNumber*)a)->getNumber() == ((Framework::JSON::JSONNumber*)b)->getNumber();
  118. case Framework::JSON::JSONType::BOOLEAN:
  119. return ((Framework::JSON::JSONBool*)a)->getBool() == ((Framework::JSON::JSONBool*)b)->getBool();
  120. case Framework::JSON::JSONType::STRING:
  121. return ((Framework::JSON::JSONString*)a)->getString().istGleich(((Framework::JSON::JSONString*)b)->getString());
  122. case Framework::JSON::JSONType::ARRAY:
  123. {
  124. Framework::JSON::JSONArray* arrayA = (Framework::JSON::JSONArray*)a;
  125. Framework::JSON::JSONArray* arrayB = (Framework::JSON::JSONArray*)b;
  126. if (arrayA->getLength() != arrayB->getLength()) return 0;
  127. for (int i = 0; i < arrayA->getLength(); i++)
  128. {
  129. Framework::JSON::JSONValue* entryA = arrayA->getValue(i);
  130. Framework::JSON::JSONValue* entryB = arrayB->getValue(i);
  131. bool eq = isEqual(entryA, entryB);
  132. entryA->release();
  133. entryB->release();
  134. if (!eq) return 0;
  135. }
  136. return 1;
  137. }
  138. case Framework::JSON::JSONType::OBJECT:
  139. {
  140. Framework::JSON::JSONObject* objA = (Framework::JSON::JSONObject*)a;
  141. Framework::JSON::JSONObject* objB = (Framework::JSON::JSONObject*)b;
  142. if (objA->getFieldCount() != objB->getFieldCount()) return 0;
  143. auto oaf = objA->getFields();
  144. while (oaf)
  145. {
  146. if (!objB->hasValue(oaf)) return 0;
  147. Framework::JSON::JSONValue* entryA = objA->getValue(oaf);
  148. Framework::JSON::JSONValue* entryB = objB->getValue(oaf);
  149. bool eq = isEqual(entryA, entryB);
  150. entryA->release();
  151. entryB->release();
  152. if (!eq) return 0;
  153. oaf++;
  154. }
  155. return 1;
  156. }
  157. }
  158. return 1;
  159. }
  160. TEST_METHOD(ToArrayTest)
  161. {
  162. Framework::JSON::JSONArray* jArray = Framework::JSON::Parser::getValue("[1,2,3,4,5,6,7,8,9,10]")->asArray();
  163. Framework::Array<int>* numberArray = jArray->toArray<int>([](Framework::JSON::JSONValue& v)
  164. {
  165. return (int)v.asNumber()->getNumber();
  166. });
  167. Assert::IsTrue(numberArray->getEintragAnzahl() == 10, L"Array hat die falsche Anzahl an elementen");
  168. Assert::IsTrue(numberArray->get(2) == 3, L"Array hat mindestens ein falsches element");
  169. Assert::IsTrue(numberArray->get(7) == 8, L"Array hat mindestens ein falsches element");
  170. numberArray->release();
  171. numberArray = jArray->toArray<int>([](Framework::JSON::JSONValue& v)
  172. {
  173. return (int)v.asNumber()->getNumber() % 2 == 0;
  174. }, [](Framework::JSON::JSONValue& v)
  175. {
  176. return (int)v.asNumber()->getNumber();
  177. });
  178. Assert::IsTrue(numberArray->get(0) == 2, L"Array hat mindestens ein falsches element");
  179. Assert::IsTrue(numberArray->get(3) == 8, L"Array hat mindestens ein falsches element");
  180. jArray->release();
  181. }
  182. TEST_METHOD(ToRCArrayTest)
  183. {
  184. Framework::JSON::JSONArray* jArray = Framework::JSON::Parser::getValue("[\"1\",\"2\",\"3\",\"4\",\"5\"]")->asArray();
  185. Framework::RCArray<Framework::Text>* numberArray = jArray->toRCArray<Framework::Text>([](Framework::JSON::JSONValue& v)
  186. {
  187. return new Framework::Text(v.asString()->getString());
  188. });
  189. Assert::IsTrue(numberArray->getEintragAnzahl() == 5, L"Array hat die falsche Anzahl an elementen");
  190. Assert::IsTrue(numberArray->z(1)->istGleich("2"), L"Array hat mindestens ein falsches element");
  191. Assert::IsTrue(numberArray->z(4)->istGleich("5"), L"Array hat mindestens ein falsches element");
  192. numberArray->release();
  193. numberArray = jArray->toRCArray<Framework::Text>([](Framework::JSON::JSONValue& v)
  194. {
  195. return (int)v.asString()->getString() % 2 == 0;
  196. }, [](Framework::JSON::JSONValue& v)
  197. {
  198. return new Framework::Text(v.asString()->getString());
  199. });
  200. Assert::IsTrue(numberArray->z(0)->istGleich("2"), L"Array hat mindestens ein falsches element");
  201. Assert::IsTrue(numberArray->z(1)->istGleich("4"), L"Array hat mindestens ein falsches element");
  202. jArray->release();
  203. }
  204. class TestObject
  205. {
  206. public:
  207. Framework::Text name;
  208. Framework::Text value;
  209. };
  210. TEST_METHOD(ParseObjectTest)
  211. {
  212. Framework::JSON::JSONObject* jObj = Framework::JSON::Parser::getValue("{\"name\": \"test\", \"value\": \"1234\"}")->asObject();
  213. TestObject* obj = jObj->parseTo<TestObject>(new TestObject(), [](TestObject* obj, Framework::Text attrName, Framework::JSON::JSONValue& v)
  214. {
  215. if (attrName.istGleich("name"))
  216. {
  217. obj->name = v.asString()->getString();
  218. }
  219. else
  220. {
  221. obj->value = v.asString()->getString();
  222. }
  223. });
  224. Assert::IsTrue(obj->name.istGleich("test"), L"Feld hat falschen wert");
  225. Assert::IsTrue(obj->value.istGleich("1234"), L"Feld hat falschen wert");
  226. delete obj;
  227. jObj->release();
  228. }
  229. TEST_METHOD(FromArrayTest)
  230. {
  231. Framework::Array<int> arr;
  232. arr.add(1);
  233. arr.add(2);
  234. arr.add(3);
  235. arr.add(4);
  236. Framework::JSON::JSONArray* jArray = Framework::JSON::JSONArray::fromArray<int>(arr, [](int v)
  237. {
  238. return new Framework::JSON::JSONNumber(v);
  239. });
  240. Assert::IsTrue(jArray->getLength() == 4, L"Array hat falsche länge");
  241. Framework::JSON::JSONNumber* n = jArray->getValue(1)->asNumber();
  242. Assert::IsTrue(n->getNumber() == 2, L"Array hat mindestens einen falschen Wert");
  243. n->release();
  244. jArray->release();
  245. Framework::RCArray<Framework::Text> rcArr;
  246. rcArr.add(new Framework::Text("1"));
  247. rcArr.add(new Framework::Text("2"));
  248. rcArr.add(new Framework::Text("3"));
  249. rcArr.add(new Framework::Text("4"));
  250. jArray = Framework::JSON::JSONArray::fromRCArray<Framework::Text>(rcArr, [](Framework::Text& v)
  251. {
  252. return new Framework::JSON::JSONString(v);
  253. });
  254. Assert::IsTrue(jArray->getLength() == 4, L"Array hat falsche länge");
  255. Framework::JSON::JSONString* s = jArray->getValue(2)->asString();
  256. Assert::IsTrue(s->getString().istGleich("3"), L"Array hat mindestens einen falschen Wert");
  257. s->release();
  258. jArray->release();
  259. }
  260. };
  261. }