From 366e612a8d7d1877bcf763924342d37c7088df78 Mon Sep 17 00:00:00 2001 From: Loki Astari Date: Mon, 15 Jul 2024 20:41:31 -0700 Subject: [PATCH] Fix issue 87 --- src/Serialize/Traits.h | 16 +++++++++-- src/Serialize/test/Issue87Test.cpp | 46 ++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 src/Serialize/test/Issue87Test.cpp diff --git a/src/Serialize/Traits.h b/src/Serialize/Traits.h index f3fb0b52..703465e4 100644 --- a/src/Serialize/Traits.h +++ b/src/Serialize/Traits.h @@ -565,10 +565,20 @@ class Traits return Traits>::getPrintSize(printer, object.*memPtr, false);\ } \ \ - template \ - static std::pair addSizeEachMemberItem(PrinterInterface& printer, MyType const& object, M item) \ + template \ + static std::pair addSizeEachMemberItem(PrinterInterface& printer, MyType const& object, std::pair const& item) \ + { \ + if (!Filter::filter(object, item.first, *(item.second))) { \ + return std::make_pair(0UL,0UL); \ + } \ + auto partSize = addSizeOneMember(printer, object, item.second); \ + auto nameSize = std::strlen(Override::nameOverride(item.first)); \ + return std::make_pair(partSize + nameSize, 1); \ + } \ + template \ + static std::pair addSizeEachMemberItem(PrinterInterface& printer, MyType const& object, std::pair const& item) \ { \ - if (!Filter::filter(object, item.first, item)) { \ + if (!Filter::filter(object, item.first, object.*(item.second))) { \ return std::make_pair(0UL,0UL); \ } \ auto partSize = addSizeOneMember(printer, object, item.second); \ diff --git a/src/Serialize/test/Issue87Test.cpp b/src/Serialize/test/Issue87Test.cpp new file mode 100644 index 00000000..4a0429bc --- /dev/null +++ b/src/Serialize/test/Issue87Test.cpp @@ -0,0 +1,46 @@ +#include "gtest/gtest.h" + +#include "Traits.h" +#include "BsonThor.h" + +#include +#include + +using ThorsAnvil::Serialize::bsonExporter; +using namespace std::string_literals; + +struct WriteConcern +{ + std::optional w; + bool j = false; +}; + +ThorsAnvil_MakeTrait(WriteConcern, w, j); + + +TEST(Issue87Test, FieldJOnly) +{ + WriteConcern a; + std::stringstream output; + output << bsonExporter(a); + + EXPECT_EQ( "\x09\x00\x00\x00" + "\x08" "j\x00" "\x00" + "\x00"s, + output.str()); +} + +TEST(Issue87Test, FieldJAndW) +{ + WriteConcern a; + a.w = 7; + std::stringstream output; + output << bsonExporter(a); + + EXPECT_EQ( "\x10\x00\x00\x00" + "\x10" "w\x00" "\x07\x00\x00\x00" + "\x08" "j\x00" "\x00" + "\x00"s, + output.str()); +} +