From 88fa9cab0ee855dae804bb26fcef8b6d88d8d688 Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Fri, 30 Apr 2021 12:03:48 +0200
Subject: [PATCH] Fix tests for EntityInstance

---
 .../armem/core/base/EntityInstanceBase.h      |   8 -
 .../armem/core/diskmemory/EntityInstance.cpp  |   9 +-
 .../armem/core/diskmemory/EntityInstance.h    |   7 +-
 .../core/longtermmemory/EntityInstance.cpp    |  13 -
 .../core/longtermmemory/EntityInstance.h      |   7 +-
 .../core/workingmemory/EntityInstance.cpp     |  27 +-
 .../armem/core/workingmemory/EntityInstance.h |  12 +-
 .../libraries/armem/test/ArMemMemoryTest.cpp  | 331 ++++++++++++------
 8 files changed, 262 insertions(+), 152 deletions(-)

diff --git a/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h b/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h
index fdf8d2be7..4e2471f3d 100644
--- a/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h
+++ b/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h
@@ -36,14 +36,6 @@ namespace armarx::armem::base
         {
         }
 
-        /*
-                EntityInstanceBase& operator=(const EntityInstanceBase& other)
-                {
-                    other._copySelf(*this);
-                    return *this;
-                }
-        */
-
 
         inline int& index()
         {
diff --git a/source/RobotAPI/libraries/armem/core/diskmemory/EntityInstance.cpp b/source/RobotAPI/libraries/armem/core/diskmemory/EntityInstance.cpp
index 1ee7691f4..49bfe419d 100644
--- a/source/RobotAPI/libraries/armem/core/diskmemory/EntityInstance.cpp
+++ b/source/RobotAPI/libraries/armem/core/diskmemory/EntityInstance.cpp
@@ -13,23 +13,20 @@
 
 namespace armarx::armem::d_ltm
 {
+
     EntityInstance::EntityInstance(const EntityInstance& other) :
         Base(other),
         path(other.path)
     {
     }
 
-    EntityInstance& EntityInstance::operator=(const EntityInstance& other)
-    {
-        other._copySelf(*this);
-        return *this;
-    }
-
     bool EntityInstance::equalsDeep(const EntityInstance& other) const
     {
         return id() == other.id();
     }
 
+
+
     void EntityInstance::update(const EntityUpdate& update, int index)
     {
         ARMARX_CHECK_FITS_SIZE(index, update.instancesData.size());
diff --git a/source/RobotAPI/libraries/armem/core/diskmemory/EntityInstance.h b/source/RobotAPI/libraries/armem/core/diskmemory/EntityInstance.h
index 37bebb7b6..9ee48c55b 100644
--- a/source/RobotAPI/libraries/armem/core/diskmemory/EntityInstance.h
+++ b/source/RobotAPI/libraries/armem/core/diskmemory/EntityInstance.h
@@ -20,8 +20,11 @@ namespace armarx::armem::d_ltm
 
         using Base::EntityInstanceBase;
 
-        EntityInstance(const EntityInstance&);
-        EntityInstance& operator=(const EntityInstance& other);
+        EntityInstance(const EntityInstance& other);
+        EntityInstance(EntityInstance&& other) = default;
+        EntityInstance& operator=(const EntityInstance& other) = default;
+        EntityInstance& operator=(EntityInstance&& other) = default;
+
 
         /**
          * @brief Fill `*this` with the update's values.
diff --git a/source/RobotAPI/libraries/armem/core/longtermmemory/EntityInstance.cpp b/source/RobotAPI/libraries/armem/core/longtermmemory/EntityInstance.cpp
index b83f77e74..6332be7ea 100644
--- a/source/RobotAPI/libraries/armem/core/longtermmemory/EntityInstance.cpp
+++ b/source/RobotAPI/libraries/armem/core/longtermmemory/EntityInstance.cpp
@@ -13,19 +13,6 @@ namespace armarx::armem::ltm
                && std::abs(confidence - other.confidence) < 1e-6f;
     }
 
-    EntityInstance::EntityInstance(const EntityInstance& other) :
-        Base(other),
-        _metadata(other._metadata)
-    {
-    }
-
-
-    EntityInstance& EntityInstance::operator=(const EntityInstance& other)
-    {
-        other._copySelf(*this);
-        return *this;
-    }
-
     bool EntityInstance::equalsDeep(const EntityInstance& other) const
     {
         return id() == other.id() && _metadata == other.metadata();
diff --git a/source/RobotAPI/libraries/armem/core/longtermmemory/EntityInstance.h b/source/RobotAPI/libraries/armem/core/longtermmemory/EntityInstance.h
index 39225dd6e..f78668e5e 100644
--- a/source/RobotAPI/libraries/armem/core/longtermmemory/EntityInstance.h
+++ b/source/RobotAPI/libraries/armem/core/longtermmemory/EntityInstance.h
@@ -42,8 +42,11 @@ namespace armarx::armem::ltm
 
         using Base::EntityInstanceBase;
 
-        EntityInstance(const EntityInstance& other);
-        EntityInstance& operator=(const EntityInstance& other);
+        EntityInstance(const EntityInstance& other) = default;
+        EntityInstance(EntityInstance&& other) = default;
+        EntityInstance& operator=(const EntityInstance& other) = default;
+        EntityInstance& operator=(EntityInstance&& other) = default;
+
 
         EntityInstanceMetadata& metadata()
         {
diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.cpp b/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.cpp
index 4d8de5156..95e508bde 100644
--- a/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.cpp
+++ b/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.cpp
@@ -3,6 +3,17 @@
 #include <ArmarXCore/core/exceptions/local/ExpressionException.h>
 
 
+std::ostream& armarx::armem::wm::operator<<(std::ostream& os, const EntityInstanceMetadata& d)
+{
+    os << "EntityInstanceMetadata: "
+       << "\n- t_create =   \t" << armem::toStringMicroSeconds(d.timeCreated) << " us"
+       << "\n- t_sent =     \t" << armem::toStringMicroSeconds(d.timeSent) << " us"
+       << "\n- t_arrived =  \t" << armem::toStringMicroSeconds(d.timeArrived) << " us"
+       << "\n- confidence = \t" << d.confidence << " us"
+          ;
+    return os;
+}
+
 namespace armarx::armem::wm
 {
 
@@ -15,22 +26,6 @@ namespace armarx::armem::wm
     }
 
 
-    /*
-    EntityInstance::EntityInstance(const EntityInstance& other) :
-        Base(other),
-        _metadata(other._metadata),
-        _data(other._data)
-    {
-    }
-
-    EntityInstance& EntityInstance::operator=(const EntityInstance& other)
-    {
-        other._copySelf(*this);
-        return *this;
-    }
-    */
-
-
     bool EntityInstance::equalsDeep(const EntityInstance& other) const
     {
         return id() == other.id()
diff --git a/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.h b/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.h
index 0a289c787..8e6eb1afe 100644
--- a/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.h
+++ b/source/RobotAPI/libraries/armem/core/workingmemory/EntityInstance.h
@@ -31,6 +31,9 @@ namespace armarx::armem::wm
         }
     };
 
+    std::ostream& operator<<(std::ostream& os, const EntityInstanceMetadata& rhs);
+
+
     /**
      * @brief Data of a single entity instance.
      */
@@ -44,10 +47,11 @@ namespace armarx::armem::wm
 
         using Base::EntityInstanceBase;
 
-        /*
-        EntityInstance(const EntityInstance& other);
-        EntityInstance& operator=(const EntityInstance& other);
-        */
+        EntityInstance(const EntityInstance& other) = default;
+        EntityInstance(EntityInstance&& other) = default;
+        EntityInstance& operator=(const EntityInstance& other) = default;
+        EntityInstance& operator=(EntityInstance&& other) = default;
+
 
         EntityInstanceMetadata& metadata()
         {
diff --git a/source/RobotAPI/libraries/armem/test/ArMemMemoryTest.cpp b/source/RobotAPI/libraries/armem/test/ArMemMemoryTest.cpp
index 42c1238a3..8d8fbed9f 100644
--- a/source/RobotAPI/libraries/armem/test/ArMemMemoryTest.cpp
+++ b/source/RobotAPI/libraries/armem/test/ArMemMemoryTest.cpp
@@ -244,46 +244,6 @@ BOOST_AUTO_TEST_CASE(test_key_ctors)
 }
 
 
-template <class T>
-void test_the_copy_move_ctors_ops_instance()
-{
-    const armem::MemoryID id("A/B/C/123000");  // int index would not be moved
-    const armem::MemoryID idMoved;
-
-    BOOST_TEST_CONTEXT("Type " << simox::meta::get_type_name<T>())
-    {
-        T in(id);
-        BOOST_CHECK_EQUAL(in.id(), id);
-        BOOST_TEST_CONTEXT("copy ctor")
-        {
-            T out { in };
-            BOOST_CHECK_EQUAL(out.id(), id);
-        }
-        BOOST_TEST_CONTEXT("copy op")
-        {
-            T out;
-            out = in;
-            BOOST_CHECK_EQUAL(out.id(), id);
-        }
-        in = T{id};
-        BOOST_TEST_CONTEXT("move ctor")
-        {
-            T out { std::move(in) };
-            BOOST_CHECK_EQUAL(in.id(), idMoved);
-            BOOST_CHECK_EQUAL(out.id(), id);
-        }
-        in = T{id};
-        BOOST_TEST_CONTEXT("move op")
-        {
-            T out;
-            out = std::move(in);
-            BOOST_CHECK_EQUAL(in.id(), idMoved);
-            BOOST_CHECK_EQUAL(out.id(), id);
-        }
-    }
-}
-
-
 template <class ...Args>
 auto add_element(std::vector<Args...>& vector)
 {
@@ -295,81 +255,250 @@ auto add_element(std::map<Args...>& map)
     return map.emplace();
 }
 
+
 template <class T>
-void test_the_copy_move_ctors_ops_container()
+struct CustomChecks
+{
+    static void checkEqual(const T& lhs, const T& rhs)
+    {
+        (void) lhs, (void) rhs;
+    }
+    static void checkMoved(const T& moved)
+    {
+        (void) moved;
+    }
+};
+template <>
+struct CustomChecks<armem::wm::EntityInstance>
+{
+    static void checkEqual(const armem::wm::EntityInstance& lhs, const armem::wm::EntityInstance& rhs)
+    {
+        BOOST_CHECK_EQUAL(lhs.metadata(), rhs.metadata());
+        BOOST_CHECK_EQUAL(lhs.data(), rhs.data());
+    }
+    static void checkMoved(const armem::wm::EntityInstance& moved)
+    {
+        BOOST_CHECK_EQUAL(moved.data(), nullptr);
+    }
+};
+template <>
+struct CustomChecks<armem::d_ltm::EntityInstance>
+{
+    static void checkEqual(const armem::d_ltm::EntityInstance& lhs, const armem::d_ltm::EntityInstance& rhs)
+    {
+        BOOST_CHECK_EQUAL(lhs.path, rhs.path);
+    }
+    static void checkMoved(const armem::d_ltm::EntityInstance& moved)
+    {
+        BOOST_CHECK_EQUAL(moved.path, nullptr);
+    }
+};
+
+
+struct CopyMoveCtorsOpsTestBase
 {
-    const armem::MemoryID id("A/B/C/123000");  // int index would not be moved
+    const armem::MemoryID id {"A/B/C/123000"};  // int index would not be moved
     const armem::MemoryID idMoved;
 
-    BOOST_TEST_CONTEXT("Type " << simox::meta::get_type_name<T>())
+    std::string typeName;
+
+    CopyMoveCtorsOpsTestBase(const std::string& typeName) :
+        typeName(typeName)
+    {
+    }
+    virtual ~CopyMoveCtorsOpsTestBase()
+    {
+    }
+
+
+    void test()
     {
-        T in(id);
+        BOOST_TEST_CONTEXT("Type " << typeName)
+        {
+            reset();
+            BOOST_TEST_CONTEXT("copy ctor")
+            {
+                testCopyCtor();
+            }
+            reset();
+            BOOST_TEST_CONTEXT("copy op")
+            {
+                testCopyOp();
+            }
+            reset();
+            BOOST_TEST_CONTEXT("move ctor")
+            {
+                testMoveCtor();
+            }
+            reset();
+            BOOST_TEST_CONTEXT("move op")
+            {
+                testMoveOp();
+            }
+        }
+    }
+
+    virtual void reset()
+    {
+    }
+
+    virtual void testCopyCtor() = 0;
+    virtual void testCopyOp() = 0;
+    virtual void testMoveCtor() = 0;
+    virtual void testMoveOp() = 0;
+};
+
+
+
+template <class T>
+struct InstanceCopyMoveCtorsOpsTest : public CopyMoveCtorsOpsTestBase
+{
+    T in;
+
+    InstanceCopyMoveCtorsOpsTest() :
+        CopyMoveCtorsOpsTestBase(simox::meta::get_type_name<T>())
+    {
+    }
+    virtual ~InstanceCopyMoveCtorsOpsTest() override = default;
+
+    void reset() override
+    {
+        in = T {id};
+        BOOST_CHECK_EQUAL(in.id(), id);
+    }
+
+    void testCopyCtor() override
+    {
+        T out { in };
+
+        BOOST_CHECK_EQUAL(out.id(), id);
+
+        CustomChecks<T>::checkEqual(out, in);
+    }
+    void testCopyOp() override
+    {
+        T out;
+        out = in;
+
+        BOOST_CHECK_EQUAL(out.id(), id);
+
+        CustomChecks<T>::checkEqual(out, in);
+    }
+    void testMoveCtor() override
+    {
+        T out { std::move(in) };
+
+        BOOST_CHECK_EQUAL(in.id(), idMoved);
+        BOOST_CHECK_EQUAL(out.id(), id);
+
+        CustomChecks<T>::checkMoved(in);
+    }
+    void testMoveOp() override
+    {
+        T out;
+        out = std::move(in);
+
+        BOOST_CHECK_EQUAL(in.id(), idMoved);
+        BOOST_CHECK_EQUAL(out.id(), id);
+
+        CustomChecks<T>::checkMoved(in);
+    }
+};
+
+
+template <class T>
+struct CopyMoveCtorsOpsTest : public CopyMoveCtorsOpsTestBase
+{
+    T in;
+
+    CopyMoveCtorsOpsTest() : CopyMoveCtorsOpsTestBase(simox::meta::get_type_name<T>())
+    {
+    }
+    virtual ~CopyMoveCtorsOpsTest() override = default;
+
+    void reset() override
+    {
+        in = T {id};
         add_element(in.container());
+
         BOOST_CHECK_EQUAL(in.id(), id);
         BOOST_CHECK_EQUAL(in.size(), 1);
+    }
 
-        BOOST_TEST_CONTEXT("copy ctor")
-        {
-            T out { in };
-            BOOST_CHECK_EQUAL(in.id(), id);
-            BOOST_CHECK_EQUAL(in.size(), 1);
-            BOOST_CHECK_EQUAL(out.id(), id);
-            BOOST_CHECK_EQUAL(out.size(), 1);
-        }
-        BOOST_TEST_CONTEXT("copy op")
-        {
-            T out;
-            out = in;
-            BOOST_CHECK_EQUAL(in.id(), id);
-            BOOST_CHECK_EQUAL(in.size(), 1);
-            BOOST_CHECK_EQUAL(out.id(), id);
-            BOOST_CHECK_EQUAL(out.size(), 1);
-        }
-        in = T{id};
-        BOOST_TEST_CONTEXT("move ctor")
-        {
-            T out { std::move(in) };
-            BOOST_CHECK_EQUAL(in.id(), idMoved);
-            BOOST_CHECK(in.empty());
-            BOOST_CHECK_EQUAL(out.id(), id);
-            BOOST_CHECK_EQUAL(out.size(), 1);
-        }
-        in = T{id};
-        BOOST_TEST_CONTEXT("move op")
-        {
-            T out;
-            out = std::move(in);
-            BOOST_CHECK_EQUAL(in.id(), idMoved);
-            BOOST_CHECK(in.empty());
-            BOOST_CHECK_EQUAL(out.id(), id);
-            BOOST_CHECK_EQUAL(out.size(), 1);
-        }
+    void testCopyCtor() override
+    {
+        T out { in };
+        BOOST_CHECK_EQUAL(in.id(), id);
+        BOOST_CHECK_EQUAL(in.size(), 1);
+        BOOST_CHECK_EQUAL(out.id(), id);
+        BOOST_CHECK_EQUAL(out.size(), 1);
+
+        CustomChecks<T>::checkEqual(out, in);
     }
-}
+    void testCopyOp() override
+    {
+        T out;
+        out = in;
+        BOOST_CHECK_EQUAL(in.id(), id);
+        BOOST_CHECK_EQUAL(in.size(), 1);
+        BOOST_CHECK_EQUAL(out.id(), id);
+        BOOST_CHECK_EQUAL(out.size(), 1);
+
+        CustomChecks<T>::checkEqual(out, in);
+    }
+    void testMoveCtor() override
+    {
+        T out { std::move(in) };
+
+        BOOST_CHECK_EQUAL(in.id(), idMoved);
+        BOOST_CHECK_EQUAL(in.size(), 0);
+        BOOST_CHECK_EQUAL(out.id(), id);
+        BOOST_CHECK_EQUAL(out.size(), 1);
+
+        CustomChecks<T>::checkMoved(in);
+    }
+    void testMoveOp() override
+    {
+        T out;
+        out = std::move(in);
+
+        BOOST_CHECK_EQUAL(in.id(), idMoved);
+        BOOST_CHECK_EQUAL(in.size(), 0);
+        BOOST_CHECK_EQUAL(out.id(), id);
+        BOOST_CHECK_EQUAL(out.size(), 1);
+
+        CustomChecks<T>::checkMoved(in);
+    }
+};
+
 
 
 BOOST_AUTO_TEST_CASE(test_copy_move_ctors_ops)
 {
-    test_the_copy_move_ctors_ops_instance<armem::wm::EntityInstance>();
-    test_the_copy_move_ctors_ops_container<armem::wm::EntitySnapshot>();
-    test_the_copy_move_ctors_ops_container<armem::wm::Entity>();
-    test_the_copy_move_ctors_ops_container<armem::wm::ProviderSegment>();
-    test_the_copy_move_ctors_ops_container<armem::wm::CoreSegment>();
-    test_the_copy_move_ctors_ops_container<armem::wm::Memory>();
-
-    test_the_copy_move_ctors_ops_instance<armem::ltm::EntityInstance>();
-    test_the_copy_move_ctors_ops_container<armem::ltm::EntitySnapshot>();
-    test_the_copy_move_ctors_ops_container<armem::ltm::Entity>();
-    test_the_copy_move_ctors_ops_container<armem::ltm::ProviderSegment>();
-    test_the_copy_move_ctors_ops_container<armem::ltm::CoreSegment>();
-    test_the_copy_move_ctors_ops_container<armem::ltm::Memory>();
-
-    test_the_copy_move_ctors_ops_instance<armem::d_ltm::EntityInstance>();
-    test_the_copy_move_ctors_ops_container<armem::d_ltm::EntitySnapshot>();
-    test_the_copy_move_ctors_ops_container<armem::d_ltm::Entity>();
-    test_the_copy_move_ctors_ops_container<armem::d_ltm::ProviderSegment>();
-    test_the_copy_move_ctors_ops_container<armem::d_ltm::CoreSegment>();
-    test_the_copy_move_ctors_ops_container<armem::d_ltm::Memory>();
+    {
+        InstanceCopyMoveCtorsOpsTest<armem::wm::EntityInstance>().test();
+        CopyMoveCtorsOpsTest<armem::wm::EntitySnapshot>().test();
+        CopyMoveCtorsOpsTest<armem::wm::Entity>().test();
+        CopyMoveCtorsOpsTest<armem::wm::ProviderSegment>().test();
+        CopyMoveCtorsOpsTest<armem::wm::CoreSegment>().test();
+        CopyMoveCtorsOpsTest<armem::wm::Memory>().test();
+    }
+    {
+        InstanceCopyMoveCtorsOpsTest<armem::ltm::EntityInstance>().test();
+        CopyMoveCtorsOpsTest<armem::ltm::EntitySnapshot>().test();
+        CopyMoveCtorsOpsTest<armem::ltm::Entity>().test();
+        CopyMoveCtorsOpsTest<armem::ltm::ProviderSegment>().test();
+        CopyMoveCtorsOpsTest<armem::ltm::CoreSegment>().test();
+        CopyMoveCtorsOpsTest<armem::ltm::Memory>().test();
+    }
+    {
+        InstanceCopyMoveCtorsOpsTest<armem::d_ltm::EntityInstance>().test();
+        CopyMoveCtorsOpsTest<armem::d_ltm::EntitySnapshot>().test();
+        CopyMoveCtorsOpsTest<armem::d_ltm::Entity>().test();
+        CopyMoveCtorsOpsTest<armem::d_ltm::ProviderSegment>().test();
+        CopyMoveCtorsOpsTest<armem::d_ltm::CoreSegment>().test();
+        CopyMoveCtorsOpsTest<armem::d_ltm::Memory>().test();
+    }
 }
 
 
-- 
GitLab