#include "aggregate.h"
#include <QtCore/QWriteLocker>
+#include <QtCore/QDebug>
/*!
\namespace Aggregation
\fn void Aggregate::add(QObject *component)
Adds the \a component to the aggregate.
+ You can't add a component that is part of a different aggregate
+ or an aggregate itself.
\sa Aggregate::remove()
*/
Aggregate *parentAggregation = aggregateMap().value(component);
if (parentAggregation == this)
return;
- if (parentAggregation)
- parentAggregation->remove(component);
+ if (parentAggregation) {
+ qWarning() << "Cannot add a component that belongs to a different aggregate" << component;
+ return;
+ }
m_components.append(component);
connect(component, SIGNAL(destroyed(QObject*)), this, SLOT(deleteSelf(QObject*)));
aggregateMap().insert(component, this);
void tst_Aggregate::parentAggregate()
{
Aggregation::Aggregate aggregation;
+ Aggregation::Aggregate aggregation2;
Interface1 *component1 = new Interface1;
Interface11 *component11 = new Interface11;
QObject *component2 = new QObject;
QCOMPARE(Aggregation::Aggregate::parentAggregate(component1), &aggregation);
QCOMPARE(Aggregation::Aggregate::parentAggregate(component11), &aggregation);
QCOMPARE(Aggregation::Aggregate::parentAggregate(component2), (Aggregation::Aggregate *)0);
+ // test reparenting a component to another aggregate (should warn but not work)
+ aggregation2.add(component11);
+ QCOMPARE(Aggregation::Aggregate::parentAggregate(component11), &aggregation);
+ // test adding an aggregate to an aggregate (should warn but not work)
+ aggregation.add(&aggregation2);
+ QCOMPARE(Aggregation::Aggregate::parentAggregate(&aggregation2), &aggregation2);
+ // test removing an object from an aggregation.
+ aggregation.remove(component11);
+ QCOMPARE(Aggregation::Aggregate::parentAggregate(component11), (Aggregation::Aggregate *)0);
}
QTEST_MAIN(tst_Aggregate)