From 39a56f719a24a75e303d3a34f73a9c8cb1a01a34 Mon Sep 17 00:00:00 2001 From: Karsten Heimrich Date: Tue, 7 Jul 2015 13:13:09 +0200 Subject: 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 --- tests/auto/installer/factory/factory.pro | 5 + tests/auto/installer/factory/tst_factory.cpp | 228 +++++++++++++++++++++++++++ tests/auto/installer/installer.pro | 3 +- 3 files changed, 235 insertions(+), 1 deletion(-) create mode 100644 tests/auto/installer/factory/factory.pro create mode 100644 tests/auto/installer/factory/tst_factory.cpp (limited to 'tests') 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 + +#include +#include + +#include + +class Food { +public: + explicit Food(int amount) + : m_amount(amount) + {} + virtual ~Food() {} + + int available() const { + return m_amount; + } + virtual QDate expireDate() const = 0; + + template + static Food *create(Args... args) { + qDebug().nospace().noquote() << "Create function."; + return new T(std::forward(args)...); + } + +private: + int m_amount; +}; + +class EggStore : public KDGenericFactory +{ +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 +{ +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 + { + public: + static EggStore &instance() { + static EggStore factory; + return factory; + } + }; + + EggStore::instance().registerProduct("Egg"); + QCOMPARE(EggStore::instance().containsProduct("Egg"), true); + // EggStore::instance().registerProduct("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); + 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"); + FoodStore::instance().registerProduct("Butter", &Butter::create); + FoodStore::instance().registerProduct("ColdCuts"); + // FoodStore::instance().registerProduct("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); + 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 -- cgit v1.2.3