/**************************************************************************** ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: http://www.qt-project.org/ ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** GNU Lesser General Public License Usage ** This file may be used under the terms of the GNU Lesser General Public ** License version 2.1 as published by the Free Software Foundation and ** appearing in the file LICENSE.LGPL included in the packaging of this ** file. Please review the following information to ensure the GNU Lesser ** General Public License version 2.1 requirements will be met: ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU General ** Public License version 3.0 as published by the Free Software Foundation ** and appearing in the file LICENSE.GPL included in the packaging of this ** file. Please review the following information to ensure the GNU General ** Public License version 3.0 requirements will be met: ** http://www.gnu.org/copyleft/gpl.html. ** ** Other Usage ** Alternatively, this file may be used in accordance with the terms and ** conditions contained in a signed written agreement between you and Nokia. ** ** ** ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include class tst_QGlobal: public QObject { Q_OBJECT private slots: void qIsNull(); void for_each(); void qassert(); void qtry(); void checkptr(); void qstaticassert(); void qConstructorFunction(); }; void tst_QGlobal::qIsNull() { double d = 0.0; float f = 0.0f; QVERIFY(::qIsNull(d)); QVERIFY(::qIsNull(f)); d += 0.000000001; f += 0.0000001f; QVERIFY(!::qIsNull(d)); QVERIFY(!::qIsNull(f)); } void tst_QGlobal::for_each() { QList list; list << 0 << 1 << 2 << 3 << 4 << 5; int counter = 0; foreach(int i, list) { QCOMPARE(i, counter++); } QCOMPARE(counter, list.count()); // do it again, to make sure we don't have any for-scoping // problems with older compilers counter = 0; foreach(int i, list) { QCOMPARE(i, counter++); } QCOMPARE(counter, list.count()); } void tst_QGlobal::qassert() { bool passed = false; if (false) { Q_ASSERT(false); } else { passed = true; } QVERIFY(passed); passed = false; if (false) { Q_ASSERT_X(false, "tst_QGlobal", "qassert"); } else { passed = true; } QVERIFY(passed); passed = false; if (false) Q_ASSERT(false); else passed = true; QVERIFY(passed); passed = false; if (false) Q_ASSERT_X(false, "tst_QGlobal", "qassert"); else passed = true; QVERIFY(passed); } void tst_QGlobal::qtry() { int i = 0; QT_TRY { i = 1; QT_THROW(42); i = 2; } QT_CATCH(int) { QCOMPARE(i, 1); i = 7; } #ifdef QT_NO_EXCEPTIONS QCOMPARE(i, 2); #else QCOMPARE(i, 7); #endif // check propper if/else scoping i = 0; if (true) { QT_TRY { i = 2; QT_THROW(42); i = 4; } QT_CATCH(int) { QCOMPARE(i, 2); i = 4; } } else { QCOMPARE(i, 0); } QCOMPARE(i, 4); i = 0; if (false) { QT_TRY { i = 2; QT_THROW(42); i = 4; } QT_CATCH(int) { QCOMPARE(i, 2); i = 2; } } else { i = 8; } QCOMPARE(i, 8); i = 0; if (false) { i = 42; } else { QT_TRY { i = 2; QT_THROW(42); i = 4; } QT_CATCH(int) { QCOMPARE(i, 2); i = 4; } } QCOMPARE(i, 4); } void tst_QGlobal::checkptr() { int i; QCOMPARE(q_check_ptr(&i), &i); const char *c = "hello"; QCOMPARE(q_check_ptr(c), c); } // Check Q_STATIC_ASSERT, It should compile // note that, we are not able to test Q_STATIC_ASSERT(false), to do it manually someone has // to replace expressions (in the asserts) one by one to false, and check if it breaks build. class MyTrue { public: MyTrue() { Q_STATIC_ASSERT(true); Q_STATIC_ASSERT(!false); Q_STATIC_ASSERT_X(true,""); Q_STATIC_ASSERT_X(!false,""); } ~MyTrue() { Q_STATIC_ASSERT(true); Q_STATIC_ASSERT(!false); Q_STATIC_ASSERT_X(true,""); Q_STATIC_ASSERT_X(!false,""); } Q_STATIC_ASSERT(true); Q_STATIC_ASSERT(!false); Q_STATIC_ASSERT_X(true,""); Q_STATIC_ASSERT_X(!false,""); }; struct MyExpresion { void foo() { Q_STATIC_ASSERT(sizeof(MyTrue) > 0); Q_STATIC_ASSERT(sizeof(MyTrue) > 0); Q_STATIC_ASSERT_X(sizeof(MyTrue) > 0,""); Q_STATIC_ASSERT_X(sizeof(MyTrue) > 0,""); } private: Q_STATIC_ASSERT(sizeof(MyTrue) > 0); Q_STATIC_ASSERT(sizeof(MyTrue) > 0); Q_STATIC_ASSERT_X(sizeof(MyTrue) > 0, ""); Q_STATIC_ASSERT_X(sizeof(MyTrue) > 0, ""); }; struct TypeDef { typedef int T; Q_STATIC_ASSERT(sizeof(T)); Q_STATIC_ASSERT_X(sizeof(T), ""); }; template struct Template { static const bool True = true; typedef typename T1::T DependentType; Q_STATIC_ASSERT(True); Q_STATIC_ASSERT(!!True); Q_STATIC_ASSERT(sizeof(DependentType)); Q_STATIC_ASSERT(!!sizeof(DependentType)); Q_STATIC_ASSERT_X(True, ""); Q_STATIC_ASSERT_X(!!True, ""); Q_STATIC_ASSERT_X(sizeof(DependentType), ""); Q_STATIC_ASSERT_X(!!sizeof(DependentType), ""); }; struct MyTemplate { static const bool Value = Template::True; Q_STATIC_ASSERT(Value); Q_STATIC_ASSERT(!!Value); Q_STATIC_ASSERT_X(Value, ""); Q_STATIC_ASSERT_X(!!Value, ""); }; void tst_QGlobal::qstaticassert() { // Force compilation of these classes MyTrue tmp1; MyExpresion tmp2; MyTemplate tmp3; Q_UNUSED(tmp1); Q_UNUSED(tmp2); Q_UNUSED(tmp3); QVERIFY(true); // if the test compiles it has passed. } static int qConstructorFunctionValue; static void qConstructorFunctionCtor() { qConstructorFunctionValue = 123; } Q_CONSTRUCTOR_FUNCTION(qConstructorFunctionCtor); void tst_QGlobal::qConstructorFunction() { QCOMPARE(qConstructorFunctionValue, 123); } QTEST_MAIN(tst_QGlobal) #include "tst_qglobal.moc"