Allow enum values to be used as signal parameters
[qt:qt.git] / tests / auto / declarative / qdeclarativeecmascript / testtypes.h
1 /****************************************************************************
2 **
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
6 **
7 ** This file is part of the test suite of the Qt Toolkit.
8 **
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** No Commercial Usage
11 ** This file contains pre-release code and may not be distributed.
12 ** You may use this file in accordance with the terms and conditions
13 ** contained in the Technology Preview License Agreement accompanying
14 ** this package.
15 **
16 ** GNU Lesser General Public License Usage
17 ** Alternatively, this file may be used under the terms of the GNU Lesser
18 ** General Public License version 2.1 as published by the Free Software
19 ** Foundation and appearing in the file LICENSE.LGPL included in the
20 ** packaging of this file.  Please review the following information to
21 ** ensure the GNU Lesser General Public License version 2.1 requirements
22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23 **
24 ** In addition, as a special exception, Nokia gives you certain additional
25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27 **
28 ** If you have questions regarding the use of this file, please contact
29 ** Nokia at qt-info@nokia.com.
30 **
31 **
32 **
33 **
34 **
35 **
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41 #ifndef TESTTYPES_H
42 #define TESTTYPES_H
43
44 #include <QtCore/qobject.h>
45 #include <QtDeclarative/qdeclarative.h>
46 #include <QtDeclarative/qdeclarativeexpression.h>
47 #include <QtCore/qpoint.h>
48 #include <QtCore/qsize.h>
49 #include <QtDeclarative/qdeclarativelist.h>
50 #include <QtCore/qrect.h>
51 #include <QtGui/qmatrix.h>
52 #include <QtGui/qcolor.h>
53 #include <QtGui/qvector3d.h>
54 #include <QtCore/qdatetime.h>
55 #include <QtScript/qscriptvalue.h>
56 #include <QtDeclarative/qdeclarativescriptstring.h>
57 #include <QtDeclarative/qdeclarativecomponent.h>
58
59 class MyQmlAttachedObject : public QObject
60 {
61     Q_OBJECT
62     Q_PROPERTY(int value READ value CONSTANT)
63     Q_PROPERTY(int value2 READ value2 WRITE setValue2)
64 public:
65     MyQmlAttachedObject(QObject *parent) : QObject(parent), m_value2(0) {}
66
67     int value() const { return 19; }
68     int value2() const { return m_value2; }
69     void setValue2(int v) { m_value2 = v; }
70
71     void emitMySignal() { emit mySignal(); }
72
73 signals:
74     void mySignal();
75
76 private:
77     int m_value2;
78 };
79
80 class MyQmlObject : public QObject
81 {
82     Q_OBJECT
83     Q_ENUMS(MyEnum)
84     Q_ENUMS(MyEnum2)
85     Q_PROPERTY(int deleteOnSet READ deleteOnSet WRITE setDeleteOnSet)
86     Q_PROPERTY(bool trueProperty READ trueProperty CONSTANT)
87     Q_PROPERTY(bool falseProperty READ falseProperty CONSTANT)
88     Q_PROPERTY(int value READ value WRITE setValue)
89     Q_PROPERTY(int console READ console CONSTANT)
90     Q_PROPERTY(QString stringProperty READ stringProperty WRITE setStringProperty NOTIFY stringChanged)
91     Q_PROPERTY(QObject *objectProperty READ objectProperty WRITE setObjectProperty NOTIFY objectChanged)
92     Q_PROPERTY(QDeclarativeListProperty<QObject> objectListProperty READ objectListProperty CONSTANT)
93     Q_PROPERTY(int resettableProperty READ resettableProperty WRITE setResettableProperty RESET resetProperty)
94     Q_PROPERTY(QRegExp regExp READ regExp WRITE setRegExp)
95     Q_PROPERTY(int nonscriptable READ nonscriptable WRITE setNonscriptable SCRIPTABLE false)
96
97 public:
98     MyQmlObject(): myinvokableObject(0), m_methodCalled(false), m_methodIntCalled(false), m_object(0), m_value(0), m_resetProperty(13) {}
99
100     enum MyEnum { EnumValue1 = 0, EnumValue2 = 1 };
101     enum MyEnum2 { EnumValue3 = 2, EnumValue4 = 3 };
102
103     bool trueProperty() const { return true; }
104     bool falseProperty() const { return false; }
105
106     QString stringProperty() const { return m_string; }
107     void setStringProperty(const QString &s)
108     {
109         if (s == m_string)
110             return;
111         m_string = s;
112         emit stringChanged();
113     }
114
115     QObject *objectProperty() const { return m_object; }
116     void setObjectProperty(QObject *obj) { 
117         if (obj == m_object)
118             return;
119         m_object = obj;
120         emit objectChanged();
121     }
122
123     QDeclarativeListProperty<QObject> objectListProperty() { return QDeclarativeListProperty<QObject>(this, m_objectQList); }
124
125     bool methodCalled() const { return m_methodCalled; }
126     bool methodIntCalled() const { return m_methodIntCalled; }
127
128     QString string() const { return m_string; }
129
130     static MyQmlAttachedObject *qmlAttachedProperties(QObject *o) {
131         return new MyQmlAttachedObject(o);
132     }
133
134     int deleteOnSet() const { return 1; }
135     void setDeleteOnSet(int v) { if(v) delete this; }
136
137     int value() const { return m_value; }
138     void setValue(int v) { m_value = v; }
139
140     int resettableProperty() const { return m_resetProperty; }
141     void setResettableProperty(int v) { m_resetProperty = v; }
142     void resetProperty() { m_resetProperty = 13; }
143
144     QRegExp regExp() { return m_regExp; }
145     void setRegExp(const QRegExp &regExp) { m_regExp = regExp; }
146
147     int console() const { return 11; }
148
149     int nonscriptable() const { return 0; }
150     void setNonscriptable(int) {}
151
152     MyQmlObject *myinvokableObject;
153     Q_INVOKABLE MyQmlObject *returnme() { return this; }
154
155     struct MyType {
156         int value;
157     };
158     QVariant variant() const { return m_variant; }
159     
160 signals:
161     void basicSignal();
162     void argumentSignal(int a, QString b, qreal c, MyEnum2 d, Qt::MouseButtons e);
163     void stringChanged();
164     void objectChanged();
165     void anotherBasicSignal();
166     void thirdBasicSignal();
167     void signalWithUnknownType(const MyQmlObject::MyType &arg);
168
169 public slots:
170     void deleteMe() { delete this; }
171     void methodNoArgs() { m_methodCalled = true; }
172     void method(int a) { if(a == 163) m_methodIntCalled = true; }
173     void setString(const QString &s) { m_string = s; }
174     void myinvokable(MyQmlObject *o) { myinvokableObject = o; }
175     void variantMethod(const QVariant &v) { m_variant = v; }
176
177 private:
178     friend class tst_qdeclarativeecmascript;
179     bool m_methodCalled;
180     bool m_methodIntCalled;
181
182     QObject *m_object;
183     QString m_string;
184     QList<QObject *> m_objectQList;
185     int m_value;
186     int m_resetProperty;
187     QRegExp m_regExp;
188     QVariant m_variant;
189 };
190
191 QML_DECLARE_TYPEINFO(MyQmlObject, QML_HAS_ATTACHED_PROPERTIES)
192
193 class MyQmlContainer : public QObject
194 {
195     Q_OBJECT
196     Q_PROPERTY(QDeclarativeListProperty<MyQmlObject> children READ children CONSTANT)
197 public:
198     MyQmlContainer() {}
199
200     QDeclarativeListProperty<MyQmlObject> children() { return QDeclarativeListProperty<MyQmlObject>(this, m_children); }
201
202 private:
203     QList<MyQmlObject*> m_children;
204 };
205
206
207 class MyExpression : public QDeclarativeExpression
208 {
209     Q_OBJECT
210 public:
211     MyExpression(QDeclarativeContext *ctxt, const QString &expr)
212         : QDeclarativeExpression(ctxt, 0, expr), changed(false)
213     {
214         QObject::connect(this, SIGNAL(valueChanged()), this, SLOT(expressionValueChanged()));
215         setNotifyOnValueChanged(true);
216     }
217
218     bool changed;
219
220 public slots:
221     void expressionValueChanged() {
222         changed = true;
223     }
224 };
225
226
227 class MyDefaultObject1 : public QObject
228 {
229     Q_OBJECT
230     Q_PROPERTY(int horseLegs READ horseLegs CONSTANT)
231     Q_PROPERTY(int antLegs READ antLegs CONSTANT)
232     Q_PROPERTY(int emuLegs READ emuLegs CONSTANT)
233 public:
234     int horseLegs() const { return 4; }
235     int antLegs() const { return 6; }
236     int emuLegs() const { return 2; }
237 };
238
239 class MyDefaultObject3 : public QObject
240 {
241     Q_OBJECT
242     Q_PROPERTY(int antLegs READ antLegs CONSTANT)
243     Q_PROPERTY(int humanLegs READ humanLegs CONSTANT)
244 public:
245     int antLegs() const { return 7; } // Mutant
246     int humanLegs() const { return 2; }
247     int millipedeLegs() const { return 1000; }
248 };
249
250 class MyDeferredObject : public QObject
251 {
252     Q_OBJECT
253     Q_PROPERTY(int value READ value WRITE setValue NOTIFY valueChanged)
254     Q_PROPERTY(QObject *objectProperty READ objectProperty WRITE setObjectProperty)
255     Q_PROPERTY(QObject *objectProperty2 READ objectProperty2 WRITE setObjectProperty2)
256     Q_CLASSINFO("DeferredPropertyNames", "value,objectProperty,objectProperty2")
257
258 public:
259     MyDeferredObject() : m_value(0), m_object(0), m_object2(0) {}
260
261     int value() const { return m_value; }
262     void setValue(int v) { m_value = v; emit valueChanged(); }
263
264     QObject *objectProperty() const { return m_object; }
265     void setObjectProperty(QObject *obj) { m_object = obj; }
266
267     QObject *objectProperty2() const { return m_object2; }
268     void setObjectProperty2(QObject *obj) { m_object2 = obj; }
269
270 signals:
271     void valueChanged();
272
273 private:
274     int m_value;
275     QObject *m_object;
276     QObject *m_object2;
277 };
278
279 class MyBaseExtendedObject : public QObject
280 {
281 Q_OBJECT
282 Q_PROPERTY(int baseProperty READ baseProperty WRITE setBaseProperty)
283 public:
284     MyBaseExtendedObject() : m_value(0) {}
285
286     int baseProperty() const { return m_value; }
287     void setBaseProperty(int v) { m_value = v; }
288
289 private:
290     int m_value;
291 };
292
293 class MyExtendedObject : public MyBaseExtendedObject
294 {
295 Q_OBJECT
296 Q_PROPERTY(int coreProperty READ coreProperty WRITE setCoreProperty)
297 public:
298     MyExtendedObject() : m_value(0) {}
299
300     int coreProperty() const { return m_value; }
301     void setCoreProperty(int v) { m_value = v; }
302
303 private:
304     int m_value;
305 };
306
307 class MyTypeObject : public QObject
308 {
309     Q_OBJECT
310     Q_ENUMS(MyEnum)
311     Q_FLAGS(MyFlags)
312
313     Q_PROPERTY(QString id READ id WRITE setId)
314     Q_PROPERTY(QObject *objectProperty READ objectProperty WRITE setObjectProperty)
315     Q_PROPERTY(QDeclarativeComponent *componentProperty READ componentProperty WRITE setComponentProperty)
316     Q_PROPERTY(MyFlags flagProperty READ flagProperty WRITE setFlagProperty)
317     Q_PROPERTY(MyEnum enumProperty READ enumProperty WRITE setEnumProperty)
318     Q_PROPERTY(QString stringProperty READ stringProperty WRITE setStringProperty)
319     Q_PROPERTY(uint uintProperty READ uintProperty WRITE setUintProperty)
320     Q_PROPERTY(int intProperty READ intProperty WRITE setIntProperty)
321     Q_PROPERTY(qreal realProperty READ realProperty WRITE setRealProperty)
322     Q_PROPERTY(double doubleProperty READ doubleProperty WRITE setDoubleProperty)
323     Q_PROPERTY(float floatProperty READ floatProperty WRITE setFloatProperty)
324     Q_PROPERTY(QColor colorProperty READ colorProperty WRITE setColorProperty)
325     Q_PROPERTY(QDate dateProperty READ dateProperty WRITE setDateProperty)
326     Q_PROPERTY(QTime timeProperty READ timeProperty WRITE setTimeProperty)
327     Q_PROPERTY(QDateTime dateTimeProperty READ dateTimeProperty WRITE setDateTimeProperty)
328     Q_PROPERTY(QPoint pointProperty READ pointProperty WRITE setPointProperty)
329     Q_PROPERTY(QPointF pointFProperty READ pointFProperty WRITE setPointFProperty)
330     Q_PROPERTY(QSize sizeProperty READ sizeProperty WRITE setSizeProperty)
331     Q_PROPERTY(QSizeF sizeFProperty READ sizeFProperty WRITE setSizeFProperty)
332     Q_PROPERTY(QRect rectProperty READ rectProperty WRITE setRectProperty NOTIFY rectPropertyChanged)
333     Q_PROPERTY(QRect rectProperty2 READ rectProperty2 WRITE setRectProperty2)
334     Q_PROPERTY(QRectF rectFProperty READ rectFProperty WRITE setRectFProperty)
335     Q_PROPERTY(bool boolProperty READ boolProperty WRITE setBoolProperty)
336     Q_PROPERTY(QVariant variantProperty READ variantProperty WRITE setVariantProperty)
337     Q_PROPERTY(QVector3D vectorProperty READ vectorProperty WRITE setVectorProperty)
338     Q_PROPERTY(QUrl urlProperty READ urlProperty WRITE setUrlProperty)
339
340     Q_PROPERTY(QDeclarativeScriptString scriptProperty READ scriptProperty WRITE setScriptProperty)
341
342 public:
343     MyTypeObject()
344         : objectPropertyValue(0), componentPropertyValue(0) {}
345
346     QString idValue;
347     QString id() const {
348         return idValue;
349     }
350     void setId(const QString &v) {
351         idValue = v;
352     }
353
354     QObject *objectPropertyValue;
355     QObject *objectProperty() const {
356         return objectPropertyValue;
357     }
358     void setObjectProperty(QObject *v) {
359         objectPropertyValue = v;
360     }
361
362     QDeclarativeComponent *componentPropertyValue;
363     QDeclarativeComponent *componentProperty() const {
364         return componentPropertyValue;
365     }
366     void setComponentProperty(QDeclarativeComponent *v) {
367         componentPropertyValue = v;
368     }
369
370     enum MyFlag { FlagVal1 = 0x01, FlagVal2 = 0x02, FlagVal3 = 0x04 };
371     Q_DECLARE_FLAGS(MyFlags, MyFlag)
372     MyFlags flagPropertyValue;
373     MyFlags flagProperty() const {
374         return flagPropertyValue;
375     }
376     void setFlagProperty(MyFlags v) {
377         flagPropertyValue = v;
378     }
379
380     enum MyEnum { EnumVal1, EnumVal2 };
381     MyEnum enumPropertyValue;
382     MyEnum enumProperty() const {
383         return enumPropertyValue;
384     }
385     void setEnumProperty(MyEnum v) {
386         enumPropertyValue = v;
387     }
388
389     QString stringPropertyValue;
390     QString stringProperty() const {
391        return stringPropertyValue;
392     }
393     void setStringProperty(const QString &v) {
394         stringPropertyValue = v;
395     }
396
397     uint uintPropertyValue;
398     uint uintProperty() const {
399        return uintPropertyValue;
400     }
401     void setUintProperty(const uint &v) {
402         uintPropertyValue = v;
403     }
404
405     int intPropertyValue;
406     int intProperty() const {
407        return intPropertyValue;
408     }
409     void setIntProperty(const int &v) {
410         intPropertyValue = v;
411     }
412
413     qreal realPropertyValue;
414     qreal realProperty() const {
415        return realPropertyValue;
416     }
417     void setRealProperty(const qreal &v) {
418         realPropertyValue = v;
419     }
420
421     double doublePropertyValue;
422     double doubleProperty() const {
423        return doublePropertyValue;
424     }
425     void setDoubleProperty(const double &v) {
426         doublePropertyValue = v;
427     }
428
429     float floatPropertyValue;
430     float floatProperty() const {
431        return floatPropertyValue;
432     }
433     void setFloatProperty(const float &v) {
434         floatPropertyValue = v;
435     }
436
437     QColor colorPropertyValue;
438     QColor colorProperty() const {
439        return colorPropertyValue;
440     }
441     void setColorProperty(const QColor &v) {
442         colorPropertyValue = v;
443     }
444
445     QDate datePropertyValue;
446     QDate dateProperty() const {
447        return datePropertyValue;
448     }
449     void setDateProperty(const QDate &v) {
450         datePropertyValue = v;
451     }
452
453     QTime timePropertyValue;
454     QTime timeProperty() const {
455        return timePropertyValue;
456     }
457     void setTimeProperty(const QTime &v) {
458         timePropertyValue = v;
459     }
460
461     QDateTime dateTimePropertyValue;
462     QDateTime dateTimeProperty() const {
463        return dateTimePropertyValue;
464     }
465     void setDateTimeProperty(const QDateTime &v) {
466         dateTimePropertyValue = v;
467     }
468
469     QPoint pointPropertyValue;
470     QPoint pointProperty() const {
471        return pointPropertyValue;
472     }
473     void setPointProperty(const QPoint &v) {
474         pointPropertyValue = v;
475     }
476
477     QPointF pointFPropertyValue;
478     QPointF pointFProperty() const {
479        return pointFPropertyValue;
480     }
481     void setPointFProperty(const QPointF &v) {
482         pointFPropertyValue = v;
483     }
484
485     QSize sizePropertyValue;
486     QSize sizeProperty() const {
487        return sizePropertyValue;
488     }
489     void setSizeProperty(const QSize &v) {
490         sizePropertyValue = v;
491     }
492
493     QSizeF sizeFPropertyValue;
494     QSizeF sizeFProperty() const {
495        return sizeFPropertyValue;
496     }
497     void setSizeFProperty(const QSizeF &v) {
498         sizeFPropertyValue = v;
499     }
500
501     QRect rectPropertyValue;
502     QRect rectProperty() const {
503        return rectPropertyValue;
504     }
505     void setRectProperty(const QRect &v) {
506         rectPropertyValue = v;
507         emit rectPropertyChanged();
508     }
509
510     QRect rectPropertyValue2;
511     QRect rectProperty2() const {
512        return rectPropertyValue2;
513     }
514     void setRectProperty2(const QRect &v) {
515         rectPropertyValue2 = v;
516     }
517
518     QRectF rectFPropertyValue;
519     QRectF rectFProperty() const {
520        return rectFPropertyValue;
521     }
522     void setRectFProperty(const QRectF &v) {
523         rectFPropertyValue = v;
524     }
525
526     bool boolPropertyValue;
527     bool boolProperty() const {
528        return boolPropertyValue;
529     }
530     void setBoolProperty(const bool &v) {
531         boolPropertyValue = v;
532     }
533
534     QVariant variantPropertyValue;
535     QVariant variantProperty() const {
536        return variantPropertyValue;
537     }
538     void setVariantProperty(const QVariant &v) {
539         variantPropertyValue = v;
540     }
541
542     QVector3D vectorPropertyValue;
543     QVector3D vectorProperty() const {
544         return vectorPropertyValue;
545     }
546     void setVectorProperty(const QVector3D &v) {
547         vectorPropertyValue = v;
548     }
549
550     QUrl urlPropertyValue;
551     QUrl urlProperty() const {
552         return urlPropertyValue;
553     }
554     void setUrlProperty(const QUrl &v) {
555         urlPropertyValue = v;
556     }
557
558     QDeclarativeScriptString scriptPropertyValue;
559     QDeclarativeScriptString scriptProperty() const {
560         return scriptPropertyValue;
561     }
562     void setScriptProperty(const QDeclarativeScriptString &v) {
563         scriptPropertyValue = v;
564     }
565
566     void doAction() { emit action(); }
567 signals:
568     void action();
569     void rectPropertyChanged();
570 };
571 Q_DECLARE_OPERATORS_FOR_FLAGS(MyTypeObject::MyFlags)
572
573 class MyDerivedObject : public MyTypeObject
574 {
575     Q_OBJECT
576 public:
577     Q_INVOKABLE bool intProperty() const {
578         return true;
579     }
580 };
581
582 Q_DECLARE_METATYPE(QScriptValue);
583 class MyInvokableBaseObject : public QObject
584 {
585     Q_OBJECT
586 public:
587     inline ~MyInvokableBaseObject() = 0;
588
589     Q_INVOKABLE inline void method_inherited(int a);
590     Q_INVOKABLE inline void method_overload();
591 };
592
593 class MyInvokableObject : public MyInvokableBaseObject
594 {
595     Q_OBJECT
596     Q_ENUMS(TestEnum)
597 public:
598     enum TestEnum { EnumValue1, EnumValue2 };
599     MyInvokableObject() { reset(); }
600
601     int invoked() const { return m_invoked; }
602     bool error() const { return m_invokedError; }
603     const QVariantList &actuals() const { return m_actuals; }
604     void reset() { m_invoked = -1; m_invokedError = false; m_actuals.clear(); }
605
606     Q_INVOKABLE QPointF method_get_QPointF() { return QPointF(99.3, -10.2); }
607     Q_INVOKABLE QPoint method_get_QPoint() { return QPoint(9, 12); }
608
609     Q_INVOKABLE void method_NoArgs() { invoke(0); }
610     Q_INVOKABLE int method_NoArgs_int() { invoke(1); return 6; }
611     Q_INVOKABLE qreal method_NoArgs_real() { invoke(2); return 19.75; }
612     Q_INVOKABLE QPointF method_NoArgs_QPointF() { invoke(3); return QPointF(123, 4.5); }
613     Q_INVOKABLE QObject *method_NoArgs_QObject() { invoke(4); return this; }
614     Q_INVOKABLE MyInvokableObject *method_NoArgs_unknown() { invoke(5); return this; }
615     Q_INVOKABLE QScriptValue method_NoArgs_QScriptValue() { invoke(6); return QScriptValue("Hello world"); }
616     Q_INVOKABLE QVariant method_NoArgs_QVariant() { invoke(7); return QVariant("QML rocks"); }
617
618     Q_INVOKABLE void method_int(int a) { invoke(8); m_actuals << a; }
619     Q_INVOKABLE void method_intint(int a, int b) { invoke(9); m_actuals << a << b; }
620     Q_INVOKABLE void method_real(qreal a) { invoke(10); m_actuals << a; }
621     Q_INVOKABLE void method_QString(QString a) { invoke(11); m_actuals << a; }
622     Q_INVOKABLE void method_QPointF(QPointF a) { invoke(12); m_actuals << a; }
623     Q_INVOKABLE void method_QObject(QObject *a) { invoke(13); m_actuals << qVariantFromValue(a); }
624     Q_INVOKABLE void method_QScriptValue(QScriptValue a) { invoke(14); m_actuals << qVariantFromValue(a); }
625     Q_INVOKABLE void method_intQScriptValue(int a, QScriptValue b) { invoke(15); m_actuals << a << qVariantFromValue(b); }
626     
627     Q_INVOKABLE void method_overload(int a) { invoke(16); m_actuals << a; }
628     Q_INVOKABLE void method_overload(int a, int b) { invoke(17); m_actuals << a << b; }
629     Q_INVOKABLE void method_overload(QString a) { invoke(18); m_actuals << a; }
630
631     Q_INVOKABLE void method_with_enum(TestEnum e) { invoke(19); m_actuals << (int)e; }
632
633     Q_INVOKABLE int method_default(int a, int b = 19) { invoke(20); m_actuals << a << b; return b; }
634
635     Q_INVOKABLE void method_QVariant(QVariant a, QVariant b = QVariant()) { invoke(21); m_actuals << a << b; }
636
637 private:
638     friend class MyInvokableBaseObject;
639     void invoke(int idx) { if (m_invoked != -1) m_invokedError = true; m_invoked = idx;}
640     int m_invoked;
641     bool m_invokedError;
642     QVariantList m_actuals;
643 };
644
645 MyInvokableBaseObject::~MyInvokableBaseObject() {}
646
647 void MyInvokableBaseObject::method_inherited(int a)
648 {
649     static_cast<MyInvokableObject *>(this)->invoke(-3);
650     static_cast<MyInvokableObject *>(this)->m_actuals << a;
651 }
652
653 // This is a hidden overload of the MyInvokableObject::method_overload() method
654 void MyInvokableBaseObject::method_overload()
655 {
656     static_cast<MyInvokableObject *>(this)->invoke(-2);
657 }
658
659 class NumberAssignment : public QObject
660 {
661     Q_OBJECT
662 public:
663     Q_PROPERTY(qreal test1 READ test1 WRITE setTest1)
664     qreal _test1;
665     qreal test1() const { return _test1; }
666     void setTest1(qreal v) { _test1 = v; }
667
668     Q_PROPERTY(qreal test2 READ test2 WRITE setTest2)
669     qreal _test2;
670     qreal test2() const { return _test2; }
671     void setTest2(qreal v) { _test2 = v; }
672
673     Q_PROPERTY(qreal test3 READ test3 WRITE setTest3)
674     qreal _test3;
675     qreal test3() const { return _test3; }
676     void setTest3(qreal v) { _test3 = v; }
677
678     Q_PROPERTY(qreal test4 READ test4 WRITE setTest4)
679     qreal _test4;
680     qreal test4() const { return _test4; }
681     void setTest4(qreal v) { _test4 = v; }
682
683     Q_PROPERTY(int test5 READ test5 WRITE setTest5)
684     int _test5;
685     int test5() const { return _test5; }
686     void setTest5(int v) { _test5 = v; }
687
688     Q_PROPERTY(int test6 READ test6 WRITE setTest6)
689     int _test6;
690     int test6() const { return _test6; }
691     void setTest6(int v) { _test6 = v; }
692
693     Q_PROPERTY(int test7 READ test7 WRITE setTest7)
694     int _test7;
695     int test7() const { return _test7; }
696     void setTest7(int v) { _test7 = v; }
697
698     Q_PROPERTY(int test8 READ test8 WRITE setTest8)
699     int _test8;
700     int test8() const { return _test8; }
701     void setTest8(int v) { _test8 = v; }
702
703     Q_PROPERTY(unsigned int test9 READ test9 WRITE setTest9)
704     unsigned int _test9;
705     unsigned int test9() const { return _test9; }
706     void setTest9(unsigned int v) { _test9 = v; }
707
708     Q_PROPERTY(unsigned int test10 READ test10 WRITE setTest10)
709     unsigned int _test10;
710     unsigned int test10() const { return _test10; }
711     void setTest10(unsigned int v) { _test10 = v; }
712
713     Q_PROPERTY(unsigned int test11 READ test11 WRITE setTest11)
714     unsigned int _test11;
715     unsigned int test11() const { return _test11; }
716     void setTest11(unsigned int v) { _test11 = v; }
717
718     Q_PROPERTY(unsigned int test12 READ test12 WRITE setTest12)
719     unsigned int _test12;
720     unsigned int test12() const { return _test12; }
721     void setTest12(unsigned int v) { _test12 = v; }
722 };
723
724 class DefaultPropertyExtendedObject : public QObject
725 {
726     Q_OBJECT
727     Q_PROPERTY(QObject *firstProperty READ firstProperty WRITE setFirstProperty)
728     Q_PROPERTY(QObject *secondProperty READ secondProperty WRITE setSecondProperty)
729 public:
730     DefaultPropertyExtendedObject(QObject *parent = 0) : QObject(parent), m_firstProperty(0), m_secondProperty(0) {}
731
732     QObject *firstProperty() const { return m_firstProperty; }
733     QObject *secondProperty() const { return m_secondProperty; }
734     void setFirstProperty(QObject *property) { m_firstProperty = property; }
735     void setSecondProperty(QObject *property) { m_secondProperty = property; }
736 private:
737     QObject* m_firstProperty;
738     QObject* m_secondProperty;
739 };
740
741 class OverrideDefaultPropertyObject : public DefaultPropertyExtendedObject
742 {
743     Q_OBJECT
744     Q_CLASSINFO("DefaultProperty", "secondProperty")
745 public:
746     OverrideDefaultPropertyObject() {}
747 };
748
749 class MyRevisionedBaseClassRegistered : public QObject
750 {
751 Q_OBJECT
752     Q_PROPERTY(qreal propA READ propA WRITE setPropA NOTIFY propAChanged)
753     Q_PROPERTY(qreal propB READ propB WRITE setPropB NOTIFY propBChanged REVISION 1)
754
755 public:
756     MyRevisionedBaseClassRegistered() : m_pa(1), m_pb(2) {}
757
758     qreal propA() const { return m_pa; }
759     void setPropA(qreal p) {
760         if (p != m_pa) {
761             m_pa = p;
762             emit propAChanged();
763         }
764     }
765     qreal propB() const { return m_pb; }
766     void setPropB(qreal p) {
767         if (p != m_pb) {
768             m_pb = p;
769             emit propBChanged();
770         }
771     }
772
773     Q_INVOKABLE void methodA() { }
774     Q_INVOKABLE Q_REVISION(1) void methodB() { }
775
776 signals:
777     void propAChanged();
778     void propBChanged();
779
780     void signalA();
781     Q_REVISION(1) void signalB();
782
783 protected:
784     qreal m_pa;
785     qreal m_pb;
786 };
787
788 class MyRevisionedBaseClassUnregistered : public MyRevisionedBaseClassRegistered
789 {
790 Q_OBJECT
791     Q_PROPERTY(qreal propC READ propC WRITE setPropC NOTIFY propCChanged)
792     Q_PROPERTY(qreal propD READ propD WRITE setPropD NOTIFY propDChanged REVISION 1)
793
794 public:
795     MyRevisionedBaseClassUnregistered() : m_pc(1), m_pd(2) {}
796
797     qreal propC() const { return m_pc; }
798     void setPropC(qreal p) {
799         if (p != m_pc) {
800             m_pc = p;
801             emit propCChanged();
802         }
803     }
804     qreal propD() const { return m_pd; }
805     void setPropD(qreal p) {
806         if (p != m_pd) {
807             m_pd = p;
808             emit propDChanged();
809         }
810     }
811
812     Q_INVOKABLE void methodC() { }
813     Q_INVOKABLE Q_REVISION(1) void methodD() { }
814
815 signals:
816     void propCChanged();
817     void propDChanged();
818
819     void signalC();
820     Q_REVISION(1) void signalD();
821
822 protected:
823     qreal m_pc;
824     qreal m_pd;
825 };
826
827 class MyRevisionedClass : public MyRevisionedBaseClassUnregistered
828 {
829     Q_OBJECT
830     Q_PROPERTY(qreal prop1 READ prop1 WRITE setProp1 NOTIFY prop1Changed)
831     Q_PROPERTY(qreal prop2 READ prop2 WRITE setProp2 NOTIFY prop2Changed REVISION 1)
832
833 public:
834     MyRevisionedClass() {}
835
836     qreal prop1() const { return m_p1; }
837     void setProp1(qreal p) {
838         if (p != m_p1) {
839             m_p1 = p;
840             emit prop1Changed();
841         }
842     }
843     qreal prop2() const { return m_p2; }
844     void setProp2(qreal p) {
845         if (p != m_p2) {
846             m_p2 = p;
847             emit prop2Changed();
848         }
849     }
850
851     Q_INVOKABLE void method1() { }
852     Q_INVOKABLE Q_REVISION(1) void method2() { }
853
854 signals:
855     void prop1Changed();
856     void prop2Changed();
857
858     void signal1();
859     Q_REVISION(1) void signal2();
860
861 protected:
862     qreal m_p1;
863     qreal m_p2;
864 };
865
866 class MyRevisionedSubclass : public MyRevisionedClass
867 {
868     Q_OBJECT
869     Q_PROPERTY(qreal prop3 READ prop3 WRITE setProp3 NOTIFY prop3Changed)
870     Q_PROPERTY(qreal prop4 READ prop4 WRITE setProp4 NOTIFY prop4Changed REVISION 1)
871
872 public:
873     MyRevisionedSubclass() : m_p3(3), m_p4(4) {}
874
875     qreal prop3() const { return m_p3; }
876     void setProp3(qreal p) {
877         if (p != m_p3) {
878             m_p3 = p;
879             emit prop3Changed();
880         }
881     }
882     qreal prop4() const { return m_p4; }
883     void setProp4(qreal p) {
884         if (p != m_p4) {
885             m_p4 = p;
886             emit prop4Changed();
887         }
888     }
889
890     Q_INVOKABLE void method3() { }
891     Q_INVOKABLE Q_REVISION(1) void method4() { }
892
893 signals:
894     void prop3Changed();
895     void prop4Changed();
896
897     void signal3();
898     Q_REVISION(1) void signal4();
899
900 protected:
901     qreal m_p3;
902     qreal m_p4;
903 };
904
905 QML_DECLARE_TYPE(MyRevisionedBaseClassRegistered)
906 QML_DECLARE_TYPE(MyRevisionedBaseClassUnregistered)
907 QML_DECLARE_TYPE(MyRevisionedClass)
908 QML_DECLARE_TYPE(MyRevisionedSubclass)
909 Q_DECLARE_METATYPE(MyQmlObject::MyType)
910
911 void registerTypes();
912
913 #endif // TESTTYPES_H
914