/**************************************************************************** ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** ****************************************************************************/ #include #include /*! \class tst_QScopedPointer \internal \since 4.6 \brief Tests class QScopedPointer. */ class tst_QScopedPointer : public QObject { Q_OBJECT private Q_SLOTS: void defaultConstructor() const; void dataOnDefaultConstructed() const; void useSubClassInConstructor() const; void dataOnValue() const; void dataSignature() const; void reset() const; void dereferenceOperator() const; void dereferenceOperatorSignature() const; void pointerOperator() const; void pointerOperatorSignature() const; void negationOperator() const; void negationOperatorSignature() const; void operatorBool() const; void operatorBoolSignature() const; void isNull() const; void isNullSignature() const; void objectSize() const; // TODO instansiate on const object }; void tst_QScopedPointer::defaultConstructor() const { /* Check that the members, one, is correctly initialized. */ QScopedPointer p; QCOMPARE(p.data(), static_cast(0)); } void tst_QScopedPointer::dataOnDefaultConstructed() const { QScopedPointer p; QCOMPARE(p.data(), static_cast(0)); } class MyClass { }; class MySubClass : public MyClass { }; void tst_QScopedPointer::useSubClassInConstructor() const { /* Use a syntax which users typically would do. */ QScopedPointer p(new MyClass()); } void tst_QScopedPointer::dataOnValue() const { int *const rawPointer = new int(5); QScopedPointer p(rawPointer); QCOMPARE(p.data(), rawPointer); } void tst_QScopedPointer::dataSignature() const { const QScopedPointer p; /* data() should be const. */ p.data(); } void tst_QScopedPointer::reset() const { /* Call reset() on a default constructed value. */ { QScopedPointer p; p.reset(); QCOMPARE(p.data(), static_cast(0)); } /* Call reset() on an active value. */ { QScopedPointer p(new int(3)); p.reset(); QCOMPARE(p.data(), static_cast(0)); } /* Call reset() with a value, on an active value. */ { QScopedPointer p(new int(3)); int *const value = new int(9); p.reset(value); QCOMPARE(*p.data(), 9); } /* Call reset() with a value, on default constructed value. */ { QScopedPointer p; int *const value = new int(9); p.reset(value); QCOMPARE(*p.data(), 9); } } class AbstractClass { public: virtual ~AbstractClass() { } virtual int member() const = 0; }; class SubClass : public AbstractClass { public: virtual int member() const { return 5; } }; void tst_QScopedPointer::dereferenceOperator() const { /* Dereference a basic value. */ { QScopedPointer p(new int(5)); const int value2 = *p; QCOMPARE(value2, 5); } /* Dereference a pointer to an abstract class. This verifies * that the operator returns a reference, when compiling * with MSVC 2005. */ { QScopedPointer p(new SubClass()); QCOMPARE((*p).member(), 5); } } void tst_QScopedPointer::dereferenceOperatorSignature() const { /* The operator should be const. */ { const QScopedPointer p(new int(5)); *p; } /* A reference should be returned, not a value. */ { const QScopedPointer p(new int(5)); Q_UNUSED(static_cast(*p)); } /* Instantiated on a const object, the returned object is a const reference. */ { const QScopedPointer p(new int(5)); Q_UNUSED(static_cast(*p)); } } class AnyForm { public: int value; }; void tst_QScopedPointer::pointerOperator() const { QScopedPointer p(new AnyForm()); p->value = 5; QCOMPARE(p->value, 5); } void tst_QScopedPointer::pointerOperatorSignature() const { /* The operator should be const. */ const QScopedPointer p(new AnyForm); p->value = 5; QVERIFY(p->value); } void tst_QScopedPointer::negationOperator() const { /* Invoke on default constructed value. */ { QScopedPointer p; QVERIFY(!p); } /* Invoke on a value. */ { QScopedPointer p(new int(2)); QCOMPARE(!p, false); } } void tst_QScopedPointer::negationOperatorSignature() const { /* The signature should be const. */ const QScopedPointer p; !p; /* The return value should be bool. */ static_cast(!p); } void tst_QScopedPointer::operatorBool() const { /* Invoke on default constructed value. */ { QScopedPointer p; QCOMPARE(bool(p), false); } /* Invoke on active value. */ { QScopedPointer p(new int(3)); QVERIFY(p); } } void tst_QScopedPointer::operatorBoolSignature() const { /* The signature should be const and return bool. */ const QScopedPointer p; static_cast(p); } void tst_QScopedPointer::isNull() const { /* Invoke on default constructed value. */ { QScopedPointer p; QVERIFY(p.isNull()); } /* Invoke on a set value. */ { QScopedPointer p(new int(69)); QVERIFY(!p.isNull()); } } void tst_QScopedPointer::isNullSignature() const { const QScopedPointer p(new int(69)); /* The signature should be const and return bool. */ static_cast(p.isNull()); } void tst_QScopedPointer::objectSize() const { /* The size of QScopedPointer should be the same as one pointer. */ QCOMPARE(sizeof(QScopedPointer), sizeof(void *)); } QTEST_MAIN(tst_QScopedPointer) #include "tst_qscopedpointer.moc"