1
0
mirror of https://github.com/vcmi/vcmi.git synced 2026-04-26 20:02:20 +02:00
Files
vcmi/test/json/JsonTests.cpp
2026-02-17 13:48:04 +02:00

137 lines
4.9 KiB
C++

#include "StdInc.h"
#include "../lib/json/JsonUtils.h"
TEST(JsonTest, conflictDetectionTestNoConflict)
{
constexpr char textA[] = R"({ "keyA" : 1, "sameKey" : { "keyInner" : 5 } })";
constexpr char textB[] = R"({ "keyB" : 1, "sameKey" : { "keyInner" : 10 } })";
JsonNode jsonA(textA, std::size(textA), "Test A");
JsonNode jsonB(textB, std::size(textB), "Test B");
JsonNode result;
jsonA.setModScope("modA");
jsonB.setModScope("modB");
JsonUtils::detectConflicts(result, jsonA, jsonB, "test");
EXPECT_EQ(result.Struct().size(), 1);
EXPECT_EQ(result.Struct().count("test/sameKey/keyInner"), 1);
EXPECT_EQ(result["test/sameKey/keyInner"].Struct().size(), 1);
}
TEST(JsonTest, conflictDetectionTestSimpleConflict)
{
constexpr char textA[] = R"({ "keyA" : 1, "sameKey" : { "keyInner" : 5 } })";
constexpr char textB[] = R"({ "keyB" : 1, "sameKey" : { "keyInner" : 10 } })";
constexpr char textC[] = R"({ "keyC" : 1, "sameKey" : { "keyInner" : 15 } })";
JsonNode jsonA(textA, std::size(textA), "Test A");
JsonNode jsonB(textB, std::size(textB), "Test B");
JsonNode jsonC(textC, std::size(textC), "Test C");
JsonNode result;
jsonA.setModScope("modA");
jsonB.setModScope("modB");
jsonC.setModScope("modC");
JsonUtils::detectConflicts(result, jsonA, jsonB, "test");
JsonUtils::detectConflicts(result, jsonA, jsonC, "test");
EXPECT_EQ(result.Struct().size(), 1);
EXPECT_EQ(result.Struct().count("test/sameKey/keyInner"), 1);
EXPECT_EQ(result["test/sameKey/keyInner"].Struct().size(), 2);
}
TEST(JsonTest, conflictDetectionTestArrayConflict)
{
constexpr char textA[] = R"({ "keyA" : 1, "sameKey" : { "keyInner" : [ 10 ] } })";
constexpr char textB[] = R"({ "keyB" : 1, "sameKey" : { "keyInner" : [ 20 ] } })";
constexpr char textC[] = R"({ "keyC" : 1, "sameKey" : { "keyInner" : [ 30 ] } })";
JsonNode jsonA(textA, std::size(textA), "Test A");
JsonNode jsonB(textB, std::size(textB), "Test B");
JsonNode jsonC(textC, std::size(textC), "Test C");
JsonNode result;
jsonA.setModScope("modA");
jsonB.setModScope("modB");
jsonC.setModScope("modC");
JsonUtils::detectConflicts(result, jsonA, jsonB, "test");
JsonUtils::detectConflicts(result, jsonA, jsonC, "test");
EXPECT_EQ(result.Struct().size(), 1);
EXPECT_EQ(result.Struct().count("test/sameKey/keyInner"), 1);
EXPECT_EQ(result["test/sameKey/keyInner"].Struct().size(), 2);
}
TEST(JsonTest, conflictDetectionTestArrayModifyConflict)
{
constexpr char textA[] = R"({ "keyA" : 1, "sameKey" : { "keyInner" : [ 10, 20 ] } })";
constexpr char textB[] = R"({ "keyB" : 1, "sameKey" : { "keyInner" : { "modify@1" : 20 } })";
constexpr char textC[] = R"({ "keyC" : 1, "sameKey" : { "keyInner" : { "modify@1" : 30 } })";
JsonNode jsonA(textA, std::size(textA), "Test A");
JsonNode jsonB(textB, std::size(textB), "Test B");
JsonNode jsonC(textC, std::size(textC), "Test C");
JsonNode result;
jsonA.setModScope("modA");
jsonB.setModScope("modB");
jsonC.setModScope("modC");
JsonUtils::detectConflicts(result, jsonA, jsonB, "test");
JsonUtils::detectConflicts(result, jsonA, jsonC, "test");
EXPECT_EQ(result.Struct().size(), 1);
EXPECT_EQ(result.Struct().count("test/sameKey/keyInner/1"), 1);
EXPECT_EQ(result["test/sameKey/keyInner/1"].Struct().size(), 2);
}
TEST(JsonTest, conflictDetectionTestArrayModifySafe)
{
constexpr char textA[] = R"({ "keyA" : 1, "sameKey" : { "keyInner" : [ 10, 20 ] } })";
constexpr char textB[] = R"({ "keyB" : 1, "sameKey" : { "keyInner" : { "modify@1" : 20 } })";
constexpr char textC[] = R"({ "keyC" : 1, "sameKey" : { "keyInner" : { "modify@2" : 30 } })";
JsonNode jsonA(textA, std::size(textA), "Test A");
JsonNode jsonB(textB, std::size(textB), "Test B");
JsonNode jsonC(textC, std::size(textC), "Test C");
JsonNode result;
jsonA.setModScope("modA");
jsonB.setModScope("modB");
jsonC.setModScope("modC");
JsonUtils::detectConflicts(result, jsonA, jsonB, "test");
JsonUtils::detectConflicts(result, jsonA, jsonC, "test");
EXPECT_EQ(result.Struct().size(), 2);
EXPECT_EQ(result.Struct().count("test/sameKey/keyInner/1"), 1);
EXPECT_EQ(result.Struct().count("test/sameKey/keyInner/2"), 1);
EXPECT_EQ(result["test/sameKey/keyInner/1"].Struct().size(), 1);
EXPECT_EQ(result["test/sameKey/keyInner/2"].Struct().size(), 1);
}
TEST(JsonTest, conflictDetectionTestArrayAppendAlwaysSafe)
{
constexpr char textA[] = R"({ "keyA" : 1, "sameKey" : { "keyInner" : [ 10, 20 ] } })";
constexpr char textB[] = R"({ "keyB" : 1, "sameKey" : { "keyInner" : { "append" : 20 } })";
constexpr char textC[] = R"({ "keyC" : 1, "sameKey" : { "keyInner" : { "append" : 30 } })";
JsonNode jsonA(textA, std::size(textA), "Test A");
JsonNode jsonB(textB, std::size(textB), "Test B");
JsonNode jsonC(textC, std::size(textC), "Test C");
JsonNode result;
jsonA.setModScope("modA");
jsonB.setModScope("modB");
jsonC.setModScope("modC");
JsonUtils::detectConflicts(result, jsonA, jsonB, "test");
JsonUtils::detectConflicts(result, jsonA, jsonC, "test");
EXPECT_EQ(result.Struct().size(), 0);
}