Json.cpp 48 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006
  1. #include "pch.h"
  2. #define NO_MAIN
  3. #include <DataValidator.h>
  4. #include <Json.h>
  5. #include <main.h>
  6. #include "CppUnitTest.h"
  7. using namespace Microsoft::VisualStudio::CppUnitTestFramework;
  8. namespace FrameworkTests
  9. {
  10. TEST_CLASS (JSONParserTests)
  11. {
  12. public:
  13. TEST_METHOD (NullTest)
  14. {
  15. Framework::JSON::JSONValue* value
  16. = Framework::JSON::Parser::getValue("null");
  17. Assert::IsTrue(value != 0,
  18. L"Framework::JSON::Parser::getValue('null') should not return "
  19. L"0");
  20. Assert::IsTrue(value->getType() == Framework::AbstractType::NULL_,
  21. L"Framework::JSON::Parser::getValue('null') should return a "
  22. L"json null value");
  23. value->release();
  24. }
  25. TEST_METHOD (BooleanTest)
  26. {
  27. Framework::JSON::JSONValue* value
  28. = Framework::JSON::Parser::getValue("false");
  29. Assert::IsTrue(value != 0,
  30. L"Framework::JSON::Parser::getValue('false') should not return "
  31. L"0");
  32. Assert::IsTrue(value->getType() == Framework::AbstractType::BOOLEAN,
  33. L"Framework::JSON::Parser::getValue('false') should return a "
  34. L"boolean");
  35. Assert::IsTrue(
  36. ((Framework::JSON::JSONBool*)value)->getBool() == false,
  37. L"Framework::JSON::Parser::getValue('false') should return a "
  38. L"boolean with value false");
  39. value->release();
  40. value = Framework::JSON::Parser::getValue("true");
  41. Assert::IsTrue(value != 0,
  42. L"Framework::JSON::Parser::getValue('true') should not return "
  43. L"0");
  44. Assert::IsTrue(value->getType() == Framework::AbstractType::BOOLEAN,
  45. L"Framework::JSON::Parser::getValue('true') should return a "
  46. L"boolean");
  47. Assert::IsTrue(
  48. ((Framework::JSON::JSONBool*)value)->getBool() == true,
  49. L"Framework::JSON::Parser::getValue('true') should return a "
  50. L"boolean with value true");
  51. value->release();
  52. }
  53. TEST_METHOD (StringTest)
  54. {
  55. Framework::JSON::JSONValue* value
  56. = Framework::JSON::Parser::getValue("\"test\"");
  57. Assert::IsTrue(value != 0,
  58. L"Framework::JSON::Parser::getValue('\"test\"') should not "
  59. L"return 0");
  60. Assert::IsTrue(value->getType() == Framework::AbstractType::STRING,
  61. L"Framework::JSON::Parser::getValue('\"test\"') should return "
  62. L"a string");
  63. Assert::IsTrue(((Framework::JSON::JSONString*)value)
  64. ->getString()
  65. .istGleich("test"),
  66. L"Framework::JSON::Parser::getValue('\"test\"') should return "
  67. L"a string with value 'test'");
  68. value->release();
  69. value = Framework::JSON::Parser::getValue("\"\"");
  70. Assert::IsTrue(value != 0,
  71. L"Framework::JSON::Parser::getValue('\"\"') should not return "
  72. L"0");
  73. Assert::IsTrue(value->getType() == Framework::AbstractType::STRING,
  74. L"Framework::JSON::Parser::getValue('\"\"') should return a "
  75. L"string");
  76. Assert::IsTrue(((Framework::JSON::JSONString*)value)
  77. ->getString()
  78. .istGleich(""),
  79. L"Framework::JSON::Parser::getValue('\"\"') should return a "
  80. L"string with value ''");
  81. value->release();
  82. }
  83. TEST_METHOD (NumberTest)
  84. {
  85. Framework::JSON::JSONValue* value
  86. = Framework::JSON::Parser::getValue("0");
  87. Assert::IsTrue(value != 0,
  88. L"Framework::JSON::Parser::getValue('0') should not return 0");
  89. Assert::IsTrue(value->getType() == Framework::AbstractType::NUMBER,
  90. L"Framework::JSON::Parser::getValue('0') should return a "
  91. L"number");
  92. Assert::IsTrue(
  93. ((Framework::JSON::JSONNumber*)value)->getNumber() == 0.0,
  94. L"Framework::JSON::Parser::getValue('0') should return a "
  95. L"number with value '0'");
  96. value->release();
  97. value = Framework::JSON::Parser::getValue("1.5");
  98. Assert::IsTrue(value != 0,
  99. L"Framework::JSON::Parser::getValue('1.5') should not return "
  100. L"0");
  101. Assert::IsTrue(value->getType() == Framework::AbstractType::NUMBER,
  102. L"Framework::JSON::Parser::getValue('1.5') should return a "
  103. L"number");
  104. Assert::IsTrue(
  105. ((Framework::JSON::JSONNumber*)value)->getNumber() == 1.5,
  106. L"Framework::JSON::Parser::getValue('1.5') should return a "
  107. L"number with value '1.5'");
  108. value->release();
  109. value = Framework::JSON::Parser::getValue("-1.5");
  110. Assert::IsTrue(value != 0,
  111. L"Framework::JSON::Parser::getValue('-1.5') should not return "
  112. L"0");
  113. Assert::IsTrue(value->getType() == Framework::AbstractType::NUMBER,
  114. L"Framework::JSON::Parser::getValue('-1.5') should return a "
  115. L"number");
  116. Assert::IsTrue(
  117. ((Framework::JSON::JSONNumber*)value)->getNumber() == -1.5,
  118. L"Framework::JSON::Parser::getValue('-1.5') should return a "
  119. L"number with value '-1.5'");
  120. value->release();
  121. value = Framework::JSON::Parser::getValue("-5.0");
  122. Assert::IsTrue(value != 0,
  123. L"Framework::JSON::Parser::getValue('-5.0') should not return "
  124. L"0");
  125. Assert::IsTrue(value->getType() == Framework::AbstractType::NUMBER,
  126. L"Framework::JSON::Parser::getValue('-5.0') should return a "
  127. L"number");
  128. Assert::IsTrue(
  129. ((Framework::JSON::JSONNumber*)value)->getNumber() == -5.0,
  130. L"Framework::JSON::Parser::getValue('-5.0') should return a "
  131. L"number with value '-5.0'");
  132. value->release();
  133. }
  134. TEST_METHOD (ArrayTest)
  135. {
  136. Framework::JSON::JSONValue* value
  137. = Framework::JSON::Parser::getValue("[]");
  138. Assert::IsTrue(value != 0,
  139. L"Framework::JSON::Parser::getValue('[]') should not return 0");
  140. Assert::IsTrue(value->getType() == Framework::AbstractType::ARRAY,
  141. L"Framework::JSON::Parser::getValue('[]') should return an "
  142. L"array");
  143. Assert::IsTrue(
  144. ((Framework::JSON::JSONArray*)value)->getLength() == 0,
  145. L"Framework::JSON::Parser::getValue('[]') should return an "
  146. L"array with length 0");
  147. value->release();
  148. value = Framework::JSON::Parser::getValue(
  149. " \t[ \r\n\tnull , \r\n\t 1,true , \"\" ] ");
  150. Assert::IsTrue(value != 0,
  151. L"Framework::JSON::Parser::getValue('[null, 1, true, \"\"]') "
  152. L"should not return 0");
  153. Assert::IsTrue(value->getType() == Framework::AbstractType::ARRAY,
  154. L"Framework::JSON::Parser::getValue('[null, 1, true, \"\"]') "
  155. L"should return an array");
  156. Assert::IsTrue(
  157. ((Framework::JSON::JSONArray*)value)->getLength() == 4,
  158. L"Framework::JSON::Parser::getValue('[null, 1, true, \"\"]') "
  159. L"should return an array with length 4");
  160. Assert::IsTrue(
  161. ((Framework::JSON::JSONArray*)value)
  162. ->isValueOfType(0, Framework::AbstractType::NULL_),
  163. L"Framework::JSON::Parser::getValue('[null, 1, true, \"\"]') "
  164. L"should contain null at index 0");
  165. Assert::IsTrue(
  166. ((Framework::JSON::JSONArray*)value)
  167. ->isValueOfType(1, Framework::AbstractType::NUMBER),
  168. L"Framework::JSON::Parser::getValue('[null, 1, true, \"\"]') "
  169. L"should contain a number at index 1");
  170. Assert::IsTrue(
  171. ((Framework::JSON::JSONArray*)value)
  172. ->isValueOfType(2, Framework::AbstractType::BOOLEAN),
  173. L"Framework::JSON::Parser::getValue('[null, 1, true, \"\"]') "
  174. L"should contain a boolean at index 2");
  175. Assert::IsTrue(
  176. ((Framework::JSON::JSONArray*)value)
  177. ->isValueOfType(3, Framework::AbstractType::STRING),
  178. L"Framework::JSON::Parser::getValue('[null, 1, true, \"\"]') "
  179. L"should contain a boolean at index 3");
  180. value->release();
  181. }
  182. TEST_METHOD (MultipleArrayTest)
  183. {
  184. Framework::JSON::JSONValue* value
  185. = Framework::JSON::Parser::getValue("[[1],2,[[]]]");
  186. Assert::IsTrue(value != 0,
  187. L"Framework::JSON::Parser::getValue('[[1],2,[[]]]') should not "
  188. L"return 0");
  189. Assert::IsTrue(value->getType() == Framework::AbstractType::ARRAY,
  190. L"Framework::JSON::Parser::getValue('[[1],2,[[]]]') should "
  191. L"return an array");
  192. Assert::IsTrue(
  193. ((Framework::JSON::JSONArray*)value)->getLength() == 3,
  194. L"Framework::JSON::Parser::getValue('[[1],2,[[]]]') should "
  195. L"return an array with length 3");
  196. Assert::IsTrue(
  197. ((Framework::JSON::JSONArray*)value)
  198. ->isValueOfType(0, Framework::AbstractType::ARRAY),
  199. L"Framework::JSON::Parser::getValue('[null, 1, true, \"\"]') "
  200. L"should contain an array at index 0");
  201. Assert::IsTrue(
  202. ((Framework::JSON::JSONArray*)value)
  203. ->isValueOfType(1, Framework::AbstractType::NUMBER),
  204. L"Framework::JSON::Parser::getValue('[null, 1, true, \"\"]') "
  205. L"should contain a number at index 1");
  206. Assert::IsTrue(
  207. ((Framework::JSON::JSONArray*)value)
  208. ->isValueOfType(2, Framework::AbstractType::ARRAY),
  209. L"Framework::JSON::Parser::getValue('[null, 1, true, \"\"]') "
  210. L"should contain an array at index 2");
  211. value->release();
  212. }
  213. TEST_METHOD (ObjectTest)
  214. {
  215. Framework::JSON::JSONValue* value
  216. = Framework::JSON::Parser::getValue("{\" \": []}");
  217. Assert::IsTrue(value != 0,
  218. L"Framework::JSON::Parser::getValue('{\"\": []}') should not "
  219. L"return 0");
  220. Assert::IsTrue(value->getType() == Framework::AbstractType::OBJECT,
  221. L"Framework::JSON::Parser::getValue('{\" \": []}') should "
  222. L"return an object");
  223. Assert::IsTrue(
  224. ((Framework::JSON::JSONObject*)value)->getFieldCount() == 1,
  225. L"Framework::JSON::Parser::getValue('{\" \": []}') should "
  226. L"return an object with one attribute");
  227. Assert::IsTrue(
  228. ((Framework::JSON::JSONObject*)value)
  229. ->isValueOfType(" ", Framework::AbstractType::ARRAY),
  230. L"Framework::JSON::Parser::getValue('{\" \": []}') should "
  231. L"contain an array at attribute ' '");
  232. value->release();
  233. }
  234. TEST_METHOD (ToStringTest)
  235. {
  236. Framework::JSON::JSONValue* value
  237. = Framework::JSON::Parser::getValue(
  238. "{\" \": [1, true, false, 0.0, {}], \"t\": null}");
  239. Framework::JSON::JSONValue* value2
  240. = Framework::JSON::Parser::getValue(value->toString());
  241. Assert::IsTrue(isEqual(value, value2),
  242. L"Framework::JSON::Parser::getValue(value.toString()) should "
  243. L"return a json value eqal to value");
  244. value->release();
  245. value2->release();
  246. }
  247. static bool isEqual(
  248. Framework::JSON::JSONValue * a, Framework::JSON::JSONValue * b)
  249. {
  250. if (a->getType() != b->getType()) return 0;
  251. switch (a->getType())
  252. {
  253. case Framework::AbstractType::NUMBER:
  254. return ((Framework::JSON::JSONNumber*)a)->getNumber()
  255. == ((Framework::JSON::JSONNumber*)b)->getNumber();
  256. case Framework::AbstractType::BOOLEAN:
  257. return ((Framework::JSON::JSONBool*)a)->getBool()
  258. == ((Framework::JSON::JSONBool*)b)->getBool();
  259. case Framework::AbstractType::STRING:
  260. return ((Framework::JSON::JSONString*)a)
  261. ->getString()
  262. .istGleich(((Framework::JSON::JSONString*)b)->getString());
  263. case Framework::AbstractType::ARRAY:
  264. {
  265. Framework::JSON::JSONArray* arrayA
  266. = (Framework::JSON::JSONArray*)a;
  267. Framework::JSON::JSONArray* arrayB
  268. = (Framework::JSON::JSONArray*)b;
  269. if (arrayA->getLength() != arrayB->getLength()) return 0;
  270. for (int i = 0; i < arrayA->getLength(); i++)
  271. {
  272. Framework::JSON::JSONValue* entryA
  273. = arrayA->getValue(i);
  274. Framework::JSON::JSONValue* entryB
  275. = arrayB->getValue(i);
  276. bool eq = isEqual(entryA, entryB);
  277. entryA->release();
  278. entryB->release();
  279. if (!eq) return 0;
  280. }
  281. return 1;
  282. }
  283. case Framework::AbstractType::OBJECT:
  284. {
  285. Framework::JSON::JSONObject* objA
  286. = (Framework::JSON::JSONObject*)a;
  287. Framework::JSON::JSONObject* objB
  288. = (Framework::JSON::JSONObject*)b;
  289. if (objA->getFieldCount() != objB->getFieldCount())
  290. return 0;
  291. auto oaf = objA->getFields();
  292. while (oaf)
  293. {
  294. if (!objB->hasValue(oaf)) return 0;
  295. Framework::JSON::JSONValue* entryA
  296. = objA->getValue(oaf);
  297. Framework::JSON::JSONValue* entryB
  298. = objB->getValue(oaf);
  299. bool eq = isEqual(entryA, entryB);
  300. entryA->release();
  301. entryB->release();
  302. if (!eq) return 0;
  303. oaf++;
  304. }
  305. return 1;
  306. }
  307. }
  308. return 1;
  309. }
  310. TEST_METHOD (ToArrayTest)
  311. {
  312. Framework::JSON::JSONArray* jArray
  313. = Framework::JSON::Parser::getValue("[1,2,3,4,5,6,7,8,9,10]")
  314. ->asArray();
  315. Framework::Array<int>* numberArray
  316. = jArray->toArray<int>([](Framework::JSON::JSONValue& v) {
  317. return (int)v.asNumber()->getNumber();
  318. });
  319. Assert::IsTrue(numberArray->getEintragAnzahl() == 10,
  320. L"Array hat die falsche Anzahl an elementen");
  321. Assert::IsTrue(numberArray->get(2) == 3,
  322. L"Array hat mindestens ein falsches element");
  323. Assert::IsTrue(numberArray->get(7) == 8,
  324. L"Array hat mindestens ein falsches element");
  325. numberArray->release();
  326. numberArray = jArray->toArray<int>(
  327. [](Framework::JSON::JSONValue& v) {
  328. return (int)v.asNumber()->getNumber() % 2 == 0;
  329. },
  330. [](Framework::JSON::JSONValue& v) {
  331. return (int)v.asNumber()->getNumber();
  332. });
  333. Assert::IsTrue(numberArray->get(0) == 2,
  334. L"Array hat mindestens ein falsches element");
  335. Assert::IsTrue(numberArray->get(3) == 8,
  336. L"Array hat mindestens ein falsches element");
  337. jArray->release();
  338. }
  339. TEST_METHOD (ToRCArrayTest)
  340. {
  341. Framework::JSON::JSONArray* jArray
  342. = Framework::JSON::Parser::getValue(
  343. "[\"1\",\"2\",\"3\",\"4\",\"5\"]")
  344. ->asArray();
  345. Framework::RCArray<Framework::Text>* numberArray
  346. = jArray->toRCArray<Framework::Text>(
  347. [](Framework::JSON::JSONValue& v) {
  348. return new Framework::Text(v.asString()->getString());
  349. });
  350. Assert::IsTrue(numberArray->getEintragAnzahl() == 5,
  351. L"Array hat die falsche Anzahl an elementen");
  352. Assert::IsTrue(numberArray->z(1)->istGleich("2"),
  353. L"Array hat mindestens ein falsches element");
  354. Assert::IsTrue(numberArray->z(4)->istGleich("5"),
  355. L"Array hat mindestens ein falsches element");
  356. numberArray->release();
  357. numberArray = jArray->toRCArray<Framework::Text>(
  358. [](Framework::JSON::JSONValue& v) {
  359. return (int)v.asString()->getString() % 2 == 0;
  360. },
  361. [](Framework::JSON::JSONValue& v) {
  362. return new Framework::Text(v.asString()->getString());
  363. });
  364. Assert::IsTrue(numberArray->z(0)->istGleich("2"),
  365. L"Array hat mindestens ein falsches element");
  366. Assert::IsTrue(numberArray->z(1)->istGleich("4"),
  367. L"Array hat mindestens ein falsches element");
  368. jArray->release();
  369. }
  370. class TestObject
  371. {
  372. public:
  373. Framework::Text name;
  374. Framework::Text value;
  375. };
  376. TEST_METHOD (ParseObjectTest)
  377. {
  378. Framework::JSON::JSONObject* jObj
  379. = Framework::JSON::Parser::getValue(
  380. "{\"name\": \"test\", \"value\": \"1234\"}")
  381. ->asObject();
  382. TestObject* obj = jObj->parseTo<TestObject>(new TestObject(),
  383. [](TestObject* obj,
  384. Framework::Text attrName,
  385. Framework::JSON::JSONValue& v) {
  386. if (attrName.istGleich("name"))
  387. {
  388. obj->name = v.asString()->getString();
  389. }
  390. else
  391. {
  392. obj->value = v.asString()->getString();
  393. }
  394. });
  395. Assert::IsTrue(
  396. obj->name.istGleich("test"), L"Feld hat falschen wert");
  397. Assert::IsTrue(
  398. obj->value.istGleich("1234"), L"Feld hat falschen wert");
  399. delete obj;
  400. jObj->release();
  401. }
  402. TEST_METHOD (FromArrayTest)
  403. {
  404. Framework::Array<int> arr;
  405. arr.add(1);
  406. arr.add(2);
  407. arr.add(3);
  408. arr.add(4);
  409. Framework::JSON::JSONArray* jArray
  410. = Framework::JSON::JSONArray::fromArray<int>(arr,
  411. [](int v) { return new Framework::JSON::JSONNumber(v); });
  412. Assert::IsTrue(
  413. jArray->getLength() == 4, L"Array hat falsche länge");
  414. Framework::JSON::JSONNumber* n = jArray->getValue(1)->asNumber();
  415. Assert::IsTrue(n->getNumber() == 2,
  416. L"Array hat mindestens einen falschen Wert");
  417. n->release();
  418. jArray->release();
  419. Framework::RCArray<Framework::Text> rcArr;
  420. rcArr.add(new Framework::Text("1"));
  421. rcArr.add(new Framework::Text("2"));
  422. rcArr.add(new Framework::Text("3"));
  423. rcArr.add(new Framework::Text("4"));
  424. jArray = Framework::JSON::JSONArray::fromRCArray<Framework::Text>(
  425. rcArr, [](Framework::Text& v) {
  426. return new Framework::JSON::JSONString(v);
  427. });
  428. Assert::IsTrue(
  429. jArray->getLength() == 4, L"Array hat falsche länge");
  430. Framework::JSON::JSONString* s = jArray->getValue(2)->asString();
  431. Assert::IsTrue(s->getString().istGleich("3"),
  432. L"Array hat mindestens einen falschen Wert");
  433. s->release();
  434. jArray->release();
  435. }
  436. };
  437. #ifdef DEBUG
  438. TEST_CLASS (JSONValidatorTests)
  439. {
  440. private:
  441. static OutputDebugStringBuf<char, std::char_traits<char>>
  442. charDebugOutput;
  443. static std::streambuf* buf;
  444. public:
  445. TEST_CLASS_INITIALIZE(Init)
  446. {
  447. buf = std::cout.rdbuf();
  448. std::cout.rdbuf(&charDebugOutput);
  449. }
  450. TEST_METHOD (ValidGreaterThenTest)
  451. {
  452. Framework::JSON::JSONValue* value
  453. = Framework::JSON::Parser::getValue("{\"test\": 0.001}");
  454. Framework::Validator::DataValidator* validator
  455. = Framework::Validator::DataValidator::buildForObject()
  456. ->withRequiredNumber("test")
  457. ->whichIsGreaterThen(0)
  458. ->finishNumber()
  459. ->finishObject();
  460. Framework::RCArray<Framework::Validator::ValidationResult> removed;
  461. Assert::IsTrue(
  462. validator->isValid(value), L"Valid value is marked as invalid");
  463. Framework::JSON::JSONValue* result
  464. = validator->getValidParts(value, &removed);
  465. Assert::IsTrue(
  466. result->asObject()->zValue("test")->asNumber()->getNumber()
  467. == value->asObject()
  468. ->zValue("test")
  469. ->asNumber()
  470. ->getNumber(),
  471. L"Get Valid Parts made the valid value invalid");
  472. value->release();
  473. validator->release();
  474. result->release();
  475. }
  476. TEST_METHOD (ValidateEndsWith)
  477. {
  478. Framework::JSON::JSONValue* value
  479. = Framework::JSON::Parser::getValue("{\"test\": \"100%\"}");
  480. Framework::Validator::DataValidator* validator
  481. = Framework::Validator::DataValidator::buildForObject()
  482. ->withRequiredString("test")
  483. ->whichEndsWithMatch("%")
  484. ->finishString()
  485. ->finishObject();
  486. Assert::IsTrue(
  487. validator->isValid(value), L"Valid value is marked as invalid");
  488. value->release();
  489. validator->release();
  490. }
  491. TEST_METHOD (ValidateMultipleSimpleTypes)
  492. {
  493. Framework::JSON::JSONValue* value
  494. = Framework::JSON::Parser::getValue("{\"test\": \"100%\"}");
  495. Framework::Validator::DataValidator* validator
  496. = Framework::Validator::DataValidator::buildForObject()
  497. ->withRequiredNumber("test")
  498. ->whichIsGreaterThen(0)
  499. ->finishNumber()
  500. ->withRequiredString("test")
  501. ->whichEndsWithMatch("%")
  502. ->finishString()
  503. ->withRequiredString("test")
  504. ->withExactMatch("auto")
  505. ->finishString()
  506. ->finishObject();
  507. Assert::IsTrue(
  508. validator->isValid(value), L"Valid value is marked as invalid");
  509. value->release();
  510. validator->release();
  511. }
  512. TEST_METHOD (ValidTest)
  513. {
  514. Framework::Validator::DataValidator* validator
  515. = Framework::Validator::DataValidator::buildForArray()
  516. ->addAcceptedObjectInArray()
  517. ->withRequiredNumber("x")
  518. ->whichIsLessThen(5)
  519. ->finishNumber()
  520. ->withRequiredBool("bla")
  521. ->whichIsOptional()
  522. ->withDefault(true)
  523. ->finishBool()
  524. ->finishObject()
  525. ->finishArray();
  526. Framework::JSON::JSONArray* jArray
  527. = Framework::JSON::Parser::getValue(
  528. "[{\"x\": 4, \"bla\": false}]")
  529. ->asArray();
  530. Assert::IsTrue(validator->isValid(jArray),
  531. L"A valid json Array was marked as invalid by the validator");
  532. validator->release();
  533. }
  534. TEST_METHOD (ComplexTest)
  535. {
  536. Framework::Validator::DataValidator* validator
  537. = Framework::Validator::DataValidator::buildForArray()
  538. ->typeSpecifiedByAttribute("type")
  539. ->addAcceptedObjectInArray()
  540. ->withRequiredString("type")
  541. ->withExactMatch("shaped")
  542. ->finishString()
  543. ->withRequiredString("group")
  544. ->finishString()
  545. ->withRequiredNumber("width")
  546. ->whichIsGreaterThen(0)
  547. ->finishNumber()
  548. ->withRequiredNumber("height")
  549. ->whichIsGreaterThen(0)
  550. ->finishNumber()
  551. ->withRequiredArray("inputs")
  552. ->addAcceptedObjectInArray()
  553. ->withRequiredNumber("x")
  554. ->whichIsGreaterOrEqual(0)
  555. ->finishNumber()
  556. ->withRequiredNumber("y")
  557. ->whichIsGreaterOrEqual(0)
  558. ->finishNumber()
  559. ->withRequiredObject("filter")
  560. ->withRequiredString("itemType")
  561. ->finishString()
  562. ->finishObject()
  563. ->finishObject()
  564. ->finishArray()
  565. ->withRequiredObject("output")
  566. ->withRequiredString("itemType")
  567. ->finishString()
  568. ->finishObject()
  569. ->withRequiredNumber("outputCount")
  570. ->whichIsGreaterThen(0)
  571. ->finishNumber()
  572. ->finishObject()
  573. ->addAcceptedObjectInArray()
  574. ->withRequiredString("type")
  575. ->withExactMatch("unordered")
  576. ->finishString()
  577. ->withRequiredString("group")
  578. ->finishString()
  579. ->withRequiredArray("inputs")
  580. ->addAcceptedObjectInArray()
  581. ->withRequiredNumber("count")
  582. ->whichIsGreaterThen(0)
  583. ->finishNumber()
  584. ->withRequiredObject("filter")
  585. ->withRequiredString("itemType")
  586. ->finishString()
  587. ->finishObject()
  588. ->finishObject()
  589. ->finishArray()
  590. ->withRequiredArray("output")
  591. ->addAcceptedObjectInArray()
  592. ->withRequiredObject("filter")
  593. ->withRequiredString("itemType")
  594. ->finishString()
  595. ->finishObject()
  596. ->withRequiredNumber("count")
  597. ->whichIsGreaterThen(0)
  598. ->finishNumber()
  599. ->finishObject()
  600. ->finishArray()
  601. ->finishObject()
  602. ->finishArray();
  603. std::cout << validator->zConstraints()->toString().getText()
  604. << "\n";
  605. Framework::JSON::JSONValue* value
  606. = Framework::JSON::Parser::getValue(
  607. "[{\"type\": \"shaped\",\"group\": "
  608. "\"inventory\",\"width\": 1,\"height\": 2,\"inputs\": "
  609. "[{\"x\": 0,\"y\": 0,\"filter\": {\"itemType\": "
  610. "\"Cobble\"}},{\"x\": 0,\"y\": -1,\"filter\": "
  611. "{\"itemType\": \"Cobble\"}}],\"output\": {\"itemType\": "
  612. "\"StoneTool\"},\"outputCount\": 1},{\"type\": "
  613. "\"shaped\",\"group\": \"inventory\",\"width\": "
  614. "1,\"height\": 2,\"inputs\": [{\"x\": 0,\"y\": "
  615. "0,\"filter\": {\"itemType\": \"Cobble\"}},{\"x\": "
  616. "0,\"y\": 1,\"filter\": {\"itemType\": "
  617. "\"Cobble\"}}],\"output\": {\"itemType\": "
  618. "\"StoneTool\"},\"outputCount\": 1}]");
  619. std::cout << value->toString().getText() << "\n";
  620. Framework::Validator::ValidationResult* result
  621. = validator->validate(value);
  622. std::cout << result->getInvalidInfo();
  623. Assert::IsTrue(
  624. !result->isValid(), L"Invalid Json was marked as valid");
  625. Framework::RCArray<Framework::Validator::ValidationResult>
  626. invalidParts;
  627. Framework::JSON::JSONValue* validValue
  628. = result->getValidPart(&invalidParts);
  629. Assert::IsTrue(invalidParts.getEintragAnzahl() > 0,
  630. L"No Invalid parts were returned for an invalid Json");
  631. for (Framework::Validator::ValidationResult* invalid : invalidParts)
  632. {
  633. invalid->getInvalidInfo();
  634. }
  635. result->release();
  636. Assert::IsTrue(validValue == 0,
  637. L"getValidPart of invalid validation result without "
  638. L"removeInvalidEntries or default values used in validation "
  639. L"should return 0");
  640. value->release();
  641. validator->release();
  642. }
  643. TEST_METHOD (ComplexRemoveInvalidTest)
  644. {
  645. Framework::Validator::DataValidator* validator
  646. = Framework::Validator::DataValidator::buildForArray()
  647. ->removeInvalidEntries()
  648. ->typeSpecifiedByAttribute("type")
  649. ->addAcceptedObjectInArray()
  650. ->withRequiredString("type")
  651. ->withExactMatch("shaped")
  652. ->finishString()
  653. ->withRequiredString("group")
  654. ->finishString()
  655. ->withRequiredNumber("width")
  656. ->whichIsGreaterThen(0)
  657. ->finishNumber()
  658. ->withRequiredNumber("height")
  659. ->whichIsGreaterThen(0)
  660. ->finishNumber()
  661. ->withRequiredArray("inputs")
  662. ->addAcceptedObjectInArray()
  663. ->withRequiredNumber("x")
  664. ->whichIsGreaterOrEqual(0)
  665. ->finishNumber()
  666. ->withRequiredNumber("y")
  667. ->whichIsGreaterOrEqual(0)
  668. ->finishNumber()
  669. ->withRequiredObject("filter")
  670. ->withRequiredString("itemType")
  671. ->finishString()
  672. ->finishObject()
  673. ->finishObject()
  674. ->finishArray()
  675. ->withRequiredObject("output")
  676. ->withRequiredString("itemType")
  677. ->finishString()
  678. ->finishObject()
  679. ->withRequiredNumber("outputCount")
  680. ->whichIsGreaterThen(0)
  681. ->finishNumber()
  682. ->finishObject()
  683. ->addAcceptedObjectInArray()
  684. ->withRequiredString("type")
  685. ->withExactMatch("unordered")
  686. ->finishString()
  687. ->withRequiredString("group")
  688. ->finishString()
  689. ->withRequiredArray("inputs")
  690. ->addAcceptedObjectInArray()
  691. ->withRequiredNumber("count")
  692. ->whichIsGreaterThen(0)
  693. ->finishNumber()
  694. ->withRequiredObject("filter")
  695. ->withRequiredString("itemType")
  696. ->finishString()
  697. ->finishObject()
  698. ->finishObject()
  699. ->finishArray()
  700. ->withRequiredArray("output")
  701. ->addAcceptedObjectInArray()
  702. ->withRequiredObject("filter")
  703. ->withRequiredString("itemType")
  704. ->finishString()
  705. ->finishObject()
  706. ->withRequiredNumber("count")
  707. ->whichIsGreaterThen(0)
  708. ->finishNumber()
  709. ->finishObject()
  710. ->finishArray()
  711. ->finishObject()
  712. ->finishArray();
  713. std::cout << validator->zConstraints()->toString().getText()
  714. << "\n";
  715. Framework::JSON::JSONValue* value
  716. = Framework::JSON::Parser::getValue(
  717. "[{\"type\": \"shaped\",\"group\": "
  718. "\"inventory\",\"width\": 1,\"height\": 2,\"inputs\": "
  719. "[{\"x\": 0,\"y\": 0,\"filter\": {\"itemType\": "
  720. "\"Cobble\"}},{\"x\": 0,\"y\": -1,\"filter\": "
  721. "{\"itemType\": \"Cobble\"}}],\"output\": {\"itemType\": "
  722. "\"StoneTool\"},\"outputCount\": 1},{\"type\": "
  723. "\"shaped\",\"group\": \"inventory\",\"width\": "
  724. "1,\"height\": 2,\"inputs\": [{\"x\": 0,\"y\": "
  725. "0,\"filter\": {\"itemType\": \"Cobble\"}},{\"x\": "
  726. "0,\"y\": 1,\"filter\": {\"itemType\": "
  727. "\"Cobble\"}}],\"output\": {\"itemType\": "
  728. "\"StoneTool\"},\"outputCount\": 1}]");
  729. std::cout << value->toString().getText() << "\n";
  730. Framework::Validator::ValidationResult* result
  731. = validator->validate(value);
  732. std::cout << result->getInvalidInfo();
  733. Assert::IsTrue(
  734. !result->isValid(), L"Invalid Json was marked as valid");
  735. Framework::JSON::JSONValue* validValue = result->getValidPart(0);
  736. result->release();
  737. Framework::JSON::JSONValue* expected
  738. = Framework::JSON::Parser::getValue(
  739. "[{\"type\": \"shaped\",\"group\": "
  740. "\"inventory\",\"width\": 1,\"height\": 2,\"inputs\": "
  741. "[{\"x\": 0,\"y\": 0,\"filter\": {\"itemType\": "
  742. "\"Cobble\"}},{\"x\": 0,\"y\": 1,\"filter\": "
  743. "{\"itemType\": \"Cobble\"}}],\"output\": {\"itemType\": "
  744. "\"StoneTool\"},\"outputCount\": 1}]");
  745. Assert::IsTrue(JSONParserTests::isEqual(validValue, expected),
  746. L"getValidPart of invalid validation result does not match the "
  747. L"expected valid part");
  748. result = validator->validate(validValue);
  749. Assert::IsTrue(result->isValid(),
  750. L"Re validation of a value returned by getValidPart on a "
  751. L"validation result should never return an invalid validation "
  752. L"result");
  753. value->release();
  754. Framework::RCArray<Framework::Validator::ValidationResult>
  755. invalidParts;
  756. value = result->getValidPart(&invalidParts);
  757. Assert::IsTrue(invalidParts.getEintragAnzahl() == 0,
  758. L"Invalid parts were returned for a valid validation result");
  759. Assert::IsTrue(JSONParserTests::isEqual(validValue, value),
  760. L"getValidPart of a valid validation result should return the "
  761. L"validated value");
  762. value->release();
  763. validValue->release();
  764. expected->release();
  765. validator->release();
  766. }
  767. TEST_METHOD (DefaultValuesTest)
  768. {
  769. Framework::Validator::DataValidator* validator
  770. = Framework::Validator::DataValidator::buildForArray()
  771. ->typeSpecifiedByAttribute("type")
  772. ->removeInvalidEntries()
  773. ->addAcceptedTypeInArray(
  774. Framework::Validator::DataValidator::buildForObject()
  775. ->withRequiredString("type")
  776. ->withExactMatch("shaped")
  777. ->finishString()
  778. ->withRequiredString("group")
  779. ->withDefault("test")
  780. ->finishString()
  781. ->withRequiredNumber("width")
  782. ->whichIsGreaterThen(0)
  783. ->finishNumber()
  784. ->withRequiredNumber("height")
  785. ->whichIsGreaterThen(0)
  786. ->finishNumber()
  787. ->withRequiredAttribute("inputs",
  788. Framework::Validator::DataValidator::
  789. buildForArray()
  790. ->withDefault(
  791. new Framework::JSON::JSONArray())
  792. ->addAcceptedTypeInArray(
  793. Framework::Validator::
  794. DataValidator::buildForObject()
  795. ->withRequiredNumber("x")
  796. ->whichIsGreaterOrEqual(0)
  797. ->finishNumber()
  798. ->withRequiredNumber("y")
  799. ->whichIsGreaterOrEqual(0)
  800. ->finishNumber()
  801. ->withRequiredObject(
  802. "filter")
  803. ->withRequiredString(
  804. "itemType")
  805. ->finishString()
  806. ->finishObject()
  807. ->finishObject())
  808. ->finishArray())
  809. ->withRequiredObject("output")
  810. ->withRequiredString("itemType")
  811. ->finishString()
  812. ->finishObject()
  813. ->withRequiredNumber("outputCount")
  814. ->withDefault(1)
  815. ->whichIsGreaterThen(0)
  816. ->finishNumber()
  817. ->finishObject())
  818. ->addAcceptedTypeInArray(
  819. Framework::Validator::DataValidator::buildForObject()
  820. ->withRequiredString("type")
  821. ->withExactMatch("unordered")
  822. ->finishString()
  823. ->withRequiredString("group")
  824. ->finishString()
  825. ->withRequiredAttribute("inputs",
  826. Framework::Validator::DataValidator::
  827. buildForArray()
  828. ->withDefault(
  829. new Framework::JSON::JSONArray())
  830. ->addAcceptedTypeInArray(Framework::
  831. Validator::DataValidator::
  832. buildForObject()
  833. ->withRequiredNumber(
  834. "count")
  835. ->withDefault(1)
  836. ->whichIsGreaterThen(
  837. 0)
  838. ->finishNumber()
  839. ->withRequiredObject(
  840. "filter")
  841. ->withRequiredString(
  842. "itemType")
  843. ->finishString()
  844. ->finishObject()
  845. ->finishObject())
  846. ->finishArray())
  847. ->withRequiredAttribute("output",
  848. Framework::Validator::DataValidator::
  849. buildForArray()
  850. ->addAcceptedTypeInArray(Framework::
  851. Validator::DataValidator::
  852. buildForObject()
  853. ->withRequiredObject(
  854. "filter")
  855. ->withRequiredString(
  856. "itemType")
  857. ->finishString()
  858. ->finishObject()
  859. ->withRequiredNumber(
  860. "count")
  861. ->withDefault(1)
  862. ->whichIsGreaterThen(
  863. 0)
  864. ->finishNumber()
  865. ->finishObject())
  866. ->finishArray())
  867. ->finishObject())
  868. ->finishArray();
  869. std::cout << validator->zConstraints()->toString().getText()
  870. << "\n";
  871. Framework::JSON::JSONValue* value
  872. = Framework::JSON::Parser::getValue(
  873. "[{\"type\": \"shaped\",\"width\": 1,\"height\": "
  874. "2,\"inputs\": [{\"x\": 0,\"y\": 0,\"filter\": "
  875. "{\"itemType\": \"Cobble\"}},{\"x\": 0,\"y\": "
  876. "1,\"filter\": {\"itemType\": \"Cobble\"}}],\"output\": "
  877. "{\"itemType\": \"StoneTool\"}},{\"type\": "
  878. "\"shaped\",\"width\": 1,\"height\": 2,\"inputs\": "
  879. "[{\"x\": 0,\"y\": 0,\"filter\": {\"itemType\": "
  880. "\"Cobble\"}},{\"x\": 0,\"y\": -1,\"filter\": "
  881. "{\"itemType\": \"Cobble\"}}],\"output\": {\"itemType\": "
  882. "\"StoneTool\"}},{\"type\": \"unordered\",\"group\": "
  883. "\"bla\", \"inputs\": [{\"filter\": {\"itemType\": "
  884. "\"Cobble\"}},{\"filter\": {\"itemType\": "
  885. "\"Cobble\"}}],\"output\": [{\"filter\": {\"itemType\": "
  886. "\"StoneTool\"}}]}]");
  887. std::cout << value->toString().getText() << "\n";
  888. Framework::Validator::ValidationResult* result
  889. = validator->validate(value);
  890. std::cout << result->getInvalidInfo();
  891. Assert::IsTrue(
  892. !result->isValid(), L"Invalid Json was marked as valid");
  893. Framework::RCArray<Framework::Validator::ValidationResult>
  894. invalidParts;
  895. Framework::JSON::JSONValue* validValue
  896. = result->getValidPart(&invalidParts);
  897. Assert::IsTrue(invalidParts.getEintragAnzahl() > 0,
  898. L"No Invalid parts were returned for an invalid Json");
  899. for (Framework::Validator::ValidationResult* invalid : invalidParts)
  900. {
  901. std::cout << result->getInvalidInfo();
  902. }
  903. result->release();
  904. Framework::JSON::JSONValue* expected
  905. = Framework::JSON::Parser::getValue(
  906. "[{\"type\": \"shaped\", \"group\": \"test\",\"width\": "
  907. "1,\"height\": 2,\"inputs\": [{\"x\": 0,\"y\": "
  908. "0,\"filter\": {\"itemType\": \"Cobble\"}},{\"x\": "
  909. "0,\"y\": 1,\"filter\": {\"itemType\": "
  910. "\"Cobble\"}}],\"output\": {\"itemType\": \"StoneTool\"}, "
  911. "\"outputCount\": 1},{\"type\": \"unordered\",\"group\": "
  912. "\"bla\", \"inputs\": [{\"count\": 1, \"filter\": "
  913. "{\"itemType\": \"Cobble\"}},{\"count\": 1, \"filter\": "
  914. "{\"itemType\": \"Cobble\"}}],\"output\": [{\"count\": 1, "
  915. "\"filter\": {\"itemType\": \"StoneTool\"}}]}]");
  916. Assert::IsTrue(JSONParserTests::isEqual(validValue, expected),
  917. L"getValidPart of invalid validation result does not match the "
  918. L"expected valid part");
  919. result = validator->validate(validValue);
  920. Assert::IsTrue(result->isValid(),
  921. L"Re validation of a value returned by getValidPart on a "
  922. L"validation result should never return an invalid validation "
  923. L"result");
  924. value->release();
  925. value = result->getValidPart(0);
  926. Assert::IsTrue(JSONParserTests::isEqual(validValue, value),
  927. L"getValidPart of a valid validation result should return the "
  928. L"validated value");
  929. value->release();
  930. validValue->release();
  931. expected->release();
  932. validator->release();
  933. }
  934. TEST_METHOD (RecursiveValidatorTest)
  935. {
  936. Framework::Validator::DataValidator* validator
  937. = Framework::Validator::DataValidator::buildForObject()
  938. ->setReferenceId("TreeNode")
  939. ->withRequiredAttribute("value",
  940. Framework::Validator::DataValidator::buildForString()
  941. ->whichCanBeNull()
  942. ->finishString())
  943. ->withRequiredAttribute("children",
  944. Framework::Validator::DataValidator::buildForArray()
  945. ->whichIsOptional()
  946. ->addAcceptedTypeInArray(
  947. Framework::Validator::DataValidator::
  948. buildForReference("TreeNode"))
  949. ->finishArray())
  950. ->finishObject();
  951. Framework::JSON::JSONObject* jArray
  952. = Framework::JSON::Parser::getValue(
  953. "{\"value\": \"1\", \"children\": [{\"value\": \"2\"}, "
  954. "{\"value\": \"3\", \"children\": [{\"value\": \"4\"}]}]}")
  955. ->asObject();
  956. Assert::IsTrue(validator->isValid(jArray),
  957. L"A valid json Object was marked as invalid by the validator");
  958. validator->release();
  959. }
  960. TEST_CLASS_CLEANUP(Cleanup)
  961. {
  962. std::cout.rdbuf(buf);
  963. }
  964. };
  965. OutputDebugStringBuf<char, std::char_traits<char>>
  966. JSONValidatorTests::charDebugOutput;
  967. std::streambuf* JSONValidatorTests::buf;
  968. #endif
  969. } // namespace FrameworkTests