TestValidator.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. #include "TestSuite.h"
  2. #include "../Source/JSONValidator.h"
  3. #define assertValid(x, method, nextchar)\
  4. {\
  5. json_string temp(JSON_TEXT(x));\
  6. const json_char * ptr = temp.c_str();\
  7. assertTrue(JSONValidator::method(ptr) && (*ptr == JSON_TEXT(nextchar)));\
  8. }
  9. #define assertNotValid(x, method, nextchar)\
  10. {\
  11. json_string temp(JSON_TEXT(x));\
  12. const json_char * ptr = temp.c_str();\
  13. assertFalse(JSONValidator::method(ptr) && (*ptr == JSON_TEXT(nextchar)));\
  14. }
  15. #ifdef JSON_SECURITY_MAX_NEST_LEVEL
  16. #define assertValid_Depth(x, method, nextchar)\
  17. {\
  18. json_string temp(JSON_TEXT(x));\
  19. const json_char * ptr = temp.c_str();\
  20. assertTrue(JSONValidator::method(ptr, 1));\
  21. assertEquals(*ptr, JSON_TEXT(nextchar));\
  22. }
  23. #define assertNotValid_Depth(x, method, nextchar)\
  24. {\
  25. json_string temp(JSON_TEXT(x));\
  26. const json_char * ptr = temp.c_str();\
  27. assertFalse(JSONValidator::method(ptr, 1));\
  28. }
  29. #else
  30. #define assertValid_Depth(x, method, nextchar) assertValid(x, method, nextchar)
  31. #define assertNotValid_Depth(x, method, nextchar) assertNotValid(x, method, nextchar)
  32. #endif
  33. void TestSuite::TestValidator(void){
  34. #ifdef JSON_VALIDATE
  35. UnitTest::SetPrefix("TestValidator.cpp - Validator Root");
  36. assertTrue(JSONValidator::isValidRoot(JSON_TEXT("{}")));
  37. assertTrue(JSONValidator::isValidRoot(JSON_TEXT("[]")));
  38. assertFalse(JSONValidator::isValidRoot(JSON_TEXT("{]")));
  39. assertFalse(JSONValidator::isValidRoot(JSON_TEXT("[}")));
  40. assertFalse(JSONValidator::isValidRoot(JSON_TEXT("{}aoe")));
  41. assertFalse(JSONValidator::isValidRoot(JSON_TEXT("[]aoe")));
  42. assertFalse(JSONValidator::isValidRoot(JSON_TEXT("aoe")));
  43. assertFalse(JSONValidator::isValidRoot(JSON_TEXT("")));
  44. assertFalse(JSONValidator::isValidRoot(JSON_TEXT("[\"stuff\":{},]")));
  45. UnitTest::SetPrefix("TestValidator.cpp - Validator Number");
  46. assertValid("123,\"next\"", isValidNumber, ',');
  47. assertValid("12.3,\"next\"", isValidNumber, ',');
  48. assertValid("0.123,\"next\"", isValidNumber, ',');
  49. assertValid("0,\"next\"", isValidNumber, ',');
  50. assertValid("0.,\"next\"", isValidNumber, ',');
  51. assertValid("0e123,\"next\"", isValidNumber, ',');
  52. assertValid("0e-123,\"next\"", isValidNumber, ',');
  53. assertValid("0e+123,\"next\"", isValidNumber, ',');
  54. assertNotValid("0e12.3,\"next\"", isValidNumber, ',');
  55. assertNotValid("0e-12.3,\"next\"", isValidNumber, ',');
  56. assertNotValid("0e+12.3,\"next\"", isValidNumber, ',');
  57. assertValid("1.e123,\"next\"", isValidNumber, ',');
  58. assertValid("1.e-123,\"next\"", isValidNumber, ',');
  59. assertValid("1.e+123,\"next\"", isValidNumber, ',');
  60. assertNotValid("1.e12.3,\"next\"", isValidNumber, ',');
  61. assertNotValid("1.e-12.3,\"next\"", isValidNumber, ',');
  62. assertNotValid("1.e+12.3,\"next\"", isValidNumber, ',');
  63. assertValid("1.0e123,\"next\"", isValidNumber, ',');
  64. assertValid("1.0e-123,\"next\"", isValidNumber, ',');
  65. assertValid("1.0e+123,\"next\"", isValidNumber, ',');
  66. assertNotValid("1.0e12.3,\"next\"", isValidNumber, ',');
  67. assertNotValid("1.0e-12.3,\"next\"", isValidNumber, ',');
  68. assertNotValid("1.0e+12.3,\"next\"", isValidNumber, ',');
  69. assertValid("-123,\"next\"", isValidNumber, ',');
  70. assertValid("-12.3,\"next\"", isValidNumber, ',');
  71. assertValid("-0.123,\"next\"", isValidNumber, ',');
  72. assertValid("-0,\"next\"", isValidNumber, ',');
  73. assertValid("-0.,\"next\"", isValidNumber, ',');
  74. assertValid("-0e123,\"next\"", isValidNumber, ',');
  75. assertValid("-0e-123,\"next\"", isValidNumber, ',');
  76. assertValid("-0e+123,\"next\"", isValidNumber, ',');
  77. assertNotValid("-0e12.3,\"next\"", isValidNumber, ',');
  78. assertNotValid("-0e-12.3,\"next\"", isValidNumber, ',');
  79. assertNotValid("-0e+12.3,\"next\"", isValidNumber, ',');
  80. assertValid("-1.e123,\"next\"", isValidNumber, ',');
  81. assertValid("-1.e-123,\"next\"", isValidNumber, ',');
  82. assertValid("-1.e+123,\"next\"", isValidNumber, ',');
  83. assertNotValid("-1.e12.3,\"next\"", isValidNumber, ',');
  84. assertNotValid("-1.e-12.3,\"next\"", isValidNumber, ',');
  85. assertNotValid("-1.e+12.3,\"next\"", isValidNumber, ',');
  86. assertValid("-1.0e123,\"next\"", isValidNumber, ',');
  87. assertValid("-1.0e-123,\"next\"", isValidNumber, ',');
  88. assertValid("-1.0e+123,\"next\"", isValidNumber, ',');
  89. assertNotValid("-1.0e12.3,\"next\"", isValidNumber, ',');
  90. assertNotValid("-1.0e-12.3,\"next\"", isValidNumber, ',');
  91. assertNotValid("-1.0e+12.3,\"next\"", isValidNumber, ',');
  92. assertValid("0123,\"next\"", isValidNumber, ','); //legal when not strict because leading zeros are ignored
  93. #ifndef JSON_STRICT
  94. assertValid(".01,\"next\"", isValidNumber, ',');
  95. assertValid("-.01,\"next\"", isValidNumber, ',');
  96. assertValid("+123,\"next\"", isValidNumber, ',');
  97. assertValid("+12.3,\"next\"", isValidNumber, ',');
  98. assertValid("+0.123,\"next\"", isValidNumber, ',');
  99. assertValid("+0,\"next\"", isValidNumber, ',');
  100. assertValid("+0.,\"next\"", isValidNumber, ',');
  101. assertValid("+0e123,\"next\"", isValidNumber, ',');
  102. assertValid("+0e-123,\"next\"", isValidNumber, ',');
  103. assertValid("+0e+123,\"next\"", isValidNumber, ',');
  104. assertValid("+1.e123,\"next\"", isValidNumber, ',');
  105. assertValid("+1.e-123,\"next\"", isValidNumber, ',');
  106. assertValid("+1.e+123,\"next\"", isValidNumber, ',');
  107. assertValid("+1.0e123,\"next\"", isValidNumber, ',');
  108. assertValid("+1.0e-123,\"next\"", isValidNumber, ',');
  109. assertValid("+1.0e+123,\"next\"", isValidNumber, ',');
  110. assertValid("0x12FF,\"next\"", isValidNumber, ',');
  111. #ifdef JSON_OCTAL
  112. assertNotValid("0128,\"next\"", isValidNumber, ','); //because of the 8
  113. #else
  114. assertValid("0128,\"next\"", isValidNumber, ','); //because the leading 0 is ignored
  115. #endif
  116. #else
  117. assertNotValid(".01,\"next\"", isValidNumber, ','); //no leading 0 as required by the standard
  118. assertNotValid("-.01,\"next\"", isValidNumber, ','); //no leading 0 as required by the standard
  119. assertNotValid("+123,\"next\"", isValidNumber, ','); //no leading +
  120. assertNotValid("+12.3,\"next\"", isValidNumber, ',');
  121. assertNotValid("+0.123,\"next\"", isValidNumber, ',');
  122. assertNotValid("+0,\"next\"", isValidNumber, ',');
  123. assertNotValid("+0.,\"next\"", isValidNumber, ',');
  124. assertNotValid("+0e123,\"next\"", isValidNumber, ',');
  125. assertNotValid("+0e-123,\"next\"", isValidNumber, ',');
  126. assertNotValid("+0e+123,\"next\"", isValidNumber, ',');
  127. assertNotValid("+1.e123,\"next\"", isValidNumber, ',');
  128. assertNotValid("+1.e-123,\"next\"", isValidNumber, ',');
  129. assertNotValid("+1.e+123,\"next\"", isValidNumber, ',');
  130. assertNotValid("+1.0e123,\"next\"", isValidNumber, ',');
  131. assertNotValid("+1.0e-123,\"next\"", isValidNumber, ',');
  132. assertNotValid("+1.0e+123,\"next\"", isValidNumber, ',');
  133. assertNotValid("0x12FF,\"next\"", isValidNumber, ',');
  134. assertValid("0128,\"next\"", isValidNumber, ','); //legal because in STRICT mode, this is not octal
  135. #endif
  136. assertNotValid("+1.0e12.3,\"next\"", isValidNumber, ',');
  137. assertNotValid("+1.0e-12.3,\"next\"", isValidNumber, ',');
  138. assertNotValid("+1.0e+12.3,\"next\"", isValidNumber, ',');
  139. assertNotValid("+1.e12.3,\"next\"", isValidNumber, ',');
  140. assertNotValid("+1.e-12.3,\"next\"", isValidNumber, ',');
  141. assertNotValid("+1.e+12.3,\"next\"", isValidNumber, ',');
  142. assertNotValid("+0e12.3,\"next\"", isValidNumber, ',');
  143. assertNotValid("+0e-12.3,\"next\"", isValidNumber, ',');
  144. assertNotValid("+0e+12.3,\"next\"", isValidNumber, ',');
  145. UnitTest::SetPrefix("TestValidator.cpp - Validator String");
  146. assertValid("hello\":123", isValidString, ':');
  147. assertValid("he\\\"ll\\\"o\":123", isValidString, ':');
  148. assertValid("he\\u1234llo\":123", isValidString, ':');
  149. assertValid("he\\u0FFFllo\":123", isValidString, ':');
  150. assertNotValid("he\\uFFFGllo\":123", isValidString, ':');
  151. #ifndef JSON_STRICT
  152. assertValid("he\\xFFllo\":123", isValidString, ':');
  153. #ifdef JSON_OCTAL
  154. assertValid("he\\0123llo\":123", isValidString, ':');
  155. #else
  156. assertNotValid("he\\0123llo\":123", isValidString, ':');
  157. #endif
  158. #else
  159. assertNotValid("he\\xFFllo\":123", isValidString, ':');
  160. assertNotValid("he\\0123llo\":123", isValidString, ':');
  161. #endif
  162. assertNotValid("he\\128llo\":123", isValidString, ':'); //not valid even when not strict because of the 8
  163. assertNotValid("he\\", isValidString, ':');
  164. assertNotValid("he\\\"", isValidString, ':');
  165. assertNotValid("he\\\"llo\\\"", isValidString, ':');
  166. assertNotValid("hello", isValidString, ':');
  167. UnitTest::SetPrefix("TestValidator.cpp - Validator Member");
  168. assertValid_Depth("true,", isValidMember, ',');
  169. assertNotValid_Depth("tru,", isValidMember, ',');
  170. assertValid_Depth("false,", isValidMember, ',');
  171. assertNotValid_Depth("fals,", isValidMember, ',');
  172. assertValid_Depth("null,", isValidMember, ',');
  173. assertNotValid_Depth("nul,", isValidMember, ',');
  174. assertNotValid_Depth("", isValidMember, ',');
  175. #ifndef JSON_STRICT
  176. assertValid_Depth("TRUE,", isValidMember, ',');
  177. assertValid_Depth("FALSE,", isValidMember, ',');
  178. assertValid_Depth("NULL,", isValidMember, ',');
  179. assertValid_Depth(",", isValidMember, ',');
  180. #else
  181. assertNotValid_Depth("TRUE,", isValidMember, ',');
  182. assertNotValid_Depth("FALSE,", isValidMember, ',');
  183. assertNotValid_Depth("NULL,", isValidMember, ',');
  184. assertNotValid_Depth(",", isValidMember, ',');
  185. #endif
  186. UnitTest::SetPrefix("TestValidator.cpp - Validator Security");
  187. #ifdef JSON_SECURITY_MAX_NEST_LEVEL
  188. #if (JSON_SECURITY_MAX_NEST_LEVEL != 128)
  189. #error, test suite only wants a nest security level of 100
  190. #endif
  191. {
  192. json_string json(JSON_TEXT("{"));
  193. for(unsigned int i = 0; i < 127; ++i){
  194. json += JSON_TEXT("\"n\":{");
  195. }
  196. json += json_string(128, '}');
  197. assertTrue(JSONValidator::isValidRoot(json.c_str()));
  198. }
  199. {
  200. json_string json(JSON_TEXT("{"));
  201. for(unsigned int i = 0; i < 128; ++i){
  202. json += JSON_TEXT("\"n\":{");
  203. }
  204. json += json_string(129, '}');
  205. assertFalse(JSONValidator::isValidRoot(json.c_str()));
  206. }
  207. #endif
  208. #endif
  209. }