@@ -63,12 +63,34 @@ class TestObjectSupportsUpdate : public TestObject
6363 }
6464};
6565
66+ class TestObjectSupportsUpdateFailure : public TestObject
67+ {
68+ public:
69+ using Ptr = std::shared_ptr<TestObjectSupportsUpdateFailure>;
70+ using ConstPtr = std::shared_ptr<const TestObjectSupportsUpdateFailure>;
71+
72+ bool update (const TestObjectSupportsUpdateFailure::ConstPtr& pattern)
73+ {
74+ val_1 = pattern->val_1 ;
75+ val_2 = pattern->val_2 ;
76+ revision_ = pattern->revision_ ;
77+ return true ;
78+ }
79+
80+ TestObjectSupportsUpdateFailure::Ptr clone () const
81+ {
82+ throw std::runtime_error (" TestObjectSupportsUpdateFailure: clone failed!" );
83+ }
84+ };
85+
6686TEST (TesseractCloneCacheUnit, WithoutUpdate) // NOLINT
6787{
6888 auto original = std::make_shared<TestObject>();
6989 original->val_1 = 1 ;
7090 original->val_2 = 2 ;
7191 auto clone_cache = std::make_shared<CloneCache<TestObject>>(original, 3 );
92+ EXPECT_EQ (clone_cache->getCacheSize (), 3 );
93+ EXPECT_EQ (clone_cache->getCurrentCacheSize (), 3 );
7294
7395 // Baseline clone of original
7496 {
@@ -90,6 +112,27 @@ TEST(TesseractCloneCacheUnit, WithoutUpdate) // NOLINT
90112 original->revision_ ++;
91113 EXPECT_NE (original->val_1 , clone->val_1 );
92114 }
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+ }
93136 // Try cloning more times than the cache is big
94137 for (int i = 0 ; i < 10 ; i++)
95138 {
@@ -99,6 +142,7 @@ TEST(TesseractCloneCacheUnit, WithoutUpdate) // NOLINT
99142 EXPECT_EQ (clone_cache->getCacheSize (), 3 );
100143 clone_cache->setCacheSize (8 );
101144 EXPECT_EQ (clone_cache->getCacheSize (), 8 );
145+ EXPECT_EQ (clone_cache->getCurrentCacheSize (), 8 );
102146}
103147
104148TEST (TesseractCloneCacheUnit, SupportsUpdate) // NOLINT
@@ -107,6 +151,8 @@ TEST(TesseractCloneCacheUnit, SupportsUpdate) // NOLINT
107151 original->val_1 = 1 ;
108152 original->val_2 = 2 ;
109153 auto clone_cache = std::make_shared<CloneCache<TestObjectSupportsUpdate>>(original, 3 );
154+ EXPECT_EQ (clone_cache->getCacheSize (), 3 );
155+ EXPECT_EQ (clone_cache->getCurrentCacheSize (), 3 );
110156
111157 // Baseline clone of original
112158 {
@@ -127,6 +173,30 @@ TEST(TesseractCloneCacheUnit, SupportsUpdate) // NOLINT
127173
128174 original->revision_ ++;
129175 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 );
130200 }
131201 // Try cloning more times than the cache is big
132202 for (int i = 0 ; i < 10 ; i++)
@@ -137,6 +207,42 @@ TEST(TesseractCloneCacheUnit, SupportsUpdate) // NOLINT
137207 EXPECT_EQ (clone_cache->getCacheSize (), 3 );
138208 clone_cache->setCacheSize (8 );
139209 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+ }
140246}
141247
142248int main (int argc, char ** argv)
0 commit comments