testStdOptionalSerialization.cpp
Go to the documentation of this file.
2 
3 #include <boost/archive/binary_iarchive.hpp>
4 #include <boost/archive/binary_oarchive.hpp>
5 #include <boost/archive/xml_iarchive.hpp>
6 #include <boost/archive/xml_oarchive.hpp>
7 
10 
11 using namespace gtsam;
12 
13 // A test to check that the serialization of std::optional works with boost
14 TEST(StdOptionalSerialization, SerializeIntOptional) {
15  // Create an optional
16  std::optional<int> opt(42);
17 
18  // Serialize it
19  std::stringstream ss;
20  boost::archive::text_oarchive oa(ss);
21  oa << opt;
22 
23  // Deserialize it
24  std::optional<int> opt2;
25  boost::archive::text_iarchive ia(ss);
26  ia >> opt2;
27 
28  // Check that it worked
29  EXPECT(opt2.has_value());
30  EXPECT(*opt2 == 42);
31 }
32 
33 // A test to check if we serialize an empty optional, it is deserialized as an
34 // empty optional
35 TEST(StdOptionalSerialization, SerializeEmptyOptional) {
36  // Create an optional
37  std::optional<int> opt;
38 
39  // Serialize it
40  std::stringstream ss;
41  boost::archive::text_oarchive oa(ss);
42  oa << opt;
43 
44  // Deserialize it
45  std::optional<int> opt2 = 43;
46  boost::archive::text_iarchive ia(ss);
47  ia >> opt2;
48 
49  // Check that it worked
50  EXPECT(!opt2.has_value());
51 }
52 
53 /* ************************************************************************* */
54 // Implement the equals trait for TestOptionalStruct
55 namespace gtsam {
56 // A struct which contains an optional
58 public:
59  std::optional<int> opt;
60  TestOptionalStruct() = default;
61  TestOptionalStruct(const int& opt)
62  : opt(opt) {}
63  bool operator==(const TestOptionalStruct& other) const {
64  // check the values are equal
65  return *opt == *other.opt;
66  }
68  template <class Archive>
69  void serialize(Archive& ar, const unsigned int /*version*/) {
70  ar& BOOST_SERIALIZATION_NVP(opt);
71  }
72 };
73 
74 template <>
76  static bool Equals(const TestOptionalStruct& q1, const TestOptionalStruct& q2, double) {
77  // if both have values then compare the values
78  if (q1.opt.has_value() && q2.opt.has_value()) {
79  return *q1.opt == *q2.opt;
80  }
81  // otherwise check that both are empty
82  return q1.opt == q2.opt;
83  }
84 
85  static void Print(const TestOptionalStruct& m, const std::string& s = "") {
86  /* std::cout << s << "opt: " << m.opt << std::endl; */
87  if (m.opt.has_value()) {
88  std::cout << s << "opt: " << *m.opt << std::endl;
89  } else {
90  std::cout << s << "opt: empty" << std::endl;
91  }
92  }
93 };
94 } // namespace gtsam
95 
96 // Test for a struct with an initialized optional
97 TEST(StdOptionalSerialization, SerializTestOptionalStruct) {
98  TestOptionalStruct optStruct(10);
99  EXPECT(serializationTestHelpers::equalsObj(optStruct));
100  EXPECT(serializationTestHelpers::equalsXML(optStruct));
101  EXPECT(serializationTestHelpers::equalsBinary(optStruct));
102 }
103 
104 // Test for a struct with an uninitialized optional
105 TEST(StdOptionalSerialization, SerializTestOptionalStructUninitialized) {
106  TestOptionalStruct optStruct;
107  EXPECT(serializationTestHelpers::equalsObj(optStruct));
108  EXPECT(serializationTestHelpers::equalsXML(optStruct));
109  EXPECT(serializationTestHelpers::equalsBinary(optStruct));
110 }
111 
112 // Test for serialization of std::optional<TestOptionalStruct>
113 TEST(StdOptionalSerialization, SerializTestOptionalStructPointer) {
114  // Create an optional
115  std::optional<TestOptionalStruct> opt(TestOptionalStruct(42));
116 
117  // Serialize it
118  std::stringstream ss;
119  boost::archive::text_oarchive oa(ss);
120  oa << opt;
121 
122  // Deserialize it
123  std::optional<TestOptionalStruct> opt2;
124  boost::archive::text_iarchive ia(ss);
125  ia >> opt2;
126 
127  // Check that it worked
128  EXPECT(opt2.has_value());
129  EXPECT(*opt2 == TestOptionalStruct(42));
130 }
131 
132 // Test for serialization of std::optional<TestOptionalStruct*>
133 TEST(StdOptionalSerialization, SerializTestOptionalStructPointerPointer) {
134  // Create an optional
135  std::optional<TestOptionalStruct*> opt(new TestOptionalStruct(42));
136 
137  // Serialize it
138  std::stringstream ss;
139  boost::archive::text_oarchive oa(ss);
140  oa << opt;
141 
142  // Deserialize it
143  std::optional<TestOptionalStruct*> opt2;
144  boost::archive::text_iarchive ia(ss);
145  ia >> opt2;
146 
147  // Check that it worked
148  EXPECT(opt2.has_value());
149  EXPECT(**opt2 == TestOptionalStruct(42));
150 
151  delete (*opt);
152  delete (*opt2);
153 }
154 
155 int main() {
156  TestResult tr;
157  return TestRegistry::runAllTests(tr);
158 }
TestRegistry::runAllTests
static int runAllTests(TestResult &result)
Definition: TestRegistry.cpp:27
gtsam::TestOptionalStruct::serialize
void serialize(Archive &ar, const unsigned int)
Definition: testStdOptionalSerialization.cpp:69
gtsam::TestOptionalStruct
Definition: testStdOptionalSerialization.cpp:57
gtsam::TestOptionalStruct::TestOptionalStruct
TestOptionalStruct(const int &opt)
Definition: testStdOptionalSerialization.cpp:61
s
RealScalar s
Definition: level1_cplx_impl.h:126
gtsam::traits< TestOptionalStruct >::Print
static void Print(const TestOptionalStruct &m, const std::string &s="")
Definition: testStdOptionalSerialization.cpp:85
EXPECT
#define EXPECT(condition)
Definition: Test.h:150
TestHarness.h
gtsam::TestOptionalStruct::opt
std::optional< int > opt
Definition: testStdOptionalSerialization.cpp:59
ss
static std::stringstream ss
Definition: testBTree.cpp:31
m
Matrix3f m
Definition: AngleAxis_mimic_euler.cpp:1
serializationTestHelpers.h
gtsam::TestOptionalStruct::access
friend class boost::serialization::access
Definition: testStdOptionalSerialization.cpp:67
TestResult
Definition: TestResult.h:26
std_optional_serialization.h
gtsam
traits
Definition: SFMdata.h:40
gtsam::TEST
TEST(SmartFactorBase, Pinhole)
Definition: testSmartFactorBase.cpp:38
gtsam::traits
Definition: Group.h:36
gtsam::TestOptionalStruct::TestOptionalStruct
TestOptionalStruct()=default
main
int main()
Definition: testStdOptionalSerialization.cpp:155
gtsam::traits< TestOptionalStruct >::Equals
static bool Equals(const TestOptionalStruct &q1, const TestOptionalStruct &q2, double)
Definition: testStdOptionalSerialization.cpp:76
pybind_wrapper_test_script.other
other
Definition: pybind_wrapper_test_script.py:42
gtsam::TestOptionalStruct::operator==
bool operator==(const TestOptionalStruct &other) const
Definition: testStdOptionalSerialization.cpp:63


gtsam
Author(s):
autogenerated on Fri Mar 7 2025 04:08:18