Fix memory management issues in Pgsql_Params leave sources of moves in a valid state.

This commit is contained in:
eelke 2026-10-18 13:38:41 +02:00
parent ee404e8121
commit 8dea806cd9
4 changed files with 132 additions and 48 deletions

View file

@ -3,6 +3,7 @@ add_executable(PgsqlTests
tst_Value.cpp
tst_ArrayParser.cpp
tst_Pgsql_oids.cpp
tst_Pgsql_Params.cpp
)
target_link_libraries(PgsqlTests PRIVATE

View file

@ -0,0 +1,85 @@
#include <gtest/gtest.h>
#include <gmock/gmock-matchers.h>
#include <string>
#include <utility>
#include <vector>
#include "Pgsql_Params.h"
#include "PrintTo_Qt.h"
using namespace testing;
using namespace Pgsql;
namespace {
void expectValues(const Params &p, const std::vector<std::string> &expected)
{
ASSERT_EQ(p.size(), static_cast<int>(expected.size()));
for (int i = 0; i < p.size(); ++i) {
ASSERT_NE(p.values()[i], nullptr);
EXPECT_STREQ(p.values()[i], expected[i].c_str());
}
}
}
TEST(Pgsql_Params, CopyAssignIntoNonEmpty)
{
Params src;
src.add("a");
src.add("bb");
Params dst;
dst.add("x");
dst.add("y");
dst.add("z");
dst = src;
expectValues(dst, {"a", "bb"});
expectValues(src, {"a", "bb"});
}
TEST(Pgsql_Params, CopyAssignIntoEmpty)
{
Params src;
src.add("a");
src.add("bb");
Params dst;
dst = src;
expectValues(dst, {"a", "bb"});
}
TEST(Pgsql_Params, MoveAssignIntoNonEmpty)
{
Params src;
src.add("a");
src.add("bb");
Params dst;
dst.add("x");
dst.add("y");
dst.add("z");
dst = std::move(src);
expectValues(dst, {"a", "bb"});
}
TEST(Pgsql_Params, CopyConstructorDoesNotAliasSource)
{
Params src;
src.add("abc");
Params dst(src);
src.clear();
expectValues(dst, {"abc"});
}
TEST(Pgsql_Params, CopyPreservesNull)
{
Params src;
src.add(std::optional<std::string>{});
src.add("v");
Params dst(src);
ASSERT_EQ(dst.size(), 2);
EXPECT_EQ(dst.values()[0], nullptr);
EXPECT_STREQ(dst.values()[1], "v");
}