1 /****************************************************************************
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/
6 ** This file is part of the test suite of the Qt Toolkit.
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** GNU Lesser General Public License Usage
10 ** This file may be used under the terms of the GNU Lesser General Public
11 ** License version 2.1 as published by the Free Software Foundation and
12 ** appearing in the file LICENSE.LGPL included in the packaging of this
13 ** file. Please review the following information to ensure the GNU Lesser
14 ** General Public License version 2.1 requirements will be met:
15 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
17 ** In addition, as a special exception, Nokia gives you certain additional
18 ** rights. These rights are described in the Nokia Qt LGPL Exception
19 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
21 ** GNU General Public License Usage
22 ** Alternatively, this file may be used under the terms of the GNU General
23 ** Public License version 3.0 as published by the Free Software Foundation
24 ** and appearing in the file LICENSE.GPL included in the packaging of this
25 ** file. Please review the following information to ensure the GNU General
26 ** Public License version 3.0 requirements will be met:
27 ** http://www.gnu.org/copyleft/gpl.html.
30 ** Alternatively, this file may be used in accordance with the terms and
31 ** conditions contained in a signed written agreement between you and Nokia.
40 ****************************************************************************/
43 #include <private/qqmlpropertycache_p.h>
44 #include <QtQml/qqmlengine.h>
45 #include "../../shared/util.h"
47 class tst_qqmlpropertycache : public QObject
51 tst_qqmlpropertycache() {}
55 void propertiesDerived();
57 void methodsDerived();
58 void signalHandlers();
59 void signalHandlersDerived();
65 class BaseObject : public QObject
68 Q_PROPERTY(int propertyA READ propertyA NOTIFY propertyAChanged)
69 Q_PROPERTY(QString propertyB READ propertyB NOTIFY propertyBChanged)
71 BaseObject(QObject *parent = 0) : QObject(parent) {}
73 int propertyA() const { return 0; }
74 QString propertyB() const { return QString(); }
80 void propertyAChanged();
81 void propertyBChanged();
85 class DerivedObject : public BaseObject
88 Q_PROPERTY(int propertyC READ propertyC NOTIFY propertyCChanged)
89 Q_PROPERTY(QString propertyD READ propertyD NOTIFY propertyDChanged)
91 DerivedObject(QObject *parent = 0) : BaseObject(parent) {}
93 int propertyC() const { return 0; }
94 QString propertyD() const { return QString(); }
100 void propertyCChanged();
101 void propertyDChanged();
105 QQmlPropertyData *cacheProperty(QQmlPropertyCache *cache, const char *name)
107 return cache->property(QLatin1String(name), 0, 0);
110 void tst_qqmlpropertycache::properties()
113 DerivedObject object;
114 const QMetaObject *metaObject = object.metaObject();
116 QQmlRefPointer<QQmlPropertyCache> cache(new QQmlPropertyCache(&engine, metaObject));
117 QQmlPropertyData *data;
119 QVERIFY(data = cacheProperty(cache, "propertyA"));
120 QCOMPARE(data->coreIndex, metaObject->indexOfProperty("propertyA"));
122 QVERIFY(data = cacheProperty(cache, "propertyB"));
123 QCOMPARE(data->coreIndex, metaObject->indexOfProperty("propertyB"));
125 QVERIFY(data = cacheProperty(cache, "propertyC"));
126 QCOMPARE(data->coreIndex, metaObject->indexOfProperty("propertyC"));
128 QVERIFY(data = cacheProperty(cache, "propertyD"));
129 QCOMPARE(data->coreIndex, metaObject->indexOfProperty("propertyD"));
132 void tst_qqmlpropertycache::propertiesDerived()
135 DerivedObject object;
136 const QMetaObject *metaObject = object.metaObject();
138 QQmlRefPointer<QQmlPropertyCache> parentCache(new QQmlPropertyCache(&engine, &BaseObject::staticMetaObject));
139 QQmlRefPointer<QQmlPropertyCache> cache(parentCache->copyAndAppend(&engine, object.metaObject()));
140 QQmlPropertyData *data;
142 QVERIFY(data = cacheProperty(cache, "propertyA"));
143 QCOMPARE(data->coreIndex, metaObject->indexOfProperty("propertyA"));
145 QVERIFY(data = cacheProperty(cache, "propertyB"));
146 QCOMPARE(data->coreIndex, metaObject->indexOfProperty("propertyB"));
148 QVERIFY(data = cacheProperty(cache, "propertyC"));
149 QCOMPARE(data->coreIndex, metaObject->indexOfProperty("propertyC"));
151 QVERIFY(data = cacheProperty(cache, "propertyD"));
152 QCOMPARE(data->coreIndex, metaObject->indexOfProperty("propertyD"));
155 void tst_qqmlpropertycache::methods()
158 DerivedObject object;
159 const QMetaObject *metaObject = object.metaObject();
161 QQmlRefPointer<QQmlPropertyCache> cache(new QQmlPropertyCache(&engine, metaObject));
162 QQmlPropertyData *data;
164 QVERIFY(data = cacheProperty(cache, "slotA"));
165 QCOMPARE(data->coreIndex, metaObject->indexOfMethod("slotA()"));
167 QVERIFY(data = cacheProperty(cache, "slotB"));
168 QCOMPARE(data->coreIndex, metaObject->indexOfMethod("slotB()"));
170 QVERIFY(data = cacheProperty(cache, "signalA"));
171 QCOMPARE(data->coreIndex, metaObject->indexOfMethod("signalA()"));
173 QVERIFY(data = cacheProperty(cache, "signalB"));
174 QCOMPARE(data->coreIndex, metaObject->indexOfMethod("signalB()"));
176 QVERIFY(data = cacheProperty(cache, "propertyAChanged"));
177 QCOMPARE(data->coreIndex, metaObject->indexOfMethod("propertyAChanged()"));
179 QVERIFY(data = cacheProperty(cache, "propertyBChanged"));
180 QCOMPARE(data->coreIndex, metaObject->indexOfMethod("propertyBChanged()"));
182 QVERIFY(data = cacheProperty(cache, "propertyCChanged"));
183 QCOMPARE(data->coreIndex, metaObject->indexOfMethod("propertyCChanged()"));
185 QVERIFY(data = cacheProperty(cache, "propertyDChanged"));
186 QCOMPARE(data->coreIndex, metaObject->indexOfMethod("propertyDChanged()"));
189 void tst_qqmlpropertycache::methodsDerived()
192 DerivedObject object;
193 const QMetaObject *metaObject = object.metaObject();
195 QQmlRefPointer<QQmlPropertyCache> parentCache(new QQmlPropertyCache(&engine, &BaseObject::staticMetaObject));
196 QQmlRefPointer<QQmlPropertyCache> cache(parentCache->copyAndAppend(&engine, object.metaObject()));
197 QQmlPropertyData *data;
199 QVERIFY(data = cacheProperty(cache, "slotA"));
200 QCOMPARE(data->coreIndex, metaObject->indexOfMethod("slotA()"));
202 QVERIFY(data = cacheProperty(cache, "slotB"));
203 QCOMPARE(data->coreIndex, metaObject->indexOfMethod("slotB()"));
205 QVERIFY(data = cacheProperty(cache, "signalA"));
206 QCOMPARE(data->coreIndex, metaObject->indexOfMethod("signalA()"));
208 QVERIFY(data = cacheProperty(cache, "signalB"));
209 QCOMPARE(data->coreIndex, metaObject->indexOfMethod("signalB()"));
211 QVERIFY(data = cacheProperty(cache, "propertyAChanged"));
212 QCOMPARE(data->coreIndex, metaObject->indexOfMethod("propertyAChanged()"));
214 QVERIFY(data = cacheProperty(cache, "propertyBChanged"));
215 QCOMPARE(data->coreIndex, metaObject->indexOfMethod("propertyBChanged()"));
217 QVERIFY(data = cacheProperty(cache, "propertyCChanged"));
218 QCOMPARE(data->coreIndex, metaObject->indexOfMethod("propertyCChanged()"));
220 QVERIFY(data = cacheProperty(cache, "propertyDChanged"));
221 QCOMPARE(data->coreIndex, metaObject->indexOfMethod("propertyDChanged()"));
224 void tst_qqmlpropertycache::signalHandlers()
227 DerivedObject object;
228 const QMetaObject *metaObject = object.metaObject();
230 QQmlRefPointer<QQmlPropertyCache> cache(new QQmlPropertyCache(&engine, metaObject));
231 QQmlPropertyData *data;
233 QVERIFY(data = cacheProperty(cache, "onSignalA"));
234 QCOMPARE(data->coreIndex, metaObject->indexOfMethod("signalA()"));
236 QVERIFY(data = cacheProperty(cache, "onSignalB"));
237 QCOMPARE(data->coreIndex, metaObject->indexOfMethod("signalB()"));
239 QVERIFY(data = cacheProperty(cache, "onPropertyAChanged"));
240 QCOMPARE(data->coreIndex, metaObject->indexOfMethod("propertyAChanged()"));
242 QVERIFY(data = cacheProperty(cache, "onPropertyBChanged"));
243 QCOMPARE(data->coreIndex, metaObject->indexOfMethod("propertyBChanged()"));
245 QVERIFY(data = cacheProperty(cache, "onPropertyCChanged"));
246 QCOMPARE(data->coreIndex, metaObject->indexOfMethod("propertyCChanged()"));
248 QVERIFY(data = cacheProperty(cache, "onPropertyDChanged"));
249 QCOMPARE(data->coreIndex, metaObject->indexOfMethod("propertyDChanged()"));
252 void tst_qqmlpropertycache::signalHandlersDerived()
255 DerivedObject object;
256 const QMetaObject *metaObject = object.metaObject();
258 QQmlRefPointer<QQmlPropertyCache> parentCache(new QQmlPropertyCache(&engine, &BaseObject::staticMetaObject));
259 QQmlRefPointer<QQmlPropertyCache> cache(parentCache->copyAndAppend(&engine, object.metaObject()));
260 QQmlPropertyData *data;
262 QVERIFY(data = cacheProperty(cache, "onSignalA"));
263 QCOMPARE(data->coreIndex, metaObject->indexOfMethod("signalA()"));
265 QVERIFY(data = cacheProperty(cache, "onSignalB"));
266 QCOMPARE(data->coreIndex, metaObject->indexOfMethod("signalB()"));
268 QVERIFY(data = cacheProperty(cache, "onPropertyAChanged"));
269 QCOMPARE(data->coreIndex, metaObject->indexOfMethod("propertyAChanged()"));
271 QVERIFY(data = cacheProperty(cache, "onPropertyBChanged"));
272 QCOMPARE(data->coreIndex, metaObject->indexOfMethod("propertyBChanged()"));
274 QVERIFY(data = cacheProperty(cache, "onPropertyCChanged"));
275 QCOMPARE(data->coreIndex, metaObject->indexOfMethod("propertyCChanged()"));
277 QVERIFY(data = cacheProperty(cache, "onPropertyDChanged"));
278 QCOMPARE(data->coreIndex, metaObject->indexOfMethod("propertyDChanged()"));
281 QTEST_MAIN(tst_qqmlpropertycache)
283 #include "tst_qqmlpropertycache.moc"