[Orxonox-commit 4958] r9627 - in code/branches/core6: src/libraries/core/object test/core/object
landauf at orxonox.net
landauf at orxonox.net
Fri Aug 9 00:27:05 CEST 2013
Author: landauf
Date: 2013-08-09 00:27:05 +0200 (Fri, 09 Aug 2013)
New Revision: 9627
Modified:
code/branches/core6/src/libraries/core/object/Listable.cc
code/branches/core6/src/libraries/core/object/ObjectListBase.h
code/branches/core6/test/core/object/ListableTest.cc
Log:
fixed bug: Listable::setContext didn't work properly with sub-contexts (contexts whose root-context is != NULL)
Modified: code/branches/core6/src/libraries/core/object/Listable.cc
===================================================================
--- code/branches/core6/src/libraries/core/object/Listable.cc 2013-08-08 22:25:11 UTC (rev 9626)
+++ code/branches/core6/src/libraries/core/object/Listable.cc 2013-08-08 22:27:05 UTC (rev 9627)
@@ -79,9 +79,16 @@
*/
void Listable::setContext(Context* context)
{
+ std::vector<ObjectListBaseElement*> copy = this->elements_;
+ this->elements_.clear();
+
+ for (size_t i = 0; i < copy.size(); ++i)
+ {
+ copy[i]->changeContext(this->context_, context);
+ delete copy[i];
+ }
+
this->context_ = context;
- for (size_t i = 0; i < this->elements_.size(); ++i)
- this->elements_[i]->changeContext(context);
}
}
Modified: code/branches/core6/src/libraries/core/object/ObjectListBase.h
===================================================================
--- code/branches/core6/src/libraries/core/object/ObjectListBase.h 2013-08-08 22:25:11 UTC (rev 9626)
+++ code/branches/core6/src/libraries/core/object/ObjectListBase.h 2013-08-08 22:27:05 UTC (rev 9627)
@@ -59,7 +59,7 @@
ObjectListBaseElement(Listable* object) : next_(0), prev_(0), objectBase_(object), list_(0) {}
virtual ~ObjectListBaseElement() { this->removeFromList(); }
- virtual void changeContext(Context* context) = 0;
+ virtual void changeContext(Context* oldContext, Context* newContext) = 0;
ObjectListBaseElement* next_; //!< The next element in the list
ObjectListBaseElement* prev_; //!< The previous element in the list
@@ -81,10 +81,15 @@
public:
ObjectListElement(T* object) : ObjectListBaseElement(static_cast<Listable*>(object)), object_(object) {}
- virtual void changeContext(Context* context)
+ virtual void changeContext(Context* oldContext, Context* newContext)
{
+ // add object to new context, but only if this element belongs exactly to the old context (and not to a sub-context to avoid re-adding objects
+ // multiple times if they are in multiple contexts)
+ if (oldContext->getObjectList<T>() == this->list_)
+ newContext->addObject(this->object_);
+
+ // remove from old list
this->removeFromList();
- context->getObjectList<T>()->addElement(this);
}
T* object_; //!< The object
Modified: code/branches/core6/test/core/object/ListableTest.cc
===================================================================
--- code/branches/core6/test/core/object/ListableTest.cc 2013-08-08 22:25:11 UTC (rev 9626)
+++ code/branches/core6/test/core/object/ListableTest.cc 2013-08-08 22:27:05 UTC (rev 9627)
@@ -78,17 +78,53 @@
EXPECT_EQ(0u, ObjectList<ListableSubclassTest>::size());
}
+ TEST(ListableTest, CanAddObjectToContext)
+ {
+ Context context(NULL);
+ ListableSubclassTest test;
+
+ test.setContext(&context);
+
+ // object is in new context
+ EXPECT_EQ(1u, context.getObjectList<ListableTest>()->size());
+ EXPECT_TRUE(objectListContains<ListableTest>(&test, &context));
+ EXPECT_EQ(1u, context.getObjectList<ListableSubclassTest>()->size());
+ EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, &context));
+ }
+
+ TEST(ListableTest, CanAddObjectToSubContext)
+ {
+ Context baseContext(NULL);
+ Context subContext(&baseContext);
+ ListableSubclassTest test;
+
+ test.setContext(&subContext);
+
+ // object is in both contexts
+ EXPECT_EQ(1u, baseContext.getObjectList<ListableTest>()->size());
+ EXPECT_TRUE(objectListContains<ListableTest>(&test, &baseContext));
+ EXPECT_EQ(1u, baseContext.getObjectList<ListableSubclassTest>()->size());
+ EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, &baseContext));
+
+ EXPECT_EQ(1u, subContext.getObjectList<ListableTest>()->size());
+ EXPECT_TRUE(objectListContains<ListableTest>(&test, &subContext));
+ EXPECT_EQ(1u, subContext.getObjectList<ListableSubclassTest>()->size());
+ EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, &subContext));
+ }
+
TEST(ListableTest, CanChangeContext)
{
Context* rootContext = Context::getRootContext();
- Context newContext;
+ Context newContext(NULL);
ListableSubclassTest test;
+ // object is in root context
EXPECT_EQ(1u, rootContext->getObjectList<ListableTest>()->size());
EXPECT_TRUE(objectListContains<ListableTest>(&test, rootContext));
EXPECT_EQ(1u, rootContext->getObjectList<ListableSubclassTest>()->size());
EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, rootContext));
+ // object is NOT in new context
EXPECT_EQ(0u, newContext.getObjectList<ListableTest>()->size());
EXPECT_FALSE(objectListContains<ListableTest>(&test, &newContext));
EXPECT_EQ(0u, newContext.getObjectList<ListableSubclassTest>()->size());
@@ -96,14 +132,97 @@
test.setContext(&newContext);
+ // object was removed from root context
EXPECT_EQ(0u, rootContext->getObjectList<ListableTest>()->size());
EXPECT_FALSE(objectListContains<ListableTest>(&test, rootContext));
EXPECT_EQ(0u, rootContext->getObjectList<ListableSubclassTest>()->size());
EXPECT_FALSE(objectListContains<ListableSubclassTest>(&test, rootContext));
+ // object is now in new context
EXPECT_EQ(1u, newContext.getObjectList<ListableTest>()->size());
EXPECT_TRUE(objectListContains<ListableTest>(&test, &newContext));
EXPECT_EQ(1u, newContext.getObjectList<ListableSubclassTest>()->size());
EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, &newContext));
}
+
+ TEST(ListableTest, CanChangeToSubContext)
+ {
+ Context* rootContext = Context::getRootContext();
+ Context subContext(rootContext);
+ ListableSubclassTest test;
+
+ // object is in root context
+ EXPECT_EQ(1u, rootContext->getObjectList<ListableTest>()->size());
+ EXPECT_TRUE(objectListContains<ListableTest>(&test, rootContext));
+ EXPECT_EQ(1u, rootContext->getObjectList<ListableSubclassTest>()->size());
+ EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, rootContext));
+
+ // object is NOT in sub context
+ EXPECT_EQ(0u, subContext.getObjectList<ListableTest>()->size());
+ EXPECT_FALSE(objectListContains<ListableTest>(&test, &subContext));
+ EXPECT_EQ(0u, subContext.getObjectList<ListableSubclassTest>()->size());
+ EXPECT_FALSE(objectListContains<ListableSubclassTest>(&test, &subContext));
+
+ test.setContext(&subContext);
+
+ // object is still in root context
+ EXPECT_EQ(1u, rootContext->getObjectList<ListableTest>()->size());
+ EXPECT_TRUE(objectListContains<ListableTest>(&test, rootContext));
+ EXPECT_EQ(1u, rootContext->getObjectList<ListableSubclassTest>()->size());
+ EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, rootContext));
+
+ // object is now also in sub context
+ EXPECT_EQ(1u, subContext.getObjectList<ListableTest>()->size());
+ EXPECT_TRUE(objectListContains<ListableTest>(&test, &subContext));
+ EXPECT_EQ(1u, subContext.getObjectList<ListableSubclassTest>()->size());
+ EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, &subContext));
+ }
+
+ TEST(ListableTest, CanChangeFromSubcontextToSubContext)
+ {
+ Context* rootContext = Context::getRootContext();
+ Context subContext1(rootContext);
+ Context subContext2(rootContext);
+ ListableSubclassTest test;
+
+ test.setContext(&subContext1);
+
+ // object is in root context
+ EXPECT_EQ(1u, rootContext->getObjectList<ListableTest>()->size());
+ EXPECT_TRUE(objectListContains<ListableTest>(&test, rootContext));
+ EXPECT_EQ(1u, rootContext->getObjectList<ListableSubclassTest>()->size());
+ EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, rootContext));
+
+ // object is also in sub context 1
+ EXPECT_EQ(1u, subContext1.getObjectList<ListableTest>()->size());
+ EXPECT_TRUE(objectListContains<ListableTest>(&test, &subContext1));
+ EXPECT_EQ(1u, subContext1.getObjectList<ListableSubclassTest>()->size());
+ EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, &subContext1));
+
+ // object is NOT in sub context 2
+ EXPECT_EQ(0u, subContext2.getObjectList<ListableTest>()->size());
+ EXPECT_FALSE(objectListContains<ListableTest>(&test, &subContext2));
+ EXPECT_EQ(0u, subContext2.getObjectList<ListableSubclassTest>()->size());
+ EXPECT_FALSE(objectListContains<ListableSubclassTest>(&test, &subContext2));
+
+ test.setContext(&subContext2);
+
+ // object is still in root context
+ EXPECT_EQ(1u, rootContext->getObjectList<ListableTest>()->size());
+ EXPECT_TRUE(objectListContains<ListableTest>(&test, rootContext));
+ EXPECT_EQ(1u, rootContext->getObjectList<ListableSubclassTest>()->size());
+ EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, rootContext));
+
+ // object was removed from sub context 1
+ EXPECT_EQ(0u, subContext1.getObjectList<ListableTest>()->size());
+ EXPECT_FALSE(objectListContains<ListableTest>(&test, &subContext1));
+ EXPECT_EQ(0u, subContext1.getObjectList<ListableSubclassTest>()->size());
+ EXPECT_FALSE(objectListContains<ListableSubclassTest>(&test, &subContext1));
+
+ // object is now in sub context 2
+ EXPECT_EQ(1u, subContext2.getObjectList<ListableTest>()->size());
+ EXPECT_TRUE(objectListContains<ListableTest>(&test, &subContext2));
+ EXPECT_EQ(1u, subContext2.getObjectList<ListableSubclassTest>()->size());
+ EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, &subContext2));
+ }
}
More information about the Orxonox-commit
mailing list