Files
openvehicle-api/tests/unit_tests/toml_parser/combine_reduce.cpp

563 lines
16 KiB
C++
Raw Normal View History

2026-03-27 14:12:49 +01:00
/********************************************************************************
* Copyright (c) 2025-2026 ZF Friedrichshafen AG
*
* This program and the accompanying materials are made available under the
* terms of the Apache License Version 2.0 which is available at
* https://www.apache.org/licenses/LICENSE-2.0
*
* SPDX-License-Identifier: Apache-2.0
*
* Contributors:
* Erik Verhoeven - initial API and implementation
********************************************************************************/
#include <gtest/gtest.h>
#include "../../../global/localmemmgr.h"
2026-03-27 14:12:49 +01:00
#include "../../../sdv_services/core/toml_parser/parser_node_toml.h"
#include "../../../sdv_services/core/toml_parser/parser_toml.h"
TEST(CombineReduse, CombineRoot)
2026-03-27 14:12:49 +01:00
{
toml_parser::CParser parser1(R"toml(
val1 = 10
val2 = "20")toml");
toml_parser::CParser parser2(R"toml(
val3 = 30.0
val1 = 10)toml");
EXPECT_TRUE(parser1.Root().Combine(parser2.Root().Cast<toml_parser::CNodeCollection>()));
std::string ssCombinedTOML = R"toml(
2026-03-27 14:12:49 +01:00
val1 = 10
val2 = "20"
val3 = 30.0)toml";
2026-03-27 14:12:49 +01:00
std::string ssGenerated;
EXPECT_NO_THROW(ssGenerated = parser1.GenerateTOML());
EXPECT_EQ(ssGenerated, ssCombinedTOML);
}
TEST(CombineReduse, CombineRootComments)
2026-03-27 14:12:49 +01:00
{
toml_parser::CParser parser1(R"toml(
val1 = 10 # This is value 1
val2 = "20" # This is value 2)toml");
toml_parser::CParser parser2(R"toml(
val3 = 30.0 # This is value 3
val1 = 10 # This is again value 1)toml");
EXPECT_TRUE(parser1.Root().Combine(parser2.Root().Cast<toml_parser::CNodeCollection>()));
std::string ssCombinedTOML = R"toml(
2026-03-27 14:12:49 +01:00
val1 = 10 # This is value 1
val2 = "20" # This is value 2
val3 = 30.0 # This is value 3)toml";
2026-03-27 14:12:49 +01:00
std::string ssGenerated;
EXPECT_NO_THROW(ssGenerated = parser1.GenerateTOML());
EXPECT_EQ(ssGenerated, ssCombinedTOML);
}
TEST(CombineReduse, CombineRootwithTableValues)
2026-03-27 14:12:49 +01:00
{
toml_parser::CParser parser1(R"toml(
val1 = 10
val2 = "20")toml");
toml_parser::CParser parser2(R"toml([MyTable]
val3 = 30.0
val1 = 10)toml");
auto ptrTable = parser2.Root().Direct("MyTable");
ASSERT_TRUE(ptrTable);
EXPECT_TRUE(parser1.Root().Combine(ptrTable->Cast<toml_parser::CNodeCollection>()));
std::string ssCombinedTOML = R"toml(
val1 = 10
val2 = "20"
val3 = 30.0)toml";
std::string ssGenerated;
EXPECT_NO_THROW(ssGenerated = parser1.GenerateTOML());
EXPECT_EQ(ssGenerated, ssCombinedTOML);
}
TEST(CombineReduse, CombineRootwithStandardTable)
{
toml_parser::CParser parser1(R"toml(
val1 = 10
val2 = "20")toml");
toml_parser::CParser parser2(R"toml([MyTable]
val3 = 30.0
val1 = 10)toml");
auto ptrTable = &parser2.Root();
ASSERT_TRUE(ptrTable);
EXPECT_TRUE(parser1.Root().Combine(ptrTable->Cast<toml_parser::CNodeCollection>()));
std::string ssCombinedTOML = R"toml(
val1 = 10
val2 = "20"
[MyTable]
val3 = 30.0
val1 = 10)toml";
std::string ssGenerated;
EXPECT_NO_THROW(ssGenerated = parser1.GenerateTOML());
EXPECT_EQ(ssGenerated, ssCombinedTOML);
}
TEST(CombineReduse, CombineRootwithInlineTable)
{
toml_parser::CParser parser1(R"toml(
val1 = 10
val2 = "20")toml");
toml_parser::CParser parser2(R"toml(MyTable = {val3 = 30.0, val1 = 10})toml");
auto ptrTable = &parser2.Root();
ASSERT_TRUE(ptrTable);
EXPECT_TRUE(parser1.Root().Combine(ptrTable->Cast<toml_parser::CNodeCollection>()));
std::string ssCombinedTOML = R"toml(
2026-03-27 14:12:49 +01:00
val1 = 10
val2 = "20"
MyTable = {val3 = 30.0, val1 = 10})toml";
2026-03-27 14:12:49 +01:00
std::string ssGenerated;
EXPECT_NO_THROW(ssGenerated = parser1.GenerateTOML());
EXPECT_EQ(ssGenerated, ssCombinedTOML);
}
TEST(CombineReduse, CombineTablewithRoot)
2026-03-27 14:12:49 +01:00
{
toml_parser::CParser parser1(R"toml([MyTable]
val1 = 10
val2 = "20")toml");
toml_parser::CParser parser2(R"toml(
val3 = 30.0
val1 = 10)toml");
auto ptrNode = parser1.Root().Direct("MyTable");
ASSERT_TRUE(ptrNode);
auto ptrTable = ptrNode->Cast<toml_parser::CNodeCollection>();
ASSERT_TRUE(ptrTable);
EXPECT_TRUE(ptrTable->Combine(parser2.Root().Cast<toml_parser::CNodeCollection>()));
std::string ssCombinedTOML = R"toml([MyTable]
2026-03-27 14:12:49 +01:00
val1 = 10
val2 = "20"
val3 = 30.0)toml";
2026-03-27 14:12:49 +01:00
std::string ssGenerated;
EXPECT_NO_THROW(ssGenerated = parser1.GenerateTOML());
EXPECT_EQ(ssGenerated, ssCombinedTOML);
}
TEST(CombineReduse, CombineTablewithDifferentTable)
2026-03-27 14:12:49 +01:00
{
toml_parser::CParser parser1(R"toml([MyTable1]
val1 = 10
val2 = "20")toml");
toml_parser::CParser parser2(R"toml([MyTable2]
val3 = 30.0
val1 = 10)toml");
auto ptrNode1 = parser1.Root().Direct("MyTable1");
ASSERT_TRUE(ptrNode1);
auto ptrTable1 = ptrNode1->Cast<toml_parser::CNodeCollection>();
ASSERT_TRUE(ptrTable1);
auto ptrNode2 = parser2.Root().Direct("MyTable2");
ASSERT_TRUE(ptrNode2);
auto ptrTable2 = ptrNode2->Cast<toml_parser::CNodeCollection>();
ASSERT_TRUE(ptrTable2);
EXPECT_TRUE(ptrTable1->Combine(ptrTable2));
std::string ssCombinedTOML = R"toml([MyTable1]
2026-03-27 14:12:49 +01:00
val1 = 10
val2 = "20"
val3 = 30.0)toml";
2026-03-27 14:12:49 +01:00
std::string ssGenerated;
EXPECT_NO_THROW(ssGenerated = parser1.GenerateTOML());
EXPECT_EQ(ssGenerated, ssCombinedTOML);
}
TEST(CombineReduse, CombineTablewithIdenticalTable)
2026-03-27 14:12:49 +01:00
{
toml_parser::CParser parser1(R"toml([MyTable]
val1 = 10
val2 = "20")toml");
toml_parser::CParser parser2(R"toml([MyTable]
val3 = 30.0
val1 = 10)toml");
EXPECT_TRUE(parser1.Root().Combine(parser2.Root().Cast<toml_parser::CNodeCollection>()));
std::string ssCombinedTOML = R"toml([MyTable]
2026-03-27 14:12:49 +01:00
val1 = 10
val2 = "20"
val3 = 30.0)toml";
2026-03-27 14:12:49 +01:00
std::string ssGenerated;
EXPECT_NO_THROW(ssGenerated = parser1.GenerateTOML());
EXPECT_EQ(ssGenerated, ssCombinedTOML);
}
TEST(CombineReduse, CombineInlineTablewithDifferentStandardTable)
2026-03-27 14:12:49 +01:00
{
toml_parser::CParser parser1(R"toml(MyTable1 = {val1 = 10, val2 = "20"})toml");
toml_parser::CParser parser2(R"toml([MyTable2]
val3 = 30.0
val1 = 10)toml");
auto ptrNode1 = parser1.Root().Direct("MyTable1");
ASSERT_TRUE(ptrNode1);
auto ptrTable1 = ptrNode1->Cast<toml_parser::CNodeCollection>();
ASSERT_TRUE(ptrTable1);
auto ptrNode2 = parser2.Root().Direct("MyTable2");
ASSERT_TRUE(ptrNode2);
auto ptrTable2 = ptrNode2->Cast<toml_parser::CNodeCollection>();
ASSERT_TRUE(ptrTable2);
EXPECT_TRUE(ptrTable1->Combine(ptrTable2));
std::string ssCombinedTOML = R"toml(MyTable1 = {val1 = 10, val2 = "20", val3 = 30.0})toml";
2026-03-27 14:12:49 +01:00
std::string ssGenerated;
EXPECT_NO_THROW(ssGenerated = parser1.GenerateTOML());
EXPECT_EQ(ssGenerated, ssCombinedTOML);
}
TEST(CombineReduse, CombineInlineTablewithIdenticalStandardTable)
2026-03-27 14:12:49 +01:00
{
toml_parser::CParser parser1(R"toml(MyTable = {val1 = 10, val2 = "20"})toml");
toml_parser::CParser parser2(R"toml([MyTable]
val3 = 30.0
val1 = 10)toml");
EXPECT_TRUE(parser1.Root().Combine(parser2.Root().Cast<toml_parser::CNodeCollection>()));
std::string ssCombinedTOML = R"toml(MyTable = {val1 = 10, val2 = "20", val3 = 30.0})toml";
2026-03-27 14:12:49 +01:00
std::string ssGenerated;
EXPECT_NO_THROW(ssGenerated = parser1.GenerateTOML());
EXPECT_EQ(ssGenerated, ssCombinedTOML);
}
TEST(CombineReduse, CombineStandardTablewithDifferentInlineTable)
2026-03-27 14:12:49 +01:00
{
toml_parser::CParser parser1(R"toml([MyTable1]
val1 = 10
val2 = "20")toml");
toml_parser::CParser parser2(R"toml(MyTable2 = {val3 = 30.0, val1 = 10})toml");
auto ptrNode1 = parser1.Root().Direct("MyTable1");
ASSERT_TRUE(ptrNode1);
auto ptrTable1 = ptrNode1->Cast<toml_parser::CNodeCollection>();
ASSERT_TRUE(ptrTable1);
auto ptrNode2 = parser2.Root().Direct("MyTable2");
ASSERT_TRUE(ptrNode2);
auto ptrTable2 = ptrNode2->Cast<toml_parser::CNodeCollection>();
ASSERT_TRUE(ptrTable2);
EXPECT_TRUE(ptrTable1->Combine(ptrTable2));
std::string ssCombinedTOML = R"toml([MyTable1]
2026-03-27 14:12:49 +01:00
val1 = 10
val2 = "20"
val3 = 30.0)toml";
2026-03-27 14:12:49 +01:00
std::string ssGenerated;
EXPECT_NO_THROW(ssGenerated = parser1.GenerateTOML());
EXPECT_EQ(ssGenerated, ssCombinedTOML);
}
TEST(CombineReduse, CombineStandardTablewithIdenticalInlineTable)
2026-03-27 14:12:49 +01:00
{
toml_parser::CParser parser1(R"toml([MyTable]
val1 = 10
val2 = "20")toml");
toml_parser::CParser parser2(R"toml(MyTable = {val3 = 30.0, val1 = 10})toml");
EXPECT_TRUE(parser1.Root().Combine(parser2.Root().Cast<toml_parser::CNodeCollection>()));
std::string ssCombinedTOML = R"toml([MyTable]
2026-03-27 14:12:49 +01:00
val1 = 10
val2 = "20"
val3 = 30.0)toml";
2026-03-27 14:12:49 +01:00
std::string ssGenerated;
EXPECT_NO_THROW(ssGenerated = parser1.GenerateTOML());
EXPECT_EQ(ssGenerated, ssCombinedTOML);
}
TEST(CombineReduse, CombineInlineTablewithDifferentInlineTable)
2026-03-27 14:12:49 +01:00
{
toml_parser::CParser parser1(R"toml(MyTable1 = {val1 = 10, val2 = "20"})toml");
toml_parser::CParser parser2(R"toml(MyTable2 = {val3 = 30.0, val1 = 10})toml");
auto ptrNode1 = parser1.Root().Direct("MyTable1");
ASSERT_TRUE(ptrNode1);
auto ptrTable1 = ptrNode1->Cast<toml_parser::CNodeCollection>();
ASSERT_TRUE(ptrTable1);
auto ptrNode2 = parser2.Root().Direct("MyTable2");
ASSERT_TRUE(ptrNode2);
auto ptrTable2 = ptrNode2->Cast<toml_parser::CNodeCollection>();
ASSERT_TRUE(ptrTable2);
EXPECT_TRUE(ptrTable1->Combine(ptrTable2));
std::string ssCombinedTOML = R"toml(MyTable1 = {val1 = 10, val2 = "20", val3 = 30.0})toml";
2026-03-27 14:12:49 +01:00
std::string ssGenerated;
EXPECT_NO_THROW(ssGenerated = parser1.GenerateTOML());
EXPECT_EQ(ssGenerated, ssCombinedTOML);
}
TEST(CombineReduse, CombineInlineTablewithIdenticalInlineTable)
2026-03-27 14:12:49 +01:00
{
toml_parser::CParser parser1(R"toml(MyTable = {val1 = 10, val2 = "20"})toml");
toml_parser::CParser parser2(R"toml(MyTable = {val3 = 30.0, val1 = 10})toml");
EXPECT_TRUE(parser1.Root().Combine(parser2.Root().Cast<toml_parser::CNodeCollection>()));
std::string ssCombinedTOML = R"toml(MyTable = {val1 = 10, val2 = "20", val3 = 30.0})toml";
2026-03-27 14:12:49 +01:00
std::string ssGenerated;
EXPECT_NO_THROW(ssGenerated = parser1.GenerateTOML());
EXPECT_EQ(ssGenerated, ssCombinedTOML);
}
TEST(CombineReduse, CombineDifferentArrays)
2026-03-27 14:12:49 +01:00
{
toml_parser::CParser parser1(R"toml(
val1 = [10, 20]
val2 = ["30", "40"])toml");
toml_parser::CParser parser2(R"toml(
val3 = [50.0, 60.0]
val1 = [70, 80])toml");
EXPECT_TRUE(parser1.Root().Combine(parser2.Root().Cast<toml_parser::CNodeCollection>()));
std::string ssCombinedTOML = R"toml(
2026-03-27 14:12:49 +01:00
val1 = [70, 80]
val2 = ["30", "40"]
val3 = [50.0, 60.0])toml";
2026-03-27 14:12:49 +01:00
std::string ssGenerated;
EXPECT_NO_THROW(ssGenerated = parser1.GenerateTOML());
EXPECT_EQ(ssGenerated, ssCombinedTOML);
}
TEST(CombineReduse, CombineDifferentTableArrays)
2026-03-27 14:12:49 +01:00
{
toml_parser::CParser parser1(R"toml([[table_array1]]
val1 = [10, 20]
[[table_array1]]
val2 = ["30", "40"])toml");
2026-03-27 14:12:49 +01:00
toml_parser::CParser parser2(R"toml(
[[table_array2]]
val3 = [50.0, 60.0]
[[table_array2]]
val1 = [70, 80])toml");
EXPECT_TRUE(parser1.Root().Combine(parser2.Root().Cast<toml_parser::CNodeCollection>()));
std::string ssCombinedTOML = R"toml([[table_array1]]
2026-03-27 14:12:49 +01:00
val1 = [10, 20]
[[table_array1]]
val2 = ["30", "40"]
[[table_array2]]
val3 = [50.0, 60.0]
[[table_array2]]
val1 = [70, 80])toml";
2026-03-27 14:12:49 +01:00
std::string ssGenerated;
EXPECT_NO_THROW(ssGenerated = parser1.GenerateTOML());
EXPECT_EQ(ssGenerated, ssCombinedTOML);
}
TEST(CombineReduse, ReduceRoot)
2026-03-27 14:12:49 +01:00
{
toml_parser::CParser parser1(R"toml(
val1 = 10
val2 = "20"
val3 = 30.0)toml");
toml_parser::CParser parser2(R"toml(
val3 = 35.0
val1 = 10)toml");
EXPECT_TRUE(parser1.Root().Reduce(parser2.Root().Cast<toml_parser::CNodeCollection>()));
std::string ssCombinedTOML = R"toml(val2 = "20"
val3 = 30.0)toml";
2026-03-27 14:12:49 +01:00
std::string ssGenerated;
EXPECT_NO_THROW(ssGenerated = parser1.GenerateTOML());
EXPECT_EQ(ssGenerated, ssCombinedTOML);
}
TEST(CombineReduse, ReduceRootComments)
2026-03-27 14:12:49 +01:00
{
toml_parser::CParser parser1(R"toml(
val1 = 10 # This is value 1
val2 = "20" # This is value 2
val3 = 30.0 # This is value 3)toml");
toml_parser::CParser parser2(R"toml(
val3 = 35.0 # This also is value 3
val1 = 10 # This also is value 1)toml");
EXPECT_TRUE(parser1.Root().Reduce(parser2.Root().Cast<toml_parser::CNodeCollection>()));
std::string ssCombinedTOML = R"toml(val2 = "20" # This is value 2
val3 = 30.0 # This is value 3)toml";
2026-03-27 14:12:49 +01:00
std::string ssGenerated;
EXPECT_NO_THROW(ssGenerated = parser1.GenerateTOML());
EXPECT_EQ(ssGenerated, ssCombinedTOML);
}
TEST(CombineReduse, ReduceTable)
2026-03-27 14:12:49 +01:00
{
toml_parser::CParser parser1(R"toml([my_table]
val1 = 10
val2 = "20"
val3 = 30.0)toml");
toml_parser::CParser parser2(R"toml([my_table]
val3 = 35.0
val1 = 10)toml");
EXPECT_TRUE(parser1.Root().Reduce(parser2.Root().Cast<toml_parser::CNodeCollection>()));
std::string ssCombinedTOML = R"toml([my_table]
2026-03-27 14:12:49 +01:00
val2 = "20"
val3 = 30.0)toml";
2026-03-27 14:12:49 +01:00
std::string ssGenerated;
EXPECT_NO_THROW(ssGenerated = parser1.GenerateTOML());
EXPECT_EQ(ssGenerated, ssCombinedTOML);
}
TEST(CombineReduse, ReduceStandardTableWithInlineTable)
2026-03-27 14:12:49 +01:00
{
toml_parser::CParser parser1(R"toml([my_table]
val1 = 10
val2 = "20"
val3 = 30.0)toml");
toml_parser::CParser parser2(R"toml(my_table = {val3 = 35.0, val1 = 10})toml");
EXPECT_TRUE(parser1.Root().Reduce(parser2.Root().Cast<toml_parser::CNodeCollection>()));
std::string ssCombinedTOML = R"toml([my_table]
2026-03-27 14:12:49 +01:00
val2 = "20"
val3 = 30.0)toml";
2026-03-27 14:12:49 +01:00
std::string ssGenerated;
EXPECT_NO_THROW(ssGenerated = parser1.GenerateTOML());
EXPECT_EQ(ssGenerated, ssCombinedTOML);
}
TEST(CombineReduse, ReduceInlineTableWithStandardTable)
2026-03-27 14:12:49 +01:00
{
toml_parser::CParser parser1(R"toml(my_table = {val1 = 10, val2 = "20", val3 = 30.0})toml");
toml_parser::CParser parser2(R"toml([my_table]
val3 = 35.0
val1 = 10)toml");
EXPECT_TRUE(parser1.Root().Reduce(parser2.Root().Cast<toml_parser::CNodeCollection>()));
std::string ssCombinedTOML = R"toml(my_table = { val2 = "20", val3 = 30.0})toml";
2026-03-27 14:12:49 +01:00
std::string ssGenerated;
EXPECT_NO_THROW(ssGenerated = parser1.GenerateTOML());
EXPECT_EQ(ssGenerated, ssCombinedTOML);
}
TEST(CombineReduse, ReduceInlineTable)
2026-03-27 14:12:49 +01:00
{
toml_parser::CParser parser1(R"toml(my_table = {val1 = 10, val2 = "20", val3 = 30.0})toml");
toml_parser::CParser parser2(R"toml(my_table = {val3 = 35.0, val1 = 10})toml");
EXPECT_TRUE(parser1.Root().Reduce(parser2.Root().Cast<toml_parser::CNodeCollection>()));
std::string ssCombinedTOML = R"toml(my_table = { val2 = "20", val3 = 30.0})toml";
2026-03-27 14:12:49 +01:00
std::string ssGenerated;
EXPECT_NO_THROW(ssGenerated = parser1.GenerateTOML());
EXPECT_EQ(ssGenerated, ssCombinedTOML);
}
TEST(CombineReduse, ReduceDifferentArrays)
2026-03-27 14:12:49 +01:00
{
toml_parser::CParser parser1(R"toml(
2026-03-27 14:12:49 +01:00
val1 = [10, 20]
val2 = ["30", "40"]
val3 = [50.0, 60.0])toml");
2026-03-27 14:12:49 +01:00
toml_parser::CParser parser2(R"toml(
val3 = [50.0, 60.0]
val1 = [70, 80])toml");
EXPECT_TRUE(parser1.Root().Reduce(parser2.Root().Cast<toml_parser::CNodeCollection>()));
std::string ssCombinedTOML = R"toml(
val1 = [10, 20]
val2 = ["30", "40"]
)toml";
std::string ssGenerated;
EXPECT_NO_THROW(ssGenerated = parser1.GenerateTOML());
EXPECT_EQ(ssGenerated, ssCombinedTOML);
}
TEST(CombineReduse, ReduceDifferentTableArrays)
2026-03-27 14:12:49 +01:00
{
toml_parser::CParser parser1(R"toml([[table_array1]]
2026-03-27 14:12:49 +01:00
val1 = [10, 20]
[[table_array1]]
val2 = ["30", "40"]
[[table_array2]]
val3 = [50.0, 60.0]
[[table_array2]]
val1 = [70, 80])toml");
2026-03-27 14:12:49 +01:00
toml_parser::CParser parser2(R"toml(
[[table_array1]]
val2 = ["30", "40"]
[[table_array2]]
val3 = [50.0, 60.0]
[[table_array2]]
val1 = [70]
)toml");
EXPECT_TRUE(parser1.Root().Reduce(parser2.Root().Cast<toml_parser::CNodeCollection>()));
std::string ssCombinedTOML = R"toml([[table_array1]]
val1 = [10, 20]
[[table_array2]]
val1 = [70, 80])toml";
std::string ssGenerated;
EXPECT_NO_THROW(ssGenerated = parser1.GenerateTOML());
EXPECT_EQ(ssGenerated, ssCombinedTOML);
}