| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 |
- #include "testBase.h"
- static char *allocPatternString(uint32_t len, char ch)
- {
- char *buf = (char *)malloc(len + 1U);
- if (NULL == buf) { return NULL; }
- for (uint32_t i = 0; i < len; i++)
- {
- buf[i] = ch;
- }
- buf[len] = '\0';
- return buf;
- }
- static void testEdgeKeyBoundaryChangeKeyShortToLong(void)
- {
- // 复杂链路:
- // Create(Object) -> AddIntToObject(短 key) -> ChangeKey(长 key) -> Compare。
- // 目标:验证短 key 切换到长 key 后结构正确。
- uint32_t shortLen = (RyanJsonInlineStringSize > 8U) ? (RyanJsonInlineStringSize - 2U) : 8U;
- uint32_t longLen = RyanJsonInlineStringSize + 8U;
- char *shortKey = allocPatternString(shortLen, 's');
- char *longKey = allocPatternString(longLen, 'l');
- TEST_ASSERT_NOT_NULL(shortKey);
- TEST_ASSERT_NOT_NULL(longKey);
- RyanJson_t root = RyanJsonCreateObject();
- TEST_ASSERT_NOT_NULL(root);
- TEST_ASSERT_TRUE(RyanJsonAddIntToObject(root, shortKey, 1));
- RyanJson_t node = RyanJsonGetObjectByKey(root, shortKey);
- TEST_ASSERT_NOT_NULL(node);
- TEST_ASSERT_TRUE(RyanJsonChangeKey(node, longKey));
- TEST_ASSERT_TRUE(RyanJsonHasObjectByKey(root, longKey));
- RyanJson_t expect = RyanJsonCreateObject();
- TEST_ASSERT_NOT_NULL(expect);
- TEST_ASSERT_TRUE(RyanJsonAddIntToObject(expect, longKey, 1));
- TEST_ASSERT_TRUE(RyanJsonCompare(root, expect));
- RyanJsonDelete(expect);
- RyanJsonDelete(root);
- free(shortKey);
- free(longKey);
- }
- static void testEdgeKeyBoundaryChangeKeyLongToShort(void)
- {
- // 复杂链路:
- // Create(Object) -> AddIntToObject(长 key) -> ChangeKey(短 key) -> Compare。
- // 目标:验证长 key 切换到短 key 后结构正确。
- uint32_t shortLen = (RyanJsonInlineStringSize > 8U) ? (RyanJsonInlineStringSize - 2U) : 8U;
- uint32_t longLen = RyanJsonInlineStringSize + 8U;
- char *shortKey = allocPatternString(shortLen, 's');
- char *longKey = allocPatternString(longLen, 'l');
- TEST_ASSERT_NOT_NULL(shortKey);
- TEST_ASSERT_NOT_NULL(longKey);
- RyanJson_t root = RyanJsonCreateObject();
- TEST_ASSERT_NOT_NULL(root);
- TEST_ASSERT_TRUE(RyanJsonAddIntToObject(root, longKey, 2));
- RyanJson_t node = RyanJsonGetObjectByKey(root, longKey);
- TEST_ASSERT_NOT_NULL(node);
- TEST_ASSERT_TRUE(RyanJsonChangeKey(node, shortKey));
- TEST_ASSERT_TRUE(RyanJsonHasObjectByKey(root, shortKey));
- RyanJson_t expect = RyanJsonCreateObject();
- TEST_ASSERT_NOT_NULL(expect);
- TEST_ASSERT_TRUE(RyanJsonAddIntToObject(expect, shortKey, 2));
- TEST_ASSERT_TRUE(RyanJsonCompare(root, expect));
- RyanJsonDelete(expect);
- RyanJsonDelete(root);
- free(shortKey);
- free(longKey);
- }
- static void testEdgeKeyBoundaryChangeKeyLongToLongDifferent(void)
- {
- // 复杂链路:
- // Create(Object) -> AddIntToObject(长 key) -> ChangeKey(另一个长 key)。
- // 目标:验证长 key 切换到另一长 key 后结构正确。
- uint32_t longLen = RyanJsonInlineStringSize + 8U;
- char *longKeyA = allocPatternString(longLen, 'a');
- char *longKeyB = allocPatternString(longLen, 'b');
- TEST_ASSERT_NOT_NULL(longKeyA);
- TEST_ASSERT_NOT_NULL(longKeyB);
- RyanJson_t root = RyanJsonCreateObject();
- TEST_ASSERT_NOT_NULL(root);
- TEST_ASSERT_TRUE(RyanJsonAddIntToObject(root, longKeyA, 3));
- RyanJson_t node = RyanJsonGetObjectByKey(root, longKeyA);
- TEST_ASSERT_NOT_NULL(node);
- TEST_ASSERT_TRUE(RyanJsonChangeKey(node, longKeyB));
- TEST_ASSERT_TRUE(RyanJsonHasObjectByKey(root, longKeyB));
- RyanJson_t expect = RyanJsonCreateObject();
- TEST_ASSERT_NOT_NULL(expect);
- TEST_ASSERT_TRUE(RyanJsonAddIntToObject(expect, longKeyB, 3));
- TEST_ASSERT_TRUE(RyanJsonCompare(root, expect));
- RyanJsonDelete(expect);
- RyanJsonDelete(root);
- free(longKeyA);
- free(longKeyB);
- }
- static void testEdgeKeyBoundaryChangeKeyKeepsValue(void)
- {
- // 复杂链路:
- // Create(Object) -> AddIntToObject -> ChangeKey -> GetIntValue。
- // 目标:验证改 key 不影响原值。
- uint32_t longLen = RyanJsonInlineStringSize + 8U;
- char *longKey = allocPatternString(longLen, 'k');
- TEST_ASSERT_NOT_NULL(longKey);
- RyanJson_t root = RyanJsonParse("{\"a\":7}");
- TEST_ASSERT_NOT_NULL(root);
- RyanJson_t node = RyanJsonGetObjectByKey(root, "a");
- TEST_ASSERT_NOT_NULL(node);
- TEST_ASSERT_TRUE(RyanJsonChangeKey(node, longKey));
- TEST_ASSERT_EQUAL_INT(7, RyanJsonGetIntValue(RyanJsonGetObjectByKey(root, longKey)));
- RyanJsonDelete(root);
- free(longKey);
- }
- static void testEdgeKeyRoundtripLongKey(void)
- {
- // 复杂链路:
- // Create(Object 长 key) -> Print -> Parse -> Compare。
- // 目标:验证长 key 往返一致。
- uint32_t longLen = RyanJsonInlineStringSize + 8U;
- char *longKey = allocPatternString(longLen, 'k');
- TEST_ASSERT_NOT_NULL(longKey);
- RyanJson_t obj = RyanJsonCreateObject();
- TEST_ASSERT_NOT_NULL(obj);
- TEST_ASSERT_TRUE(RyanJsonAddIntToObject(obj, longKey, 1));
- char *printed = RyanJsonPrint(obj, 32, RyanJsonFalse, NULL);
- TEST_ASSERT_NOT_NULL(printed);
- RyanJson_t reparsed = RyanJsonParse(printed);
- TEST_ASSERT_NOT_NULL(reparsed);
- TEST_ASSERT_TRUE(RyanJsonCompare(obj, reparsed));
- RyanJsonDelete(reparsed);
- RyanJsonFree(printed);
- RyanJsonDelete(obj);
- free(longKey);
- }
- static void testEdgeKeyRoundtripNestedLongKey(void)
- {
- // 复杂链路:
- // Create(嵌套 Object 长 key) -> Print -> Parse -> Compare。
- // 目标:验证长 key 在嵌套 Object 中的往返一致性。
- uint32_t longLen = RyanJsonInlineStringSize + 8U;
- char *longKey = allocPatternString(longLen, 'k');
- TEST_ASSERT_NOT_NULL(longKey);
- RyanJson_t root = RyanJsonCreateObject();
- RyanJson_t child = RyanJsonCreateObject();
- TEST_ASSERT_NOT_NULL(root);
- TEST_ASSERT_NOT_NULL(child);
- TEST_ASSERT_TRUE(RyanJsonAddStringToObject(child, longKey, "v"));
- TEST_ASSERT_TRUE(RyanJsonAddItemToObject(root, "child", child));
- char *printed = RyanJsonPrint(root, 64, RyanJsonFalse, NULL);
- TEST_ASSERT_NOT_NULL(printed);
- RyanJson_t reparsed = RyanJsonParse(printed);
- TEST_ASSERT_NOT_NULL(reparsed);
- TEST_ASSERT_TRUE(RyanJsonCompare(root, reparsed));
- RyanJsonDelete(reparsed);
- RyanJsonFree(printed);
- RyanJsonDelete(root);
- free(longKey);
- }
- static void testEdgeKeyBoundaryExactInlineLenKey(void)
- {
- // 复杂链路:
- // Create(Object) -> AddIntToObject(key 长度=InlineSize) -> Print/Parse -> Compare。
- // 目标:验证边界长度 key 往返一致。
- uint32_t keyLen = RyanJsonInlineStringSize;
- char *key = allocPatternString(keyLen, 'k');
- TEST_ASSERT_NOT_NULL(key);
- RyanJson_t obj = RyanJsonCreateObject();
- TEST_ASSERT_NOT_NULL(obj);
- TEST_ASSERT_TRUE(RyanJsonAddIntToObject(obj, key, 1));
- char *printed = RyanJsonPrint(obj, 32, RyanJsonFalse, NULL);
- TEST_ASSERT_NOT_NULL(printed);
- RyanJson_t reparsed = RyanJsonParse(printed);
- TEST_ASSERT_NOT_NULL(reparsed);
- TEST_ASSERT_TRUE(RyanJsonCompare(obj, reparsed));
- RyanJsonDelete(reparsed);
- RyanJsonFree(printed);
- RyanJsonDelete(obj);
- free(key);
- }
- static void testEdgeKeyBoundaryInlinePlusOneKey(void)
- {
- // 复杂链路:
- // Create(Object) -> AddIntToObject(key 长度=InlineSize+1) -> Print/Parse -> Compare。
- // 目标:验证边界+1 长度 key 往返一致。
- uint32_t keyLen = RyanJsonInlineStringSize + 1U;
- char *key = allocPatternString(keyLen, 'k');
- TEST_ASSERT_NOT_NULL(key);
- RyanJson_t obj = RyanJsonCreateObject();
- TEST_ASSERT_NOT_NULL(obj);
- TEST_ASSERT_TRUE(RyanJsonAddIntToObject(obj, key, 1));
- char *printed = RyanJsonPrint(obj, 32, RyanJsonFalse, NULL);
- TEST_ASSERT_NOT_NULL(printed);
- RyanJson_t reparsed = RyanJsonParse(printed);
- TEST_ASSERT_NOT_NULL(reparsed);
- TEST_ASSERT_TRUE(RyanJsonCompare(obj, reparsed));
- RyanJsonDelete(reparsed);
- RyanJsonFree(printed);
- RyanJsonDelete(obj);
- free(key);
- }
- void testEdgeKeyBoundaryRunner(void)
- {
- UnitySetTestFile(__FILE__);
- RUN_TEST(testEdgeKeyBoundaryChangeKeyShortToLong);
- RUN_TEST(testEdgeKeyBoundaryChangeKeyLongToShort);
- RUN_TEST(testEdgeKeyBoundaryChangeKeyLongToLongDifferent);
- RUN_TEST(testEdgeKeyBoundaryChangeKeyKeepsValue);
- RUN_TEST(testEdgeKeyRoundtripLongKey);
- RUN_TEST(testEdgeKeyRoundtripNestedLongKey);
- RUN_TEST(testEdgeKeyBoundaryExactInlineLenKey);
- RUN_TEST(testEdgeKeyBoundaryInlinePlusOneKey);
- }
|