1 /****************************************************************************
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
7 ** This file is part of the test suite of the Qt Toolkit.
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
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.
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.
28 ** If you have questions regarding the use of this file, please contact
29 ** Nokia at qt-info@nokia.com.
40 ****************************************************************************/
43 #include <QDeclarativeEngine>
44 #include <QDeclarativeComponent>
46 #include <private/qdeclarativevaluetype_p.h>
47 #include "testtypes.h"
50 // In Symbian OS test data is located in applications private dir
55 extern int qt_defaultDpi();
58 class tst_qdeclarativevaluetypes : public QObject
62 tst_qdeclarativevaluetypes() {}
82 void bindingAssignment();
84 void staticAssignment();
86 void autoBindingRemoval();
88 void valueInterceptors();
89 void bindingConflict();
91 void bindingVariantCopy();
92 void scriptVariantCopy();
95 void conflictingBindings();
98 void bindingsSpliceCorrectly();
101 QDeclarativeEngine engine;
104 void tst_qdeclarativevaluetypes::initTestCase()
109 inline QUrl TEST_FILE(const QString &filename)
111 return QUrl::fromLocalFile(QLatin1String(SRCDIR) + QLatin1String("/data/") + filename);
114 void tst_qdeclarativevaluetypes::point()
117 QDeclarativeComponent component(&engine, TEST_FILE("point_read.qml"));
118 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
119 QVERIFY(object != 0);
121 QCOMPARE(object->property("p_x").toInt(), 10);
122 QCOMPARE(object->property("p_y").toInt(), 4);
123 QCOMPARE(object->property("copy"), QVariant(QPoint(10, 4)));
129 QDeclarativeComponent component(&engine, TEST_FILE("point_write.qml"));
130 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
131 QVERIFY(object != 0);
133 QCOMPARE(object->point(), QPoint(11, 12));
139 void tst_qdeclarativevaluetypes::pointf()
142 QDeclarativeComponent component(&engine, TEST_FILE("pointf_read.qml"));
143 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
144 QVERIFY(object != 0);
146 QCOMPARE(float(object->property("p_x").toDouble()), float(11.3));
147 QCOMPARE(float(object->property("p_y").toDouble()), float(-10.9));
148 QCOMPARE(object->property("copy"), QVariant(QPointF(11.3, -10.9)));
154 QDeclarativeComponent component(&engine, TEST_FILE("pointf_write.qml"));
155 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
156 QVERIFY(object != 0);
158 QCOMPARE(object->pointf(), QPointF(6.8, 9.3));
164 void tst_qdeclarativevaluetypes::size()
167 QDeclarativeComponent component(&engine, TEST_FILE("size_read.qml"));
168 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
169 QVERIFY(object != 0);
171 QCOMPARE(object->property("s_width").toInt(), 1912);
172 QCOMPARE(object->property("s_height").toInt(), 1913);
173 QCOMPARE(object->property("copy"), QVariant(QSize(1912, 1913)));
179 QDeclarativeComponent component(&engine, TEST_FILE("size_write.qml"));
180 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
181 QVERIFY(object != 0);
183 QCOMPARE(object->size(), QSize(13, 88));
189 void tst_qdeclarativevaluetypes::sizef()
192 QDeclarativeComponent component(&engine, TEST_FILE("sizef_read.qml"));
193 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
194 QVERIFY(object != 0);
196 QCOMPARE(float(object->property("s_width").toDouble()), float(0.1));
197 QCOMPARE(float(object->property("s_height").toDouble()), float(100923.2));
198 QCOMPARE(object->property("copy"), QVariant(QSizeF(0.1, 100923.2)));
204 QDeclarativeComponent component(&engine, TEST_FILE("sizef_write.qml"));
205 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
206 QVERIFY(object != 0);
208 QCOMPARE(object->sizef(), QSizeF(44.3, 92.8));
214 void tst_qdeclarativevaluetypes::variant()
216 QDeclarativeComponent component(&engine, TEST_FILE("variant_read.qml"));
217 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
218 QVERIFY(object != 0);
220 QCOMPARE(float(object->property("s_width").toDouble()), float(0.1));
221 QCOMPARE(float(object->property("s_height").toDouble()), float(100923.2));
222 QCOMPARE(object->property("copy"), QVariant(QSizeF(0.1, 100923.2)));
227 void tst_qdeclarativevaluetypes::sizereadonly()
230 QDeclarativeComponent component(&engine, TEST_FILE("sizereadonly_read.qml"));
231 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
232 QVERIFY(object != 0);
234 QCOMPARE(object->property("s_width").toInt(), 1912);
235 QCOMPARE(object->property("s_height").toInt(), 1913);
236 QCOMPARE(object->property("copy"), QVariant(QSize(1912, 1913)));
242 QDeclarativeComponent component(&engine, TEST_FILE("sizereadonly_writeerror.qml"));
243 QVERIFY(component.isError());
244 QCOMPARE(component.errors().at(0).description(), QLatin1String("Invalid property assignment: \"sizereadonly\" is a read-only property"));
248 QDeclarativeComponent component(&engine, TEST_FILE("sizereadonly_writeerror2.qml"));
249 QVERIFY(component.isError());
250 QCOMPARE(component.errors().at(0).description(), QLatin1String("Invalid property assignment: \"sizereadonly\" is a read-only property"));
254 QDeclarativeComponent component(&engine, TEST_FILE("sizereadonly_writeerror3.qml"));
255 QVERIFY(component.isError());
256 QCOMPARE(component.errors().at(0).description(), QLatin1String("Invalid property assignment: \"sizereadonly\" is a read-only property"));
260 QDeclarativeComponent component(&engine, TEST_FILE("sizereadonly_writeerror4.qml"));
262 QObject *object = component.create();
265 QCOMPARE(object->property("sizereadonly").toSize(), QSize(1912, 1913));
271 void tst_qdeclarativevaluetypes::rect()
274 QDeclarativeComponent component(&engine, TEST_FILE("rect_read.qml"));
275 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
276 QVERIFY(object != 0);
278 QCOMPARE(object->property("r_x").toInt(), 2);
279 QCOMPARE(object->property("r_y").toInt(), 3);
280 QCOMPARE(object->property("r_width").toInt(), 109);
281 QCOMPARE(object->property("r_height").toInt(), 102);
282 QCOMPARE(object->property("copy"), QVariant(QRect(2, 3, 109, 102)));
288 QDeclarativeComponent component(&engine, TEST_FILE("rect_write.qml"));
289 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
290 QVERIFY(object != 0);
292 QCOMPARE(object->rect(), QRect(1234, 7, 56, 63));
298 void tst_qdeclarativevaluetypes::rectf()
301 QDeclarativeComponent component(&engine, TEST_FILE("rectf_read.qml"));
302 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
303 QVERIFY(object != 0);
305 QCOMPARE(float(object->property("r_x").toDouble()), float(103.8));
306 QCOMPARE(float(object->property("r_y").toDouble()), float(99.2));
307 QCOMPARE(float(object->property("r_width").toDouble()), float(88.1));
308 QCOMPARE(float(object->property("r_height").toDouble()), float(77.6));
309 QCOMPARE(object->property("copy"), QVariant(QRectF(103.8, 99.2, 88.1, 77.6)));
315 QDeclarativeComponent component(&engine, TEST_FILE("rectf_write.qml"));
316 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
317 QVERIFY(object != 0);
319 QCOMPARE(object->rectf(), QRectF(70.1, -113.2, 80924.8, 99.2));
325 void tst_qdeclarativevaluetypes::vector2d()
328 QDeclarativeComponent component(&engine, TEST_FILE("vector2d_read.qml"));
329 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
330 QVERIFY(object != 0);
332 QCOMPARE((float)object->property("v_x").toDouble(), (float)32.88);
333 QCOMPARE((float)object->property("v_y").toDouble(), (float)1.3);
334 QCOMPARE(object->property("copy"), QVariant(QVector2D(32.88, 1.3)));
340 QDeclarativeComponent component(&engine, TEST_FILE("vector2d_write.qml"));
341 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
342 QVERIFY(object != 0);
344 QCOMPARE(object->vector2(), QVector2D(-0.3, -12.9));
350 void tst_qdeclarativevaluetypes::vector3d()
353 QDeclarativeComponent component(&engine, TEST_FILE("vector3d_read.qml"));
354 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
355 QVERIFY(object != 0);
357 QCOMPARE((float)object->property("v_x").toDouble(), (float)23.88);
358 QCOMPARE((float)object->property("v_y").toDouble(), (float)3.1);
359 QCOMPARE((float)object->property("v_z").toDouble(), (float)4.3);
360 QCOMPARE(object->property("copy"), QVariant(QVector3D(23.88, 3.1, 4.3)));
366 QDeclarativeComponent component(&engine, TEST_FILE("vector3d_write.qml"));
367 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
368 QVERIFY(object != 0);
370 QCOMPARE(object->vector(), QVector3D(-0.3, -12.9, 907.4));
376 void tst_qdeclarativevaluetypes::vector4d()
379 QDeclarativeComponent component(&engine, TEST_FILE("vector4d_read.qml"));
380 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
381 QVERIFY(object != 0);
383 QCOMPARE((float)object->property("v_x").toDouble(), (float)54.2);
384 QCOMPARE((float)object->property("v_y").toDouble(), (float)23.88);
385 QCOMPARE((float)object->property("v_z").toDouble(), (float)3.1);
386 QCOMPARE((float)object->property("v_w").toDouble(), (float)4.3);
387 QCOMPARE(object->property("copy"), QVariant(QVector4D(54.2, 23.88, 3.1, 4.3)));
393 QDeclarativeComponent component(&engine, TEST_FILE("vector4d_write.qml"));
394 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
395 QVERIFY(object != 0);
397 QCOMPARE(object->vector4(), QVector4D(-0.3, -12.9, 907.4, 88.5));
403 void tst_qdeclarativevaluetypes::quaternion()
406 QDeclarativeComponent component(&engine, TEST_FILE("quaternion_read.qml"));
407 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
408 QVERIFY(object != 0);
410 QCOMPARE((float)object->property("v_scalar").toDouble(), (float)4.3);
411 QCOMPARE((float)object->property("v_x").toDouble(), (float)54.2);
412 QCOMPARE((float)object->property("v_y").toDouble(), (float)23.88);
413 QCOMPARE((float)object->property("v_z").toDouble(), (float)3.1);
414 QCOMPARE(object->property("copy"), QVariant(QQuaternion(4.3, 54.2, 23.88, 3.1)));
420 QDeclarativeComponent component(&engine, TEST_FILE("quaternion_write.qml"));
421 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
422 QVERIFY(object != 0);
424 QCOMPARE(object->quaternion(), QQuaternion(88.5, -0.3, -12.9, 907.4));
430 void tst_qdeclarativevaluetypes::matrix4x4()
433 QDeclarativeComponent component(&engine, TEST_FILE("matrix4x4_read.qml"));
434 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
435 QVERIFY(object != 0);
437 QCOMPARE((float)object->property("v_m11").toDouble(), (float)1);
438 QCOMPARE((float)object->property("v_m12").toDouble(), (float)2);
439 QCOMPARE((float)object->property("v_m13").toDouble(), (float)3);
440 QCOMPARE((float)object->property("v_m14").toDouble(), (float)4);
441 QCOMPARE((float)object->property("v_m21").toDouble(), (float)5);
442 QCOMPARE((float)object->property("v_m22").toDouble(), (float)6);
443 QCOMPARE((float)object->property("v_m23").toDouble(), (float)7);
444 QCOMPARE((float)object->property("v_m24").toDouble(), (float)8);
445 QCOMPARE((float)object->property("v_m31").toDouble(), (float)9);
446 QCOMPARE((float)object->property("v_m32").toDouble(), (float)10);
447 QCOMPARE((float)object->property("v_m33").toDouble(), (float)11);
448 QCOMPARE((float)object->property("v_m34").toDouble(), (float)12);
449 QCOMPARE((float)object->property("v_m41").toDouble(), (float)13);
450 QCOMPARE((float)object->property("v_m42").toDouble(), (float)14);
451 QCOMPARE((float)object->property("v_m43").toDouble(), (float)15);
452 QCOMPARE((float)object->property("v_m44").toDouble(), (float)16);
453 QCOMPARE(object->property("copy"),
454 QVariant(QMatrix4x4(1, 2, 3, 4,
463 QDeclarativeComponent component(&engine, TEST_FILE("matrix4x4_write.qml"));
464 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
465 QVERIFY(object != 0);
467 QCOMPARE(object->matrix(), QMatrix4x4(11, 12, 13, 14,
476 void tst_qdeclarativevaluetypes::font()
479 QDeclarativeComponent component(&engine, TEST_FILE("font_read.qml"));
480 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
481 QVERIFY(object != 0);
483 QCOMPARE(object->property("f_family").toString(), object->font().family());
484 QCOMPARE(object->property("f_bold").toBool(), object->font().bold());
485 QCOMPARE(object->property("f_weight").toInt(), object->font().weight());
486 QCOMPARE(object->property("f_italic").toBool(), object->font().italic());
487 QCOMPARE(object->property("f_underline").toBool(), object->font().underline());
488 QCOMPARE(object->property("f_overline").toBool(), object->font().overline());
489 QCOMPARE(object->property("f_strikeout").toBool(), object->font().strikeOut());
490 QCOMPARE(object->property("f_pointSize").toDouble(), object->font().pointSizeF());
491 QCOMPARE(object->property("f_pixelSize").toInt(), int((object->font().pointSizeF() * qt_defaultDpi()) / qreal(72.)));
492 QCOMPARE(object->property("f_capitalization").toInt(), (int)object->font().capitalization());
493 QCOMPARE(object->property("f_letterSpacing").toDouble(), object->font().letterSpacing());
494 QCOMPARE(object->property("f_wordSpacing").toDouble(), object->font().wordSpacing());
496 QCOMPARE(object->property("copy"), QVariant(object->font()));
502 QDeclarativeComponent component(&engine, TEST_FILE("font_write.qml"));
503 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
504 QVERIFY(object != 0);
507 font.setFamily("Helvetica");
509 font.setWeight(QFont::Normal);
510 font.setItalic(false);
511 font.setUnderline(false);
512 font.setStrikeOut(false);
513 font.setPointSize(15);
514 font.setCapitalization(QFont::AllLowercase);
515 font.setLetterSpacing(QFont::AbsoluteSpacing, 9.7);
516 font.setWordSpacing(11.2);
518 QFont f = object->font();
519 QCOMPARE(f.family(), font.family());
520 QCOMPARE(f.bold(), font.bold());
521 QCOMPARE(f.weight(), font.weight());
522 QCOMPARE(f.italic(), font.italic());
523 QCOMPARE(f.underline(), font.underline());
524 QCOMPARE(f.strikeOut(), font.strikeOut());
525 QCOMPARE(f.pointSize(), font.pointSize());
526 QCOMPARE(f.capitalization(), font.capitalization());
527 QCOMPARE(f.letterSpacing(), font.letterSpacing());
528 QCOMPARE(f.wordSpacing(), font.wordSpacing());
535 QDeclarativeComponent component(&engine, TEST_FILE("font_write.2.qml"));
536 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
537 QVERIFY(object != 0);
539 QCOMPARE(object->font().pixelSize(), 10);
544 // Test pixelSize and pointSize
546 QDeclarativeComponent component(&engine, TEST_FILE("font_write.3.qml"));
547 QTest::ignoreMessage(QtWarningMsg, "Both point size and pixel size set. Using pixel size. ");
548 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
549 QVERIFY(object != 0);
551 QCOMPARE(object->font().pixelSize(), 10);
556 QDeclarativeComponent component(&engine, TEST_FILE("font_write.4.qml"));
557 QTest::ignoreMessage(QtWarningMsg, "Both point size and pixel size set. Using pixel size. ");
558 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
559 QVERIFY(object != 0);
561 QCOMPARE(object->font().pixelSize(), 10);
566 QDeclarativeComponent component(&engine, TEST_FILE("font_write.5.qml"));
567 QObject *object = qobject_cast<QObject *>(component.create());
568 QVERIFY(object != 0);
569 MyTypeObject *object1 = object->findChild<MyTypeObject *>("object1");
570 QVERIFY(object1 != 0);
571 MyTypeObject *object2 = object->findChild<MyTypeObject *>("object2");
572 QVERIFY(object2 != 0);
574 QCOMPARE(object1->font().pixelSize(), 19);
575 QCOMPARE(object2->font().pointSize(), 14);
581 // Test bindings can write to value types
582 void tst_qdeclarativevaluetypes::bindingAssignment()
584 QDeclarativeComponent component(&engine, TEST_FILE("bindingAssignment.qml"));
585 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
586 QVERIFY(object != 0);
588 QCOMPARE(object->rect().x(), 10);
590 object->setProperty("value", QVariant(92));
592 QCOMPARE(object->rect().x(), 92);
597 // Test bindings can read from value types
598 void tst_qdeclarativevaluetypes::bindingRead()
600 QDeclarativeComponent component(&engine, TEST_FILE("bindingRead.qml"));
601 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
602 QVERIFY(object != 0);
604 QCOMPARE(object->property("value").toInt(), 2);
606 object->setRect(QRect(19, 3, 88, 2));
608 QCOMPARE(object->property("value").toInt(), 19);
613 // Test static values can assign to value types
614 void tst_qdeclarativevaluetypes::staticAssignment()
616 QDeclarativeComponent component(&engine, TEST_FILE("staticAssignment.qml"));
617 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
618 QVERIFY(object != 0);
620 QCOMPARE(object->rect().x(), 9);
625 // Test scripts can read/write value types
626 void tst_qdeclarativevaluetypes::scriptAccess()
628 QDeclarativeComponent component(&engine, TEST_FILE("scriptAccess.qml"));
629 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
630 QVERIFY(object != 0);
632 QCOMPARE(object->property("valuePre").toInt(), 2);
633 QCOMPARE(object->rect().x(), 19);
634 QCOMPARE(object->property("valuePost").toInt(), 19);
639 // Test that assigning a constant from script removes any binding
640 void tst_qdeclarativevaluetypes::autoBindingRemoval()
643 QDeclarativeComponent component(&engine, TEST_FILE("autoBindingRemoval.qml"));
644 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
645 QVERIFY(object != 0);
647 QCOMPARE(object->rect().x(), 10);
649 object->setProperty("value", QVariant(13));
651 QCOMPARE(object->rect().x(), 13);
653 object->emitRunScript();
655 QCOMPARE(object->rect().x(), 42);
657 object->setProperty("value", QVariant(92));
659 QCOMPARE(object->rect().x(), 42);
666 QDeclarativeComponent component(&engine, TEST_FILE("autoBindingRemoval.2.qml"));
667 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
668 QVERIFY(object != 0);
670 QCOMPARE(object->rect().x(), 10);
672 object->setProperty("value", QVariant(13));
674 QCOMPARE(object->rect().x(), 13);
676 object->emitRunScript();
678 QCOMPARE(object->rect(), QRect(10, 10, 10, 10));
680 object->setProperty("value", QVariant(92));
682 QCOMPARE(object->rect(), QRect(10, 10, 10, 10));
688 QDeclarativeComponent component(&engine, TEST_FILE("autoBindingRemoval.3.qml"));
689 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
690 QVERIFY(object != 0);
692 object->setProperty("value", QVariant(QRect(9, 22, 33, 44)));
694 QCOMPARE(object->rect(), QRect(9, 22, 33, 44));
696 object->emitRunScript();
698 QCOMPARE(object->rect(), QRect(44, 22, 33, 44));
700 object->setProperty("value", QVariant(QRect(19, 3, 4, 8)));
702 QCOMPARE(object->rect(), QRect(44, 22, 33, 44));
709 // Test that property value sources assign to value types
710 void tst_qdeclarativevaluetypes::valueSources()
712 QDeclarativeComponent component(&engine, TEST_FILE("valueSources.qml"));
713 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
714 QVERIFY(object != 0);
716 QCOMPARE(object->rect().x(), 3345);
721 static void checkNoErrors(QDeclarativeComponent& component)
723 QList<QDeclarativeError> errors = component.errors();
724 if (errors.isEmpty())
726 for (int ii = 0; ii < errors.count(); ++ii) {
727 const QDeclarativeError &error = errors.at(ii);
728 qWarning("%d:%d:%s",error.line(),error.column(),error.description().toUtf8().constData());
732 // Test that property value interceptors can be applied to value types
733 void tst_qdeclarativevaluetypes::valueInterceptors()
735 QDeclarativeComponent component(&engine, TEST_FILE("valueInterceptors.qml"));
736 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
737 checkNoErrors(component);
738 QVERIFY(object != 0);
740 QCOMPARE(object->rect().x(), 13);
742 object->setProperty("value", 99);
744 QCOMPARE(object->rect().x(), 112);
749 // Test that you can't assign a binding to the "root" value type, and a sub-property
750 void tst_qdeclarativevaluetypes::bindingConflict()
752 QDeclarativeComponent component(&engine, TEST_FILE("bindingConflict.qml"));
753 QCOMPARE(component.isError(), true);
756 #define CPP_TEST(type, v) \
758 type *t = new type; \
760 t->setValue(value); \
761 QCOMPARE(t->value(), value); \
765 // Test that accessing a reference to a valuetype after the owning object is deleted
767 void tst_qdeclarativevaluetypes::deletedObject()
769 QDeclarativeComponent component(&engine, TEST_FILE("deletedObject.qml"));
770 QTest::ignoreMessage(QtDebugMsg, "Test: 2");
771 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
772 QVERIFY(object != 0);
774 QObject *dObject = qvariant_cast<QObject *>(object->property("object"));
775 QVERIFY(dObject != 0);
778 QTest::ignoreMessage(QtDebugMsg, "Test: undefined");
779 object->emitRunScript();
784 // Test that value types can be assigned to another value type property in a binding
785 void tst_qdeclarativevaluetypes::bindingVariantCopy()
787 QDeclarativeComponent component(&engine, TEST_FILE("bindingVariantCopy.qml"));
788 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
789 QVERIFY(object != 0);
791 QCOMPARE(object->rect(), QRect(19, 33, 5, 99));
796 // Test that value types can be assigned to another value type property in script
797 void tst_qdeclarativevaluetypes::scriptVariantCopy()
799 QDeclarativeComponent component(&engine, TEST_FILE("scriptVariantCopy.qml"));
800 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
801 QVERIFY(object != 0);
803 QCOMPARE(object->rect(), QRect(2, 3, 109, 102));
805 object->emitRunScript();
807 QCOMPARE(object->rect(), QRect(19, 33, 5, 99));
813 // Test that the value type classes can be used manually
814 void tst_qdeclarativevaluetypes::cppClasses()
816 CPP_TEST(QDeclarativePointValueType, QPoint(19, 33));
817 CPP_TEST(QDeclarativePointFValueType, QPointF(33.6, -23));
818 CPP_TEST(QDeclarativeSizeValueType, QSize(-100, 18));
819 CPP_TEST(QDeclarativeSizeFValueType, QSizeF(-100.7, 18.2));
820 CPP_TEST(QDeclarativeRectValueType, QRect(13, 39, 10928, 88));
821 CPP_TEST(QDeclarativeRectFValueType, QRectF(88.2, -90.1, 103.2, 118));
822 CPP_TEST(QDeclarativeVector2DValueType, QVector2D(19.7, 1002));
823 CPP_TEST(QDeclarativeVector3DValueType, QVector3D(18.2, 19.7, 1002));
824 CPP_TEST(QDeclarativeVector4DValueType, QVector4D(18.2, 19.7, 1002, 54));
825 CPP_TEST(QDeclarativeQuaternionValueType, QQuaternion(18.2, 19.7, 1002, 54));
826 CPP_TEST(QDeclarativeMatrix4x4ValueType,
827 QMatrix4x4(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16));
828 CPP_TEST(QDeclarativeFontValueType, QFont("Helvetica"));
832 void tst_qdeclarativevaluetypes::enums()
835 QDeclarativeComponent component(&engine, TEST_FILE("enums.1.qml"));
836 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
837 QVERIFY(object != 0);
838 QVERIFY(object->font().capitalization() == QFont::AllUppercase);
843 QDeclarativeComponent component(&engine, TEST_FILE("enums.2.qml"));
844 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
845 QVERIFY(object != 0);
846 QVERIFY(object->font().capitalization() == QFont::AllUppercase);
851 QDeclarativeComponent component(&engine, TEST_FILE("enums.3.qml"));
852 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
853 QVERIFY(object != 0);
854 QVERIFY(object->font().capitalization() == QFont::AllUppercase);
859 QDeclarativeComponent component(&engine, TEST_FILE("enums.4.qml"));
860 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
861 QVERIFY(object != 0);
862 QVERIFY(object->font().capitalization() == QFont::AllUppercase);
867 QDeclarativeComponent component(&engine, TEST_FILE("enums.5.qml"));
868 MyTypeObject *object = qobject_cast<MyTypeObject *>(component.create());
869 QVERIFY(object != 0);
870 QVERIFY(object->font().capitalization() == QFont::AllUppercase);
875 // Tests switching between "conflicting" bindings (eg. a binding on the core
876 // property, to a binding on the value-type sub-property)
877 void tst_qdeclarativevaluetypes::conflictingBindings()
880 QDeclarativeComponent component(&engine, TEST_FILE("conflicting.1.qml"));
881 QObject *object = component.create();
882 QVERIFY(object != 0);
884 QCOMPARE(qvariant_cast<QFont>(object->property("font")).pixelSize(), 12);
886 QMetaObject::invokeMethod(object, "toggle");
888 QCOMPARE(qvariant_cast<QFont>(object->property("font")).pixelSize(), 6);
890 QMetaObject::invokeMethod(object, "toggle");
892 QCOMPARE(qvariant_cast<QFont>(object->property("font")).pixelSize(), 12);
898 QDeclarativeComponent component(&engine, TEST_FILE("conflicting.2.qml"));
899 QObject *object = component.create();
900 QVERIFY(object != 0);
902 QCOMPARE(qvariant_cast<QFont>(object->property("font")).pixelSize(), 6);
904 QMetaObject::invokeMethod(object, "toggle");
906 QCOMPARE(qvariant_cast<QFont>(object->property("font")).pixelSize(), 12);
908 QMetaObject::invokeMethod(object, "toggle");
910 QCOMPARE(qvariant_cast<QFont>(object->property("font")).pixelSize(), 6);
916 QDeclarativeComponent component(&engine, TEST_FILE("conflicting.3.qml"));
917 QObject *object = component.create();
918 QVERIFY(object != 0);
920 QCOMPARE(qvariant_cast<QFont>(object->property("font")).pixelSize(), 12);
922 QMetaObject::invokeMethod(object, "toggle");
924 QCOMPARE(qvariant_cast<QFont>(object->property("font")).pixelSize(), 24);
926 QMetaObject::invokeMethod(object, "toggle");
928 QCOMPARE(qvariant_cast<QFont>(object->property("font")).pixelSize(), 12);
934 void tst_qdeclarativevaluetypes::returnValues()
936 QDeclarativeComponent component(&engine, TEST_FILE("returnValues.qml"));
937 QObject *object = component.create();
938 QVERIFY(object != 0);
940 QCOMPARE(object->property("test1").toBool(), true);
941 QCOMPARE(object->property("test2").toBool(), true);
942 QCOMPARE(object->property("size").toSize(), QSize(13, 14));
947 void tst_qdeclarativevaluetypes::varAssignment()
949 QDeclarativeComponent component(&engine, TEST_FILE("varAssignment.qml"));
950 QObject *object = component.create();
951 QVERIFY(object != 0);
953 QCOMPARE(object->property("x").toInt(), 1);
954 QCOMPARE(object->property("y").toInt(), 2);
955 QCOMPARE(object->property("z").toInt(), 3);
960 // Test bindings splice together correctly
961 void tst_qdeclarativevaluetypes::bindingsSpliceCorrectly()
964 QDeclarativeComponent component(&engine, TEST_FILE("bindingsSpliceCorrectly.1.qml"));
965 QObject *object = component.create();
966 QVERIFY(object != 0);
968 QCOMPARE(object->property("test").toBool(), true);
974 QDeclarativeComponent component(&engine, TEST_FILE("bindingsSpliceCorrectly.2.qml"));
975 QObject *object = component.create();
976 QVERIFY(object != 0);
978 QCOMPARE(object->property("test").toBool(), true);
985 QDeclarativeComponent component(&engine, TEST_FILE("bindingsSpliceCorrectly.3.qml"));
986 QObject *object = component.create();
987 QVERIFY(object != 0);
989 QCOMPARE(object->property("test").toBool(), true);
995 QDeclarativeComponent component(&engine, TEST_FILE("bindingsSpliceCorrectly.4.qml"));
996 QObject *object = component.create();
997 QVERIFY(object != 0);
999 QCOMPARE(object->property("test").toBool(), true);
1005 QDeclarativeComponent component(&engine, TEST_FILE("bindingsSpliceCorrectly.5.qml"));
1006 QObject *object = component.create();
1007 QVERIFY(object != 0);
1009 QCOMPARE(object->property("test").toBool(), true);
1015 QTEST_MAIN(tst_qdeclarativevaluetypes)
1017 #include "tst_qdeclarativevaluetypes.moc"