JsonTests.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #include "StdInc.h"
  2. #include "../lib/json/JsonUtils.h"
  3. TEST(JsonTest, conflictDetectionTestNoConflict)
  4. {
  5. constexpr char textA[] = R"({ "keyA" : 1, "sameKey" : { "keyInner" : 5 } })";
  6. constexpr char textB[] = R"({ "keyB" : 1, "sameKey" : { "keyInner" : 10 } })";
  7. JsonNode jsonA(textA, std::size(textA), "Test A");
  8. JsonNode jsonB(textB, std::size(textB), "Test B");
  9. JsonNode result;
  10. jsonA.setModScope("modA");
  11. jsonB.setModScope("modB");
  12. JsonUtils::detectConflicts(result, jsonA, jsonB, "test");
  13. EXPECT_EQ(result.Struct().size(), 1);
  14. EXPECT_EQ(result.Struct().count("test/sameKey/keyInner"), 1);
  15. EXPECT_EQ(result["test/sameKey/keyInner"].Struct().size(), 1);
  16. }
  17. TEST(JsonTest, conflictDetectionTestSimpleConflict)
  18. {
  19. constexpr char textA[] = R"({ "keyA" : 1, "sameKey" : { "keyInner" : 5 } })";
  20. constexpr char textB[] = R"({ "keyB" : 1, "sameKey" : { "keyInner" : 10 } })";
  21. constexpr char textC[] = R"({ "keyC" : 1, "sameKey" : { "keyInner" : 15 } })";
  22. JsonNode jsonA(textA, std::size(textA), "Test A");
  23. JsonNode jsonB(textB, std::size(textB), "Test B");
  24. JsonNode jsonC(textC, std::size(textC), "Test C");
  25. JsonNode result;
  26. jsonA.setModScope("modA");
  27. jsonB.setModScope("modB");
  28. jsonC.setModScope("modC");
  29. JsonUtils::detectConflicts(result, jsonA, jsonB, "test");
  30. JsonUtils::detectConflicts(result, jsonA, jsonC, "test");
  31. EXPECT_EQ(result.Struct().size(), 1);
  32. EXPECT_EQ(result.Struct().count("test/sameKey/keyInner"), 1);
  33. EXPECT_EQ(result["test/sameKey/keyInner"].Struct().size(), 2);
  34. }
  35. TEST(JsonTest, conflictDetectionTestArrayConflict)
  36. {
  37. constexpr char textA[] = R"({ "keyA" : 1, "sameKey" : { "keyInner" : [ 10 ] } })";
  38. constexpr char textB[] = R"({ "keyB" : 1, "sameKey" : { "keyInner" : [ 20 ] } })";
  39. constexpr char textC[] = R"({ "keyC" : 1, "sameKey" : { "keyInner" : [ 30 ] } })";
  40. JsonNode jsonA(textA, std::size(textA), "Test A");
  41. JsonNode jsonB(textB, std::size(textB), "Test B");
  42. JsonNode jsonC(textC, std::size(textC), "Test C");
  43. JsonNode result;
  44. jsonA.setModScope("modA");
  45. jsonB.setModScope("modB");
  46. jsonC.setModScope("modC");
  47. JsonUtils::detectConflicts(result, jsonA, jsonB, "test");
  48. JsonUtils::detectConflicts(result, jsonA, jsonC, "test");
  49. EXPECT_EQ(result.Struct().size(), 1);
  50. EXPECT_EQ(result.Struct().count("test/sameKey/keyInner"), 1);
  51. EXPECT_EQ(result["test/sameKey/keyInner"].Struct().size(), 2);
  52. }
  53. TEST(JsonTest, conflictDetectionTestArrayModifyConflict)
  54. {
  55. constexpr char textA[] = R"({ "keyA" : 1, "sameKey" : { "keyInner" : [ 10, 20 ] } })";
  56. constexpr char textB[] = R"({ "keyB" : 1, "sameKey" : { "keyInner" : { "modify@1" : 20 } })";
  57. constexpr char textC[] = R"({ "keyC" : 1, "sameKey" : { "keyInner" : { "modify@1" : 30 } })";
  58. JsonNode jsonA(textA, std::size(textA), "Test A");
  59. JsonNode jsonB(textB, std::size(textB), "Test B");
  60. JsonNode jsonC(textC, std::size(textC), "Test C");
  61. JsonNode result;
  62. jsonA.setModScope("modA");
  63. jsonB.setModScope("modB");
  64. jsonC.setModScope("modC");
  65. JsonUtils::detectConflicts(result, jsonA, jsonB, "test");
  66. JsonUtils::detectConflicts(result, jsonA, jsonC, "test");
  67. EXPECT_EQ(result.Struct().size(), 1);
  68. EXPECT_EQ(result.Struct().count("test/sameKey/keyInner/1"), 1);
  69. EXPECT_EQ(result["test/sameKey/keyInner/1"].Struct().size(), 2);
  70. }
  71. TEST(JsonTest, conflictDetectionTestArrayModifySafe)
  72. {
  73. constexpr char textA[] = R"({ "keyA" : 1, "sameKey" : { "keyInner" : [ 10, 20 ] } })";
  74. constexpr char textB[] = R"({ "keyB" : 1, "sameKey" : { "keyInner" : { "modify@1" : 20 } })";
  75. constexpr char textC[] = R"({ "keyC" : 1, "sameKey" : { "keyInner" : { "modify@2" : 30 } })";
  76. JsonNode jsonA(textA, std::size(textA), "Test A");
  77. JsonNode jsonB(textB, std::size(textB), "Test B");
  78. JsonNode jsonC(textC, std::size(textC), "Test C");
  79. JsonNode result;
  80. jsonA.setModScope("modA");
  81. jsonB.setModScope("modB");
  82. jsonC.setModScope("modC");
  83. JsonUtils::detectConflicts(result, jsonA, jsonB, "test");
  84. JsonUtils::detectConflicts(result, jsonA, jsonC, "test");
  85. EXPECT_EQ(result.Struct().size(), 2);
  86. EXPECT_EQ(result.Struct().count("test/sameKey/keyInner/1"), 1);
  87. EXPECT_EQ(result.Struct().count("test/sameKey/keyInner/2"), 1);
  88. EXPECT_EQ(result["test/sameKey/keyInner/1"].Struct().size(), 1);
  89. EXPECT_EQ(result["test/sameKey/keyInner/2"].Struct().size(), 1);
  90. }
  91. TEST(JsonTest, conflictDetectionTestArrayAppendAlwaysSafe)
  92. {
  93. constexpr char textA[] = R"({ "keyA" : 1, "sameKey" : { "keyInner" : [ 10, 20 ] } })";
  94. constexpr char textB[] = R"({ "keyB" : 1, "sameKey" : { "keyInner" : { "append" : 20 } })";
  95. constexpr char textC[] = R"({ "keyC" : 1, "sameKey" : { "keyInner" : { "append" : 30 } })";
  96. JsonNode jsonA(textA, std::size(textA), "Test A");
  97. JsonNode jsonB(textB, std::size(textB), "Test B");
  98. JsonNode jsonC(textC, std::size(textC), "Test C");
  99. JsonNode result;
  100. jsonA.setModScope("modA");
  101. jsonB.setModScope("modB");
  102. jsonC.setModScope("modC");
  103. JsonUtils::detectConflicts(result, jsonA, jsonB, "test");
  104. JsonUtils::detectConflicts(result, jsonA, jsonC, "test");
  105. EXPECT_EQ(result.Struct().size(), 0);
  106. }