diff options
| author | Christian Kandeler <christian.kandeler@digia.com> | 2013-02-07 17:31:59 +0100 |
|---|---|---|
| committer | Joerg Bornemann <joerg.bornemann@digia.com> | 2013-02-08 17:29:16 +0100 |
| commit | a0442f40968da79b4b0e50e665a8885b78769df7 (patch) | |
| tree | 019f0f27456b57e49079221adaf3d48e277e2674 /src/lib/buildgraph/tst_buildgraph.cpp | |
| parent | a9f9ea2dbfa327b7bf5e4247c073d2ba6eaef30b (diff) | |
| download | qbs-a0442f40968da79b4b0e50e665a8885b78769df7.tar.gz | |
Build a shared library.
We don't want our code to be duplicated in memory for each application
that uses it, so the library should not be linked statically.
Some ramifications worth mentioning:
- The unit tests had to be moved into the library,
because otherwise we would need to export random
internal symbols. This is why the patch appears so big.
A follow-up patch should probably make compilation
of tests optional, so the library can be deployed without
unneeded code.
- The DESTDIR of the auto test executables is now the
same as the one of all other executables, so they
can all use the dll on Windows without additional
setup.
- Some internal symbols were exported, namely:
a) Logging-related stuff. This allows us to use
a uniform logging approach in the library and in
our command-line tools; I consider this acceptable.
b) A handful of classes and functions currently needed
by certain command-line tools. These seem more questionable
to me and we should probably find a different way to implement
the respective functionality.
Change-Id: I9cd21e12cd622b55cf62f5e04ad398734410ede1
Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
Diffstat (limited to 'src/lib/buildgraph/tst_buildgraph.cpp')
| -rw-r--r-- | src/lib/buildgraph/tst_buildgraph.cpp | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/src/lib/buildgraph/tst_buildgraph.cpp b/src/lib/buildgraph/tst_buildgraph.cpp new file mode 100644 index 000000000..3c9c208ff --- /dev/null +++ b/src/lib/buildgraph/tst_buildgraph.cpp @@ -0,0 +1,113 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Build Suite. +** +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/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 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, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ +#include "tst_buildgraph.h" + +#include <buildgraph/artifact.h> +#include <buildgraph/buildproduct.h> +#include <buildgraph/cycledetector.h> +#include <language/language.h> +#include <logging/logger.h> +#include <tools/error.h> + +#include <QtTest> + +namespace qbs { +namespace Internal { + +TestBuildGraph::TestBuildGraph(ILogSink *logSink) : m_logSink(logSink) +{ +} + +void TestBuildGraph::initTestCase() +{ +} + +void TestBuildGraph::cleanupTestCase() +{ + qDeleteAll(m_artifacts); +} + + +bool TestBuildGraph::cycleDetected(const BuildProductConstPtr &product) +{ + try { + CycleDetector(Logger(m_logSink)).visitProduct(product); + return false; + } catch (const Error &) { + return true; + } +} + +BuildProductConstPtr TestBuildGraph::productWithDirectCycle() +{ + Artifact * const root = new Artifact; + Artifact * const child = new Artifact; + m_artifacts << root << child; + root->children.insert(child); + child->children.insert(root); + const BuildProductPtr product = BuildProduct::create(); + product->targetArtifacts.insert(root); + return product; +} + +BuildProductConstPtr TestBuildGraph::productWithLessDirectCycle() +{ + Artifact * const root = new Artifact; + Artifact * const child = new Artifact; + Artifact * const grandchild = new Artifact; + m_artifacts << root << child << grandchild; + root->children.insert(child); + child->children.insert(grandchild); + grandchild->children.insert(root); + const BuildProductPtr product = BuildProduct::create(); + product->targetArtifacts << root; + return product; +} + +// root appears as a child, but in a different tree +BuildProductConstPtr TestBuildGraph::productWithNoCycle() +{ + Artifact * const root = new Artifact; + Artifact * const root2 = new Artifact; + m_artifacts << root << root2; + root2->children.insert(root); + const BuildProductPtr product = BuildProduct::create(); + product->targetArtifacts << root << root2; + return product; +} + +void TestBuildGraph::testCycle() +{ + QVERIFY(cycleDetected(productWithDirectCycle())); + QVERIFY(cycleDetected(productWithLessDirectCycle())); + QVERIFY(!cycleDetected(productWithNoCycle())); +} + +} // namespace Internal +} // namespace qbs |
