[Orxonox-commit 4941] r9610 - in code/branches/core6: src/libraries/core/object test/core test/core/object

landauf at orxonox.net landauf at orxonox.net
Mon Apr 1 10:57:34 CEST 2013


Author: landauf
Date: 2013-04-01 10:57:34 +0200 (Mon, 01 Apr 2013)
New Revision: 9610

Added:
   code/branches/core6/test/core/object/ContextTest.cc
Modified:
   code/branches/core6/src/libraries/core/object/Context.cc
   code/branches/core6/src/libraries/core/object/Context.h
   code/branches/core6/src/libraries/core/object/Listable.cc
   code/branches/core6/src/libraries/core/object/Listable.h
   code/branches/core6/test/core/CMakeLists.txt
Log:
context is now a Listable itself as well

Modified: code/branches/core6/src/libraries/core/object/Context.cc
===================================================================
--- code/branches/core6/src/libraries/core/object/Context.cc	2013-04-01 08:54:47 UTC (rev 9609)
+++ code/branches/core6/src/libraries/core/object/Context.cc	2013-04-01 08:57:34 UTC (rev 9610)
@@ -36,12 +36,19 @@
 
 namespace orxonox
 {
-    Context::Context(Context* context) : parentContext_(context)
+    Context::Context(Context* context) : Listable(this), parentContext_(context)
     {
+        // we have to call Listable(this) to avoid circular initialization when creating a Context because Listable calls Context::getRootContext() by
+        // default AND we have to set the context again in the constructor because of other classes inheriting from Context (Listable is a virtual base
+        // and each subclass must call its constructor individually, so either all subclasses add Listable(this) to their initialization list or we call
+        // setContext(this) here).
+        this->setContext(this);
     }
 
     Context::~Context()
     {
+        // unregister context from object lists before object lists are destroyed
+        this->unregisterObject();
         for (size_t i = 0; i < this->objectLists_.size(); ++i)
             delete this->objectLists_[i];
     }

Modified: code/branches/core6/src/libraries/core/object/Context.h
===================================================================
--- code/branches/core6/src/libraries/core/object/Context.h	2013-04-01 08:54:47 UTC (rev 9609)
+++ code/branches/core6/src/libraries/core/object/Context.h	2013-04-01 08:57:34 UTC (rev 9610)
@@ -38,9 +38,11 @@
 
 #include <vector>
 
+#include "Listable.h"
+
 namespace orxonox
 {
-    class _CoreExport Context
+    class _CoreExport Context : virtual public Listable
     {
         public:
             static Context* getRootContext();

Modified: code/branches/core6/src/libraries/core/object/Listable.cc
===================================================================
--- code/branches/core6/src/libraries/core/object/Listable.cc	2013-04-01 08:54:47 UTC (rev 9609)
+++ code/branches/core6/src/libraries/core/object/Listable.cc	2013-04-01 08:57:34 UTC (rev 9610)
@@ -47,6 +47,15 @@
     }
 
     /**
+        @brief Constructor: Allocates space in the element list and assignes the context
+    */
+    Listable::Listable(Context* context)
+    {
+        this->context_ = context;
+        this->elements_.reserve(6);
+    }
+
+    /**
         @brief Destructor: Removes the object from the object-lists
     */
     Listable::~Listable()

Modified: code/branches/core6/src/libraries/core/object/Listable.h
===================================================================
--- code/branches/core6/src/libraries/core/object/Listable.h	2013-04-01 08:54:47 UTC (rev 9609)
+++ code/branches/core6/src/libraries/core/object/Listable.h	2013-04-01 08:57:34 UTC (rev 9610)
@@ -52,6 +52,7 @@
 
         public:
             Listable();
+            Listable(Context* context);
             virtual ~Listable();
 
             void unregisterObject();

Modified: code/branches/core6/test/core/CMakeLists.txt
===================================================================
--- code/branches/core6/test/core/CMakeLists.txt	2013-04-01 08:54:47 UTC (rev 9609)
+++ code/branches/core6/test/core/CMakeLists.txt	2013-04-01 08:57:34 UTC (rev 9610)
@@ -15,6 +15,7 @@
     class/SuperTest.cc
     command/CommandTest.cc
     object/ClassFactoryTest.cc
+    object/ContextTest.cc
     object/DestroyableTest.cc
     object/IteratorTest.cc
     object/ListableTest.cc

Added: code/branches/core6/test/core/object/ContextTest.cc
===================================================================
--- code/branches/core6/test/core/object/ContextTest.cc	                        (rev 0)
+++ code/branches/core6/test/core/object/ContextTest.cc	2013-04-01 08:57:34 UTC (rev 9610)
@@ -0,0 +1,45 @@
+#include <gtest/gtest.h>
+#include "core/object/Context.h"
+#include "core/class/OrxonoxClass.h"
+#include "core/CoreIncludes.h"
+
+namespace orxonox
+{
+    namespace
+    {
+        class SubclassContext : public OrxonoxClass, public Context
+        {
+            public:
+                SubclassContext() { RegisterRootObject(SubclassContext); }
+        };
+    }
+
+    TEST(ContextTest, CanCreateContext)
+    {
+        Context context;
+    }
+
+    TEST(ContextTest, CanCreateSubclassContext)
+    {
+        SubclassContext context;
+    }
+
+    TEST(ContextTest, ContextIsItsOwnContext)
+    {
+        Context context;
+        EXPECT_EQ(&context, context.getContext());
+    }
+
+    TEST(ContextTest, SubclassContextIsItsOwnContext)
+    {
+        SubclassContext context;
+        EXPECT_EQ(&context, context.getContext());
+    }
+
+    TEST(ContextTest, SubclassAddsToItsOwnObjectList)
+    {
+        SubclassContext context;
+        EXPECT_EQ(&context, context.getContext());
+        EXPECT_EQ(1u, context.getObjectList<SubclassContext>()->size());
+    }
+}




More information about the Orxonox-commit mailing list