testUtils.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. #include "testBase.h"
  2. /**
  3. * @brief Json 公共校验辅助函数
  4. */
  5. void printJsonDebug(RyanJson_t json)
  6. {
  7. char *str = RyanJsonPrint(json, 1024, RyanJsonTrue, NULL);
  8. testLog("aa %s\r\n", str);
  9. RyanJsonFree(str);
  10. }
  11. void rootNodeCheckTest(RyanJson_t json)
  12. {
  13. TEST_ASSERT_NOT_NULL_MESSAGE(json, "根节点检查:输入 Json 为空");
  14. // 校验整数字段
  15. RyanJson_t inter = RyanJsonGetObjectToKey(json, "inter");
  16. TEST_ASSERT_TRUE_MESSAGE(RyanJsonIsInt(inter), "字段 'inter' 不是整数类型");
  17. TEST_ASSERT_EQUAL_INT_MESSAGE(16, RyanJsonGetIntValue(inter), "字段 'inter' 值不正确");
  18. // 校验浮点数字段
  19. RyanJson_t dbl = RyanJsonGetObjectToKey(json, "double");
  20. TEST_ASSERT_TRUE_MESSAGE(RyanJsonIsDouble(dbl), "字段 'double' 不是浮点数类型");
  21. TEST_ASSERT_TRUE_MESSAGE(RyanJsonCompareDouble(RyanJsonGetDoubleValue(dbl), 16.89), "字段 'double' 值不正确");
  22. // 校验字符串字段
  23. RyanJson_t str = RyanJsonGetObjectToKey(json, "string");
  24. TEST_ASSERT_TRUE_MESSAGE(RyanJsonIsString(str), "字段 'string' 不是字符串类型");
  25. TEST_ASSERT_EQUAL_STRING_MESSAGE("hello", RyanJsonGetStringValue(str), "字段 'string' 值不正确");
  26. // 校验布尔字段(true)
  27. RyanJson_t bTrue = RyanJsonGetObjectToKey(json, "boolTrue");
  28. TEST_ASSERT_TRUE_MESSAGE(RyanJsonIsBool(bTrue), "字段 'boolTrue' 不是布尔类型");
  29. TEST_ASSERT_EQUAL_INT_MESSAGE(RyanJsonTrue, RyanJsonGetBoolValue(bTrue), "字段 'boolTrue' 值不正确");
  30. // 校验布尔字段(false)
  31. RyanJson_t bFalse = RyanJsonGetObjectToKey(json, "boolFalse");
  32. TEST_ASSERT_TRUE_MESSAGE(RyanJsonIsBool(bFalse), "字段 'boolFalse' 不是布尔类型");
  33. TEST_ASSERT_EQUAL_INT_MESSAGE(RyanJsonFalse, RyanJsonGetBoolValue(bFalse), "字段 'boolFalse' 值不正确");
  34. // 校验 null 字段
  35. TEST_ASSERT_TRUE_MESSAGE(RyanJsonIsNull(RyanJsonGetObjectToKey(json, "null")), "字段 'null' 不是 Null 类型");
  36. }
  37. void itemNodeCheckTest(RyanJson_t json)
  38. {
  39. RyanJson_t item = RyanJsonGetObjectToKey(json, "item");
  40. TEST_ASSERT_NOT_NULL_MESSAGE(item, "字段 'item' 不存在");
  41. rootNodeCheckTest(item);
  42. }
  43. void arrayNodeCheckTest(RyanJson_t json, RyanJsonBool_e isReversed)
  44. {
  45. TEST_ASSERT_TRUE_MESSAGE(RyanJsonIsArray(RyanJsonGetObjectToKey(json, "arrayInt")), "arrayInt 不是数组");
  46. TEST_ASSERT_TRUE_MESSAGE(RyanJsonIsArray(RyanJsonGetObjectToKey(json, "arrayDouble")), "arrayDouble 不是数组");
  47. TEST_ASSERT_TRUE_MESSAGE(RyanJsonIsArray(RyanJsonGetObjectToKey(json, "arrayString")), "arrayString 不是数组");
  48. TEST_ASSERT_TRUE_MESSAGE(RyanJsonIsArray(RyanJsonGetObjectToKey(json, "array")), "array 不是数组");
  49. // 校验混合数组 array:[16, 16.89, "hello", true, false, null]
  50. RyanJson_t array = RyanJsonGetObjectToKey(json, "array");
  51. TEST_ASSERT_EQUAL_INT_MESSAGE(6, RyanJsonGetSize(array), "混合数组长度不正确");
  52. if (isReversed)
  53. {
  54. TEST_ASSERT_TRUE_MESSAGE(RyanJsonIsNull(RyanJsonGetObjectByIndex(array, 0)), "混合数组[0]不是 Null");
  55. TEST_ASSERT_TRUE_MESSAGE(RyanJsonIsBool(RyanJsonGetObjectByIndex(array, 1)), "混合数组[1]不是布尔值");
  56. TEST_ASSERT_EQUAL_INT_MESSAGE(RyanJsonFalse, RyanJsonGetBoolValue(RyanJsonGetObjectByIndex(array, 1)), "混合数组[1]值错误");
  57. TEST_ASSERT_TRUE_MESSAGE(RyanJsonIsBool(RyanJsonGetObjectByIndex(array, 2)), "混合数组[2]不是布尔值");
  58. TEST_ASSERT_EQUAL_INT_MESSAGE(RyanJsonTrue, RyanJsonGetBoolValue(RyanJsonGetObjectByIndex(array, 2)), "混合数组[2]值错误");
  59. TEST_ASSERT_TRUE_MESSAGE(RyanJsonIsString(RyanJsonGetObjectByIndex(array, 3)), "混合数组[3]不是字符串");
  60. TEST_ASSERT_EQUAL_STRING_MESSAGE("hello", RyanJsonGetStringValue(RyanJsonGetObjectByIndex(array, 3)), "混合数组[3]值错误");
  61. TEST_ASSERT_TRUE_MESSAGE(RyanJsonIsDouble(RyanJsonGetObjectByIndex(array, 4)), "混合数组[4]不是浮点数");
  62. TEST_ASSERT_TRUE_MESSAGE(RyanJsonCompareDouble(RyanJsonGetDoubleValue(RyanJsonGetObjectByIndex(array, 4)), 16.89),
  63. "混合数组[4]值错误");
  64. TEST_ASSERT_TRUE_MESSAGE(RyanJsonIsInt(RyanJsonGetObjectByIndex(array, 5)), "混合数组[5]不是整数");
  65. TEST_ASSERT_EQUAL_INT_MESSAGE(16, RyanJsonGetIntValue(RyanJsonGetObjectByIndex(array, 5)), "混合数组[5]值错误");
  66. }
  67. else
  68. {
  69. TEST_ASSERT_TRUE_MESSAGE(RyanJsonIsInt(RyanJsonGetObjectByIndex(array, 0)), "混合数组[0]不是整数");
  70. TEST_ASSERT_EQUAL_INT_MESSAGE(16, RyanJsonGetIntValue(RyanJsonGetObjectByIndex(array, 0)), "混合数组[0]值错误");
  71. TEST_ASSERT_TRUE_MESSAGE(RyanJsonIsDouble(RyanJsonGetObjectByIndex(array, 1)), "混合数组[1]不是浮点数");
  72. TEST_ASSERT_TRUE_MESSAGE(RyanJsonCompareDouble(RyanJsonGetDoubleValue(RyanJsonGetObjectByIndex(array, 1)), 16.89),
  73. "混合数组[1]值错误");
  74. TEST_ASSERT_TRUE_MESSAGE(RyanJsonIsString(RyanJsonGetObjectByIndex(array, 2)), "混合数组[2]不是字符串");
  75. TEST_ASSERT_EQUAL_STRING_MESSAGE("hello", RyanJsonGetStringValue(RyanJsonGetObjectByIndex(array, 2)), "混合数组[2]值错误");
  76. TEST_ASSERT_TRUE_MESSAGE(RyanJsonIsBool(RyanJsonGetObjectByIndex(array, 3)), "混合数组[3]不是布尔值");
  77. TEST_ASSERT_EQUAL_INT_MESSAGE(RyanJsonTrue, RyanJsonGetBoolValue(RyanJsonGetObjectByIndex(array, 3)), "混合数组[3]值错误");
  78. TEST_ASSERT_TRUE_MESSAGE(RyanJsonIsBool(RyanJsonGetObjectByIndex(array, 4)), "混合数组[4]不是布尔值");
  79. TEST_ASSERT_EQUAL_INT_MESSAGE(RyanJsonFalse, RyanJsonGetBoolValue(RyanJsonGetObjectByIndex(array, 4)), "混合数组[4]值错误");
  80. TEST_ASSERT_TRUE_MESSAGE(RyanJsonIsNull(RyanJsonGetObjectByIndex(array, 5)), "混合数组[5]不是 Null");
  81. }
  82. // 校验强类型数组
  83. RyanJson_t arrayInt = RyanJsonGetObjectToKey(json, "arrayInt");
  84. for (int32_t i = 0; i < RyanJsonGetSize(arrayInt); i++)
  85. {
  86. RyanJson_t item = RyanJsonGetObjectByIndex(arrayInt, i);
  87. TEST_ASSERT_TRUE_MESSAGE(RyanJsonIsInt(item), "arrayInt 元素不是整数");
  88. TEST_ASSERT_EQUAL_INT_MESSAGE(16, RyanJsonGetIntValue(item), "arrayInt 元素值错误");
  89. }
  90. RyanJson_t arrayDouble = RyanJsonGetObjectToKey(json, "arrayDouble");
  91. for (int32_t i = 0; i < RyanJsonGetSize(arrayDouble); i++)
  92. {
  93. RyanJson_t item = RyanJsonGetObjectByIndex(arrayDouble, i);
  94. TEST_ASSERT_TRUE_MESSAGE(RyanJsonIsDouble(item), "arrayDouble 元素不是浮点数");
  95. TEST_ASSERT_TRUE_MESSAGE(RyanJsonCompareDouble(RyanJsonGetDoubleValue(item), 16.89), "arrayDouble 元素值错误");
  96. }
  97. RyanJson_t arrayString = RyanJsonGetObjectToKey(json, "arrayString");
  98. for (int32_t i = 0; i < RyanJsonGetSize(arrayString); i++)
  99. {
  100. RyanJson_t item = RyanJsonGetObjectByIndex(arrayString, i);
  101. TEST_ASSERT_TRUE_MESSAGE(RyanJsonIsString(item), "arrayString 元素不是字符串");
  102. TEST_ASSERT_EQUAL_STRING_MESSAGE("hello", RyanJsonGetStringValue(item), "arrayString 元素值错误");
  103. }
  104. }
  105. void arrayItemNodeCheckTest(RyanJson_t json)
  106. {
  107. RyanJson_t arrayItem = RyanJsonGetObjectToKey(json, "arrayItem");
  108. TEST_ASSERT_TRUE_MESSAGE(RyanJsonIsArray(arrayItem), "arrayItem 不是数组");
  109. TEST_ASSERT_EQUAL_INT_MESSAGE(2, RyanJsonGetSize(arrayItem), "arrayItem 长度错误");
  110. rootNodeCheckTest(RyanJsonGetObjectToIndex(arrayItem, 0));
  111. rootNodeCheckTest(RyanJsonGetObjectToIndex(arrayItem, 1));
  112. }
  113. void testCheckRootEx(RyanJson_t pJson, RyanJsonBool_e isReversed)
  114. {
  115. rootNodeCheckTest(pJson);
  116. itemNodeCheckTest(pJson);
  117. arrayNodeCheckTest(pJson, isReversed);
  118. arrayItemNodeCheckTest(pJson);
  119. }
  120. void testCheckRoot(RyanJson_t pJson)
  121. {
  122. testCheckRootEx(pJson, RyanJsonFalse);
  123. }
  124. static void testUtilsBasic(void)
  125. {
  126. char jsonstr[] = "{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,\"boolFalse\":false,\"null\":null,\"item\":"
  127. "{\"inter\":16,\"double\":16."
  128. "89,\"string\":\"hello\","
  129. "\"boolTrue\":true,\"boolFalse\":false,\"null\":null},\"arrayInt\":[16,16,16,16,16],\"arrayDouble\":[16.89,16.89,"
  130. "16.89,16.89,16.89],"
  131. "\"arrayString\":[\"hello\",\"hello\","
  132. "\"hello\",\"hello\",\"hello\"],\"array\":[16,16.89,\"hello\",true,false,null],\"arrayItem\":[{\"inter\":16,"
  133. "\"double\":16.89,\"string\":"
  134. "\"hello\",\"boolTrue\":true,"
  135. "\"boolFalse\":false,\"null\":null},{\"inter\":16,\"double\":16.89,\"string\":\"hello\",\"boolTrue\":true,"
  136. "\"boolFalse\":false,\"null\":null}]}";
  137. RyanJson_t json = RyanJsonParse(jsonstr);
  138. TEST_ASSERT_NOT_NULL(json);
  139. // 调用全部校验辅助函数
  140. testCheckRoot(json);
  141. RyanJsonDelete(json);
  142. }
  143. static void testUtilsMinifyNoExtraSpace(void)
  144. {
  145. char buf[4];
  146. buf[0] = 'a';
  147. buf[1] = 'b';
  148. buf[2] = 'c';
  149. buf[3] = 'X'; // 哨兵:不应被覆盖
  150. uint32_t count = RyanJsonMinify(buf, 3);
  151. TEST_ASSERT_EQUAL_UINT32(3, count);
  152. TEST_ASSERT_EQUAL_UINT8('a', (uint8_t)buf[0]);
  153. TEST_ASSERT_EQUAL_UINT8('b', (uint8_t)buf[1]);
  154. TEST_ASSERT_EQUAL_UINT8('c', (uint8_t)buf[2]);
  155. TEST_ASSERT_EQUAL_UINT8('X', (uint8_t)buf[3]);
  156. }
  157. static void testUtilsMinifyWriteTerminatorWhenSpaceRemain(void)
  158. {
  159. /*
  160. * textLen=4 时,压缩后 "abc" 长度为 3:
  161. * - 返回值应为 3
  162. * - 因为 3 < 4,函数应在 buf[3] 写入 '\0'
  163. * - buf[4] 是哨兵,必须保持不变
  164. */
  165. char buf[5];
  166. buf[0] = 'a';
  167. buf[1] = ' ';
  168. buf[2] = 'b';
  169. buf[3] = 'c';
  170. buf[4] = '#';
  171. uint32_t count = RyanJsonMinify(buf, 4);
  172. TEST_ASSERT_EQUAL_UINT32(3, count);
  173. TEST_ASSERT_EQUAL_UINT8('a', (uint8_t)buf[0]);
  174. TEST_ASSERT_EQUAL_UINT8('b', (uint8_t)buf[1]);
  175. TEST_ASSERT_EQUAL_UINT8('c', (uint8_t)buf[2]);
  176. TEST_ASSERT_EQUAL_UINT8('\0', (uint8_t)buf[3]);
  177. TEST_ASSERT_EQUAL_UINT8('#', (uint8_t)buf[4]);
  178. }
  179. static void testUtilsVarargsPathHelpers(void)
  180. {
  181. RyanJson_t root = RyanJsonCreateObject();
  182. RyanJson_t objA = RyanJsonCreateObject();
  183. RyanJson_t objB = RyanJsonCreateObject();
  184. RyanJsonAddIntToObject(objB, "c", 3);
  185. RyanJsonAddItemToObject(objA, "b", objB);
  186. RyanJsonAddItemToObject(root, "a", objA);
  187. RyanJson_t c = RyanJsonGetObjectToKey(root, "a", "b", "c");
  188. TEST_ASSERT_NOT_NULL_MESSAGE(c, "GetObjectToKey 多级路径失败");
  189. TEST_ASSERT_EQUAL_INT_MESSAGE(3, RyanJsonGetIntValue(c), "多级路径取值错误");
  190. TEST_ASSERT_NULL_MESSAGE(RyanJsonGetObjectToKey(root, "a", "missing"), "不存在的路径应返回 NULL");
  191. RyanJson_t arr = RyanJsonCreateArray();
  192. RyanJson_t sub = RyanJsonCreateArray();
  193. RyanJsonAddIntToArray(sub, 7);
  194. RyanJsonAddItemToArray(arr, sub);
  195. RyanJsonAddItemToObject(root, "arr", arr);
  196. RyanJson_t arrNode = RyanJsonGetObjectToKey(root, "arr");
  197. RyanJson_t v = RyanJsonGetObjectToIndex(arrNode, 0, 0);
  198. TEST_ASSERT_NOT_NULL_MESSAGE(v, "GetObjectToIndex 多级索引失败");
  199. TEST_ASSERT_EQUAL_INT_MESSAGE(7, RyanJsonGetIntValue(v), "多级索引取值错误");
  200. TEST_ASSERT_NULL_MESSAGE(RyanJsonGetObjectToIndex(arrNode, 1), "越界索引应返回 NULL");
  201. RyanJsonDelete(root);
  202. }
  203. void testUtilsRunner(void)
  204. {
  205. UnitySetTestFile(__FILE__);
  206. RUN_TEST(testUtilsBasic);
  207. RUN_TEST(testUtilsMinifyNoExtraSpace);
  208. RUN_TEST(testUtilsMinifyWriteTerminatorWhenSpaceRemain);
  209. RUN_TEST(testUtilsVarargsPathHelpers);
  210. }