2011-04-27 12:13:26 +00:00
/****************************************************************************
* *
2016-01-19 11:23:05 +00:00
* * Copyright ( C ) 2016 The Qt Company Ltd .
* * Contact : https : //www.qt.io/licensing/
2011-04-27 12:13:26 +00:00
* *
* * This file is part of the test suite of the Qt Toolkit .
* *
2016-01-19 11:23:05 +00:00
* * $ QT_BEGIN_LICENSE : GPL - EXCEPT $
2012-09-20 05:21:40 +00:00
* * Commercial License Usage
* * Licensees holding valid commercial Qt licenses may use this file in
* * accordance with the commercial license agreement provided with the
* * Software or , alternatively , in accordance with the terms contained in
2015-01-28 11:55:39 +00:00
* * a written agreement between you and The Qt Company . For licensing terms
2016-01-19 11:23:05 +00:00
* * and conditions see https : //www.qt.io/terms-conditions. For further
* * information use the contact form at https : //www.qt.io/contact-us.
2012-09-20 05:21:40 +00:00
* *
2016-01-19 11:23:05 +00:00
* * GNU General Public License Usage
* * Alternatively , this file may be used under the terms of the GNU
* * General Public License version 3 as published by the Free Software
* * Foundation with exceptions as appearing in the file LICENSE . GPL3 - EXCEPT
* * included in the packaging of this file . Please review the following
* * information to ensure the GNU General Public License requirements will
* * be met : https : //www.gnu.org/licenses/gpl-3.0.html.
2011-04-27 12:13:26 +00:00
* *
* * $ QT_END_LICENSE $
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# include <qtest.h>
# include <QSignalSpy>
2011-08-17 07:46:54 +00:00
2012-02-16 04:43:03 +00:00
# include <QtQml/qqmlengine.h>
# include <QtQml/qqmlcomponent.h>
# include <QtQml/qqmlincubator.h>
2011-10-14 08:51:42 +00:00
# include <private/qquickloader_p.h>
2011-04-27 12:13:26 +00:00
# include "testhttpserver.h"
Say hello to QtQuick module
This change moves the QtQuick 2 types and C++ API (including
SceneGraph) to a new module (AKA library), QtQuick.
99% of this change is moving files from src/declarative to
src/quick, and from tests/auto/declarative to
tests/auto/qtquick2.
The loading of QtQuick 2 ("import QtQuick 2.0") is now delegated to
a plugin, src/imports/qtquick2, just like it's done for QtQuick 1.
All tools, examples, and tests that use QtQuick C++ API have gotten
"QT += quick" or "QT += quick-private" added to their .pro file.
A few additional internal QtDeclarative classes had to be exported
(via Q_DECLARATIVE_PRIVATE_EXPORT) since they're needed by the
QtQuick 2 implementation.
The old header locations (e.g. QtDeclarative/qquickitem.h) will
still be supported for some time, but will produce compile-time
warnings. (To avoid the QtQuick implementation using the
compatibility headers (since QtDeclarative's includepath comes
first), a few include statements were modified, e.g. from
"#include <qsgnode.h>" to "#include <QtQuick/qsgnode.h>".)
There's a change in qtbase that automatically adds QtQuick to the
module list if QtDeclarative is used. Together with the compatibility
headers, this should help reduce the migration pain for existing
projects.
In theory, simply getting an existing QtDeclarative-based project
to compile and link shouldn't require any changes for now -- but
porting to the new scheme is of course recommended, and will
eventually become mandatory.
Task-number: QTBUG-22889
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
Change-Id: Ia52be9373172ba2f37e7623231ecb060316c96a7
Reviewed-by: Kent Hansen <kent.hansen@nokia.com>
Reviewed-by: Sergio Ahumada <sergio.ahumada@nokia.com>
2011-11-23 14:14:07 +00:00
# include "../../shared/util.h"
2011-04-27 12:13:26 +00:00
2013-03-06 17:47:17 +00:00
class SlowComponent : public QQmlComponent
{
Q_OBJECT
public :
SlowComponent ( ) {
QTest : : qSleep ( 500 ) ;
}
} ;
2011-10-07 06:20:39 +00:00
class PeriodicIncubationController : public QObject ,
2012-02-16 04:43:03 +00:00
public QQmlIncubationController
2011-10-07 06:20:39 +00:00
{
public :
2012-07-30 01:10:28 +00:00
PeriodicIncubationController ( ) : incubated ( false ) { }
void start ( ) { startTimer ( 20 ) ; }
2011-10-07 06:20:39 +00:00
2012-03-06 08:03:33 +00:00
bool incubated ;
2011-10-07 06:20:39 +00:00
protected :
virtual void timerEvent ( QTimerEvent * ) {
incubateFor ( 15 ) ;
}
2012-03-06 08:03:33 +00:00
virtual void incubatingObjectCountChanged ( int count ) {
if ( count )
incubated = true ;
}
2011-10-07 06:20:39 +00:00
} ;
2012-02-16 04:43:03 +00:00
class tst_QQuickLoader : public QQmlDataTest
2011-04-27 12:13:26 +00:00
{
Q_OBJECT
public :
2011-10-14 08:51:42 +00:00
tst_QQuickLoader ( ) ;
2011-04-27 12:13:26 +00:00
private slots :
2013-03-06 17:47:17 +00:00
void cleanup ( ) ;
2011-04-27 12:13:26 +00:00
void sourceOrComponent ( ) ;
void sourceOrComponent_data ( ) ;
void clear ( ) ;
void urlToComponent ( ) ;
void componentToUrl ( ) ;
void anchoredLoader ( ) ;
void sizeLoaderToItem ( ) ;
void sizeItemToLoader ( ) ;
void noResize ( ) ;
void networkRequestUrl ( ) ;
void failNetworkRequest ( ) ;
2012-03-29 01:14:59 +00:00
void networkComponent ( ) ;
2011-08-17 07:46:54 +00:00
void active ( ) ;
void initialPropertyValues_data ( ) ;
void initialPropertyValues ( ) ;
void initialPropertyValuesBinding ( ) ;
void initialPropertyValuesError_data ( ) ;
void initialPropertyValuesError ( ) ;
2011-04-27 12:13:26 +00:00
void deleteComponentCrash ( ) ;
void nonItem ( ) ;
void vmeErrors ( ) ;
void creationContext ( ) ;
void QTBUG_16928 ( ) ;
void implicitSize ( ) ;
void QTBUG_17114 ( ) ;
2011-10-07 06:20:39 +00:00
void asynchronous_data ( ) ;
void asynchronous ( ) ;
void asynchronous_clear ( ) ;
2012-03-06 08:03:33 +00:00
void simultaneousSyncAsync ( ) ;
2015-09-07 21:29:55 +00:00
void asyncToSync1 ( ) ;
void asyncToSync2 ( ) ;
2012-03-29 01:14:59 +00:00
void loadedSignal ( ) ;
2011-04-27 12:13:26 +00:00
2011-11-14 03:00:31 +00:00
void parented ( ) ;
2012-02-16 03:45:02 +00:00
void sizeBound ( ) ;
2013-03-13 17:31:57 +00:00
void QTBUG_30183 ( ) ;
2011-11-14 03:00:31 +00:00
2013-12-05 15:21:03 +00:00
void sourceComponentGarbageCollection ( ) ;
2011-04-27 12:13:26 +00:00
private :
2012-02-16 04:43:03 +00:00
QQmlEngine engine ;
2011-04-27 12:13:26 +00:00
} ;
2013-03-06 17:47:17 +00:00
void tst_QQuickLoader : : cleanup ( )
{
// clear components. otherwise we even bypass the test server by using the cache.
engine . clearComponentCache ( ) ;
}
2011-04-27 12:13:26 +00:00
2011-10-14 08:51:42 +00:00
tst_QQuickLoader : : tst_QQuickLoader ( )
2011-04-27 12:13:26 +00:00
{
2013-03-06 17:47:17 +00:00
qmlRegisterType < SlowComponent > ( " LoaderTest " , 1 , 0 , " SlowComponent " ) ;
2011-04-27 12:13:26 +00:00
}
2011-10-14 08:51:42 +00:00
void tst_QQuickLoader : : sourceOrComponent ( )
2011-04-27 12:13:26 +00:00
{
2011-07-29 04:41:16 +00:00
QFETCH ( QString , sourceOrComponent ) ;
2011-04-27 12:13:26 +00:00
QFETCH ( QString , sourceDefinition ) ;
QFETCH ( QUrl , sourceUrl ) ;
QFETCH ( QString , errorString ) ;
bool error = ! errorString . isEmpty ( ) ;
if ( error )
QTest : : ignoreMessage ( QtWarningMsg , errorString . toUtf8 ( ) . constData ( ) ) ;
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine ) ;
2011-04-27 12:13:26 +00:00
component . setData ( QByteArray (
" import QtQuick 2.0 \n "
" Loader { \n "
" property int onItemChangedCount: 0 \n "
" property int onSourceChangedCount: 0 \n "
2011-07-29 04:41:16 +00:00
" property int onSourceComponentChangedCount: 0 \n "
2011-04-27 12:13:26 +00:00
" property int onStatusChangedCount: 0 \n "
" property int onProgressChangedCount: 0 \n "
" property int onLoadedCount: 0 \n " )
+ sourceDefinition . toUtf8 ( )
+ QByteArray (
" onItemChanged: onItemChangedCount += 1 \n "
" onSourceChanged: onSourceChangedCount += 1 \n "
2011-07-29 04:41:16 +00:00
" onSourceComponentChanged: onSourceComponentChangedCount += 1 \n "
2011-04-27 12:13:26 +00:00
" onStatusChanged: onStatusChangedCount += 1 \n "
" onProgressChanged: onProgressChangedCount += 1 \n "
" onLoaded: onLoadedCount += 1 \n "
" } " )
2011-12-21 08:06:26 +00:00
, dataDirectoryUrl ( ) ) ;
2011-04-27 12:13:26 +00:00
2011-10-14 08:51:42 +00:00
QQuickLoader * loader = qobject_cast < QQuickLoader * > ( component . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( loader ! = 0 ) ;
QCOMPARE ( loader - > item ( ) = = 0 , error ) ;
QCOMPARE ( loader - > source ( ) , sourceUrl ) ;
QCOMPARE ( loader - > progress ( ) , 1.0 ) ;
2011-10-14 08:51:42 +00:00
QCOMPARE ( loader - > status ( ) , error ? QQuickLoader : : Error : QQuickLoader : : Ready ) ;
QCOMPARE ( static_cast < QQuickItem * > ( loader ) - > childItems ( ) . count ( ) , error ? 0 : 1 ) ;
2011-04-27 12:13:26 +00:00
if ( ! error ) {
2011-10-06 04:37:09 +00:00
bool sourceComponentIsChildOfLoader = false ;
for ( int ii = 0 ; ii < loader - > children ( ) . size ( ) ; + + ii ) {
2012-02-16 04:43:03 +00:00
QQmlComponent * c = qobject_cast < QQmlComponent * > ( loader - > children ( ) . at ( ii ) ) ;
2011-10-06 04:37:09 +00:00
if ( c & & c = = loader - > sourceComponent ( ) ) {
sourceComponentIsChildOfLoader = true ;
}
}
QVERIFY ( sourceComponentIsChildOfLoader ) ;
2011-04-27 12:13:26 +00:00
}
2011-07-29 04:41:16 +00:00
if ( sourceOrComponent = = " component " ) {
QCOMPARE ( loader - > property ( " onSourceComponentChangedCount " ) . toInt ( ) , 1 ) ;
QCOMPARE ( loader - > property ( " onSourceChangedCount " ) . toInt ( ) , 0 ) ;
} else {
QCOMPARE ( loader - > property ( " onSourceComponentChangedCount " ) . toInt ( ) , 0 ) ;
QCOMPARE ( loader - > property ( " onSourceChangedCount " ) . toInt ( ) , 1 ) ;
}
2011-04-27 12:13:26 +00:00
QCOMPARE ( loader - > property ( " onStatusChangedCount " ) . toInt ( ) , 1 ) ;
QCOMPARE ( loader - > property ( " onProgressChangedCount " ) . toInt ( ) , 1 ) ;
2012-06-12 01:47:13 +00:00
QCOMPARE ( loader - > property ( " onItemChangedCount " ) . toInt ( ) , 1 ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( loader - > property ( " onLoadedCount " ) . toInt ( ) , error ? 0 : 1 ) ;
delete loader ;
}
2011-10-14 08:51:42 +00:00
void tst_QQuickLoader : : sourceOrComponent_data ( )
2011-04-27 12:13:26 +00:00
{
2011-07-29 04:41:16 +00:00
QTest : : addColumn < QString > ( " sourceOrComponent " ) ;
2011-04-27 12:13:26 +00:00
QTest : : addColumn < QString > ( " sourceDefinition " ) ;
QTest : : addColumn < QUrl > ( " sourceUrl " ) ;
QTest : : addColumn < QString > ( " errorString " ) ;
2011-12-21 08:06:26 +00:00
QTest : : newRow ( " source " ) < < " source " < < " source: 'Rect120x60.qml' \n " < < testFileUrl ( " Rect120x60.qml " ) < < " " ;
2012-06-19 00:24:01 +00:00
QTest : : newRow ( " source with subdir " ) < < " source " < < " source: 'subdir/Test.qml' \n " < < testFileUrl ( " subdir/Test.qml " ) < < " " ;
QTest : : newRow ( " source with encoded subdir literal " ) < < " source " < < " source: 'subdir%2fTest.qml' \n " < < testFileUrl ( " subdir/Test.qml " ) < < " " ;
QTest : : newRow ( " source with encoded subdir optimized binding " ) < < " source " < < " source: 'subdir' + '%2fTest.qml' \n " < < testFileUrl ( " subdir/Test.qml " ) < < " " ;
QTest : : newRow ( " source with encoded subdir binding " ) < < " source " < < " source: encodeURIComponent('subdir/Test.qml') \n " < < testFileUrl ( " subdir/Test.qml " ) < < " " ;
2011-07-29 04:41:16 +00:00
QTest : : newRow ( " sourceComponent " ) < < " component " < < " Component { id: comp; Rectangle { width: 100; height: 50 } } \n sourceComponent: comp \n " < < QUrl ( ) < < " " ;
2011-12-21 08:06:26 +00:00
QTest : : newRow ( " invalid source " ) < < " source " < < " source: 'IDontExist.qml' \n " < < testFileUrl ( " IDontExist.qml " )
< < QString ( testFileUrl ( " IDontExist.qml " ) . toString ( ) + " : File not found " ) ;
2011-04-27 12:13:26 +00:00
}
2011-10-14 08:51:42 +00:00
void tst_QQuickLoader : : clear ( )
2011-04-27 12:13:26 +00:00
{
{
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine ) ;
2011-04-27 12:13:26 +00:00
component . setData ( QByteArray (
" import QtQuick 2.0 \n "
" Loader { id: loader \n "
" source: 'Rect120x60.qml' \n "
" Timer { interval: 200; running: true; onTriggered: loader.source = '' } \n "
" } " )
2011-12-21 08:06:26 +00:00
, dataDirectoryUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickLoader * loader = qobject_cast < QQuickLoader * > ( component . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( loader ! = 0 ) ;
QVERIFY ( loader - > item ( ) ) ;
QCOMPARE ( loader - > progress ( ) , 1.0 ) ;
2011-10-14 08:51:42 +00:00
QCOMPARE ( static_cast < QQuickItem * > ( loader ) - > childItems ( ) . count ( ) , 1 ) ;
2011-04-27 12:13:26 +00:00
2015-07-24 13:32:22 +00:00
QTRY_VERIFY ( ! loader - > item ( ) ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( loader - > progress ( ) , 0.0 ) ;
2011-10-14 08:51:42 +00:00
QCOMPARE ( loader - > status ( ) , QQuickLoader : : Null ) ;
QCOMPARE ( static_cast < QQuickItem * > ( loader ) - > childItems ( ) . count ( ) , 0 ) ;
2011-04-27 12:13:26 +00:00
delete loader ;
}
{
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine , testFileUrl ( " /SetSourceComponent.qml " ) ) ;
2011-10-14 08:51:42 +00:00
QQuickItem * item = qobject_cast < QQuickItem * > ( component . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( item ) ;
2011-10-14 08:51:42 +00:00
QQuickLoader * loader = qobject_cast < QQuickLoader * > ( item - > QQuickItem : : childItems ( ) . at ( 0 ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( loader ) ;
QVERIFY ( loader - > item ( ) ) ;
QCOMPARE ( loader - > progress ( ) , 1.0 ) ;
2011-10-14 08:51:42 +00:00
QCOMPARE ( static_cast < QQuickItem * > ( loader ) - > childItems ( ) . count ( ) , 1 ) ;
2011-04-27 12:13:26 +00:00
loader - > setSourceComponent ( 0 ) ;
2015-07-24 13:32:22 +00:00
QVERIFY ( ! loader - > item ( ) ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( loader - > progress ( ) , 0.0 ) ;
2011-10-14 08:51:42 +00:00
QCOMPARE ( loader - > status ( ) , QQuickLoader : : Null ) ;
QCOMPARE ( static_cast < QQuickItem * > ( loader ) - > childItems ( ) . count ( ) , 0 ) ;
2011-04-27 12:13:26 +00:00
delete item ;
}
{
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine , testFileUrl ( " /SetSourceComponent.qml " ) ) ;
2011-10-14 08:51:42 +00:00
QQuickItem * item = qobject_cast < QQuickItem * > ( component . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( item ) ;
2011-10-14 08:51:42 +00:00
QQuickLoader * loader = qobject_cast < QQuickLoader * > ( item - > QQuickItem : : childItems ( ) . at ( 0 ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( loader ) ;
QVERIFY ( loader - > item ( ) ) ;
QCOMPARE ( loader - > progress ( ) , 1.0 ) ;
2011-10-14 08:51:42 +00:00
QCOMPARE ( static_cast < QQuickItem * > ( loader ) - > childItems ( ) . count ( ) , 1 ) ;
2011-04-27 12:13:26 +00:00
QMetaObject : : invokeMethod ( item , " clear " ) ;
2015-07-24 13:32:22 +00:00
QVERIFY ( ! loader - > item ( ) ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( loader - > progress ( ) , 0.0 ) ;
2011-10-14 08:51:42 +00:00
QCOMPARE ( loader - > status ( ) , QQuickLoader : : Null ) ;
QCOMPARE ( static_cast < QQuickItem * > ( loader ) - > childItems ( ) . count ( ) , 0 ) ;
2011-04-27 12:13:26 +00:00
delete item ;
}
}
2011-10-14 08:51:42 +00:00
void tst_QQuickLoader : : urlToComponent ( )
2011-04-27 12:13:26 +00:00
{
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine ) ;
2011-04-27 12:13:26 +00:00
component . setData ( QByteArray ( " import QtQuick 2.0 \n "
" Loader { \n "
" id: loader \n "
" Component { id: myComp; Rectangle { width: 10; height: 10 } } \n "
" source: \" Rect120x60.qml \" \n "
" Timer { interval: 100; running: true; onTriggered: loader.sourceComponent = myComp } \n "
" } " )
2011-12-21 08:06:26 +00:00
, dataDirectoryUrl ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickLoader * loader = qobject_cast < QQuickLoader * > ( component . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QTest : : qWait ( 200 ) ;
QTRY_VERIFY ( loader ! = 0 ) ;
QVERIFY ( loader - > item ( ) ) ;
QCOMPARE ( loader - > progress ( ) , 1.0 ) ;
2011-10-14 08:51:42 +00:00
QCOMPARE ( static_cast < QQuickItem * > ( loader ) - > childItems ( ) . count ( ) , 1 ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( loader - > width ( ) , 10.0 ) ;
QCOMPARE ( loader - > height ( ) , 10.0 ) ;
delete loader ;
}
2011-10-14 08:51:42 +00:00
void tst_QQuickLoader : : componentToUrl ( )
2011-04-27 12:13:26 +00:00
{
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine , testFileUrl ( " /SetSourceComponent.qml " ) ) ;
2011-10-14 08:51:42 +00:00
QQuickItem * item = qobject_cast < QQuickItem * > ( component . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( item ) ;
2011-10-14 08:51:42 +00:00
QQuickLoader * loader = qobject_cast < QQuickLoader * > ( item - > QQuickItem : : childItems ( ) . at ( 0 ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( loader ) ;
QVERIFY ( loader - > item ( ) ) ;
QCOMPARE ( loader - > progress ( ) , 1.0 ) ;
2011-10-14 08:51:42 +00:00
QCOMPARE ( static_cast < QQuickItem * > ( loader ) - > childItems ( ) . count ( ) , 1 ) ;
2011-04-27 12:13:26 +00:00
2011-12-21 08:06:26 +00:00
loader - > setSource ( testFileUrl ( " /Rect120x60.qml " ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( loader - > item ( ) ) ;
QCOMPARE ( loader - > progress ( ) , 1.0 ) ;
2011-10-14 08:51:42 +00:00
QCOMPARE ( static_cast < QQuickItem * > ( loader ) - > childItems ( ) . count ( ) , 1 ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( loader - > width ( ) , 120.0 ) ;
QCOMPARE ( loader - > height ( ) , 60.0 ) ;
delete item ;
}
2011-10-14 08:51:42 +00:00
void tst_QQuickLoader : : anchoredLoader ( )
2011-04-27 12:13:26 +00:00
{
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine , testFileUrl ( " /AnchoredLoader.qml " ) ) ;
2011-10-14 08:51:42 +00:00
QQuickItem * rootItem = qobject_cast < QQuickItem * > ( component . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( rootItem ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QQuickItem * loader = rootItem - > findChild < QQuickItem * > ( " loader " ) ;
QQuickItem * sourceElement = rootItem - > findChild < QQuickItem * > ( " sourceElement " ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( loader ! = 0 ) ;
QVERIFY ( sourceElement ! = 0 ) ;
QCOMPARE ( rootItem - > width ( ) , 300.0 ) ;
QCOMPARE ( rootItem - > height ( ) , 200.0 ) ;
QCOMPARE ( loader - > width ( ) , 300.0 ) ;
QCOMPARE ( loader - > height ( ) , 200.0 ) ;
QCOMPARE ( sourceElement - > width ( ) , 300.0 ) ;
QCOMPARE ( sourceElement - > height ( ) , 200.0 ) ;
}
2011-10-14 08:51:42 +00:00
void tst_QQuickLoader : : sizeLoaderToItem ( )
2011-04-27 12:13:26 +00:00
{
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine , testFileUrl ( " /SizeToItem.qml " ) ) ;
2011-10-14 08:51:42 +00:00
QQuickLoader * loader = qobject_cast < QQuickLoader * > ( component . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( loader ! = 0 ) ;
QCOMPARE ( loader - > width ( ) , 120.0 ) ;
QCOMPARE ( loader - > height ( ) , 60.0 ) ;
// Check resize
2011-10-14 08:51:42 +00:00
QQuickItem * rect = qobject_cast < QQuickItem * > ( loader - > item ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( rect ) ;
rect - > setWidth ( 150 ) ;
rect - > setHeight ( 45 ) ;
QCOMPARE ( loader - > width ( ) , 150.0 ) ;
QCOMPARE ( loader - > height ( ) , 45.0 ) ;
// Check explicit width
loader - > setWidth ( 200.0 ) ;
QCOMPARE ( loader - > width ( ) , 200.0 ) ;
QCOMPARE ( rect - > width ( ) , 200.0 ) ;
rect - > setWidth ( 100.0 ) ; // when rect changes ...
QCOMPARE ( rect - > width ( ) , 100.0 ) ; // ... it changes
QCOMPARE ( loader - > width ( ) , 200.0 ) ; // ... but loader stays the same
// Check explicit height
loader - > setHeight ( 200.0 ) ;
QCOMPARE ( loader - > height ( ) , 200.0 ) ;
QCOMPARE ( rect - > height ( ) , 200.0 ) ;
rect - > setHeight ( 100.0 ) ; // when rect changes ...
QCOMPARE ( rect - > height ( ) , 100.0 ) ; // ... it changes
QCOMPARE ( loader - > height ( ) , 200.0 ) ; // ... but loader stays the same
// Switch mode
loader - > setWidth ( 180 ) ;
loader - > setHeight ( 30 ) ;
QCOMPARE ( rect - > width ( ) , 180.0 ) ;
QCOMPARE ( rect - > height ( ) , 30.0 ) ;
delete loader ;
}
2011-10-14 08:51:42 +00:00
void tst_QQuickLoader : : sizeItemToLoader ( )
2011-04-27 12:13:26 +00:00
{
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine , testFileUrl ( " /SizeToLoader.qml " ) ) ;
2011-10-14 08:51:42 +00:00
QQuickLoader * loader = qobject_cast < QQuickLoader * > ( component . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( loader ! = 0 ) ;
QCOMPARE ( loader - > width ( ) , 200.0 ) ;
QCOMPARE ( loader - > height ( ) , 80.0 ) ;
2011-10-14 08:51:42 +00:00
QQuickItem * rect = qobject_cast < QQuickItem * > ( loader - > item ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( rect ) ;
QCOMPARE ( rect - > width ( ) , 200.0 ) ;
QCOMPARE ( rect - > height ( ) , 80.0 ) ;
// Check resize
loader - > setWidth ( 180 ) ;
loader - > setHeight ( 30 ) ;
QCOMPARE ( rect - > width ( ) , 180.0 ) ;
QCOMPARE ( rect - > height ( ) , 30.0 ) ;
// Switch mode
loader - > resetWidth ( ) ; // reset explicit size
loader - > resetHeight ( ) ;
rect - > setWidth ( 160 ) ;
rect - > setHeight ( 45 ) ;
QCOMPARE ( loader - > width ( ) , 160.0 ) ;
QCOMPARE ( loader - > height ( ) , 45.0 ) ;
delete loader ;
}
2011-10-14 08:51:42 +00:00
void tst_QQuickLoader : : noResize ( )
2011-04-27 12:13:26 +00:00
{
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine , testFileUrl ( " /NoResize.qml " ) ) ;
2011-10-14 08:51:42 +00:00
QQuickItem * item = qobject_cast < QQuickItem * > ( component . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( item ! = 0 ) ;
QCOMPARE ( item - > width ( ) , 200.0 ) ;
QCOMPARE ( item - > height ( ) , 80.0 ) ;
delete item ;
}
2011-10-14 08:51:42 +00:00
void tst_QQuickLoader : : networkRequestUrl ( )
2011-04-27 12:13:26 +00:00
{
2015-09-25 08:30:59 +00:00
ThreadedTestHTTPServer server ( dataDirectory ( ) ) ;
2011-04-27 12:13:26 +00:00
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine ) ;
2015-04-22 15:15:30 +00:00
const QString qml = " import QtQuick 2.0 \n Loader { property int signalCount : 0; source: \" " + server . baseUrl ( ) . toString ( ) + " /Rect120x60.qml \" ; onLoaded: signalCount += 1 } " ;
component . setData ( qml . toUtf8 ( ) , testFileUrl ( " ../dummy.qml " ) ) ;
2011-04-27 12:13:26 +00:00
if ( component . isError ( ) )
qDebug ( ) < < component . errors ( ) ;
2011-10-14 08:51:42 +00:00
QQuickLoader * loader = qobject_cast < QQuickLoader * > ( component . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( loader ! = 0 ) ;
2015-07-24 13:32:22 +00:00
QTRY_COMPARE ( loader - > status ( ) , QQuickLoader : : Ready ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( loader - > item ( ) ) ;
QCOMPARE ( loader - > progress ( ) , 1.0 ) ;
QCOMPARE ( loader - > property ( " signalCount " ) . toInt ( ) , 1 ) ;
2011-10-14 08:51:42 +00:00
QCOMPARE ( static_cast < QQuickItem * > ( loader ) - > childItems ( ) . count ( ) , 1 ) ;
2011-04-27 12:13:26 +00:00
delete loader ;
}
2012-03-29 01:14:59 +00:00
/* XXX Component waits until all dependencies are loaded. Is this actually possible? */
2011-10-14 08:51:42 +00:00
void tst_QQuickLoader : : networkComponent ( )
2011-04-27 12:13:26 +00:00
{
2015-09-25 08:30:59 +00:00
ThreadedTestHTTPServer server ( dataDirectory ( ) , TestHTTPServer : : Delay ) ;
2011-04-27 12:13:26 +00:00
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine ) ;
2015-04-22 15:15:30 +00:00
const QString qml = " import QtQuick 2.0 \n "
" import \" " + server . baseUrl ( ) . toString ( ) + " / \" as NW \n "
" Item { \n "
" Component { id: comp; NW.Rect120x60 {} } \n "
" Loader { sourceComponent: comp } } " ;
component . setData ( qml . toUtf8 ( ) , dataDirectory ( ) ) ;
2015-09-25 08:30:59 +00:00
// The component may be loaded synchronously or asynchronously, so we cannot test for
// status == Loading here. Also, it makes no sense to instruct the server to send here
// because in the synchronous case we're already done loading.
2012-12-17 13:00:10 +00:00
QTRY_COMPARE ( component . status ( ) , QQmlComponent : : Ready ) ;
2011-04-27 12:13:26 +00:00
2011-10-14 08:51:42 +00:00
QQuickItem * item = qobject_cast < QQuickItem * > ( component . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( item ) ;
2013-03-06 17:47:17 +00:00
QQuickLoader * loader = qobject_cast < QQuickLoader * > ( item - > children ( ) . at ( 1 ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( loader ) ;
2015-07-24 13:32:22 +00:00
QTRY_COMPARE ( loader - > status ( ) , QQuickLoader : : Ready ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( loader - > item ( ) ) ;
QCOMPARE ( loader - > progress ( ) , 1.0 ) ;
2011-10-14 08:51:42 +00:00
QCOMPARE ( loader - > status ( ) , QQuickLoader : : Ready ) ;
QCOMPARE ( static_cast < QQuickItem * > ( loader ) - > children ( ) . count ( ) , 1 ) ;
2011-04-27 12:13:26 +00:00
delete loader ;
}
2011-10-14 08:51:42 +00:00
void tst_QQuickLoader : : failNetworkRequest ( )
2011-04-27 12:13:26 +00:00
{
2015-09-25 08:30:59 +00:00
ThreadedTestHTTPServer server ( dataDirectory ( ) ) ;
2011-04-27 12:13:26 +00:00
2015-04-22 15:15:30 +00:00
QTest : : ignoreMessage ( QtWarningMsg , QString ( server . baseUrl ( ) . toString ( ) + " /IDontExist.qml: File not found " ) . toUtf8 ( ) ) ;
2011-04-27 12:13:26 +00:00
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine ) ;
2015-04-22 15:15:30 +00:00
const QString qml = " import QtQuick 2.0 \n Loader { property int did_load: 123; source: \" " + server . baseUrl ( ) . toString ( ) + " /IDontExist.qml \" ; onLoaded: did_load=456 } " ;
component . setData ( qml . toUtf8 ( ) , server . url ( " /dummy.qml " ) ) ;
2012-12-17 13:00:10 +00:00
QTRY_COMPARE ( component . status ( ) , QQmlComponent : : Ready ) ;
2011-10-14 08:51:42 +00:00
QQuickLoader * loader = qobject_cast < QQuickLoader * > ( component . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( loader ! = 0 ) ;
2015-07-24 13:32:22 +00:00
QTRY_COMPARE ( loader - > status ( ) , QQuickLoader : : Error ) ;
2011-04-27 12:13:26 +00:00
2015-07-24 13:32:22 +00:00
QVERIFY ( ! loader - > item ( ) ) ;
2012-03-06 08:03:33 +00:00
QCOMPARE ( loader - > progress ( ) , 1.0 ) ;
2011-04-27 12:13:26 +00:00
QCOMPARE ( loader - > property ( " did_load " ) . toInt ( ) , 123 ) ;
2011-10-14 08:51:42 +00:00
QCOMPARE ( static_cast < QQuickItem * > ( loader ) - > childItems ( ) . count ( ) , 0 ) ;
2011-04-27 12:13:26 +00:00
delete loader ;
}
2011-10-14 08:51:42 +00:00
void tst_QQuickLoader : : active ( )
2011-08-17 07:46:54 +00:00
{
// check that the item isn't instantiated until active is set to true
{
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine , testFileUrl ( " active.1.qml " ) ) ;
2011-08-17 07:46:54 +00:00
QObject * object = component . create ( ) ;
QVERIFY ( object ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QQuickLoader * loader = object - > findChild < QQuickLoader * > ( " loader " ) ;
2011-08-17 07:46:54 +00:00
QVERIFY ( loader - > active ( ) = = false ) ; // set manually to false
2015-07-24 13:32:22 +00:00
QVERIFY ( ! loader - > item ( ) ) ;
2011-08-17 07:46:54 +00:00
QMetaObject : : invokeMethod ( object , " doSetSourceComponent " ) ;
2015-07-24 13:32:22 +00:00
QVERIFY ( ! loader - > item ( ) ) ;
2011-08-17 07:46:54 +00:00
QMetaObject : : invokeMethod ( object , " doSetSource " ) ;
2015-07-24 13:32:22 +00:00
QVERIFY ( ! loader - > item ( ) ) ;
2011-08-17 07:46:54 +00:00
QMetaObject : : invokeMethod ( object , " doSetActive " ) ;
QVERIFY ( loader - > item ( ) ! = 0 ) ;
delete object ;
}
// check that the status is Null if active is set to false
{
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine , testFileUrl ( " active.2.qml " ) ) ;
2011-08-17 07:46:54 +00:00
QObject * object = component . create ( ) ;
QVERIFY ( object ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QQuickLoader * loader = object - > findChild < QQuickLoader * > ( " loader " ) ;
2011-08-17 07:46:54 +00:00
QVERIFY ( loader - > active ( ) = = true ) ; // active is true by default
2011-10-14 08:51:42 +00:00
QCOMPARE ( loader - > status ( ) , QQuickLoader : : Ready ) ;
2011-08-17 07:46:54 +00:00
int currStatusChangedCount = loader - > property ( " statusChangedCount " ) . toInt ( ) ;
QMetaObject : : invokeMethod ( object , " doSetInactive " ) ;
2011-10-14 08:51:42 +00:00
QCOMPARE ( loader - > status ( ) , QQuickLoader : : Null ) ;
2011-08-17 07:46:54 +00:00
QCOMPARE ( loader - > property ( " statusChangedCount " ) . toInt ( ) , ( currStatusChangedCount + 1 ) ) ;
delete object ;
}
// check that the source is not cleared if active is set to false
{
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine , testFileUrl ( " active.3.qml " ) ) ;
2011-08-17 07:46:54 +00:00
QObject * object = component . create ( ) ;
QVERIFY ( object ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QQuickLoader * loader = object - > findChild < QQuickLoader * > ( " loader " ) ;
2011-08-17 07:46:54 +00:00
QVERIFY ( loader - > active ( ) = = true ) ; // active is true by default
QVERIFY ( ! loader - > source ( ) . isEmpty ( ) ) ;
int currSourceChangedCount = loader - > property ( " sourceChangedCount " ) . toInt ( ) ;
QMetaObject : : invokeMethod ( object , " doSetInactive " ) ;
QVERIFY ( ! loader - > source ( ) . isEmpty ( ) ) ;
QCOMPARE ( loader - > property ( " sourceChangedCount " ) . toInt ( ) , currSourceChangedCount ) ;
delete object ;
}
// check that the sourceComponent is not cleared if active is set to false
{
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine , testFileUrl ( " active.4.qml " ) ) ;
2011-08-17 07:46:54 +00:00
QObject * object = component . create ( ) ;
QVERIFY ( object ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QQuickLoader * loader = object - > findChild < QQuickLoader * > ( " loader " ) ;
2011-08-17 07:46:54 +00:00
QVERIFY ( loader - > active ( ) = = true ) ; // active is true by default
QVERIFY ( loader - > sourceComponent ( ) ! = 0 ) ;
int currSourceComponentChangedCount = loader - > property ( " sourceComponentChangedCount " ) . toInt ( ) ;
QMetaObject : : invokeMethod ( object , " doSetInactive " ) ;
QVERIFY ( loader - > sourceComponent ( ) ! = 0 ) ;
QCOMPARE ( loader - > property ( " sourceComponentChangedCount " ) . toInt ( ) , currSourceComponentChangedCount ) ;
delete object ;
}
// check that the item is released if active is set to false
{
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine , testFileUrl ( " active.5.qml " ) ) ;
2011-08-17 07:46:54 +00:00
QObject * object = component . create ( ) ;
QVERIFY ( object ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QQuickLoader * loader = object - > findChild < QQuickLoader * > ( " loader " ) ;
2011-08-17 07:46:54 +00:00
QVERIFY ( loader - > active ( ) = = true ) ; // active is true by default
QVERIFY ( loader - > item ( ) ! = 0 ) ;
int currItemChangedCount = loader - > property ( " itemChangedCount " ) . toInt ( ) ;
QMetaObject : : invokeMethod ( object , " doSetInactive " ) ;
2015-07-24 13:32:22 +00:00
QVERIFY ( ! loader - > item ( ) ) ;
2011-08-17 07:46:54 +00:00
QCOMPARE ( loader - > property ( " itemChangedCount " ) . toInt ( ) , ( currItemChangedCount + 1 ) ) ;
delete object ;
}
// check that the activeChanged signal is emitted correctly
{
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine , testFileUrl ( " active.6.qml " ) ) ;
2011-08-17 07:46:54 +00:00
QObject * object = component . create ( ) ;
QVERIFY ( object ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QQuickLoader * loader = object - > findChild < QQuickLoader * > ( " loader " ) ;
2011-08-17 07:46:54 +00:00
QVERIFY ( loader - > active ( ) = = true ) ; // active is true by default
loader - > setActive ( true ) ; // no effect
QCOMPARE ( loader - > property ( " activeChangedCount " ) . toInt ( ) , 0 ) ;
loader - > setActive ( false ) ; // change signal should be emitted
QCOMPARE ( loader - > property ( " activeChangedCount " ) . toInt ( ) , 1 ) ;
loader - > setActive ( false ) ; // no effect
QCOMPARE ( loader - > property ( " activeChangedCount " ) . toInt ( ) , 1 ) ;
loader - > setActive ( true ) ; // change signal should be emitted
QCOMPARE ( loader - > property ( " activeChangedCount " ) . toInt ( ) , 2 ) ;
loader - > setActive ( false ) ; // change signal should be emitted
QCOMPARE ( loader - > property ( " activeChangedCount " ) . toInt ( ) , 3 ) ;
QMetaObject : : invokeMethod ( object , " doSetActive " ) ;
QCOMPARE ( loader - > property ( " activeChangedCount " ) . toInt ( ) , 4 ) ;
QMetaObject : : invokeMethod ( object , " doSetActive " ) ;
QCOMPARE ( loader - > property ( " activeChangedCount " ) . toInt ( ) , 4 ) ;
QMetaObject : : invokeMethod ( object , " doSetInactive " ) ;
QCOMPARE ( loader - > property ( " activeChangedCount " ) . toInt ( ) , 5 ) ;
loader - > setActive ( true ) ; // change signal should be emitted
QCOMPARE ( loader - > property ( " activeChangedCount " ) . toInt ( ) , 6 ) ;
delete object ;
}
2011-10-06 04:37:09 +00:00
// check that the component isn't loaded until active is set to true
{
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine , testFileUrl ( " active.7.qml " ) ) ;
2011-10-06 04:37:09 +00:00
QObject * object = component . create ( ) ;
QVERIFY ( object ! = 0 ) ;
QCOMPARE ( object - > property ( " success " ) . toBool ( ) , true ) ;
delete object ;
}
// check that the component is loaded if active is not set (true by default)
{
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine , testFileUrl ( " active.8.qml " ) ) ;
2011-10-06 04:37:09 +00:00
QObject * object = component . create ( ) ;
QVERIFY ( object ! = 0 ) ;
QCOMPARE ( object - > property ( " success " ) . toBool ( ) , true ) ;
delete object ;
}
2011-08-17 07:46:54 +00:00
}
2011-10-14 08:51:42 +00:00
void tst_QQuickLoader : : initialPropertyValues_data ( )
2011-08-17 07:46:54 +00:00
{
QTest : : addColumn < QUrl > ( " qmlFile " ) ;
QTest : : addColumn < QStringList > ( " expectedWarnings " ) ;
QTest : : addColumn < QStringList > ( " propertyNames " ) ;
QTest : : addColumn < QVariantList > ( " propertyValues " ) ;
2011-12-21 08:06:26 +00:00
QTest : : newRow ( " source url with value set in onLoaded, initially active = true " ) < < testFileUrl ( " initialPropertyValues.1.qml " )
2011-08-17 07:46:54 +00:00
< < QStringList ( )
< < ( QStringList ( ) < < " initialValue " < < " behaviorCount " )
< < ( QVariantList ( ) < < 1 < < 1 ) ;
2011-12-21 08:06:26 +00:00
QTest : : newRow ( " set source with initial property values specified, active = true " ) < < testFileUrl ( " initialPropertyValues.2.qml " )
2011-08-17 07:46:54 +00:00
< < QStringList ( )
< < ( QStringList ( ) < < " initialValue " < < " behaviorCount " )
< < ( QVariantList ( ) < < 2 < < 0 ) ;
2011-12-21 08:06:26 +00:00
QTest : : newRow ( " set source with initial property values specified, active = false " ) < < testFileUrl ( " initialPropertyValues.3.qml " )
2012-03-14 14:42:58 +00:00
< < ( QStringList ( ) < < QString ( testFileUrl ( " initialPropertyValues.3.qml " ) . toString ( ) + QLatin1String ( " :16: TypeError: Cannot read property 'canary' of null " ) ) )
2011-08-17 07:46:54 +00:00
< < ( QStringList ( ) )
< < ( QVariantList ( ) ) ;
2011-12-21 08:06:26 +00:00
QTest : : newRow ( " set source with initial property values specified, active = false, with active set true later " ) < < testFileUrl ( " initialPropertyValues.4.qml " )
2011-08-17 07:46:54 +00:00
< < QStringList ( )
< < ( QStringList ( ) < < " initialValue " < < " behaviorCount " )
< < ( QVariantList ( ) < < 4 < < 0 ) ;
2011-12-21 08:06:26 +00:00
QTest : : newRow ( " set source without initial property values specified, active = true " ) < < testFileUrl ( " initialPropertyValues.5.qml " )
2011-08-17 07:46:54 +00:00
< < QStringList ( )
< < ( QStringList ( ) < < " initialValue " < < " behaviorCount " )
< < ( QVariantList ( ) < < 0 < < 0 ) ;
2011-12-21 08:06:26 +00:00
QTest : : newRow ( " set source with initial property values specified with binding, active = true " ) < < testFileUrl ( " initialPropertyValues.6.qml " )
2011-08-17 07:46:54 +00:00
< < QStringList ( )
< < ( QStringList ( ) < < " initialValue " < < " behaviorCount " )
< < ( QVariantList ( ) < < 6 < < 0 ) ;
2011-12-21 08:06:26 +00:00
QTest : : newRow ( " ensure initial property value semantics mimic createObject " ) < < testFileUrl ( " initialPropertyValues.7.qml " )
2011-08-17 07:46:54 +00:00
< < QStringList ( )
< < ( QStringList ( ) < < " loaderValue " < < " createObjectValue " )
< < ( QVariantList ( ) < < 1 < < 1 ) ;
2011-10-06 06:29:52 +00:00
2011-12-21 08:06:26 +00:00
QTest : : newRow ( " ensure initial property values aren't disposed prior to component completion " ) < < testFileUrl ( " initialPropertyValues.8.qml " )
2011-10-06 06:29:52 +00:00
< < QStringList ( )
< < ( QStringList ( ) < < " initialValue " )
< < ( QVariantList ( ) < < 6 ) ;
2011-08-17 07:46:54 +00:00
}
2011-10-14 08:51:42 +00:00
void tst_QQuickLoader : : initialPropertyValues ( )
2011-08-17 07:46:54 +00:00
{
QFETCH ( QUrl , qmlFile ) ;
QFETCH ( QStringList , expectedWarnings ) ;
QFETCH ( QStringList , propertyNames ) ;
QFETCH ( QVariantList , propertyValues ) ;
2015-09-25 08:30:59 +00:00
ThreadedTestHTTPServer server ( dataDirectory ( ) ) ;
2011-10-06 06:29:52 +00:00
2011-08-17 07:46:54 +00:00
foreach ( const QString & warning , expectedWarnings )
2012-05-03 12:42:53 +00:00
QTest : : ignoreMessage ( QtWarningMsg , warning . toLatin1 ( ) . constData ( ) ) ;
2011-08-17 07:46:54 +00:00
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine , qmlFile ) ;
2015-04-22 15:15:30 +00:00
QObject * object = component . beginCreate ( engine . rootContext ( ) ) ;
2011-08-17 07:46:54 +00:00
QVERIFY ( object ! = 0 ) ;
2015-04-22 15:15:30 +00:00
const int serverBaseUrlPropertyIndex = object - > metaObject ( ) - > indexOfProperty ( " serverBaseUrl " ) ;
if ( serverBaseUrlPropertyIndex ! = - 1 ) {
QMetaProperty prop = object - > metaObject ( ) - > property ( serverBaseUrlPropertyIndex ) ;
QVERIFY ( prop . write ( object , server . baseUrl ( ) . toString ( ) ) ) ;
}
component . completeCreate ( ) ;
2012-07-10 03:10:28 +00:00
if ( expectedWarnings . isEmpty ( ) ) {
QQuickLoader * loader = object - > findChild < QQuickLoader * > ( " loader " ) ;
QTRY_VERIFY ( loader - > item ( ) ) ;
}
2011-08-17 07:46:54 +00:00
for ( int i = 0 ; i < propertyNames . size ( ) ; + + i )
2012-05-03 12:42:53 +00:00
QCOMPARE ( object - > property ( propertyNames . at ( i ) . toLatin1 ( ) . constData ( ) ) , propertyValues . at ( i ) ) ;
2011-08-17 07:46:54 +00:00
delete object ;
}
2011-10-14 08:51:42 +00:00
void tst_QQuickLoader : : initialPropertyValuesBinding ( )
2011-08-17 07:46:54 +00:00
{
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine , testFileUrl ( " initialPropertyValues.binding.qml " ) ) ;
2011-08-17 07:46:54 +00:00
QObject * object = component . create ( ) ;
QVERIFY ( object ! = 0 ) ;
QVERIFY ( object - > setProperty ( " bindable " , QVariant ( 8 ) ) ) ;
QCOMPARE ( object - > property ( " canaryValue " ) . toInt ( ) , 8 ) ;
delete object ;
}
2011-10-14 08:51:42 +00:00
void tst_QQuickLoader : : initialPropertyValuesError_data ( )
2011-08-17 07:46:54 +00:00
{
QTest : : addColumn < QUrl > ( " qmlFile " ) ;
QTest : : addColumn < QStringList > ( " expectedWarnings " ) ;
2011-12-21 08:06:26 +00:00
QTest : : newRow ( " invalid initial property values object " ) < < testFileUrl ( " initialPropertyValues.error.1.qml " )
< < ( QStringList ( ) < < QString ( testFileUrl ( " initialPropertyValues.error.1.qml " ) . toString ( ) + " :6:5: QML Loader: setSource: value is not an object " ) ) ;
2011-08-17 07:46:54 +00:00
2011-12-21 08:06:26 +00:00
QTest : : newRow ( " nonexistent source url " ) < < testFileUrl ( " initialPropertyValues.error.2.qml " )
< < ( QStringList ( ) < < QString ( testFileUrl ( " NonexistentSourceComponent.qml " ) . toString ( ) + " : File not found " ) ) ;
2011-08-17 07:46:54 +00:00
2011-12-21 08:06:26 +00:00
QTest : : newRow ( " invalid source url " ) < < testFileUrl ( " initialPropertyValues.error.3.qml " )
< < ( QStringList ( ) < < QString ( testFileUrl ( " InvalidSourceComponent.qml " ) . toString ( ) + " :5:1: Syntax error " ) ) ;
2011-08-17 07:46:54 +00:00
2011-12-21 08:06:26 +00:00
QTest : : newRow ( " invalid initial property values object with invalid property access " ) < < testFileUrl ( " initialPropertyValues.error.4.qml " )
< < ( QStringList ( ) < < QString ( testFileUrl ( " initialPropertyValues.error.4.qml " ) . toString ( ) + " :7:5: QML Loader: setSource: value is not an object " )
< < QString ( testFileUrl ( " initialPropertyValues.error.4.qml " ) . toString ( ) + " :5: TypeError: Cannot read property 'canary' of null " ) ) ;
2011-08-17 07:46:54 +00:00
}
2011-10-14 08:51:42 +00:00
void tst_QQuickLoader : : initialPropertyValuesError ( )
2011-08-17 07:46:54 +00:00
{
QFETCH ( QUrl , qmlFile ) ;
QFETCH ( QStringList , expectedWarnings ) ;
foreach ( const QString & warning , expectedWarnings )
QTest : : ignoreMessage ( QtWarningMsg , warning . toUtf8 ( ) . constData ( ) ) ;
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine , qmlFile ) ;
2011-08-17 07:46:54 +00:00
QObject * object = component . create ( ) ;
QVERIFY ( object ! = 0 ) ;
2011-10-14 08:51:42 +00:00
QQuickLoader * loader = object - > findChild < QQuickLoader * > ( " loader " ) ;
2011-08-17 07:46:54 +00:00
QVERIFY ( loader ! = 0 ) ;
2015-07-24 13:32:22 +00:00
QVERIFY ( ! loader - > item ( ) ) ;
2011-08-17 07:46:54 +00:00
delete object ;
}
2011-04-27 12:13:26 +00:00
// QTBUG-9241
2011-10-14 08:51:42 +00:00
void tst_QQuickLoader : : deleteComponentCrash ( )
2011-04-27 12:13:26 +00:00
{
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine , testFileUrl ( " crash.qml " ) ) ;
2011-10-14 08:51:42 +00:00
QQuickItem * item = qobject_cast < QQuickItem * > ( component . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( item ) ;
item - > metaObject ( ) - > invokeMethod ( item , " setLoaderSource " ) ;
2011-10-14 08:51:42 +00:00
QQuickLoader * loader = qobject_cast < QQuickLoader * > ( item - > QQuickItem : : childItems ( ) . at ( 0 ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( loader ) ;
QVERIFY ( loader - > item ( ) ) ;
QCOMPARE ( loader - > item ( ) - > objectName ( ) , QLatin1String ( " blue " ) ) ;
QCOMPARE ( loader - > progress ( ) , 1.0 ) ;
2011-10-14 08:51:42 +00:00
QCOMPARE ( loader - > status ( ) , QQuickLoader : : Ready ) ;
2012-01-24 00:30:57 +00:00
QCoreApplication : : sendPostedEvents ( 0 , QEvent : : DeferredDelete ) ;
QCoreApplication : : processEvents ( ) ;
2011-10-14 08:51:42 +00:00
QTRY_COMPARE ( static_cast < QQuickItem * > ( loader ) - > childItems ( ) . count ( ) , 1 ) ;
2015-07-24 13:32:22 +00:00
QCOMPARE ( loader - > source ( ) , testFileUrl ( " BlueRect.qml " ) ) ;
2011-04-27 12:13:26 +00:00
delete item ;
}
2011-10-14 08:51:42 +00:00
void tst_QQuickLoader : : nonItem ( )
2011-04-27 12:13:26 +00:00
{
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine , testFileUrl ( " nonItem.qml " ) ) ;
2011-04-27 12:13:26 +00:00
2011-10-14 08:51:42 +00:00
QQuickLoader * loader = qobject_cast < QQuickLoader * > ( component . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( loader ) ;
2012-06-12 00:16:47 +00:00
QVERIFY ( loader - > item ( ) ) ;
QCOMPARE ( loader , loader - > item ( ) - > parent ( ) ) ;
QPointer < QObject > item = loader - > item ( ) ;
loader - > setActive ( false ) ;
QVERIFY ( ! loader - > item ( ) ) ;
QTRY_VERIFY ( ! item ) ;
2011-04-27 12:13:26 +00:00
delete loader ;
}
2011-10-14 08:51:42 +00:00
void tst_QQuickLoader : : vmeErrors ( )
2011-04-27 12:13:26 +00:00
{
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine , testFileUrl ( " vmeErrors.qml " ) ) ;
2014-02-26 17:43:28 +00:00
QString err = testFileUrl ( " VmeError.qml " ) . toString ( ) + " :6:26: Cannot assign object type QObject with no default method " ;
2011-04-27 12:13:26 +00:00
QTest : : ignoreMessage ( QtWarningMsg , err . toLatin1 ( ) . constData ( ) ) ;
2011-10-14 08:51:42 +00:00
QQuickLoader * loader = qobject_cast < QQuickLoader * > ( component . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( loader ) ;
2015-07-24 13:32:22 +00:00
QVERIFY ( ! loader - > item ( ) ) ;
2011-04-27 12:13:26 +00:00
delete loader ;
}
// QTBUG-13481
2011-10-14 08:51:42 +00:00
void tst_QQuickLoader : : creationContext ( )
2011-04-27 12:13:26 +00:00
{
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine , testFileUrl ( " creationContext.qml " ) ) ;
2011-04-27 12:13:26 +00:00
QObject * o = component . create ( ) ;
QVERIFY ( o ! = 0 ) ;
QCOMPARE ( o - > property ( " test " ) . toBool ( ) , true ) ;
delete o ;
}
2011-10-14 08:51:42 +00:00
void tst_QQuickLoader : : QTBUG_16928 ( )
2011-04-27 12:13:26 +00:00
{
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine , testFileUrl ( " QTBUG_16928.qml " ) ) ;
2011-10-14 08:51:42 +00:00
QQuickItem * item = qobject_cast < QQuickItem * > ( component . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( item ) ;
QCOMPARE ( item - > width ( ) , 250. ) ;
QCOMPARE ( item - > height ( ) , 250. ) ;
delete item ;
}
2011-10-14 08:51:42 +00:00
void tst_QQuickLoader : : implicitSize ( )
2011-04-27 12:13:26 +00:00
{
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine , testFileUrl ( " implicitSize.qml " ) ) ;
2011-10-14 08:51:42 +00:00
QQuickItem * item = qobject_cast < QQuickItem * > ( component . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( item ) ;
QCOMPARE ( item - > width ( ) , 150. ) ;
QCOMPARE ( item - > height ( ) , 150. ) ;
QCOMPARE ( item - > property ( " implHeight " ) . toReal ( ) , 100. ) ;
QCOMPARE ( item - > property ( " implWidth " ) . toReal ( ) , 100. ) ;
2012-03-30 00:48:50 +00:00
QQuickLoader * loader = item - > findChild < QQuickLoader * > ( " loader " ) ;
QSignalSpy implWidthSpy ( loader , SIGNAL ( implicitWidthChanged ( ) ) ) ;
QSignalSpy implHeightSpy ( loader , SIGNAL ( implicitHeightChanged ( ) ) ) ;
QMetaObject : : invokeMethod ( item , " changeImplicitSize " ) ;
QCOMPARE ( loader - > property ( " implicitWidth " ) . toReal ( ) , 200. ) ;
QCOMPARE ( loader - > property ( " implicitHeight " ) . toReal ( ) , 300. ) ;
QCOMPARE ( implWidthSpy . count ( ) , 1 ) ;
QCOMPARE ( implHeightSpy . count ( ) , 1 ) ;
2011-04-27 12:13:26 +00:00
delete item ;
}
2011-10-14 08:51:42 +00:00
void tst_QQuickLoader : : QTBUG_17114 ( )
2011-04-27 12:13:26 +00:00
{
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine , testFileUrl ( " QTBUG_17114.qml " ) ) ;
2011-10-14 08:51:42 +00:00
QQuickItem * item = qobject_cast < QQuickItem * > ( component . create ( ) ) ;
2011-04-27 12:13:26 +00:00
QVERIFY ( item ) ;
QCOMPARE ( item - > property ( " loaderWidth " ) . toReal ( ) , 32. ) ;
QCOMPARE ( item - > property ( " loaderHeight " ) . toReal ( ) , 32. ) ;
delete item ;
}
2011-10-14 08:51:42 +00:00
void tst_QQuickLoader : : asynchronous_data ( )
2011-10-07 06:20:39 +00:00
{
QTest : : addColumn < QUrl > ( " qmlFile " ) ;
QTest : : addColumn < QStringList > ( " expectedWarnings " ) ;
2011-12-21 08:06:26 +00:00
QTest : : newRow ( " Valid component " ) < < testFileUrl ( " BigComponent.qml " )
2011-10-07 06:20:39 +00:00
< < QStringList ( ) ;
2012-03-06 08:03:33 +00:00
QTest : : newRow ( " Non-existent component " ) < < testFileUrl ( " IDoNotExist.qml " )
2011-12-21 08:06:26 +00:00
< < ( QStringList ( ) < < QString ( testFileUrl ( " IDoNotExist.qml " ) . toString ( ) + " : File not found " ) ) ;
2011-10-07 06:20:39 +00:00
2011-12-21 08:06:26 +00:00
QTest : : newRow ( " Invalid component " ) < < testFileUrl ( " InvalidSourceComponent.qml " )
< < ( QStringList ( ) < < QString ( testFileUrl ( " InvalidSourceComponent.qml " ) . toString ( ) + " :5:1: Syntax error " ) ) ;
2011-10-07 06:20:39 +00:00
}
2011-10-14 08:51:42 +00:00
void tst_QQuickLoader : : asynchronous ( )
2011-10-07 06:20:39 +00:00
{
QFETCH ( QUrl , qmlFile ) ;
QFETCH ( QStringList , expectedWarnings ) ;
2012-07-30 01:10:28 +00:00
PeriodicIncubationController * controller = new PeriodicIncubationController ;
QQmlIncubationController * previous = engine . incubationController ( ) ;
engine . setIncubationController ( controller ) ;
delete previous ;
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine , testFileUrl ( " asynchronous.qml " ) ) ;
2011-10-14 08:51:42 +00:00
QQuickItem * root = qobject_cast < QQuickItem * > ( component . create ( ) ) ;
2011-10-07 06:20:39 +00:00
QVERIFY ( root ) ;
2011-10-14 08:51:42 +00:00
QQuickLoader * loader = root - > findChild < QQuickLoader * > ( " loader " ) ;
2011-10-07 06:20:39 +00:00
QVERIFY ( loader ) ;
foreach ( const QString & warning , expectedWarnings )
QTest : : ignoreMessage ( QtWarningMsg , warning . toUtf8 ( ) . constData ( ) ) ;
QVERIFY ( ! loader - > item ( ) ) ;
2012-03-06 08:03:33 +00:00
QCOMPARE ( loader - > progress ( ) , 0.0 ) ;
2011-10-07 06:20:39 +00:00
root - > setProperty ( " comp " , qmlFile . toString ( ) ) ;
QMetaObject : : invokeMethod ( root , " loadComponent " ) ;
QVERIFY ( ! loader - > item ( ) ) ;
if ( expectedWarnings . isEmpty ( ) ) {
2011-10-14 08:51:42 +00:00
QCOMPARE ( loader - > status ( ) , QQuickLoader : : Loading ) ;
2012-07-30 01:10:28 +00:00
controller - > start ( ) ;
2012-03-06 08:03:33 +00:00
QVERIFY ( ! controller - > incubated ) ; // asynchronous compilation means not immediately compiled/incubating.
QTRY_VERIFY ( controller - > incubated ) ; // but should start incubating once compilation is complete.
2011-10-07 06:20:39 +00:00
QTRY_VERIFY ( loader - > item ( ) ) ;
QCOMPARE ( loader - > progress ( ) , 1.0 ) ;
2011-10-14 08:51:42 +00:00
QCOMPARE ( loader - > status ( ) , QQuickLoader : : Ready ) ;
2011-10-07 06:20:39 +00:00
} else {
2012-03-06 08:03:33 +00:00
QTRY_COMPARE ( loader - > progress ( ) , 1.0 ) ;
2011-10-14 08:51:42 +00:00
QTRY_COMPARE ( loader - > status ( ) , QQuickLoader : : Error ) ;
2011-10-07 06:20:39 +00:00
}
delete root ;
}
2011-10-14 08:51:42 +00:00
void tst_QQuickLoader : : asynchronous_clear ( )
2011-10-07 06:20:39 +00:00
{
2012-07-30 01:10:28 +00:00
PeriodicIncubationController * controller = new PeriodicIncubationController ;
QQmlIncubationController * previous = engine . incubationController ( ) ;
engine . setIncubationController ( controller ) ;
delete previous ;
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine , testFileUrl ( " asynchronous.qml " ) ) ;
2011-10-14 08:51:42 +00:00
QQuickItem * root = qobject_cast < QQuickItem * > ( component . create ( ) ) ;
2011-10-07 06:20:39 +00:00
QVERIFY ( root ) ;
2011-10-14 08:51:42 +00:00
QQuickLoader * loader = root - > findChild < QQuickLoader * > ( " loader " ) ;
2011-10-07 06:20:39 +00:00
QVERIFY ( loader ) ;
QVERIFY ( ! loader - > item ( ) ) ;
root - > setProperty ( " comp " , " BigComponent.qml " ) ;
QMetaObject : : invokeMethod ( root , " loadComponent " ) ;
QVERIFY ( ! loader - > item ( ) ) ;
2012-07-30 01:10:28 +00:00
controller - > start ( ) ;
2011-10-14 08:51:42 +00:00
QCOMPARE ( loader - > status ( ) , QQuickLoader : : Loading ) ;
2012-03-20 01:58:09 +00:00
QTRY_COMPARE ( engine . incubationController ( ) - > incubatingObjectCount ( ) , 1 ) ;
2011-10-07 06:20:39 +00:00
// clear before component created
root - > setProperty ( " comp " , " " ) ;
QMetaObject : : invokeMethod ( root , " loadComponent " ) ;
QVERIFY ( ! loader - > item ( ) ) ;
QCOMPARE ( engine . incubationController ( ) - > incubatingObjectCount ( ) , 0 ) ;
QCOMPARE ( loader - > progress ( ) , 0.0 ) ;
2011-10-14 08:51:42 +00:00
QCOMPARE ( loader - > status ( ) , QQuickLoader : : Null ) ;
QCOMPARE ( static_cast < QQuickItem * > ( loader ) - > childItems ( ) . count ( ) , 0 ) ;
2011-10-07 06:20:39 +00:00
// check loading component
2012-03-20 01:58:09 +00:00
root - > setProperty ( " comp " , " BigComponent.qml " ) ;
2011-10-07 06:20:39 +00:00
QMetaObject : : invokeMethod ( root , " loadComponent " ) ;
QVERIFY ( ! loader - > item ( ) ) ;
2011-10-14 08:51:42 +00:00
QCOMPARE ( loader - > status ( ) , QQuickLoader : : Loading ) ;
2011-10-07 06:20:39 +00:00
QCOMPARE ( engine . incubationController ( ) - > incubatingObjectCount ( ) , 1 ) ;
QTRY_VERIFY ( loader - > item ( ) ) ;
QCOMPARE ( loader - > progress ( ) , 1.0 ) ;
2011-10-14 08:51:42 +00:00
QCOMPARE ( loader - > status ( ) , QQuickLoader : : Ready ) ;
QCOMPARE ( static_cast < QQuickItem * > ( loader ) - > childItems ( ) . count ( ) , 1 ) ;
2012-03-20 01:58:09 +00:00
delete root ;
2012-03-06 08:03:33 +00:00
}
void tst_QQuickLoader : : simultaneousSyncAsync ( )
{
2012-07-30 01:10:28 +00:00
PeriodicIncubationController * controller = new PeriodicIncubationController ;
QQmlIncubationController * previous = engine . incubationController ( ) ;
engine . setIncubationController ( controller ) ;
delete previous ;
2012-03-06 08:03:33 +00:00
QQmlComponent component ( & engine , testFileUrl ( " simultaneous.qml " ) ) ;
QQuickItem * root = qobject_cast < QQuickItem * > ( component . create ( ) ) ;
QVERIFY ( root ) ;
QQuickLoader * asyncLoader = root - > findChild < QQuickLoader * > ( " asyncLoader " ) ;
QQuickLoader * syncLoader = root - > findChild < QQuickLoader * > ( " syncLoader " ) ;
QVERIFY ( asyncLoader ) ;
QVERIFY ( syncLoader ) ;
QVERIFY ( ! asyncLoader - > item ( ) ) ;
QVERIFY ( ! syncLoader - > item ( ) ) ;
QMetaObject : : invokeMethod ( root , " loadComponents " ) ;
QVERIFY ( ! asyncLoader - > item ( ) ) ;
QVERIFY ( syncLoader - > item ( ) ) ;
2012-07-30 01:10:28 +00:00
controller - > start ( ) ;
2012-03-06 08:03:33 +00:00
QCOMPARE ( asyncLoader - > status ( ) , QQuickLoader : : Loading ) ;
QVERIFY ( ! controller - > incubated ) ; // asynchronous compilation means not immediately compiled/incubating.
QTRY_VERIFY ( controller - > incubated ) ; // but should start incubating once compilation is complete.
QTRY_VERIFY ( asyncLoader - > item ( ) ) ;
QCOMPARE ( asyncLoader - > progress ( ) , 1.0 ) ;
QCOMPARE ( asyncLoader - > status ( ) , QQuickLoader : : Ready ) ;
delete root ;
2012-03-29 01:14:59 +00:00
}
2015-09-07 21:29:55 +00:00
void tst_QQuickLoader : : asyncToSync1 ( )
{
QQmlEngine engine ;
PeriodicIncubationController * controller = new PeriodicIncubationController ;
QQmlIncubationController * previous = engine . incubationController ( ) ;
engine . setIncubationController ( controller ) ;
delete previous ;
QQmlComponent component ( & engine , testFileUrl ( " asynchronous.qml " ) ) ;
QQuickItem * root = qobject_cast < QQuickItem * > ( component . create ( ) ) ;
QVERIFY ( root ) ;
QQuickLoader * loader = root - > findChild < QQuickLoader * > ( " loader " ) ;
QVERIFY ( loader ) ;
QVERIFY ( ! loader - > item ( ) ) ;
root - > setProperty ( " comp " , " BigComponent.qml " ) ;
QMetaObject : : invokeMethod ( root , " loadComponent " ) ;
QVERIFY ( ! loader - > item ( ) ) ;
controller - > start ( ) ;
QCOMPARE ( loader - > status ( ) , QQuickLoader : : Loading ) ;
QCOMPARE ( engine . incubationController ( ) - > incubatingObjectCount ( ) , 0 ) ;
// force completion before component created
loader - > setAsynchronous ( false ) ;
QVERIFY ( loader - > item ( ) ) ;
QCOMPARE ( loader - > progress ( ) , 1.0 ) ;
QCOMPARE ( loader - > status ( ) , QQuickLoader : : Ready ) ;
QCOMPARE ( static_cast < QQuickItem * > ( loader ) - > childItems ( ) . count ( ) , 1 ) ;
delete root ;
}
void tst_QQuickLoader : : asyncToSync2 ( )
{
PeriodicIncubationController * controller = new PeriodicIncubationController ;
QQmlIncubationController * previous = engine . incubationController ( ) ;
engine . setIncubationController ( controller ) ;
delete previous ;
QQmlComponent component ( & engine , testFileUrl ( " asynchronous.qml " ) ) ;
QQuickItem * root = qobject_cast < QQuickItem * > ( component . create ( ) ) ;
QVERIFY ( root ) ;
QQuickLoader * loader = root - > findChild < QQuickLoader * > ( " loader " ) ;
QVERIFY ( loader ) ;
QVERIFY ( ! loader - > item ( ) ) ;
root - > setProperty ( " comp " , " BigComponent.qml " ) ;
QMetaObject : : invokeMethod ( root , " loadComponent " ) ;
QVERIFY ( ! loader - > item ( ) ) ;
controller - > start ( ) ;
QCOMPARE ( loader - > status ( ) , QQuickLoader : : Loading ) ;
QTRY_COMPARE ( engine . incubationController ( ) - > incubatingObjectCount ( ) , 1 ) ;
// force completion after component created but before incubation complete
loader - > setAsynchronous ( false ) ;
QVERIFY ( loader - > item ( ) ) ;
QCOMPARE ( loader - > progress ( ) , 1.0 ) ;
QCOMPARE ( loader - > status ( ) , QQuickLoader : : Ready ) ;
QCOMPARE ( static_cast < QQuickItem * > ( loader ) - > childItems ( ) . count ( ) , 1 ) ;
delete root ;
}
2012-03-29 01:14:59 +00:00
void tst_QQuickLoader : : loadedSignal ( )
{
2013-03-06 17:47:17 +00:00
PeriodicIncubationController * controller = new PeriodicIncubationController ;
QQmlIncubationController * previous = engine . incubationController ( ) ;
engine . setIncubationController ( controller ) ;
delete previous ;
2012-03-29 01:14:59 +00:00
{
// ensure that triggering loading (by setting active = true)
// and then immediately setting active to false, causes the
// loader to be deactivated, including disabling the incubator.
QQmlComponent component ( & engine , testFileUrl ( " loadedSignal.qml " ) ) ;
QObject * obj = component . create ( ) ;
QMetaObject : : invokeMethod ( obj , " triggerLoading " ) ;
QTest : : qWait ( 100 ) ; // ensure that loading would have finished if it wasn't deactivated
QCOMPARE ( obj - > property ( " loadCount " ) . toInt ( ) , 0 ) ;
QVERIFY ( obj - > property ( " success " ) . toBool ( ) ) ;
QMetaObject : : invokeMethod ( obj , " triggerLoading " ) ;
QTest : : qWait ( 100 ) ;
QCOMPARE ( obj - > property ( " loadCount " ) . toInt ( ) , 0 ) ;
QVERIFY ( obj - > property ( " success " ) . toBool ( ) ) ;
QMetaObject : : invokeMethod ( obj , " triggerMultipleLoad " ) ;
2013-03-06 17:47:17 +00:00
controller - > start ( ) ;
2012-03-29 01:14:59 +00:00
QTest : : qWait ( 100 ) ;
2013-03-06 17:47:17 +00:00
QTRY_COMPARE ( obj - > property ( " loadCount " ) . toInt ( ) , 1 ) ; // only one loaded signal should be emitted.
2012-03-29 01:14:59 +00:00
QVERIFY ( obj - > property ( " success " ) . toBool ( ) ) ;
delete obj ;
}
{
// ensure that an error doesn't result in the onLoaded signal being emitted.
QQmlComponent component ( & engine , testFileUrl ( " loadedSignal.2.qml " ) ) ;
QObject * obj = component . create ( ) ;
QMetaObject : : invokeMethod ( obj , " triggerLoading " ) ;
QTest : : qWait ( 100 ) ;
QCOMPARE ( obj - > property ( " loadCount " ) . toInt ( ) , 0 ) ;
QVERIFY ( obj - > property ( " success " ) . toBool ( ) ) ;
delete obj ;
}
2011-10-07 06:20:39 +00:00
}
2011-11-14 03:00:31 +00:00
void tst_QQuickLoader : : parented ( )
{
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine , testFileUrl ( " parented.qml " ) ) ;
2011-11-14 03:00:31 +00:00
QQuickItem * root = qobject_cast < QQuickItem * > ( component . create ( ) ) ;
QVERIFY ( root ) ;
QQuickItem * item = root - > findChild < QQuickItem * > ( " comp " ) ;
QVERIFY ( item ) ;
2015-07-24 13:32:22 +00:00
QCOMPARE ( item - > parentItem ( ) , root ) ;
2011-11-14 03:00:31 +00:00
QCOMPARE ( item - > width ( ) , 300. ) ;
QCOMPARE ( item - > height ( ) , 300. ) ;
delete root ;
}
2012-02-16 03:45:02 +00:00
void tst_QQuickLoader : : sizeBound ( )
{
2012-02-16 04:43:03 +00:00
QQmlComponent component ( & engine , testFileUrl ( " sizebound.qml " ) ) ;
2012-02-16 03:45:02 +00:00
QQuickItem * root = qobject_cast < QQuickItem * > ( component . create ( ) ) ;
QVERIFY ( root ) ;
QQuickLoader * loader = root - > findChild < QQuickLoader * > ( " loader " ) ;
QVERIFY ( loader ! = 0 ) ;
QVERIFY ( loader - > item ( ) ) ;
QCOMPARE ( loader - > width ( ) , 50.0 ) ;
QCOMPARE ( loader - > height ( ) , 60.0 ) ;
QMetaObject : : invokeMethod ( root , " switchComponent " ) ;
QCOMPARE ( loader - > width ( ) , 80.0 ) ;
QCOMPARE ( loader - > height ( ) , 90.0 ) ;
delete root ;
}
2013-03-13 17:31:57 +00:00
void tst_QQuickLoader : : QTBUG_30183 ( )
{
QQmlComponent component ( & engine , testFileUrl ( " /QTBUG_30183.qml " ) ) ;
QQuickLoader * loader = qobject_cast < QQuickLoader * > ( component . create ( ) ) ;
QVERIFY ( loader ! = 0 ) ;
QCOMPARE ( loader - > width ( ) , 240.0 ) ;
QCOMPARE ( loader - > height ( ) , 120.0 ) ;
// the loaded item must follow the size
QQuickItem * rect = qobject_cast < QQuickItem * > ( loader - > item ( ) ) ;
QVERIFY ( rect ) ;
QCOMPARE ( rect - > width ( ) , 240.0 ) ;
QCOMPARE ( rect - > height ( ) , 120.0 ) ;
delete loader ;
}
2011-10-07 06:20:39 +00:00
2013-12-05 15:21:03 +00:00
void tst_QQuickLoader : : sourceComponentGarbageCollection ( )
{
QQmlComponent component ( & engine , testFileUrl ( " sourceComponentGarbageCollection.qml " ) ) ;
QScopedPointer < QObject > obj ( component . create ( ) ) ;
QVERIFY ( ! obj . isNull ( ) ) ;
QMetaObject : : invokeMethod ( obj . data ( ) , " setSourceComponent " ) ;
engine . collectGarbage ( ) ;
QCoreApplication : : sendPostedEvents ( 0 , QEvent : : DeferredDelete ) ;
QSignalSpy spy ( obj . data ( ) , SIGNAL ( loaded ( ) ) ) ;
obj - > setProperty ( " active " , true ) ;
if ( spy . isEmpty ( ) )
QVERIFY ( spy . wait ( ) ) ;
QCOMPARE ( spy . count ( ) , 1 ) ;
}
2011-10-14 08:51:42 +00:00
QTEST_MAIN ( tst_QQuickLoader )
2011-04-27 12:13:26 +00:00
2011-10-14 08:51:42 +00:00
# include "tst_qquickloader.moc"