From 95263dbf7a7fe6ae72abc59b7a576ab66b886238 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Thu, 6 Apr 2017 19:36:47 +0200 Subject: [PATCH] Add a test for container API symmetry Akin to the successful tst_QStringApiSymmetry, add such a test for generic containers, too. Yes, we have tst_collections, but it's a cut'n'paste mess that makes it hard to systematically perform cross-class checks for consistency. This new test, still in its infancy, uses templates and thus ensures that exactly the same checks are run on all containers. Starting out with front()/back(), which the string classes were found to lack, we will build this test up, as we did and continue to do with the string API one. Change-Id: I07323340b5612ecc658232b2776d788018010d0d Reviewed-by: Lars Knoll --- .../tools/containerapisymmetry/.gitignore | 1 + .../containerapisymmetry.pro | 7 ++ .../tst_containerapisymmetry.cpp | 84 +++++++++++++++++++ tests/auto/corelib/tools/tools.pro | 1 + 4 files changed, 93 insertions(+) create mode 100644 tests/auto/corelib/tools/containerapisymmetry/.gitignore create mode 100644 tests/auto/corelib/tools/containerapisymmetry/containerapisymmetry.pro create mode 100644 tests/auto/corelib/tools/containerapisymmetry/tst_containerapisymmetry.cpp diff --git a/tests/auto/corelib/tools/containerapisymmetry/.gitignore b/tests/auto/corelib/tools/containerapisymmetry/.gitignore new file mode 100644 index 0000000000..172ca970f2 --- /dev/null +++ b/tests/auto/corelib/tools/containerapisymmetry/.gitignore @@ -0,0 +1 @@ +tst_containerapisymmetry diff --git a/tests/auto/corelib/tools/containerapisymmetry/containerapisymmetry.pro b/tests/auto/corelib/tools/containerapisymmetry/containerapisymmetry.pro new file mode 100644 index 0000000000..30dc8026ef --- /dev/null +++ b/tests/auto/corelib/tools/containerapisymmetry/containerapisymmetry.pro @@ -0,0 +1,7 @@ +CONFIG += testcase +TARGET = tst_containerapisymmetry +SOURCES += tst_containerapisymmetry.cpp +QT = core testlib + +# This test does not work with strict iterators +DEFINES -= QT_STRICT_ITERATORS diff --git a/tests/auto/corelib/tools/containerapisymmetry/tst_containerapisymmetry.cpp b/tests/auto/corelib/tools/containerapisymmetry/tst_containerapisymmetry.cpp new file mode 100644 index 0000000000..d7ec624804 --- /dev/null +++ b/tests/auto/corelib/tools/containerapisymmetry/tst_containerapisymmetry.cpp @@ -0,0 +1,84 @@ +/**************************************************************************** +** +** Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include + +#include "qlinkedlist.h" +#include "qlist.h" +#include "qvarlengtharray.h" +#include "qvector.h" + +#include // for reference + +class tst_ContainerApiSymmetry : public QObject +{ + Q_OBJECT + +private: + template + void front_back_impl() const; + +private Q_SLOTS: + void front_back_std_vector() { front_back_impl>(); } + void front_back_QVector() { front_back_impl>(); } + void front_back_QList() { front_back_impl>(); } + void front_back_QLinkedList() { front_back_impl>(); } + void front_back_QVarLengthArray() { front_back_impl>(); } +}; + +template +Container make(int size) +{ + Container c; + int i = 1; + while (size--) + c.push_back(typename Container::value_type(i++)); + return c; +} + +template T clean(T &&t) { return std::forward(t); } + +template +void tst_ContainerApiSymmetry::front_back_impl() const +{ + using V = typename Container::value_type; + auto c1 = make(1); + QCOMPARE(clean(c1.front()), V(1)); + QCOMPARE(clean(c1.back()), V(1)); + QCOMPARE(clean(qAsConst(c1).front()), V(1)); + QCOMPARE(clean(qAsConst(c1).back()), V(1)); + + auto c2 = make(2); + QCOMPARE(clean(c2.front()), V(1)); + QCOMPARE(clean(c2.back()), V(2)); + QCOMPARE(clean(qAsConst(c2).front()), V(1)); + QCOMPARE(clean(qAsConst(c2).back()), V(2)); +} + +QTEST_APPLESS_MAIN(tst_ContainerApiSymmetry) +#include "tst_containerapisymmetry.moc" diff --git a/tests/auto/corelib/tools/tools.pro b/tests/auto/corelib/tools/tools.pro index e16648c15f..6720307d59 100644 --- a/tests/auto/corelib/tools/tools.pro +++ b/tests/auto/corelib/tools/tools.pro @@ -1,6 +1,7 @@ TEMPLATE=subdirs SUBDIRS=\ collections \ + containerapisymmetry \ qalgorithms \ qarraydata \ qarraydata_strictiterators \