diff options
author | Karsten Heimrich <karsten.heimrich@theqtcompany.com> | 2015-07-07 13:13:09 +0200 |
---|---|---|
committer | Karsten Heimrich <karsten.heimrich@theqtcompany.com> | 2015-07-10 08:53:49 +0000 |
commit | 39a56f719a24a75e303d3a34f73a9c8cb1a01a34 (patch) | |
tree | b5e3c3c68ef0c23eb1a06dfe9c7586e3337ae80e /tests/auto | |
parent | d01de18c1edfc7613f5c521452b595e71cd6e94d (diff) |
Add factory auto test. Update template parameter + documentation.
The create function cannot be documented properly, cause qdoc
does not understand the ellipsis(...) operator as of right now.
Change-Id: I6569372ed37621eeaaa7a41ea49aa795676ca65b
Reviewed-by: Kai Koehne <kai.koehne@theqtcompany.com>
Diffstat (limited to 'tests/auto')
-rw-r--r-- | tests/auto/installer/factory/factory.pro | 5 | ||||
-rw-r--r-- | tests/auto/installer/factory/tst_factory.cpp | 228 | ||||
-rw-r--r-- | tests/auto/installer/installer.pro | 3 |
3 files changed, 235 insertions, 1 deletions
diff --git a/tests/auto/installer/factory/factory.pro b/tests/auto/installer/factory/factory.pro new file mode 100644 index 000000000..b87f23bab --- /dev/null +++ b/tests/auto/installer/factory/factory.pro @@ -0,0 +1,5 @@ +include(../../qttest.pri) + +QT -= gui + +SOURCES += tst_factory.cpp diff --git a/tests/auto/installer/factory/tst_factory.cpp b/tests/auto/installer/factory/tst_factory.cpp new file mode 100644 index 000000000..bd77f1877 --- /dev/null +++ b/tests/auto/installer/factory/tst_factory.cpp @@ -0,0 +1,228 @@ +/************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Installer Framework. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 http://qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** +** $QT_END_LICENSE$ +** +**************************************************************************/ + +#include <kdgenericfactory.h> + +#include <QDebug> +#include <QTest> + +#include <functional> + +class Food { +public: + explicit Food(int amount) + : m_amount(amount) + {} + virtual ~Food() {} + + int available() const { + return m_amount; + } + virtual QDate expireDate() const = 0; + + template <typename T, typename... Args> + static Food *create(Args... args) { + qDebug().nospace().noquote() << "Create function."; + return new T(std::forward<Args>(args)...); + } + +private: + int m_amount; +}; + +class EggStore : public KDGenericFactory<Food, QString, int> +{ +public: + static EggStore &instance() { + static EggStore factory; + return factory; + } +}; + +class Bread : public Food +{ +public: + Bread(int amount, const QDate &expireDate) + : Food(amount) + , m_expireDate(expireDate) + { qDebug().nospace().noquote() << "Constructor."; } + QDate expireDate() const { + return m_expireDate; + } +private: + QDate m_expireDate; +}; + +class Butter : public Food +{ +public: + QDate expireDate() const { + return m_expireDate; + } + static Food *create(int amount, const QDate expireDate) { + qDebug().nospace().noquote() << "Create function."; + return new Butter(amount, expireDate); + } + +private: + Butter(int amount, const QDate &expireDate) + : Food(amount) + , m_expireDate(expireDate) + { qDebug().nospace().noquote() << "Constructor."; } + +private: + QDate m_expireDate; +}; + +class ColdCuts : public Food +{ +public: + ColdCuts(int amount, const QDate &expireDate) + : Food(amount) + , m_expireDate(expireDate) + { qDebug().nospace().noquote() << "Constructor."; } + QDate expireDate() const { + return m_expireDate; + } + +private: + QDate m_expireDate; +}; + +class FoodStore : public KDGenericFactory<Food, QString, int, QDate> +{ +public: + static FoodStore &instance() { + static FoodStore factory; + return factory; + } +}; + +class tst_Factory : public QObject +{ + Q_OBJECT + +private slots: + void testSingleArg() + { + class Egg : public Food + { + public: + explicit Egg(int amount) + : Food(amount) + { qDebug().nospace().noquote() << "Constructor."; } + QDate expireDate() const { + return QDate::currentDate().addDays(1); + } + private: + QDate m_expireDate; + }; + class EggStore : public KDGenericFactory<Food, QString, int> + { + public: + static EggStore &instance() { + static EggStore factory; + return factory; + } + }; + + EggStore::instance().registerProduct<Egg>("Egg"); + QCOMPARE(EggStore::instance().containsProduct("Egg"), true); + // EggStore::instance().registerProduct<Bread>("Bread"); // Does not compile. + + QTest::ignoreMessage(QtDebugMsg, "Constructor."); + auto food = EggStore::instance().create("Egg", 100); + QCOMPARE(food->available(), 100); + QCOMPARE(food->expireDate(), QDate::currentDate().addDays(1)); + + QTest::ignoreMessage(QtDebugMsg, "Create function."); + QTest::ignoreMessage(QtDebugMsg, "Constructor."); + EggStore::instance().registerProduct("Egg", &Egg::create<Egg, int>); + food = EggStore::instance().create("Egg", 10); + QCOMPARE(food->available(), 10); + QCOMPARE(food->expireDate(), QDate::currentDate().addDays(1)); + + auto lambda = [](int amount) -> Food* { return new Egg(amount); }; + EggStore::instance().registerProduct("Egg", lambda); + + QTest::ignoreMessage(QtDebugMsg, "Constructor."); + food = EggStore::instance().create("Egg", 20); + QCOMPARE(food->available(), 20); + QCOMPARE(food->expireDate(), QDate::currentDate().addDays(1)); + } + + void testMultiArg() + { + FoodStore::instance().registerProduct<Bread>("Bread"); + FoodStore::instance().registerProduct("Butter", &Butter::create); + FoodStore::instance().registerProduct<ColdCuts>("ColdCuts"); + // FoodStore::instance().registerProduct<Eggs>("Eggs"); // Does not compile. + + QCOMPARE(FoodStore::instance().containsProduct("Bread"), true); + QCOMPARE(FoodStore::instance().containsProduct("Butter"), true); + QCOMPARE(FoodStore::instance().containsProduct("ColdCuts"), true); + QCOMPARE(FoodStore::instance().containsProduct("Sandwich"), false); + + QTest::ignoreMessage(QtDebugMsg, "Constructor."); + auto food = FoodStore::instance().create("Bread", 10, QDate::currentDate().addDays(7)); + QCOMPARE(food->available(), 10); + QCOMPARE(food->expireDate(), QDate::currentDate().addDays(7)); + + QTest::ignoreMessage(QtDebugMsg, "Create function."); + QTest::ignoreMessage(QtDebugMsg, "Constructor."); + food = FoodStore::instance().create("Butter", 2, QDate::currentDate().addDays(3)); + QCOMPARE(food->available(), 2); + QCOMPARE(food->expireDate(), QDate::currentDate().addDays(3)); + + QTest::ignoreMessage(QtDebugMsg, "Constructor."); + food = FoodStore::instance().create("ColdCuts", 50, QDate::currentDate().addDays(5)); + QCOMPARE(food->available(), 50); + QCOMPARE(food->expireDate(), QDate::currentDate().addDays(5)); + + food = FoodStore::instance().create("Sandwich", 50, QDate::currentDate()); + QCOMPARE(food == Q_NULLPTR, true); + + // overwrites the existing registration + FoodStore::instance().registerProduct("ColdCuts", &ColdCuts::create<ColdCuts, int, QDate>); + QTest::ignoreMessage(QtDebugMsg, "Create function."); + QTest::ignoreMessage(QtDebugMsg, "Constructor."); + food = FoodStore::instance().create("ColdCuts", 100, QDate::currentDate().addDays(4)); + QCOMPARE(food->available(), 100); + QCOMPARE(food->expireDate(), QDate::currentDate().addDays(4)); + } +}; + +QTEST_MAIN(tst_Factory) + +#include "tst_factory.moc" diff --git a/tests/auto/installer/installer.pro b/tests/auto/installer/installer.pro index 0bd5e8690..dfdb23995 100644 --- a/tests/auto/installer/installer.pro +++ b/tests/auto/installer/installer.pro @@ -17,4 +17,5 @@ SUBDIRS += \ packagemanagercore \ settingsoperation \ task \ - clientserver + clientserver \ + factory |