/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ ** 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 ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** 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. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include #include #include class tst_QGraphicsObject : public QObject { Q_OBJECT private slots: void pos(); void x(); void y(); void z(); void opacity(); void enabled(); void visible(); void deleted(); }; class MyGraphicsObject : public QGraphicsObject { public: MyGraphicsObject() : QGraphicsObject() {} virtual QRectF boundingRect() const { return QRectF(); } virtual void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *) {} }; void tst_QGraphicsObject::pos() { MyGraphicsObject object; QSignalSpy xSpy(&object, SIGNAL(xChanged())); QSignalSpy ySpy(&object, SIGNAL(yChanged())); QVERIFY(object.pos() == QPointF(0, 0)); object.setPos(10, 10); QCOMPARE(xSpy.count(), 1); QCOMPARE(ySpy.count(), 1); QCOMPARE(object.pos(), QPointF(10,10)); object.setPos(10, 10); QCOMPARE(xSpy.count(), 1); QCOMPARE(ySpy.count(), 1); object.setProperty("pos", QPointF(0, 0)); QCOMPARE(xSpy.count(), 2); QCOMPARE(ySpy.count(), 2); QCOMPARE(object.property("pos").toPointF(), QPointF(0,0)); object.setProperty("pos", QPointF(10, 0)); QCOMPARE(xSpy.count(), 3); QCOMPARE(ySpy.count(), 2); QCOMPARE(object.property("pos").toPointF(), QPointF(10,0)); object.setProperty("pos", QPointF(10, 10)); QCOMPARE(xSpy.count(), 3); QCOMPARE(ySpy.count(), 3); QVERIFY(object.property("pos") == QPointF(10, 10)); } void tst_QGraphicsObject::x() { MyGraphicsObject object; QSignalSpy xSpy(&object, SIGNAL(xChanged())); QSignalSpy ySpy(&object, SIGNAL(yChanged())); QVERIFY(object.pos() == QPointF(0, 0)); object.setX(10); QCOMPARE(xSpy.count(), 1); QCOMPARE(ySpy.count(), 0); QVERIFY(object.pos() == QPointF(10, 0)); QCOMPARE(object.x(), qreal(10)); object.setX(10); QCOMPARE(xSpy.count(), 1); QCOMPARE(ySpy.count(), 0); object.setProperty("x", 0); QCOMPARE(xSpy.count(), 2); QCOMPARE(ySpy.count(), 0); QCOMPARE(object.property("x").toDouble(), double(0)); } void tst_QGraphicsObject::y() { MyGraphicsObject object; QSignalSpy xSpy(&object, SIGNAL(xChanged())); QSignalSpy ySpy(&object, SIGNAL(yChanged())); QVERIFY(object.pos() == QPointF(0, 0)); object.setY(10); QCOMPARE(xSpy.count(), 0); QCOMPARE(ySpy.count(), 1); QVERIFY(object.pos() == QPointF(0, 10)); QCOMPARE(object.y(), qreal(10)); object.setY(10); QCOMPARE(xSpy.count(), 0); QCOMPARE(ySpy.count(), 1); object.setProperty("y", 0); QCOMPARE(xSpy.count(), 0); QCOMPARE(ySpy.count(), 2); QCOMPARE(object.property("y").toDouble(), qreal(0)); } void tst_QGraphicsObject::z() { MyGraphicsObject object; QSignalSpy zSpy(&object, SIGNAL(zChanged())); QCOMPARE(object.zValue(), qreal(0)); object.setZValue(10); QCOMPARE(zSpy.count(), 1); QCOMPARE(object.zValue(), qreal(10)); object.setZValue(10); QCOMPARE(zSpy.count(), 1); object.setProperty("z", 0); QCOMPARE(zSpy.count(), 2); QCOMPARE(object.property("z").toDouble(), double(0)); } void tst_QGraphicsObject::opacity() { MyGraphicsObject object; QSignalSpy spy(&object, SIGNAL(opacityChanged())); QCOMPARE(object.opacity(), 1.); object.setOpacity(0); QCOMPARE(spy.count(), 1); QCOMPARE(object.opacity(), 0.); object.setOpacity(0); QCOMPARE(spy.count(), 1); object.setProperty("opacity", .5); QCOMPARE(spy.count(), 2); QCOMPARE(object.property("opacity").toDouble(), .5); } void tst_QGraphicsObject::enabled() { MyGraphicsObject object; QSignalSpy spy(&object, SIGNAL(enabledChanged())); QVERIFY(object.isEnabled()); object.setEnabled(false); QCOMPARE(spy.count(), 1); QVERIFY(!object.isEnabled()); object.setEnabled(false); QCOMPARE(spy.count(), 1); object.setProperty("enabled", true); QCOMPARE(spy.count(), 2); QVERIFY(object.property("enabled").toBool()); } void tst_QGraphicsObject::visible() { MyGraphicsObject object; QSignalSpy spy(&object, SIGNAL(visibleChanged())); QVERIFY(object.isVisible()); object.setVisible(false); QCOMPARE(spy.count(), 1); QVERIFY(!object.isVisible()); object.setVisible(false); QCOMPARE(spy.count(), 1); object.setProperty("visible", true); QCOMPARE(spy.count(), 2); QVERIFY(object.property("visible").toBool()); } class DeleteTester : public QGraphicsObject { public: DeleteTester(bool *w, bool *pw, QGraphicsItem *parent = 0) : QGraphicsObject(parent), wasDeleted(w), parentWasDeleted(pw) { } ~DeleteTester() { *wasDeleted = QObjectPrivate::get(this)->wasDeleted; if (QGraphicsItem *p = parentItem()) { if (QGraphicsObject *o = p->toGraphicsObject()) *parentWasDeleted = QObjectPrivate::get(o)->wasDeleted; } } void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget * = 0) { } QRectF boundingRect() const { return QRectF(); } bool *wasDeleted; bool *parentWasDeleted; }; void tst_QGraphicsObject::deleted() { bool item1_parentWasDeleted = false; bool item1_wasDeleted = false; bool item2_parentWasDeleted = false; bool item2_wasDeleted = false; DeleteTester *item1 = new DeleteTester(&item1_wasDeleted, &item1_parentWasDeleted); DeleteTester *item2 = new DeleteTester(&item2_wasDeleted, &item2_parentWasDeleted, item1); Q_UNUSED(item2); delete item1; QVERIFY(!item1_wasDeleted); // destructor not called yet QVERIFY(!item1_parentWasDeleted); // no parent QVERIFY(!item2_wasDeleted); // destructor not called yet QVERIFY(item2_parentWasDeleted); } QTEST_MAIN(tst_QGraphicsObject) #include "tst_qgraphicsobject.moc"