#include #include #include #include #include class MyObject : public QObject { Q_OBJECT public: MyObject( QObject *parent=0 ); ~MyObject(); static MyObject *instance; }; MyObject *MyObject::instance = 0; MyObject::MyObject( QObject *parent ) : QObject( parent ) { instance = this; } MyObject::~MyObject() { instance = 0; } class MyObjectFactory : public QObject { Q_OBJECT public: MyObjectFactory( QObject *parent=0 ); ~MyObjectFactory(); Q_INVOKABLE QObject *createQObject( QObject *parent=0 ); Q_INVOKABLE MyObject *createMyObject( QObject *parent=0 ); }; MyObjectFactory::MyObjectFactory( QObject *parent ) : QObject( parent ) { } MyObjectFactory::~MyObjectFactory() { } QObject *MyObjectFactory::createQObject( QObject *parent ) { return createMyObject( parent ); } MyObject *MyObjectFactory::createMyObject( QObject *parent ) { MyObject *obj = new MyObject( parent ); return obj; } class QmlTest : public QObject { Q_OBJECT private slots: void initTestCase(); void createQObjectWithFactory(); void createMyObjectWithFactory(); void createMyObject(); void cleanup(); private: void run( const QByteArray &qmlData ); }; void QmlTest::initTestCase() { qmlRegisterType("com.nokia.qmlcomponents", 1, 0, "MyObjectFactory"); qmlRegisterType("com.nokia.qmlcomponents", 1, 0, "MyObject"); } void QmlTest::createQObjectWithFactory() { run( "import Qt 4.7; import com.nokia.qmlcomponents 1.0; QtObject { property QtObject myObject: factory.createQObject() }" ); } void QmlTest::createMyObjectWithFactory() { run( "import Qt 4.7; import com.nokia.qmlcomponents 1.0; QtObject { property MyObject myObject: factory.createMyObject() }" ); } void QmlTest::createMyObject() { run( "import Qt 4.7; import com.nokia.qmlcomponents 1.0; QtObject { property QtObject myObject: MyObject{} }" ); } void QmlTest::run( const QByteArray &qmlData ) { { MyObjectFactory factory = MyObjectFactory(); QDeclarativeEngine engine; engine.rootContext()->setContextProperty("factory", &factory); QDeclarativeComponent component( &engine ); component.setData( qmlData, QUrl() ); QObject *obj = component.create(); QVERIFY( MyObject::instance ); QCOMPARE( QDeclarativeEngine::objectOwnership(MyObject::instance), QDeclarativeEngine::JavaScriptOwnership ); delete obj; } QCoreApplication::sendPostedEvents( MyObject::instance, 0 ); QVERIFY( MyObject::instance == 0 ); } void QmlTest::cleanup() { delete MyObject::instance; } #include "qmltest.moc" QTEST_MAIN(QmlTest)