diff options
author | Robert Griebl <rgriebl@trolltech.com> | 2009-06-10 11:46:23 (GMT) |
---|---|---|
committer | Robert Griebl <rgriebl@trolltech.com> | 2009-06-10 11:46:23 (GMT) |
commit | 7604f8087f88171ef933d8ae08f501467e647338 (patch) | |
tree | 51d071f462ed48d0b25884d9f62b8ba11c5dff13 /tests/auto/qscopedpointer | |
parent | 8c265860b41214daade7c8a28237c1e07ea71a3c (diff) | |
download | Qt-7604f8087f88171ef933d8ae08f501467e647338.zip Qt-7604f8087f88171ef933d8ae08f501467e647338.tar.gz Qt-7604f8087f88171ef933d8ae08f501467e647338.tar.bz2 |
Make Qt exception safer.
Squashed commit of the branch haralds-haralds-qt-s60-topics/topic/exceptions,
which also contains the full history.
Rev-By: Harald Fernengel
Rev-By: Ralf Engels
Diffstat (limited to 'tests/auto/qscopedpointer')
-rw-r--r-- | tests/auto/qscopedpointer/.gitignore | 1 | ||||
-rw-r--r-- | tests/auto/qscopedpointer/qscopedpointer.pro | 3 | ||||
-rw-r--r-- | tests/auto/qscopedpointer/tst_qscopedpointer.cpp | 282 |
3 files changed, 286 insertions, 0 deletions
diff --git a/tests/auto/qscopedpointer/.gitignore b/tests/auto/qscopedpointer/.gitignore new file mode 100644 index 0000000..9f2324c --- /dev/null +++ b/tests/auto/qscopedpointer/.gitignore @@ -0,0 +1 @@ +tst_qscopedpointer diff --git a/tests/auto/qscopedpointer/qscopedpointer.pro b/tests/auto/qscopedpointer/qscopedpointer.pro new file mode 100644 index 0000000..13d8425 --- /dev/null +++ b/tests/auto/qscopedpointer/qscopedpointer.pro @@ -0,0 +1,3 @@ +load(qttest_p4) +SOURCES += tst_qscopedpointer.cpp +QT -= gui diff --git a/tests/auto/qscopedpointer/tst_qscopedpointer.cpp b/tests/auto/qscopedpointer/tst_qscopedpointer.cpp new file mode 100644 index 0000000..0e005c3 --- /dev/null +++ b/tests/auto/qscopedpointer/tst_qscopedpointer.cpp @@ -0,0 +1,282 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +****************************************************************************/ + +#include <QtTest/QtTest> +#include <QtCore/QScopedPointer> + +/*! + \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<int> p; + QCOMPARE(p.data(), static_cast<int *>(0)); +} + +void tst_QScopedPointer::dataOnDefaultConstructed() const +{ + QScopedPointer<int> p; + + QCOMPARE(p.data(), static_cast<int *>(0)); +} + +class MyClass +{ +}; + +class MySubClass : public MyClass +{ +}; + +void tst_QScopedPointer::useSubClassInConstructor() const +{ + /* Use a syntax which users typically would do. */ + QScopedPointer<MyClass> p(new MyClass()); +} + +void tst_QScopedPointer::dataOnValue() const +{ + int *const rawPointer = new int(5); + QScopedPointer<int> p(rawPointer); + + QCOMPARE(p.data(), rawPointer); +} + +void tst_QScopedPointer::dataSignature() const +{ + const QScopedPointer<int> p; + /* data() should be const. */ + p.data(); +} + +void tst_QScopedPointer::reset() const +{ + /* Call reset() on a default constructed value. */ + { + QScopedPointer<int> p; + p.reset(); + QCOMPARE(p.data(), static_cast<int *>(0)); + } + + /* Call reset() on an active value. */ + { + QScopedPointer<int> p(new int(3)); + p.reset(); + QCOMPARE(p.data(), static_cast<int *>(0)); + } + + /* Call reset() with a value, on an active value. */ + { + QScopedPointer<int> 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<int> 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<int> 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<AbstractClass> p(new SubClass()); + + QCOMPARE((*p).member(), 5); + } +} + +void tst_QScopedPointer::dereferenceOperatorSignature() const +{ + /* The operator should be const. */ + { + const QScopedPointer<int> p(new int(5)); + *p; + } + + /* A reference should be returned, not a value. */ + { + const QScopedPointer<int> p(new int(5)); + Q_UNUSED(static_cast<int &>(*p)); + } + + /* Instantiated on a const object, the returned object is a const reference. */ + { + const QScopedPointer<const int> p(new int(5)); + Q_UNUSED(static_cast<const int &>(*p)); + } +} + +class AnyForm +{ +public: + int value; +}; + +void tst_QScopedPointer::pointerOperator() const +{ + QScopedPointer<AnyForm> p(new AnyForm()); + p->value = 5; + + QCOMPARE(p->value, 5); +} + +void tst_QScopedPointer::pointerOperatorSignature() const +{ + /* The operator should be const. */ + const QScopedPointer<AnyForm> p(new AnyForm); + p->value = 5; + + QVERIFY(p->value); +} + +void tst_QScopedPointer::negationOperator() const +{ + /* Invoke on default constructed value. */ + { + QScopedPointer<int> p; + QVERIFY(!p); + } + + /* Invoke on a value. */ + { + QScopedPointer<int> p(new int(2)); + QCOMPARE(!p, false); + } +} + +void tst_QScopedPointer::negationOperatorSignature() const +{ + /* The signature should be const. */ + const QScopedPointer<int> p; + !p; + + /* The return value should be bool. */ + static_cast<bool>(!p); +} + +void tst_QScopedPointer::operatorBool() const +{ + /* Invoke on default constructed value. */ + { + QScopedPointer<int> p; + QCOMPARE(bool(p), false); + } + + /* Invoke on active value. */ + { + QScopedPointer<int> p(new int(3)); + QVERIFY(p); + } +} + +void tst_QScopedPointer::operatorBoolSignature() const +{ + /* The signature should be const and return bool. */ + const QScopedPointer<int> p; + + static_cast<bool>(p); +} + +void tst_QScopedPointer::isNull() const +{ + /* Invoke on default constructed value. */ + { + QScopedPointer<int> p; + QVERIFY(p.isNull()); + } + + /* Invoke on a set value. */ + { + QScopedPointer<int> p(new int(69)); + QVERIFY(!p.isNull()); + } +} + +void tst_QScopedPointer::isNullSignature() const +{ + const QScopedPointer<int> p(new int(69)); + + /* The signature should be const and return bool. */ + static_cast<bool>(p.isNull()); +} + +void tst_QScopedPointer::objectSize() const +{ + /* The size of QScopedPointer should be the same as one pointer. */ + QCOMPARE(sizeof(QScopedPointer<int>), sizeof(void *)); +} + +QTEST_MAIN(tst_QScopedPointer) +#include "tst_qscopedpointer.moc" |