clone_cache_unit.cpp
Go to the documentation of this file.
3 #include <gtest/gtest.h>
5 
7 
8 using namespace tesseract_common;
13 {
14 public:
15  using Ptr = std::shared_ptr<TestObject>;
16  using ConstPtr = std::shared_ptr<const TestObject>;
17 
18  TestObject() = default;
19  virtual ~TestObject() = default;
20  TestObject(const TestObject&) = delete;
21  TestObject& operator=(const TestObject&) = delete;
22  TestObject(TestObject&&) = delete;
23  TestObject& operator=(TestObject&&) = delete;
24 
26  {
27  auto clone = std::make_shared<TestObject>();
28  clone->val_1 = val_1;
29  clone->val_2 = val_2;
30  clone->revision_ = revision_;
31  return clone;
32  }
33 
34  int getRevision() const { return revision_; }
35 
36  int val_1{ 0 };
37  int val_2{ 0 };
38 
39  int revision_{ 0 };
40 };
41 
43 {
44 public:
45  using Ptr = std::shared_ptr<TestObjectSupportsUpdate>;
46  using ConstPtr = std::shared_ptr<const TestObjectSupportsUpdate>;
47 
49  {
50  val_1 = pattern->val_1;
51  val_2 = pattern->val_2;
52  revision_ = pattern->revision_;
53  return true;
54  }
55 
57  {
58  TestObjectSupportsUpdate::Ptr clone = std::make_shared<TestObjectSupportsUpdate>();
59  clone->val_1 = val_1;
60  clone->val_2 = val_2;
61  clone->revision_ = revision_;
62  return clone;
63  }
64 };
65 
67 {
68 public:
69  using Ptr = std::shared_ptr<TestObjectSupportsUpdateFailure>;
70  using ConstPtr = std::shared_ptr<const TestObjectSupportsUpdateFailure>;
71 
73  {
74  val_1 = pattern->val_1;
75  val_2 = pattern->val_2;
76  revision_ = pattern->revision_;
77  return true;
78  }
79 
81  {
82  throw std::runtime_error("TestObjectSupportsUpdateFailure: clone failed!");
83  }
84 };
85 
86 TEST(TesseractCloneCacheUnit, WithoutUpdate) // NOLINT
87 {
88  auto original = std::make_shared<TestObject>();
89  original->val_1 = 1;
90  original->val_2 = 2;
91  auto clone_cache = std::make_shared<CloneCache<TestObject>>(original, 3);
92  EXPECT_EQ(clone_cache->getCacheSize(), 3);
93  EXPECT_EQ(clone_cache->getCurrentCacheSize(), 3);
94 
95  // Baseline clone of original
96  {
97  auto clone = clone_cache->clone();
98  EXPECT_EQ(original->val_1, clone->val_1);
99  EXPECT_EQ(original->val_2, clone->val_2);
100  }
101  // Change value without changing revision would be expected to fail
102  {
103  auto clone = clone_cache->clone();
104 
105  original->val_1 = 3;
106  EXPECT_NE(original->val_1, clone->val_1);
107  }
108  // Now it should update the cache and be the same
109  {
110  auto clone = clone_cache->clone();
111 
112  original->revision_++;
113  EXPECT_NE(original->val_1, clone->val_1);
114  }
115  // Cache should be empty so call update
116  {
117  EXPECT_EQ(clone_cache->getCurrentCacheSize(), 0);
118  clone_cache->updateCache();
119  EXPECT_EQ(clone_cache->getCurrentCacheSize(), 3);
120  }
121  // Now change revision and call update
122  {
123  original->revision_++;
124  original->val_1 = 5;
125  clone_cache->updateCache();
126  auto clone = clone_cache->clone();
127  EXPECT_EQ(original->val_1, clone->val_1);
128  }
129  // Now change revision and call clone
130  {
131  original->revision_++;
132  original->val_1 = 6;
133  auto clone = clone_cache->clone();
134  EXPECT_EQ(original->val_1, clone->val_1);
135  }
136  // Try cloning more times than the cache is big
137  for (int i = 0; i < 10; i++)
138  {
139  auto clone = clone_cache->clone();
140  }
141  // Test getters/setters
142  EXPECT_EQ(clone_cache->getCacheSize(), 3);
143  clone_cache->setCacheSize(8);
144  EXPECT_EQ(clone_cache->getCacheSize(), 8);
145  EXPECT_EQ(clone_cache->getCurrentCacheSize(), 8);
146 }
147 
148 TEST(TesseractCloneCacheUnit, SupportsUpdate) // NOLINT
149 {
150  auto original = std::make_shared<TestObjectSupportsUpdate>();
151  original->val_1 = 1;
152  original->val_2 = 2;
153  auto clone_cache = std::make_shared<CloneCache<TestObjectSupportsUpdate>>(original, 3);
154  EXPECT_EQ(clone_cache->getCacheSize(), 3);
155  EXPECT_EQ(clone_cache->getCurrentCacheSize(), 3);
156 
157  // Baseline clone of original
158  {
159  auto clone = clone_cache->clone();
160  EXPECT_EQ(original->val_1, clone->val_1);
161  EXPECT_EQ(original->val_2, clone->val_2);
162  }
163  // Change value without changing revision would be expected to fail
164  {
165  auto clone = clone_cache->clone();
166 
167  original->val_1 = 3;
168  EXPECT_NE(original->val_1, clone->val_1);
169  }
170  // Now it should update the cache and be the same
171  {
172  auto clone = clone_cache->clone();
173 
174  original->revision_++;
175  EXPECT_NE(original->val_1, clone->val_1);
176 
177  auto updated_clone = clone_cache->clone();
178  EXPECT_EQ(original->val_1, updated_clone->val_1);
179  }
180  // Cache should be empty so call update
181  {
182  EXPECT_EQ(clone_cache->getCurrentCacheSize(), 0);
183  clone_cache->updateCache();
184  EXPECT_EQ(clone_cache->getCurrentCacheSize(), 3);
185  }
186  // Now change revision and call update
187  {
188  original->revision_++;
189  original->val_1 = 5;
190  clone_cache->updateCache();
191  auto clone = clone_cache->clone();
192  EXPECT_EQ(original->val_1, clone->val_1);
193  }
194  // Now change revision and call clone
195  {
196  original->revision_++;
197  original->val_1 = 6;
198  auto clone = clone_cache->clone();
199  EXPECT_EQ(original->val_1, clone->val_1);
200  }
201  // Try cloning more times than the cache is big
202  for (int i = 0; i < 10; i++)
203  {
204  auto clone = clone_cache->clone();
205  }
206  // Test getters/setters
207  EXPECT_EQ(clone_cache->getCacheSize(), 3);
208  clone_cache->setCacheSize(8);
209  EXPECT_EQ(clone_cache->getCacheSize(), 8);
210  EXPECT_EQ(clone_cache->getCurrentCacheSize(), 8);
211 }
212 
213 TEST(TesseractCloneCacheUnit, SupportsUpdateFailure) // NOLINT
214 {
215  { // Test original is a nullptr
216  std::shared_ptr<TestObjectSupportsUpdate> original;
217  auto clone_cache = std::make_shared<CloneCache<TestObjectSupportsUpdate>>(original, 3);
218  EXPECT_TRUE(clone_cache->clone() == nullptr);
219  EXPECT_EQ(clone_cache->getCacheSize(), 3);
220  EXPECT_EQ(clone_cache->getCurrentCacheSize(), 0);
221  clone_cache->updateCache();
222  EXPECT_EQ(clone_cache->getCurrentCacheSize(), 0);
223  }
224 
225  // Test when clone throws an exception
226  auto original = std::make_shared<TestObjectSupportsUpdateFailure>();
227  original->val_1 = 1;
228  original->val_2 = 2;
229  auto clone_cache = std::make_shared<CloneCache<TestObjectSupportsUpdateFailure>>(original, 3);
230  EXPECT_EQ(clone_cache->getCacheSize(), 3);
231  EXPECT_EQ(clone_cache->getCurrentCacheSize(), 0);
232 
233  // Baseline clone of original which should be nullptr because of exception during clone
234  {
235  EXPECT_TRUE(clone_cache->clone() == nullptr);
236  EXPECT_EQ(clone_cache->getCacheSize(), 3);
237  EXPECT_EQ(clone_cache->getCurrentCacheSize(), 0);
238  }
239  // Now it should update the cache and clone should be nullptr because of exception during clone
240  {
241  original->revision_++;
242  EXPECT_EQ(clone_cache->getCacheSize(), 3);
243  EXPECT_EQ(clone_cache->getCurrentCacheSize(), 0);
244  EXPECT_TRUE(clone_cache->clone() == nullptr);
245  }
246 }
247 
248 int main(int argc, char** argv)
249 {
250  testing::InitGoogleTest(&argc, argv);
251 
252  return RUN_ALL_TESTS();
253 }
TestObject::ConstPtr
std::shared_ptr< const TestObject > ConstPtr
Definition: clone_cache_unit.cpp:16
TestObject::clone
TestObject::Ptr clone() const
Definition: clone_cache_unit.cpp:25
tesseract_common
Definition: allowed_collision_matrix.h:19
TestObject
Object used to test the CloneCache.
Definition: clone_cache_unit.cpp:12
TestObjectSupportsUpdate::Ptr
std::shared_ptr< TestObjectSupportsUpdate > Ptr
Definition: clone_cache_unit.cpp:45
main
int main(int argc, char **argv)
Definition: clone_cache_unit.cpp:248
macros.h
Common Tesseract Macros.
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
#define TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
Definition: macros.h:71
TestObjectSupportsUpdate::clone
TestObjectSupportsUpdate::Ptr clone() const
Definition: clone_cache_unit.cpp:56
TestObjectSupportsUpdate::update
bool update(const TestObjectSupportsUpdate::ConstPtr &pattern)
Definition: clone_cache_unit.cpp:48
TestObjectSupportsUpdateFailure::ConstPtr
std::shared_ptr< const TestObjectSupportsUpdateFailure > ConstPtr
Definition: clone_cache_unit.cpp:70
TEST
TEST(TesseractCloneCacheUnit, WithoutUpdate)
Definition: clone_cache_unit.cpp:86
TestObjectSupportsUpdateFailure::update
bool update(const TestObjectSupportsUpdateFailure::ConstPtr &pattern)
Definition: clone_cache_unit.cpp:72
TestObject::Ptr
std::shared_ptr< TestObject > Ptr
Definition: clone_cache_unit.cpp:15
TestObjectSupportsUpdateFailure
Definition: clone_cache_unit.cpp:66
TestObject::getRevision
int getRevision() const
Definition: clone_cache_unit.cpp:34
TestObjectSupportsUpdate::ConstPtr
std::shared_ptr< const TestObjectSupportsUpdate > ConstPtr
Definition: clone_cache_unit.cpp:46
TESSERACT_COMMON_IGNORE_WARNINGS_POP
#define TESSERACT_COMMON_IGNORE_WARNINGS_POP
Definition: macros.h:72
TestObjectSupportsUpdateFailure::clone
TestObjectSupportsUpdateFailure::Ptr clone() const
Definition: clone_cache_unit.cpp:80
TestObjectSupportsUpdateFailure::Ptr
std::shared_ptr< TestObjectSupportsUpdateFailure > Ptr
Definition: clone_cache_unit.cpp:69
clone_cache.h
TestObjectSupportsUpdate
Definition: clone_cache_unit.cpp:42


tesseract_common
Author(s): Levi Armstrong
autogenerated on Sun May 18 2025 03:01:40