summaryrefslogtreecommitdiffstats
path: root/tests/auto/gui/util
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/gui/util')
-rw-r--r--tests/auto/gui/util/CMakeLists.txt8
-rw-r--r--tests/auto/gui/util/qdesktopservices/CMakeLists.txt13
-rw-r--r--tests/auto/gui/util/qdesktopservices/tst_qdesktopservices.cpp50
-rw-r--r--tests/auto/gui/util/qdoublevalidator/CMakeLists.txt11
-rw-r--r--tests/auto/gui/util/qdoublevalidator/tst_qdoublevalidator.cpp120
-rw-r--r--tests/auto/gui/util/qintvalidator/CMakeLists.txt11
-rw-r--r--tests/auto/gui/util/qintvalidator/tst_qintvalidator.cpp75
-rw-r--r--tests/auto/gui/util/qregularexpressionvalidator/CMakeLists.txt11
-rw-r--r--tests/auto/gui/util/qregularexpressionvalidator/tst_qregularexpressionvalidator.cpp37
-rw-r--r--tests/auto/gui/util/qshadergenerator/CMakeLists.txt13
-rw-r--r--tests/auto/gui/util/qshadergenerator/tst_qshadergenerator.cpp1428
-rw-r--r--tests/auto/gui/util/qshadergraph/CMakeLists.txt13
-rw-r--r--tests/auto/gui/util/qshadergraph/tst_qshadergraph.cpp815
-rw-r--r--tests/auto/gui/util/qshadergraphloader/CMakeLists.txt13
-rw-r--r--tests/auto/gui/util/qshadergraphloader/tst_qshadergraphloader.cpp627
-rw-r--r--tests/auto/gui/util/qshadernodes/CMakeLists.txt13
-rw-r--r--tests/auto/gui/util/qshadernodes/tst_qshadernodes.cpp548
-rw-r--r--tests/auto/gui/util/qshadernodesloader/CMakeLists.txt13
-rw-r--r--tests/auto/gui/util/qshadernodesloader/tst_qshadernodesloader.cpp327
-rw-r--r--tests/auto/gui/util/qtexturefilereader/CMakeLists.txt29
-rw-r--r--tests/auto/gui/util/qtexturefilereader/qtexturefilereader.qrc11
-rw-r--r--tests/auto/gui/util/qtexturefilereader/texturefiles/invalid.ktxbin0 -> 69 bytes
-rw-r--r--tests/auto/gui/util/qtexturefilereader/tst_qtexturefilereader.cpp42
-rw-r--r--tests/auto/gui/util/qundogroup/CMakeLists.txt11
-rw-r--r--tests/auto/gui/util/qundogroup/tst_qundogroup.cpp49
-rw-r--r--tests/auto/gui/util/qundostack/CMakeLists.txt11
-rw-r--r--tests/auto/gui/util/qundostack/tst_qundostack.cpp73
27 files changed, 234 insertions, 4138 deletions
diff --git a/tests/auto/gui/util/CMakeLists.txt b/tests/auto/gui/util/CMakeLists.txt
index 4feae26818..830a9ff2f0 100644
--- a/tests/auto/gui/util/CMakeLists.txt
+++ b/tests/auto/gui/util/CMakeLists.txt
@@ -1,14 +1,10 @@
-# Generated from util.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
add_subdirectory(qdesktopservices)
add_subdirectory(qdoublevalidator)
add_subdirectory(qintvalidator)
add_subdirectory(qregularexpressionvalidator)
-add_subdirectory(qshadergenerator)
-add_subdirectory(qshadergraph)
-add_subdirectory(qshadergraphloader)
-add_subdirectory(qshadernodes)
-add_subdirectory(qshadernodesloader)
add_subdirectory(qtexturefilereader)
add_subdirectory(qundogroup)
add_subdirectory(qundostack)
diff --git a/tests/auto/gui/util/qdesktopservices/CMakeLists.txt b/tests/auto/gui/util/qdesktopservices/CMakeLists.txt
index 475a3405c0..64a1aaa930 100644
--- a/tests/auto/gui/util/qdesktopservices/CMakeLists.txt
+++ b/tests/auto/gui/util/qdesktopservices/CMakeLists.txt
@@ -1,14 +1,19 @@
-# Generated from qdesktopservices.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
#####################################################################
## tst_qdesktopservices Test:
#####################################################################
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_qdesktopservices LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
qt_internal_add_test(tst_qdesktopservices
SOURCES
tst_qdesktopservices.cpp
- DEFINES
- # QT_DISABLE_DEPRECATED_BEFORE=0 # special case
- PUBLIC_LIBRARIES
+ LIBRARIES
Qt::Gui
)
diff --git a/tests/auto/gui/util/qdesktopservices/tst_qdesktopservices.cpp b/tests/auto/gui/util/qdesktopservices/tst_qdesktopservices.cpp
index 7446f8ed9f..e08b299209 100644
--- a/tests/auto/gui/util/qdesktopservices/tst_qdesktopservices.cpp
+++ b/tests/auto/gui/util/qdesktopservices/tst_qdesktopservices.cpp
@@ -1,36 +1,13 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** 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$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QTest>
#include <qdesktopservices.h>
#include <qregularexpression.h>
+using namespace Qt::StringLiterals;
+
class tst_qdesktopservices : public QObject
{
Q_OBJECT
@@ -65,6 +42,10 @@ public slots:
}
};
+#if QT_VERSION < QT_VERSION_CHECK(6, 6, 0)
+# define CAN_IMPLICITLY_UNSET
+#endif
+
void tst_qdesktopservices::handlers()
{
MyUrlHandler fooHandler;
@@ -72,6 +53,12 @@ void tst_qdesktopservices::handlers()
QDesktopServices::setUrlHandler(QString("foo"), &fooHandler, "handle");
QDesktopServices::setUrlHandler(QString("bar"), &barHandler, "handle");
+#ifndef CAN_IMPLICITLY_UNSET
+ const auto unsetHandlers = qScopeGuard([] {
+ QDesktopServices::unsetUrlHandler(u"bar"_s);
+ QDesktopServices::unsetUrlHandler(u"foo"_s);
+ });
+#endif
QUrl fooUrl("foo://blub/meh");
QUrl barUrl("bar://hmm/hmmmm");
@@ -81,6 +68,15 @@ void tst_qdesktopservices::handlers()
QCOMPARE(fooHandler.lastHandledUrl.toString(), fooUrl.toString());
QCOMPARE(barHandler.lastHandledUrl.toString(), barUrl.toString());
+
+#ifdef CAN_IMPLICITLY_UNSET
+ for (int i = 0; i < 2; ++i)
+ QTest::ignoreMessage(QtWarningMsg,
+ "Please call QDesktopServices::unsetUrlHandler() before destroying a "
+ "registered URL handler object.\n"
+ "Support for destroying a registered URL handler object is deprecated, "
+ "and will be removed in Qt 6.6.");
+#endif
}
QTEST_MAIN(tst_qdesktopservices)
diff --git a/tests/auto/gui/util/qdoublevalidator/CMakeLists.txt b/tests/auto/gui/util/qdoublevalidator/CMakeLists.txt
index 27996300d7..f79fe8b00c 100644
--- a/tests/auto/gui/util/qdoublevalidator/CMakeLists.txt
+++ b/tests/auto/gui/util/qdoublevalidator/CMakeLists.txt
@@ -1,12 +1,19 @@
-# Generated from qdoublevalidator.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
#####################################################################
## tst_qdoublevalidator Test:
#####################################################################
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_qdoublevalidator LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
qt_internal_add_test(tst_qdoublevalidator
SOURCES
tst_qdoublevalidator.cpp
- PUBLIC_LIBRARIES
+ LIBRARIES
Qt::Gui
)
diff --git a/tests/auto/gui/util/qdoublevalidator/tst_qdoublevalidator.cpp b/tests/auto/gui/util/qdoublevalidator/tst_qdoublevalidator.cpp
index 77d52682f6..b44975ea0b 100644
--- a/tests/auto/gui/util/qdoublevalidator/tst_qdoublevalidator.cpp
+++ b/tests/auto/gui/util/qdoublevalidator/tst_qdoublevalidator.cpp
@@ -1,30 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** 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$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QTest>
@@ -168,6 +143,7 @@ void tst_QDoubleValidator::validate_data()
QTest::newRow("data56") << "C" << 1229.0 << 1231.0 << -1 << QString("123E+") << ITM << INV;
QTest::newRow("data57") << "C" << 1229.0 << 1231.0 << -1 << QString("123E+1") << ACC << INV;
QTest::newRow("data58") << "C" << 0.0 << 100.0 << -1 << QString("0.0") << ACC << ACC;
+ QTest::newRow("overlong") << "C" << 0.0 << 99.9 << 2 << QString("1234.0") << ITM << INV;
QTest::newRow("data_de0") << "de" << 0.0 << 100.0 << 1 << QString("50,0") << ACC << ACC;
QTest::newRow("data_de1") << "de" << 00.0 << 100.0 << 1 << QString("500,0") << ITM << ITM;
@@ -335,74 +311,74 @@ void tst_QDoubleValidator::notifySignals()
QCOMPARE(dv.decimals(), 10);
dv.setTop(0.8);
- QCOMPARE(topSpy.count(), 1);
- QCOMPARE(changedSpy.count(), 1);
+ QCOMPARE(topSpy.size(), 1);
+ QCOMPARE(changedSpy.size(), 1);
QCOMPARE(dv.top(), 0.8);
dv.setBottom(0.2);
- QCOMPARE(bottomSpy.count(), 1);
- QCOMPARE(changedSpy.count(), 2);
+ QCOMPARE(bottomSpy.size(), 1);
+ QCOMPARE(changedSpy.size(), 2);
QCOMPARE(dv.bottom(), 0.2);
dv.setRange(0.2, 0.7);
- QCOMPARE(topSpy.count(), 2);
- QCOMPARE(bottomSpy.count(), 1);
- QCOMPARE(decSpy.count(), 0);
- QCOMPARE(changedSpy.count(), 3);
+ QCOMPARE(topSpy.size(), 2);
+ QCOMPARE(bottomSpy.size(), 1);
+ QCOMPARE(decSpy.size(), 0);
+ QCOMPARE(changedSpy.size(), 3);
QCOMPARE(dv.bottom(), 0.2);
QCOMPARE(dv.top(), 0.7);
QCOMPARE(dv.decimals(), 10);
dv.setRange(0.3, 0.7);
- QCOMPARE(topSpy.count(), 2);
- QCOMPARE(bottomSpy.count(), 2);
- QCOMPARE(changedSpy.count(), 4);
+ QCOMPARE(topSpy.size(), 2);
+ QCOMPARE(bottomSpy.size(), 2);
+ QCOMPARE(changedSpy.size(), 4);
QCOMPARE(dv.bottom(), 0.3);
QCOMPARE(dv.top(), 0.7);
QCOMPARE(dv.decimals(), 10);
dv.setRange(0.4, 0.6);
- QCOMPARE(topSpy.count(), 3);
- QCOMPARE(bottomSpy.count(), 3);
- QCOMPARE(changedSpy.count(), 5);
+ QCOMPARE(topSpy.size(), 3);
+ QCOMPARE(bottomSpy.size(), 3);
+ QCOMPARE(changedSpy.size(), 5);
QCOMPARE(dv.bottom(), 0.4);
QCOMPARE(dv.top(), 0.6);
QCOMPARE(dv.decimals(), 10);
dv.setDecimals(5);
- QCOMPARE(decSpy.count(), 1);
- QCOMPARE(changedSpy.count(), 6);
+ QCOMPARE(decSpy.size(), 1);
+ QCOMPARE(changedSpy.size(), 6);
QCOMPARE(dv.decimals(), 5);
dv.setRange(0.4, 0.6, 100);
- QCOMPARE(topSpy.count(), 3);
- QCOMPARE(bottomSpy.count(), 3);
- QCOMPARE(decSpy.count(), 2);
- QCOMPARE(changedSpy.count(), 7);
+ QCOMPARE(topSpy.size(), 3);
+ QCOMPARE(bottomSpy.size(), 3);
+ QCOMPARE(decSpy.size(), 2);
+ QCOMPARE(changedSpy.size(), 7);
QCOMPARE(dv.bottom(), 0.4);
QCOMPARE(dv.top(), 0.6);
QCOMPARE(dv.decimals(), 100);
dv.setNotation(QDoubleValidator::StandardNotation);
- QCOMPARE(notSpy.count(), 1);
- QCOMPARE(changedSpy.count(), 8);
+ QCOMPARE(notSpy.size(), 1);
+ QCOMPARE(changedSpy.size(), 8);
QCOMPARE(dv.notation(), QDoubleValidator::StandardNotation);
dv.setRange(dv.bottom(), dv.top(), dv.decimals());
- QCOMPARE(topSpy.count(), 3);
- QCOMPARE(bottomSpy.count(), 3);
- QCOMPARE(decSpy.count(), 2);
- QCOMPARE(changedSpy.count(), 8);
+ QCOMPARE(topSpy.size(), 3);
+ QCOMPARE(bottomSpy.size(), 3);
+ QCOMPARE(decSpy.size(), 2);
+ QCOMPARE(changedSpy.size(), 8);
dv.setNotation(dv.notation());
- QCOMPARE(notSpy.count(), 1);
- QCOMPARE(changedSpy.count(), 8);
+ QCOMPARE(notSpy.size(), 1);
+ QCOMPARE(changedSpy.size(), 8);
dv.setLocale(QLocale("C"));
- QCOMPARE(changedSpy.count(), 8);
+ QCOMPARE(changedSpy.size(), 8);
dv.setLocale(QLocale("en"));
- QCOMPARE(changedSpy.count(), 9);
+ QCOMPARE(changedSpy.size(), 9);
}
void tst_QDoubleValidator::fixup()
@@ -441,7 +417,7 @@ void tst_QDoubleValidator::fixup_data()
QTest::newRow("C standard with invalid digit grouping")
<< "C" << QDoubleValidator::StandardNotation << -1 << "1,234,5.678"
<< "12345.678";
- QTest::newRow("C standard with invalid number of decimals")
+ QTest::newRow("C standard with invalid group size")
<< "C" << QDoubleValidator::StandardNotation << 2 << "-12,34.678"
<< "-1234.68";
QTest::newRow("C standard truncate decimals")
@@ -470,7 +446,7 @@ void tst_QDoubleValidator::fixup_data()
QTest::newRow("C scientific with invalid digit grouping")
<< "C" << QDoubleValidator::ScientificNotation << -1 << "12,34.98765e2"
<< "1.23498765e+05";
- QTest::newRow("C scientific with invalid number of decimals")
+ QTest::newRow("C scientific with invalid group size")
<< "C" << QDoubleValidator::ScientificNotation << 2 << "-12,34.98765e2"
<< "-1.23e+05";
QTest::newRow("C scientific truncate decimals")
@@ -510,7 +486,7 @@ void tst_QDoubleValidator::fixup_data()
QTest::newRow("en standard with invalid digit grouping")
<< "en" << QDoubleValidator::StandardNotation << -1 << "-1,234,5.678"
<< "-12,345.678";
- QTest::newRow("en standard with invalid number of decimals")
+ QTest::newRow("en standard with invalid group size")
<< "en" << QDoubleValidator::StandardNotation << 2 << "12,34.678"
<< "1,234.68";
QTest::newRow("en standard no fractional part")
@@ -526,7 +502,7 @@ void tst_QDoubleValidator::fixup_data()
QTest::newRow("en scientific with invalid digit grouping")
<< "en" << QDoubleValidator::ScientificNotation << -1 << "-12,34.98765e2"
<< "-1.23498765E+05";
- QTest::newRow("en scientific with invalid number of decimals")
+ QTest::newRow("en scientific with invalid group size")
<< "en" << QDoubleValidator::ScientificNotation << 2 << "12,34.98765e2"
<< "1.23E+05";
QTest::newRow("en scientific no fractional part")
@@ -553,7 +529,7 @@ void tst_QDoubleValidator::fixup_data()
QTest::newRow("de standard with invalid digit grouping")
<< "de" << QDoubleValidator::StandardNotation << -1 << "1.234.5,678"
<< "12.345,678";
- QTest::newRow("de standard with invalid number of decimals")
+ QTest::newRow("de standard with invalid group size")
<< "de" << QDoubleValidator::StandardNotation << 2 << "-12.34,678"
<< "-1.234,68";
QTest::newRow("de standard no fractional part")
@@ -568,7 +544,7 @@ void tst_QDoubleValidator::fixup_data()
QTest::newRow("de scientific with invalid digit grouping")
<< "de" << QDoubleValidator::ScientificNotation << -1 << "12.34,98765e2"
<< "1,23498765E+05";
- QTest::newRow("de scientific with invalid number of decimals")
+ QTest::newRow("de scientific with invalid group size")
<< "de" << QDoubleValidator::ScientificNotation << 2 << "-12.34,98765e2"
<< "-1,23E+05";
QTest::newRow("de scientific no fractional part")
@@ -584,6 +560,22 @@ void tst_QDoubleValidator::fixup_data()
<< "de" << QDoubleValidator::ScientificNotation << -1 << "-12.34"
<< "-1,234E+03";
+ // es locale uses ',' as decimal point and '.' as grouping separator.
+ // It doesn't apply grouping unless the the next-to-least significant group
+ // has more than one digit in it.
+ QTest::newRow("es standard no digit grouping")
+ << "es" << QDoubleValidator::StandardNotation << -1 << "1234,567" << "1234,567";
+ QTest::newRow("es standard with digit grouping")
+ << "es" << QDoubleValidator::StandardNotation << -1 << "-12.345,678" << "-12.345,678";
+ QTest::newRow("es standard with invalid group size")
+ << "es" << QDoubleValidator::StandardNotation << -1 << "1.234.5,678" << "12.345,678";
+ QTest::newRow("es standard with invalid digit grouping")
+ << "es" << QDoubleValidator::StandardNotation << 2 << "-1.234,678" << "-1234,68";
+ QTest::newRow("es standard big with invalid digit grouping")
+ << "es" << QDoubleValidator::StandardNotation << 2 << "-1234.678,9" << "-1.234.678,9";
+ QTest::newRow("es standard no fractional part")
+ << "es" << QDoubleValidator::StandardNotation << -1 << "12.34" << "1234";
+
// hi locale uses '.' as decimal point and ',' as grouping separator.
// The rightmost group is of three digits, all the others contain two
// digits.
@@ -666,7 +658,7 @@ void tst_QDoubleValidator::setRangeOverloads_data()
QTest::newRow("scientific, 1 digits after point")
<< QDoubleValidator::ScientificNotation << -1 << -100.0 << 100.0 << 0
<< QString("1.2e1") << ACC << INV;
- QTest::newRow("scientific, 3 digits after point, not in range")
+ QTest::newRow("scientific, 3 digits after point, demand fewer")
<< QDoubleValidator::ScientificNotation << 3 << -100.0 << 100.0 << 1
<< QString("10.234e-1") << ACC << INV;
QTest::newRow("scientific, 3 digits after point, not in range")
diff --git a/tests/auto/gui/util/qintvalidator/CMakeLists.txt b/tests/auto/gui/util/qintvalidator/CMakeLists.txt
index 83891a3541..841b83a8e0 100644
--- a/tests/auto/gui/util/qintvalidator/CMakeLists.txt
+++ b/tests/auto/gui/util/qintvalidator/CMakeLists.txt
@@ -1,12 +1,19 @@
-# Generated from qintvalidator.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
#####################################################################
## tst_qintvalidator Test:
#####################################################################
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_qintvalidator LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
qt_internal_add_test(tst_qintvalidator
SOURCES
tst_qintvalidator.cpp
- PUBLIC_LIBRARIES
+ LIBRARIES
Qt::Gui
)
diff --git a/tests/auto/gui/util/qintvalidator/tst_qintvalidator.cpp b/tests/auto/gui/util/qintvalidator/tst_qintvalidator.cpp
index 48b04cef14..bfa69c90b8 100644
--- a/tests/auto/gui/util/qintvalidator/tst_qintvalidator.cpp
+++ b/tests/auto/gui/util/qintvalidator/tst_qintvalidator.cpp
@@ -1,30 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** 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$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QTest>
@@ -190,8 +165,10 @@ void tst_QIntValidator::validateFrench()
QIntValidator validator(-2000, 2000, 0);
validator.setLocale(QLocale::French);
int i;
+ // Grouping separator is a narrow no-break space; QLocale accepts a space as it.
QString s = QLatin1String("1 ");
- QCOMPARE(validator.validate(s, i), QValidator::Acceptable);
+ // Shouldn't end with a group separator
+ QCOMPARE(validator.validate(s, i), QValidator::Intermediate);
validator.fixup(s);
QCOMPARE(s, s);
@@ -236,45 +213,45 @@ void tst_QIntValidator::notifySignals()
QSignalSpy changedSpy(&iv, SIGNAL(changed()));
iv.setTop(9);
- QCOMPARE(topSpy.count(), 1);
- QCOMPARE(changedSpy.count(), 1);
+ QCOMPARE(topSpy.size(), 1);
+ QCOMPARE(changedSpy.size(), 1);
QCOMPARE(iv.top(), 9);
iv.setBottom(1);
- QCOMPARE(bottomSpy.count(), 1);
- QCOMPARE(changedSpy.count(), 2);
+ QCOMPARE(bottomSpy.size(), 1);
+ QCOMPARE(changedSpy.size(), 2);
QCOMPARE(iv.bottom(), 1);
iv.setRange(1, 8);
- QCOMPARE(topSpy.count(), 2);
- QCOMPARE(bottomSpy.count(), 1);
- QCOMPARE(changedSpy.count(), 3);
+ QCOMPARE(topSpy.size(), 2);
+ QCOMPARE(bottomSpy.size(), 1);
+ QCOMPARE(changedSpy.size(), 3);
QCOMPARE(iv.top(), 8);
QCOMPARE(iv.bottom(), 1);
iv.setRange(2, 8);
- QCOMPARE(topSpy.count(), 2);
- QCOMPARE(bottomSpy.count(), 2);
- QCOMPARE(changedSpy.count(), 4);
+ QCOMPARE(topSpy.size(), 2);
+ QCOMPARE(bottomSpy.size(), 2);
+ QCOMPARE(changedSpy.size(), 4);
QCOMPARE(iv.top(), 8);
QCOMPARE(iv.bottom(), 2);
iv.setRange(3, 7);
- QCOMPARE(topSpy.count(), 3);
- QCOMPARE(bottomSpy.count(), 3);
- QCOMPARE(changedSpy.count(), 5);
+ QCOMPARE(topSpy.size(), 3);
+ QCOMPARE(bottomSpy.size(), 3);
+ QCOMPARE(changedSpy.size(), 5);
QCOMPARE(iv.top(), 7);
QCOMPARE(iv.bottom(), 3);
iv.setRange(3, 7);
- QCOMPARE(topSpy.count(), 3);
- QCOMPARE(bottomSpy.count(), 3);
- QCOMPARE(changedSpy.count(), 5);
+ QCOMPARE(topSpy.size(), 3);
+ QCOMPARE(bottomSpy.size(), 3);
+ QCOMPARE(changedSpy.size(), 5);
iv.setLocale(QLocale("C"));
- QCOMPARE(changedSpy.count(), 5);
+ QCOMPARE(changedSpy.size(), 5);
iv.setLocale(QLocale("en"));
- QCOMPARE(changedSpy.count(), 6);
+ QCOMPARE(changedSpy.size(), 6);
}
void tst_QIntValidator::fixup()
@@ -331,9 +308,9 @@ void tst_QIntValidator::fixup_data()
// Normally the groups contain three digits, but the leftmost group should
// have at least two digits.
QTest::newRow("es no digit grouping 1000") << "es" << "1000" << "1000";
- QTest::newRow("es no digit grouping 10000") << "es" << "10000" << "10.000";
- QTest::newRow("es with digit grouping") << "es" << "1000.000" << "1000.000";
- QTest::newRow("es invalid digit grouping") << "es" << "1.000.000" << "1000.000";
+ QTest::newRow("es with digit grouping 10000") << "es" << "10000" << "10.000";
+ QTest::newRow("es with digit grouping million") << "es" << "1.000.000" << "1.000.000";
+ QTest::newRow("es invalid digit grouping") << "es" << "1000.000" << "1.000.000";
}
QTEST_APPLESS_MAIN(tst_QIntValidator)
diff --git a/tests/auto/gui/util/qregularexpressionvalidator/CMakeLists.txt b/tests/auto/gui/util/qregularexpressionvalidator/CMakeLists.txt
index 9caf7a1596..1d48205537 100644
--- a/tests/auto/gui/util/qregularexpressionvalidator/CMakeLists.txt
+++ b/tests/auto/gui/util/qregularexpressionvalidator/CMakeLists.txt
@@ -1,12 +1,19 @@
-# Generated from qregularexpressionvalidator.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
#####################################################################
## tst_qregularexpressionvalidator Test:
#####################################################################
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_qregularexpressionvalidator LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
qt_internal_add_test(tst_qregularexpressionvalidator
SOURCES
tst_qregularexpressionvalidator.cpp
- PUBLIC_LIBRARIES
+ LIBRARIES
Qt::Gui
)
diff --git a/tests/auto/gui/util/qregularexpressionvalidator/tst_qregularexpressionvalidator.cpp b/tests/auto/gui/util/qregularexpressionvalidator/tst_qregularexpressionvalidator.cpp
index 0d1d748e00..17f9e6a1bd 100644
--- a/tests/auto/gui/util/qregularexpressionvalidator/tst_qregularexpressionvalidator.cpp
+++ b/tests/auto/gui/util/qregularexpressionvalidator/tst_qregularexpressionvalidator.cpp
@@ -1,31 +1,6 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Copyright (C) 2016 The Qt Company Ltd.
-** 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$
-**
-****************************************************************************/
+// Copyright (C) 2012 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtGui/QRegularExpressionValidator>
#include <QTest>
@@ -98,12 +73,12 @@ void tst_QRegularExpressionValidator::validate()
QTEST(result, "state");
if (result == QValidator::Invalid)
- QCOMPARE(pos, value.length());
+ QCOMPARE(pos, value.size());
else
QCOMPARE(pos, -1); // ensure pos is not modified if validate returned Acceptable or Intermediate
- QCOMPARE(spy.count(), signalCount);
- QCOMPARE(changedSpy.count(), signalCount);
+ QCOMPARE(spy.size(), signalCount);
+ QCOMPARE(changedSpy.size(), signalCount);
}
QTEST_GUILESS_MAIN(tst_QRegularExpressionValidator)
diff --git a/tests/auto/gui/util/qshadergenerator/CMakeLists.txt b/tests/auto/gui/util/qshadergenerator/CMakeLists.txt
deleted file mode 100644
index 77cefcbd06..0000000000
--- a/tests/auto/gui/util/qshadergenerator/CMakeLists.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-# Generated from qshadergenerator.pro.
-
-#####################################################################
-## tst_qshadergenerator Test:
-#####################################################################
-
-qt_internal_add_test(tst_qshadergenerator
- SOURCES
- tst_qshadergenerator.cpp
- PUBLIC_LIBRARIES
- Qt::Gui
- Qt::GuiPrivate
-)
diff --git a/tests/auto/gui/util/qshadergenerator/tst_qshadergenerator.cpp b/tests/auto/gui/util/qshadergenerator/tst_qshadergenerator.cpp
deleted file mode 100644
index 408460132b..0000000000
--- a/tests/auto/gui/util/qshadergenerator/tst_qshadergenerator.cpp
+++ /dev/null
@@ -1,1428 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB).
-** 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 <QTest>
-
-#include <QtCore/qmetaobject.h>
-#include <QtGui/private/qshadergenerator_p.h>
-#include <QtGui/private/qshaderlanguage_p.h>
-
-namespace
-{
- QShaderFormat createFormat(QShaderFormat::Api api, int majorVersion, int minorVersion,
- QShaderFormat::ShaderType shaderType= QShaderFormat::Fragment)
- {
- auto format = QShaderFormat();
- format.setApi(api);
- format.setVersion(QVersionNumber(majorVersion, minorVersion));
- format.setShaderType(shaderType);
- return format;
- }
-
- QShaderNodePort createPort(QShaderNodePort::Direction portDirection, const QString &portName)
- {
- auto port = QShaderNodePort();
- port.direction = portDirection;
- port.name = portName;
- return port;
- }
-
- QShaderNode createNode(const QList<QShaderNodePort> &ports,
- const QStringList &layers = QStringList())
- {
- auto node = QShaderNode();
- node.setUuid(QUuid::createUuid());
- node.setLayers(layers);
- for (const auto &port : ports)
- node.addPort(port);
- return node;
- }
-
- QShaderGraph::Edge createEdge(const QUuid &sourceUuid, const QString &sourceName,
- const QUuid &targetUuid, const QString &targetName,
- const QStringList &layers = QStringList())
- {
- auto edge = QShaderGraph::Edge();
- edge.sourceNodeUuid = sourceUuid;
- edge.sourcePortName = sourceName;
- edge.targetNodeUuid = targetUuid;
- edge.targetPortName = targetName;
- edge.layers = layers;
- return edge;
- }
-
- QShaderGraph createFragmentShaderGraph()
- {
- const auto openGLES2 = createFormat(QShaderFormat::OpenGLES, 2, 0);
- const auto openGL3 = createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0);
-
- auto graph = QShaderGraph();
-
- auto worldPosition = createNode({
- createPort(QShaderNodePort::Output, "value")
- });
- worldPosition.setParameter("name", "worldPosition");
- worldPosition.addRule(openGLES2, QShaderNode::Rule("highp vec3 $value = $name;",
- QByteArrayList() << "varying highp vec3 $name;"));
- worldPosition.addRule(openGL3, QShaderNode::Rule("vec3 $value = $name;",
- QByteArrayList() << "in vec3 $name;"));
-
- auto texture = createNode({
- createPort(QShaderNodePort::Output, "texture")
- });
- texture.addRule(openGLES2, QShaderNode::Rule("sampler2D $texture = texture;",
- QByteArrayList() << "uniform sampler2D texture;"));
- texture.addRule(openGL3, QShaderNode::Rule("sampler2D $texture = texture;",
- QByteArrayList() << "uniform sampler2D texture;"));
-
- auto texCoord = createNode({
- createPort(QShaderNodePort::Output, "texCoord")
- });
- texCoord.addRule(openGLES2, QShaderNode::Rule("highp vec2 $texCoord = texCoord;",
- QByteArrayList() << "varying highp vec2 texCoord;"));
- texCoord.addRule(openGL3, QShaderNode::Rule("vec2 $texCoord = texCoord;",
- QByteArrayList() << "in vec2 texCoord;"));
-
- auto lightIntensity = createNode({
- createPort(QShaderNodePort::Output, "lightIntensity")
- });
- lightIntensity.addRule(openGLES2, QShaderNode::Rule("highp float $lightIntensity = lightIntensity;",
- QByteArrayList() << "uniform highp float lightIntensity;"));
- lightIntensity.addRule(openGL3, QShaderNode::Rule("float $lightIntensity = lightIntensity;",
- QByteArrayList() << "uniform float lightIntensity;"));
-
- auto exposure = createNode({
- createPort(QShaderNodePort::Output, "exposure")
- });
- exposure.addRule(openGLES2, QShaderNode::Rule("highp float $exposure = exposure;",
- QByteArrayList() << "uniform highp float exposure;"));
- exposure.addRule(openGL3, QShaderNode::Rule("float $exposure = exposure;",
- QByteArrayList() << "uniform float exposure;"));
-
- auto fragColor = createNode({
- createPort(QShaderNodePort::Input, "fragColor")
- });
- fragColor.addRule(openGLES2, QShaderNode::Rule("gl_fragColor = $fragColor;"));
- fragColor.addRule(openGL3, QShaderNode::Rule("fragColor = $fragColor;",
- QByteArrayList() << "out vec4 fragColor;"));
-
- auto sampleTexture = createNode({
- createPort(QShaderNodePort::Input, "sampler"),
- createPort(QShaderNodePort::Input, "coord"),
- createPort(QShaderNodePort::Output, "color")
- });
- sampleTexture.addRule(openGLES2, QShaderNode::Rule("highp vec4 $color = texture2D($sampler, $coord);"));
- sampleTexture.addRule(openGL3, QShaderNode::Rule("vec4 $color = texture($sampler, $coord);"));
-
- auto lightFunction = createNode({
- createPort(QShaderNodePort::Input, "baseColor"),
- createPort(QShaderNodePort::Input, "position"),
- createPort(QShaderNodePort::Input, "lightIntensity"),
- createPort(QShaderNodePort::Output, "outputColor")
- });
- lightFunction.addRule(openGLES2, QShaderNode::Rule("highp vec4 $outputColor = lightModel($baseColor, $position, $lightIntensity);",
- QByteArrayList() << "#pragma include es2/lightmodel.frag.inc"));
- lightFunction.addRule(openGL3, QShaderNode::Rule("vec4 $outputColor = lightModel($baseColor, $position, $lightIntensity);",
- QByteArrayList() << "#pragma include gl3/lightmodel.frag.inc"));
-
- auto exposureFunction = createNode({
- createPort(QShaderNodePort::Input, "inputColor"),
- createPort(QShaderNodePort::Input, "exposure"),
- createPort(QShaderNodePort::Output, "outputColor")
- });
- exposureFunction.addRule(openGLES2, QShaderNode::Rule("highp vec4 $outputColor = $inputColor * pow(2.0, $exposure);"));
- exposureFunction.addRule(openGL3, QShaderNode::Rule("vec4 $outputColor = $inputColor * pow(2.0, $exposure);"));
-
- graph.addNode(worldPosition);
- graph.addNode(texture);
- graph.addNode(texCoord);
- graph.addNode(lightIntensity);
- graph.addNode(exposure);
- graph.addNode(fragColor);
- graph.addNode(sampleTexture);
- graph.addNode(lightFunction);
- graph.addNode(exposureFunction);
-
- graph.addEdge(createEdge(texture.uuid(), "texture", sampleTexture.uuid(), "sampler"));
- graph.addEdge(createEdge(texCoord.uuid(), "texCoord", sampleTexture.uuid(), "coord"));
-
- graph.addEdge(createEdge(worldPosition.uuid(), "value", lightFunction.uuid(), "position"));
- graph.addEdge(createEdge(sampleTexture.uuid(), "color", lightFunction.uuid(), "baseColor"));
- graph.addEdge(createEdge(lightIntensity.uuid(), "lightIntensity", lightFunction.uuid(), "lightIntensity"));
-
- graph.addEdge(createEdge(lightFunction.uuid(), "outputColor", exposureFunction.uuid(), "inputColor"));
- graph.addEdge(createEdge(exposure.uuid(), "exposure", exposureFunction.uuid(), "exposure"));
-
- graph.addEdge(createEdge(exposureFunction.uuid(), "outputColor", fragColor.uuid(), "fragColor"));
-
- return graph;
- }
-}
-
-class tst_QShaderGenerator : public QObject
-{
- Q_OBJECT
-private slots:
- void shouldHaveDefaultState();
- void shouldGenerateShaderCode_data();
- void shouldGenerateShaderCode();
- void shouldGenerateVersionCommands_data();
- void shouldGenerateVersionCommands();
- void shouldProcessLanguageQualifierAndTypeEnums_data();
- void shouldProcessLanguageQualifierAndTypeEnums();
- void shouldGenerateDifferentCodeDependingOnActiveLayers();
- void shouldUseGlobalVariableRatherThanTemporaries();
- void shouldGenerateTemporariesWisely();
- void shouldHandlePortNamesPrefixingOneAnother();
- void shouldHandleNodesWithMultipleOutputPorts();
- void shouldHandleExpressionsInInputNodes();
-};
-
-void tst_QShaderGenerator::shouldHaveDefaultState()
-{
- // GIVEN
- auto generator = QShaderGenerator();
-
- // THEN
- QVERIFY(generator.graph.nodes().isEmpty());
- QVERIFY(generator.graph.edges().isEmpty());
- QVERIFY(!generator.format.isValid());
-}
-
-void tst_QShaderGenerator::shouldGenerateShaderCode_data()
-{
- QTest::addColumn<QShaderGraph>("graph");
- QTest::addColumn<QShaderFormat>("format");
- QTest::addColumn<QByteArray>("expectedCode");
-
- const auto graph = createFragmentShaderGraph();
-
- const auto openGLES2 = createFormat(QShaderFormat::OpenGLES, 2, 0);
- const auto openGL3 = createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0);
- const auto openGL32 = createFormat(QShaderFormat::OpenGLCoreProfile, 3, 2);
- const auto openGL4 = createFormat(QShaderFormat::OpenGLCoreProfile, 4, 0);
-
- const auto versionGLES2 = QByteArrayList() << "#version 100" << "";
- const auto versionGL3 = QByteArrayList() << "#version 130" << "";
- const auto versionGL32 = QByteArrayList() << "#version 150 core" << "";
- const auto versionGL4 = QByteArrayList() << "#version 400 core" << "";
-
- const auto es2Code = QByteArrayList() << "varying highp vec3 worldPosition;"
- << "uniform sampler2D texture;"
- << "varying highp vec2 texCoord;"
- << "uniform highp float lightIntensity;"
- << "uniform highp float exposure;"
- << "#pragma include es2/lightmodel.frag.inc"
- << ""
- << "void main()"
- << "{"
- << " gl_fragColor = (((((lightModel(((texture2D(texture, texCoord))), worldPosition, lightIntensity)))) * pow(2.0, exposure)));"
- << "}"
- << "";
-
- const auto gl3Code = QByteArrayList() << "in vec3 worldPosition;"
- << "uniform sampler2D texture;"
- << "in vec2 texCoord;"
- << "uniform float lightIntensity;"
- << "uniform float exposure;"
- << "out vec4 fragColor;"
- << "#pragma include gl3/lightmodel.frag.inc"
- << ""
- << "void main()"
- << "{"
- << " fragColor = (((((lightModel(((texture(texture, texCoord))), worldPosition, lightIntensity)))) * pow(2.0, exposure)));"
- << "}"
- << "";
-
- QTest::newRow("EmptyGraphAndFormat") << QShaderGraph() << QShaderFormat() << QByteArrayLiteral("\nvoid main()\n{\n}\n");
- QTest::newRow("LightExposureGraphAndES2") << graph << openGLES2 << (versionGLES2 + es2Code).join('\n');
- QTest::newRow("LightExposureGraphAndGL3") << graph << openGL3 << (versionGL3 + gl3Code).join('\n');
- QTest::newRow("LightExposureGraphAndGL32") << graph << openGL32 << (versionGL32 + gl3Code).join('\n');
- QTest::newRow("LightExposureGraphAndGL4") << graph << openGL4 << (versionGL4 + gl3Code).join('\n');
-}
-
-void tst_QShaderGenerator::shouldGenerateShaderCode()
-{
- // GIVEN
- QFETCH(QShaderGraph, graph);
- QFETCH(QShaderFormat, format);
-
- auto generator = QShaderGenerator();
- generator.graph = graph;
- generator.format = format;
-
- // WHEN
- const auto code = generator.createShaderCode();
-
- // THEN
- QFETCH(QByteArray, expectedCode);
- QCOMPARE(code, expectedCode);
-}
-
-void tst_QShaderGenerator::shouldGenerateVersionCommands_data()
-{
- QTest::addColumn<QShaderFormat>("format");
- QTest::addColumn<QByteArray>("version");
-
- QTest::newRow("GLES2") << createFormat(QShaderFormat::OpenGLES, 2, 0) << QByteArrayLiteral("#version 100");
- QTest::newRow("GLES3") << createFormat(QShaderFormat::OpenGLES, 3, 0) << QByteArrayLiteral("#version 300 es");
-
- QTest::newRow("GL20") << createFormat(QShaderFormat::OpenGLNoProfile, 2, 0) << QByteArrayLiteral("#version 110");
- QTest::newRow("GL21") << createFormat(QShaderFormat::OpenGLNoProfile, 2, 1) << QByteArrayLiteral("#version 120");
- QTest::newRow("GL30") << createFormat(QShaderFormat::OpenGLNoProfile, 3, 0) << QByteArrayLiteral("#version 130");
- QTest::newRow("GL31") << createFormat(QShaderFormat::OpenGLNoProfile, 3, 1) << QByteArrayLiteral("#version 140");
- QTest::newRow("GL32") << createFormat(QShaderFormat::OpenGLNoProfile, 3, 2) << QByteArrayLiteral("#version 150");
- QTest::newRow("GL33") << createFormat(QShaderFormat::OpenGLNoProfile, 3, 3) << QByteArrayLiteral("#version 330");
- QTest::newRow("GL40") << createFormat(QShaderFormat::OpenGLNoProfile, 4, 0) << QByteArrayLiteral("#version 400");
- QTest::newRow("GL41") << createFormat(QShaderFormat::OpenGLNoProfile, 4, 1) << QByteArrayLiteral("#version 410");
- QTest::newRow("GL42") << createFormat(QShaderFormat::OpenGLNoProfile, 4, 2) << QByteArrayLiteral("#version 420");
- QTest::newRow("GL43") << createFormat(QShaderFormat::OpenGLNoProfile, 4, 3) << QByteArrayLiteral("#version 430");
-
- QTest::newRow("GL20core") << createFormat(QShaderFormat::OpenGLCoreProfile, 2, 0) << QByteArrayLiteral("#version 110");
- QTest::newRow("GL21core") << createFormat(QShaderFormat::OpenGLCoreProfile, 2, 1) << QByteArrayLiteral("#version 120");
- QTest::newRow("GL30core") << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0) << QByteArrayLiteral("#version 130");
- QTest::newRow("GL31core") << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 1) << QByteArrayLiteral("#version 140");
- QTest::newRow("GL32core") << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 2) << QByteArrayLiteral("#version 150 core");
- QTest::newRow("GL33core") << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 3) << QByteArrayLiteral("#version 330 core");
- QTest::newRow("GL40core") << createFormat(QShaderFormat::OpenGLCoreProfile, 4, 0) << QByteArrayLiteral("#version 400 core");
- QTest::newRow("GL41core") << createFormat(QShaderFormat::OpenGLCoreProfile, 4, 1) << QByteArrayLiteral("#version 410 core");
- QTest::newRow("GL42core") << createFormat(QShaderFormat::OpenGLCoreProfile, 4, 2) << QByteArrayLiteral("#version 420 core");
- QTest::newRow("GL43core") << createFormat(QShaderFormat::OpenGLCoreProfile, 4, 3) << QByteArrayLiteral("#version 430 core");
-
- QTest::newRow("GL20compatibility") << createFormat(QShaderFormat::OpenGLCompatibilityProfile, 2, 0) << QByteArrayLiteral("#version 110");
- QTest::newRow("GL21compatibility") << createFormat(QShaderFormat::OpenGLCompatibilityProfile, 2, 1) << QByteArrayLiteral("#version 120");
- QTest::newRow("GL30compatibility") << createFormat(QShaderFormat::OpenGLCompatibilityProfile, 3, 0) << QByteArrayLiteral("#version 130");
- QTest::newRow("GL31compatibility") << createFormat(QShaderFormat::OpenGLCompatibilityProfile, 3, 1) << QByteArrayLiteral("#version 140");
- QTest::newRow("GL32compatibility") << createFormat(QShaderFormat::OpenGLCompatibilityProfile, 3, 2) << QByteArrayLiteral("#version 150 compatibility");
- QTest::newRow("GL33compatibility") << createFormat(QShaderFormat::OpenGLCompatibilityProfile, 3, 3) << QByteArrayLiteral("#version 330 compatibility");
- QTest::newRow("GL40compatibility") << createFormat(QShaderFormat::OpenGLCompatibilityProfile, 4, 0) << QByteArrayLiteral("#version 400 compatibility");
- QTest::newRow("GL41compatibility") << createFormat(QShaderFormat::OpenGLCompatibilityProfile, 4, 1) << QByteArrayLiteral("#version 410 compatibility");
- QTest::newRow("GL42compatibility") << createFormat(QShaderFormat::OpenGLCompatibilityProfile, 4, 2) << QByteArrayLiteral("#version 420 compatibility");
- QTest::newRow("GL43compatibility") << createFormat(QShaderFormat::OpenGLCompatibilityProfile, 4, 3) << QByteArrayLiteral("#version 430 compatibility");
-}
-
-void tst_QShaderGenerator::shouldGenerateVersionCommands()
-{
- // GIVEN
- QFETCH(QShaderFormat, format);
-
- auto generator = QShaderGenerator();
- generator.format = format;
-
- // WHEN
- const auto code = generator.createShaderCode();
-
- // THEN
- QFETCH(QByteArray, version);
- const auto expectedCode = (QByteArrayList() << version
- << ""
- << ""
- << "void main()"
- << "{"
- << "}"
- << "").join('\n');
- QCOMPARE(code, expectedCode);
-}
-
-
-namespace {
- QString toGlsl(QShaderLanguage::StorageQualifier qualifier, const QShaderFormat &format)
- {
- if (format.version().majorVersion() <= 2) {
- // Note we're assuming fragment shader only here, it'd be different
- // values for vertex shader, will need to be fixed properly at some
- // point but isn't necessary yet (this problem already exists in past
- // commits anyway)
- switch (qualifier) {
- case QShaderLanguage::Const:
- return "const";
- case QShaderLanguage::Input:
- return "varying";
- case QShaderLanguage::BuiltIn:
- return "//";
- case QShaderLanguage::Output:
- return ""; // Although fragment shaders for <=2 only have fixed outputs
- case QShaderLanguage::Uniform:
- return "uniform";
- }
- } else {
- switch (qualifier) {
- case QShaderLanguage::Const:
- return "const";
- case QShaderLanguage::Input:
- return "in";
- case QShaderLanguage::BuiltIn:
- return "//";
- case QShaderLanguage::Output:
- return "out";
- case QShaderLanguage::Uniform:
- return "uniform";
- }
- }
-
- Q_UNREACHABLE();
- }
-
- QString toGlsl(QShaderLanguage::VariableType type)
- {
- switch (type) {
- case QShaderLanguage::Bool:
- return "bool";
- case QShaderLanguage::Int:
- return "int";
- case QShaderLanguage::Uint:
- return "uint";
- case QShaderLanguage::Float:
- return "float";
- case QShaderLanguage::Double:
- return "double";
- case QShaderLanguage::Vec2:
- return "vec2";
- case QShaderLanguage::Vec3:
- return "vec3";
- case QShaderLanguage::Vec4:
- return "vec4";
- case QShaderLanguage::DVec2:
- return "dvec2";
- case QShaderLanguage::DVec3:
- return "dvec3";
- case QShaderLanguage::DVec4:
- return "dvec4";
- case QShaderLanguage::BVec2:
- return "bvec2";
- case QShaderLanguage::BVec3:
- return "bvec3";
- case QShaderLanguage::BVec4:
- return "bvec4";
- case QShaderLanguage::IVec2:
- return "ivec2";
- case QShaderLanguage::IVec3:
- return "ivec3";
- case QShaderLanguage::IVec4:
- return "ivec4";
- case QShaderLanguage::UVec2:
- return "uvec2";
- case QShaderLanguage::UVec3:
- return "uvec3";
- case QShaderLanguage::UVec4:
- return "uvec4";
- case QShaderLanguage::Mat2:
- return "mat2";
- case QShaderLanguage::Mat3:
- return "mat3";
- case QShaderLanguage::Mat4:
- return "mat4";
- case QShaderLanguage::Mat2x2:
- return "mat2x2";
- case QShaderLanguage::Mat2x3:
- return "mat2x3";
- case QShaderLanguage::Mat2x4:
- return "mat2x4";
- case QShaderLanguage::Mat3x2:
- return "mat3x2";
- case QShaderLanguage::Mat3x3:
- return "mat3x3";
- case QShaderLanguage::Mat3x4:
- return "mat3x4";
- case QShaderLanguage::Mat4x2:
- return "mat4x2";
- case QShaderLanguage::Mat4x3:
- return "mat4x3";
- case QShaderLanguage::Mat4x4:
- return "mat4x4";
- case QShaderLanguage::DMat2:
- return "dmat2";
- case QShaderLanguage::DMat3:
- return "dmat3";
- case QShaderLanguage::DMat4:
- return "dmat4";
- case QShaderLanguage::DMat2x2:
- return "dmat2x2";
- case QShaderLanguage::DMat2x3:
- return "dmat2x3";
- case QShaderLanguage::DMat2x4:
- return "dmat2x4";
- case QShaderLanguage::DMat3x2:
- return "dmat3x2";
- case QShaderLanguage::DMat3x3:
- return "dmat3x3";
- case QShaderLanguage::DMat3x4:
- return "dmat3x4";
- case QShaderLanguage::DMat4x2:
- return "dmat4x2";
- case QShaderLanguage::DMat4x3:
- return "dmat4x3";
- case QShaderLanguage::DMat4x4:
- return "dmat4x4";
- case QShaderLanguage::Sampler1D:
- return "sampler1D";
- case QShaderLanguage::Sampler2D:
- return "sampler2D";
- case QShaderLanguage::Sampler3D:
- return "sampler3D";
- case QShaderLanguage::SamplerCube:
- return "samplerCube";
- case QShaderLanguage::Sampler2DRect:
- return "sampler2DRect";
- case QShaderLanguage::Sampler2DMs:
- return "sampler2DMS";
- case QShaderLanguage::SamplerBuffer:
- return "samplerBuffer";
- case QShaderLanguage::Sampler1DArray:
- return "sampler1DArray";
- case QShaderLanguage::Sampler2DArray:
- return "sampler2DArray";
- case QShaderLanguage::Sampler2DMsArray:
- return "sampler2DMSArray";
- case QShaderLanguage::SamplerCubeArray:
- return "samplerCubeArray";
- case QShaderLanguage::Sampler1DShadow:
- return "sampler1DShadow";
- case QShaderLanguage::Sampler2DShadow:
- return "sampler2DShadow";
- case QShaderLanguage::Sampler2DRectShadow:
- return "sampler2DRectShadow";
- case QShaderLanguage::Sampler1DArrayShadow:
- return "sampler1DArrayShadow";
- case QShaderLanguage::Sampler2DArrayShadow:
- return "sample2DArrayShadow";
- case QShaderLanguage::SamplerCubeShadow:
- return "samplerCubeShadow";
- case QShaderLanguage::SamplerCubeArrayShadow:
- return "samplerCubeArrayShadow";
- case QShaderLanguage::ISampler1D:
- return "isampler1D";
- case QShaderLanguage::ISampler2D:
- return "isampler2D";
- case QShaderLanguage::ISampler3D:
- return "isampler3D";
- case QShaderLanguage::ISamplerCube:
- return "isamplerCube";
- case QShaderLanguage::ISampler2DRect:
- return "isampler2DRect";
- case QShaderLanguage::ISampler2DMs:
- return "isampler2DMS";
- case QShaderLanguage::ISamplerBuffer:
- return "isamplerBuffer";
- case QShaderLanguage::ISampler1DArray:
- return "isampler1DArray";
- case QShaderLanguage::ISampler2DArray:
- return "isampler2DArray";
- case QShaderLanguage::ISampler2DMsArray:
- return "isampler2DMSArray";
- case QShaderLanguage::ISamplerCubeArray:
- return "isamplerCubeArray";
- case QShaderLanguage::USampler1D:
- return "usampler1D";
- case QShaderLanguage::USampler2D:
- return "usampler2D";
- case QShaderLanguage::USampler3D:
- return "usampler3D";
- case QShaderLanguage::USamplerCube:
- return "usamplerCube";
- case QShaderLanguage::USampler2DRect:
- return "usampler2DRect";
- case QShaderLanguage::USampler2DMs:
- return "usampler2DMS";
- case QShaderLanguage::USamplerBuffer:
- return "usamplerBuffer";
- case QShaderLanguage::USampler1DArray:
- return "usampler1DArray";
- case QShaderLanguage::USampler2DArray:
- return "usampler2DArray";
- case QShaderLanguage::USampler2DMsArray:
- return "usampler2DMSArray";
- case QShaderLanguage::USamplerCubeArray:
- return "usamplerCubeArray";
- }
-
- Q_UNREACHABLE();
- }
-}
-
-void tst_QShaderGenerator::shouldProcessLanguageQualifierAndTypeEnums_data()
-{
- QTest::addColumn<QShaderGraph>("graph");
- QTest::addColumn<QShaderFormat>("format");
- QTest::addColumn<QByteArray>("expectedCode");
-
- {
- const auto es2 = createFormat(QShaderFormat::OpenGLES, 2, 0);
- const auto es3 = createFormat(QShaderFormat::OpenGLES, 3, 0);
- const auto gl2 = createFormat(QShaderFormat::OpenGLNoProfile, 2, 0);
- const auto gl3 = createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0);
- const auto gl4 = createFormat(QShaderFormat::OpenGLCoreProfile, 4, 0);
-
- const auto qualifierEnum = QMetaEnum::fromType<QShaderLanguage::StorageQualifier>();
- const auto typeEnum = QMetaEnum::fromType<QShaderLanguage::VariableType>();
-
- for (int qualifierIndex = 0; qualifierIndex < qualifierEnum.keyCount(); qualifierIndex++) {
- const auto qualifierName = qualifierEnum.key(qualifierIndex);
- const auto qualifierValue = static_cast<QShaderLanguage::StorageQualifier>(qualifierEnum.value(qualifierIndex));
-
- for (int typeIndex = 0; typeIndex < typeEnum.keyCount(); typeIndex++) {
- const auto typeName = typeEnum.key(typeIndex);
- const auto typeValue = static_cast<QShaderLanguage::VariableType>(typeEnum.value(typeIndex));
-
- auto graph = QShaderGraph();
-
- auto worldPosition = createNode({
- createPort(QShaderNodePort::Output, "value")
- });
- worldPosition.setParameter("name", "worldPosition");
- worldPosition.setParameter("qualifier", QVariant::fromValue<QShaderLanguage::StorageQualifier>(qualifierValue));
- worldPosition.setParameter("type", QVariant::fromValue<QShaderLanguage::VariableType>(typeValue));
- worldPosition.addRule(es2, QShaderNode::Rule("highp $type $value = $name;",
- QByteArrayList() << "$qualifier highp $type $name;"));
- worldPosition.addRule(gl2, QShaderNode::Rule("$type $value = $name;",
- QByteArrayList() << "$qualifier $type $name;"));
- worldPosition.addRule(gl3, QShaderNode::Rule("$type $value = $name;",
- QByteArrayList() << "$qualifier $type $name;"));
-
- auto fragColor = createNode({
- createPort(QShaderNodePort::Input, "fragColor")
- });
- fragColor.addRule(es2, QShaderNode::Rule("gl_fragColor = $fragColor;"));
- fragColor.addRule(gl2, QShaderNode::Rule("gl_fragColor = $fragColor;"));
- fragColor.addRule(gl3, QShaderNode::Rule("fragColor = $fragColor;",
- QByteArrayList() << "out vec4 fragColor;"));
-
- graph.addNode(worldPosition);
- graph.addNode(fragColor);
-
- graph.addEdge(createEdge(worldPosition.uuid(), "value", fragColor.uuid(), "fragColor"));
-
- const auto gl2Code = (QByteArrayList() << "#version 110"
- << ""
- << QStringLiteral("%1 %2 worldPosition;").arg(toGlsl(qualifierValue, gl2))
- .arg(toGlsl(typeValue))
- .toUtf8()
- << ""
- << "void main()"
- << "{"
- << " gl_fragColor = worldPosition;"
- << "}"
- << "").join("\n");
- const auto gl3Code = (QByteArrayList() << "#version 130"
- << ""
- << QStringLiteral("%1 %2 worldPosition;").arg(toGlsl(qualifierValue, gl3))
- .arg(toGlsl(typeValue))
- .toUtf8()
- << "out vec4 fragColor;"
- << ""
- << "void main()"
- << "{"
- << " fragColor = worldPosition;"
- << "}"
- << "").join("\n");
- const auto gl4Code = (QByteArrayList() << "#version 400 core"
- << ""
- << QStringLiteral("%1 %2 worldPosition;").arg(toGlsl(qualifierValue, gl4))
- .arg(toGlsl(typeValue))
- .toUtf8()
- << "out vec4 fragColor;"
- << ""
- << "void main()"
- << "{"
- << " fragColor = worldPosition;"
- << "}"
- << "").join("\n");
- const auto es2Code = (QByteArrayList() << "#version 100"
- << ""
- << QStringLiteral("%1 highp %2 worldPosition;").arg(toGlsl(qualifierValue, es2))
- .arg(toGlsl(typeValue))
- .toUtf8()
- << ""
- << "void main()"
- << "{"
- << " gl_fragColor = worldPosition;"
- << "}"
- << "").join("\n");
- const auto es3Code = (QByteArrayList() << "#version 300 es"
- << ""
- << QStringLiteral("%1 highp %2 worldPosition;").arg(toGlsl(qualifierValue, es3))
- .arg(toGlsl(typeValue))
- .toUtf8()
- << ""
- << "void main()"
- << "{"
- << " gl_fragColor = worldPosition;"
- << "}"
- << "").join("\n");
-
- QTest::addRow("%s %s ES2", qualifierName, typeName) << graph << es2 << es2Code;
- QTest::addRow("%s %s ES3", qualifierName, typeName) << graph << es3 << es3Code;
- QTest::addRow("%s %s GL2", qualifierName, typeName) << graph << gl2 << gl2Code;
- QTest::addRow("%s %s GL3", qualifierName, typeName) << graph << gl3 << gl3Code;
- QTest::addRow("%s %s GL4", qualifierName, typeName) << graph << gl4 << gl4Code;
- }
- }
- }
-
- {
- const auto es2 = createFormat(QShaderFormat::OpenGLES, 2, 0, QShaderFormat::Vertex);
- const auto es3 = createFormat(QShaderFormat::OpenGLES, 3, 0, QShaderFormat::Vertex);
- const auto gl2 = createFormat(QShaderFormat::OpenGLNoProfile, 2, 0, QShaderFormat::Vertex);
- const auto gl3 = createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0, QShaderFormat::Vertex);
- const auto gl4 = createFormat(QShaderFormat::OpenGLCoreProfile, 4, 0, QShaderFormat::Vertex);
-
- auto graph = QShaderGraph();
-
- auto vertexPosition = createNode({
- createPort(QShaderNodePort::Output, "value")
- });
- vertexPosition.setParameter("name", "vertexPosition");
- vertexPosition.setParameter("qualifier", QVariant::fromValue<QShaderLanguage::StorageQualifier>(QShaderLanguage::Input));
- vertexPosition.setParameter("type", QVariant::fromValue<QShaderLanguage::VariableType>(QShaderLanguage::Vec4));
-
- vertexPosition.addRule(es2, QShaderNode::Rule("",
- QByteArrayList() << "$qualifier highp $type $name;"));
- vertexPosition.addRule(gl2, QShaderNode::Rule("",
- QByteArrayList() << "$qualifier $type $name;"));
- vertexPosition.addRule(gl3, QShaderNode::Rule("",
- QByteArrayList() << "$qualifier $type $name;"));
-
- graph.addNode(vertexPosition);
-
- const auto gl2Code = (QByteArrayList() << "#version 110"
- << ""
- << "attribute vec4 vertexPosition;"
- << ""
- << "void main()"
- << "{"
- << "}"
- << "").join("\n");
- const auto gl3Code = (QByteArrayList() << "#version 130"
- << ""
- << "in vec4 vertexPosition;"
- << ""
- << "void main()"
- << "{"
- << "}"
- << "").join("\n");
- const auto gl4Code = (QByteArrayList() << "#version 400 core"
- << ""
- << "in vec4 vertexPosition;"
- << ""
- << "void main()"
- << "{"
- << "}"
- << "").join("\n");
- const auto es2Code = (QByteArrayList() << "#version 100"
- << ""
- << "attribute highp vec4 vertexPosition;"
- << ""
- << "void main()"
- << "{"
- << "}"
- << "").join("\n");
- const auto es3Code = (QByteArrayList() << "#version 300 es"
- << ""
- << "in highp vec4 vertexPosition;"
- << ""
- << "void main()"
- << "{"
- << "}"
- << "").join("\n");
-
- QTest::addRow("Attribute header substitution ES2") << graph << es2 << es2Code;
- QTest::addRow("Attribute header substitution ES3") << graph << es3 << es3Code;
- QTest::addRow("Attribute header substitution GL2") << graph << gl2 << gl2Code;
- QTest::addRow("Attribute header substitution GL3") << graph << gl3 << gl3Code;
- QTest::addRow("Attribute header substitution GL4") << graph << gl4 << gl4Code;
- }
-}
-
-void tst_QShaderGenerator::shouldProcessLanguageQualifierAndTypeEnums()
-{
- // GIVEN
- QFETCH(QShaderGraph, graph);
- QFETCH(QShaderFormat, format);
-
- auto generator = QShaderGenerator();
- generator.graph = graph;
- generator.format = format;
-
- // WHEN
- const auto code = generator.createShaderCode();
-
- // THEN
- QFETCH(QByteArray, expectedCode);
- QCOMPARE(code, expectedCode);
-}
-
-void tst_QShaderGenerator::shouldGenerateDifferentCodeDependingOnActiveLayers()
-{
- // GIVEN
- const auto gl4 = createFormat(QShaderFormat::OpenGLCoreProfile, 4, 0);
-
- auto texCoord = createNode({
- createPort(QShaderNodePort::Output, "texCoord")
- }, {
- "diffuseTexture",
- "normalTexture"
- });
- texCoord.addRule(gl4, QShaderNode::Rule("vec2 $texCoord = texCoord;",
- QByteArrayList() << "in vec2 texCoord;"));
- auto diffuseUniform = createNode({
- createPort(QShaderNodePort::Output, "color")
- }, {"diffuseUniform"});
- diffuseUniform.addRule(gl4, QShaderNode::Rule("vec4 $color = diffuseUniform;",
- QByteArrayList() << "uniform vec4 diffuseUniform;"));
- auto diffuseTexture = createNode({
- createPort(QShaderNodePort::Input, "coord"),
- createPort(QShaderNodePort::Output, "color")
- }, {"diffuseTexture"});
- diffuseTexture.addRule(gl4, QShaderNode::Rule("vec4 $color = texture2D(diffuseTexture, $coord);",
- QByteArrayList() << "uniform sampler2D diffuseTexture;"));
- auto normalUniform = createNode({
- createPort(QShaderNodePort::Output, "normal")
- }, {"normalUniform"});
- normalUniform.addRule(gl4, QShaderNode::Rule("vec3 $normal = normalUniform;",
- QByteArrayList() << "uniform vec3 normalUniform;"));
- auto normalTexture = createNode({
- createPort(QShaderNodePort::Input, "coord"),
- createPort(QShaderNodePort::Output, "normal")
- }, {"normalTexture"});
- normalTexture.addRule(gl4, QShaderNode::Rule("vec3 $normal = texture2D(normalTexture, $coord).rgb;",
- QByteArrayList() << "uniform sampler2D normalTexture;"));
- auto lightFunction = createNode({
- createPort(QShaderNodePort::Input, "color"),
- createPort(QShaderNodePort::Input, "normal"),
- createPort(QShaderNodePort::Output, "output")
- });
- lightFunction.addRule(gl4, QShaderNode::Rule("vec4 $output = lightModel($color, $normal);",
- QByteArrayList() << "#pragma include gl4/lightmodel.frag.inc"));
- auto fragColor = createNode({
- createPort(QShaderNodePort::Input, "fragColor")
- });
- fragColor.addRule(gl4, QShaderNode::Rule("fragColor = $fragColor;",
- QByteArrayList() << "out vec4 fragColor;"));
-
- const auto graph = [=] {
- auto res = QShaderGraph();
-
- res.addNode(texCoord);
- res.addNode(diffuseUniform);
- res.addNode(diffuseTexture);
- res.addNode(normalUniform);
- res.addNode(normalTexture);
- res.addNode(lightFunction);
- res.addNode(fragColor);
-
- res.addEdge(createEdge(diffuseUniform.uuid(), "color", lightFunction.uuid(), "color", {"diffuseUniform"}));
- res.addEdge(createEdge(texCoord.uuid(), "texCoord", diffuseTexture.uuid(), "coord", {"diffuseTexture"}));
- res.addEdge(createEdge(diffuseTexture.uuid(), "color", lightFunction.uuid(), "color", {"diffuseTexture"}));
-
- res.addEdge(createEdge(normalUniform.uuid(), "normal", lightFunction.uuid(), "normal", {"normalUniform"}));
- res.addEdge(createEdge(texCoord.uuid(), "texCoord", normalTexture.uuid(), "coord", {"normalTexture"}));
- res.addEdge(createEdge(normalTexture.uuid(), "normal", lightFunction.uuid(), "normal", {"normalTexture"}));
-
- res.addEdge(createEdge(lightFunction.uuid(), "output", fragColor.uuid(), "fragColor"));
-
- return res;
- }();
-
- auto generator = QShaderGenerator();
- generator.graph = graph;
- generator.format = gl4;
-
- {
- // WHEN
- const auto code = generator.createShaderCode({"diffuseUniform", "normalUniform"});
-
- // THEN
- const auto expected = QByteArrayList()
- << "#version 400 core"
- << ""
- << "uniform vec4 diffuseUniform;"
- << "uniform vec3 normalUniform;"
- << "#pragma include gl4/lightmodel.frag.inc"
- << "out vec4 fragColor;"
- << ""
- << "void main()"
- << "{"
- << " fragColor = ((lightModel(diffuseUniform, normalUniform)));"
- << "}"
- << "";
- QCOMPARE(code, expected.join("\n"));
- }
-
- {
- // WHEN
- const auto code = generator.createShaderCode({"diffuseUniform", "normalTexture"});
-
- // THEN
- const auto expected = QByteArrayList()
- << "#version 400 core"
- << ""
- << "in vec2 texCoord;"
- << "uniform vec4 diffuseUniform;"
- << "uniform sampler2D normalTexture;"
- << "#pragma include gl4/lightmodel.frag.inc"
- << "out vec4 fragColor;"
- << ""
- << "void main()"
- << "{"
- << " fragColor = ((lightModel(diffuseUniform, texture2D(normalTexture, texCoord).rgb)));"
- << "}"
- << "";
- QCOMPARE(code, expected.join("\n"));
- }
-
- {
- // WHEN
- const auto code = generator.createShaderCode({"diffuseTexture", "normalUniform"});
-
- // THEN
- const auto expected = QByteArrayList()
- << "#version 400 core"
- << ""
- << "in vec2 texCoord;"
- << "uniform sampler2D diffuseTexture;"
- << "uniform vec3 normalUniform;"
- << "#pragma include gl4/lightmodel.frag.inc"
- << "out vec4 fragColor;"
- << ""
- << "void main()"
- << "{"
- << " fragColor = ((lightModel(texture2D(diffuseTexture, texCoord), normalUniform)));"
- << "}"
- << "";
- QCOMPARE(code, expected.join("\n"));
- }
-
- {
- // WHEN
- const auto code = generator.createShaderCode({"diffuseTexture", "normalTexture"});
-
- // THEN
- const auto expected = QByteArrayList()
- << "#version 400 core"
- << ""
- << "in vec2 texCoord;"
- << "uniform sampler2D diffuseTexture;"
- << "uniform sampler2D normalTexture;"
- << "#pragma include gl4/lightmodel.frag.inc"
- << "out vec4 fragColor;"
- << ""
- << "void main()"
- << "{"
- << " fragColor = ((lightModel(texture2D(diffuseTexture, texCoord), texture2D(normalTexture, texCoord).rgb)));"
- << "}"
- << "";
- QCOMPARE(code, expected.join("\n"));
- }
-}
-
-void tst_QShaderGenerator::shouldUseGlobalVariableRatherThanTemporaries()
-{
- // GIVEN
- const auto gl4 = createFormat(QShaderFormat::OpenGLCoreProfile, 4, 0);
-
- {
- // WHEN
- auto vertexPosition = createNode({
- createPort(QShaderNodePort::Output, "vertexPosition")
- });
- vertexPosition.addRule(gl4, QShaderNode::Rule("vec4 $vertexPosition = vertexPosition;",
- QByteArrayList() << "in vec4 vertexPosition;"));
-
- auto fakeMultiPlyNoSpace = createNode({
- createPort(QShaderNodePort::Input, "varName"),
- createPort(QShaderNodePort::Output, "out")
- });
- fakeMultiPlyNoSpace.addRule(gl4, QShaderNode::Rule("vec4 $out = $varName*speed;"));
-
- auto fakeMultiPlySpace = createNode({
- createPort(QShaderNodePort::Input, "varName"),
- createPort(QShaderNodePort::Output, "out")
- });
- fakeMultiPlySpace.addRule(gl4, QShaderNode::Rule("vec4 $out = $varName * speed;"));
-
- auto fakeJoinNoSpace = createNode({
- createPort(QShaderNodePort::Input, "varName"),
- createPort(QShaderNodePort::Output, "out")
- });
- fakeJoinNoSpace.addRule(gl4, QShaderNode::Rule("vec4 $out = vec4($varName.xyz,$varName.w);"));
-
- auto fakeJoinSpace = createNode({
- createPort(QShaderNodePort::Input, "varName"),
- createPort(QShaderNodePort::Output, "out")
- });
- fakeJoinSpace.addRule(gl4, QShaderNode::Rule("vec4 $out = vec4($varName.xyz, $varName.w);"));
-
- auto fakeAdd = createNode({
- createPort(QShaderNodePort::Input, "varName"),
- createPort(QShaderNodePort::Output, "out")
- });
- fakeAdd.addRule(gl4, QShaderNode::Rule("vec4 $out = $varName.xyzw + $varName;"));
-
- auto fakeSub = createNode({
- createPort(QShaderNodePort::Input, "varName"),
- createPort(QShaderNodePort::Output, "out")
- });
- fakeSub.addRule(gl4, QShaderNode::Rule("vec4 $out = $varName.xyzw - $varName;"));
-
- auto fakeDiv = createNode({
- createPort(QShaderNodePort::Input, "varName"),
- createPort(QShaderNodePort::Output, "out")
- });
- fakeDiv.addRule(gl4, QShaderNode::Rule("vec4 $out = $varName / v0;"));
-
- auto fragColor = createNode({
- createPort(QShaderNodePort::Input, "input1"),
- createPort(QShaderNodePort::Input, "input2"),
- createPort(QShaderNodePort::Input, "input3"),
- createPort(QShaderNodePort::Input, "input4"),
- createPort(QShaderNodePort::Input, "input5"),
- createPort(QShaderNodePort::Input, "input6"),
- createPort(QShaderNodePort::Input, "input7")
- });
- fragColor.addRule(gl4, QShaderNode::Rule("fragColor = $input1 + $input2 + $input3 + $input4 + $input5 + $input6 + $input7;",
- QByteArrayList() << "out vec4 fragColor;"));
-
- const auto graph = [=] {
- auto res = QShaderGraph();
-
- res.addNode(vertexPosition);
- res.addNode(fakeMultiPlyNoSpace);
- res.addNode(fakeMultiPlySpace);
- res.addNode(fakeJoinNoSpace);
- res.addNode(fakeJoinSpace);
- res.addNode(fakeAdd);
- res.addNode(fakeSub);
- res.addNode(fakeDiv);
- res.addNode(fragColor);
-
- res.addEdge(createEdge(vertexPosition.uuid(), "vertexPosition", fakeMultiPlyNoSpace.uuid(), "varName"));
- res.addEdge(createEdge(vertexPosition.uuid(), "vertexPosition", fakeMultiPlySpace.uuid(), "varName"));
- res.addEdge(createEdge(vertexPosition.uuid(), "vertexPosition", fakeJoinNoSpace.uuid(), "varName"));
- res.addEdge(createEdge(vertexPosition.uuid(), "vertexPosition", fakeJoinSpace.uuid(), "varName"));
- res.addEdge(createEdge(vertexPosition.uuid(), "vertexPosition", fakeAdd.uuid(), "varName"));
- res.addEdge(createEdge(vertexPosition.uuid(), "vertexPosition", fakeSub.uuid(), "varName"));
- res.addEdge(createEdge(vertexPosition.uuid(), "vertexPosition", fakeDiv.uuid(), "varName"));
- res.addEdge(createEdge(fakeMultiPlyNoSpace.uuid(), "out", fragColor.uuid(), "input1"));
- res.addEdge(createEdge(fakeMultiPlySpace.uuid(), "out", fragColor.uuid(), "input2"));
- res.addEdge(createEdge(fakeJoinNoSpace.uuid(), "out", fragColor.uuid(), "input3"));
- res.addEdge(createEdge(fakeJoinSpace.uuid(), "out", fragColor.uuid(), "input4"));
- res.addEdge(createEdge(fakeAdd.uuid(), "out", fragColor.uuid(), "input5"));
- res.addEdge(createEdge(fakeSub.uuid(), "out", fragColor.uuid(), "input6"));
- res.addEdge(createEdge(fakeDiv.uuid(), "out", fragColor.uuid(), "input7"));
-
- return res;
- }();
-
- auto generator = QShaderGenerator();
- generator.graph = graph;
- generator.format = gl4;
-
- const auto code = generator.createShaderCode({"diffuseUniform", "normalUniform"});
-
- // THEN
- const auto expected = QByteArrayList()
- << "#version 400 core"
- << ""
- << "in vec4 vertexPosition;"
- << "out vec4 fragColor;"
- << ""
- << "void main()"
- << "{"
- << " fragColor = (((((((vertexPosition*speed + vertexPosition * speed + ((vec4(vertexPosition.xyz,vertexPosition.w))) + ((vec4(vertexPosition.xyz, vertexPosition.w))) + ((vertexPosition.xyzw + vertexPosition)) + ((vertexPosition.xyzw - vertexPosition)) + ((vertexPosition / vertexPosition)))))))));"
- << "}"
- << "";
- QCOMPARE(code, expected.join("\n"));
- }
-}
-
-void tst_QShaderGenerator::shouldGenerateTemporariesWisely()
-{
- // GIVEN
- const auto gl4 = createFormat(QShaderFormat::OpenGLCoreProfile, 4, 0);
-
- {
- auto attribute = createNode({
- createPort(QShaderNodePort::Output, "vertexPosition")
- });
- attribute.addRule(gl4, QShaderNode::Rule("vec4 $vertexPosition = vertexPosition;",
- QByteArrayList() << "in vec4 vertexPosition;"));
-
- auto complexFunction = createNode({
- createPort(QShaderNodePort::Input, "inputVarName"),
- createPort(QShaderNodePort::Output, "out")
- });
- complexFunction.addRule(gl4, QShaderNode::Rule("vec4 $out = $inputVarName * 2.0;"));
-
- auto complexFunction2 = createNode({
- createPort(QShaderNodePort::Input, "inputVarName"),
- createPort(QShaderNodePort::Output, "out")
- });
- complexFunction2.addRule(gl4, QShaderNode::Rule("vec4 $out = $inputVarName * 4.0;"));
-
- auto complexFunction3 = createNode({
- createPort(QShaderNodePort::Input, "a"),
- createPort(QShaderNodePort::Input, "b"),
- createPort(QShaderNodePort::Output, "out")
- });
- complexFunction3.addRule(gl4, QShaderNode::Rule("vec4 $out = $a + $b;"));
-
- auto shaderOutput1 = createNode({
- createPort(QShaderNodePort::Input, "input")
- });
-
- shaderOutput1.addRule(gl4, QShaderNode::Rule("shaderOutput1 = $input;",
- QByteArrayList() << "out vec4 shaderOutput1;"));
-
- auto shaderOutput2 = createNode({
- createPort(QShaderNodePort::Input, "input")
- });
-
- shaderOutput2.addRule(gl4, QShaderNode::Rule("shaderOutput2 = $input;",
- QByteArrayList() << "out vec4 shaderOutput2;"));
-
- {
- // WHEN
- const auto graph = [=] {
- auto res = QShaderGraph();
-
- res.addNode(attribute);
- res.addNode(complexFunction);
- res.addNode(shaderOutput1);
-
- res.addEdge(createEdge(attribute.uuid(), "vertexPosition", complexFunction.uuid(), "inputVarName"));
- res.addEdge(createEdge(complexFunction.uuid(), "out", shaderOutput1.uuid(), "input"));
-
- return res;
- }();
-
- auto generator = QShaderGenerator();
- generator.graph = graph;
- generator.format = gl4;
-
- const auto code = generator.createShaderCode();
-
- // THEN
- const auto expected = QByteArrayList()
- << "#version 400 core"
- << ""
- << "in vec4 vertexPosition;"
- << "out vec4 shaderOutput1;"
- << ""
- << "void main()"
- << "{"
- << " shaderOutput1 = vertexPosition * 2.0;"
- << "}"
- << "";
- QCOMPARE(code, expected.join("\n"));
- }
-
- {
- // WHEN
- const auto graph = [=] {
- auto res = QShaderGraph();
-
- res.addNode(attribute);
- res.addNode(complexFunction);
- res.addNode(shaderOutput1);
- res.addNode(shaderOutput2);
-
- res.addEdge(createEdge(attribute.uuid(), "vertexPosition", complexFunction.uuid(), "inputVarName"));
- res.addEdge(createEdge(complexFunction.uuid(), "out", shaderOutput1.uuid(), "input"));
- res.addEdge(createEdge(complexFunction.uuid(), "out", shaderOutput2.uuid(), "input"));
-
- return res;
- }();
-
- auto generator = QShaderGenerator();
- generator.graph = graph;
- generator.format = gl4;
-
- const auto code = generator.createShaderCode();
-
- // THEN
- const auto expected = QByteArrayList()
- << "#version 400 core"
- << ""
- << "in vec4 vertexPosition;"
- << "out vec4 shaderOutput1;"
- << "out vec4 shaderOutput2;"
- << ""
- << "void main()"
- << "{"
- << " vec4 v1 = vertexPosition * 2.0;"
- << " shaderOutput2 = v1;"
- << " shaderOutput1 = v1;"
- << "}"
- << "";
- QCOMPARE(code, expected.join("\n"));
- }
-
- {
- // WHEN
- const auto graph = [=] {
- auto res = QShaderGraph();
-
- res.addNode(attribute);
- res.addNode(complexFunction);
- res.addNode(complexFunction2);
- res.addNode(complexFunction3);
- res.addNode(shaderOutput1);
- res.addNode(shaderOutput2);
-
- res.addEdge(createEdge(attribute.uuid(), "vertexPosition", complexFunction.uuid(), "inputVarName"));
- res.addEdge(createEdge(attribute.uuid(), "vertexPosition", complexFunction2.uuid(), "inputVarName"));
-
- res.addEdge(createEdge(complexFunction.uuid(), "out", complexFunction3.uuid(), "a"));
- res.addEdge(createEdge(complexFunction2.uuid(), "out", complexFunction3.uuid(), "b"));
-
- res.addEdge(createEdge(complexFunction3.uuid(), "out", shaderOutput1.uuid(), "input"));
- res.addEdge(createEdge(complexFunction2.uuid(), "out", shaderOutput2.uuid(), "input"));
-
- return res;
- }();
-
- auto generator = QShaderGenerator();
- generator.graph = graph;
- generator.format = gl4;
-
- const auto code = generator.createShaderCode();
-
- // THEN
- const auto expected = QByteArrayList()
- << "#version 400 core"
- << ""
- << "in vec4 vertexPosition;"
- << "out vec4 shaderOutput1;"
- << "out vec4 shaderOutput2;"
- << ""
- << "void main()"
- << "{"
- << " vec4 v2 = vertexPosition * 4.0;"
- << " shaderOutput2 = v2;"
- << " shaderOutput1 = (vertexPosition * 2.0 + v2);"
- << "}"
- << "";
- QCOMPARE(code, expected.join("\n"));
- }
- }
-}
-
-void tst_QShaderGenerator::shouldHandlePortNamesPrefixingOneAnother()
-{
- // GIVEN
- const auto gl4 = createFormat(QShaderFormat::OpenGLCoreProfile, 4, 0);
-
- auto color1 = createNode({
- createPort(QShaderNodePort::Output, "output")
- });
- color1.addRule(gl4, QShaderNode::Rule("vec4 $output = color1;",
- QByteArrayList() << "in vec4 color1;"));
-
- auto color2 = createNode({
- createPort(QShaderNodePort::Output, "output")
- });
- color2.addRule(gl4, QShaderNode::Rule("vec4 $output = color2;",
- QByteArrayList() << "in vec4 color2;"));
-
- auto addColor = createNode({
- createPort(QShaderNodePort::Output, "color"),
- createPort(QShaderNodePort::Input, "color1"),
- createPort(QShaderNodePort::Input, "color2"),
- });
- addColor.addRule(gl4, QShaderNode::Rule("vec4 $color = $color1 + $color2;"));
-
- auto shaderOutput = createNode({
- createPort(QShaderNodePort::Input, "input")
- });
-
- shaderOutput.addRule(gl4, QShaderNode::Rule("shaderOutput = $input;",
- QByteArrayList() << "out vec4 shaderOutput;"));
-
- // WHEN
- const auto graph = [=] {
- auto res = QShaderGraph();
-
- res.addNode(color1);
- res.addNode(color2);
- res.addNode(addColor);
- res.addNode(shaderOutput);
-
- res.addEdge(createEdge(color1.uuid(), "output", addColor.uuid(), "color1"));
- res.addEdge(createEdge(color2.uuid(), "output", addColor.uuid(), "color2"));
- res.addEdge(createEdge(addColor.uuid(), "color", shaderOutput.uuid(), "input"));
-
- return res;
- }();
-
- auto generator = QShaderGenerator();
- generator.graph = graph;
- generator.format = gl4;
-
- const auto code = generator.createShaderCode();
-
- // THEN
- const auto expected = QByteArrayList()
- << "#version 400 core"
- << ""
- << "in vec4 color1;"
- << "in vec4 color2;"
- << "out vec4 shaderOutput;"
- << ""
- << "void main()"
- << "{"
- << " shaderOutput = ((color1 + color2));"
- << "}"
- << "";
- QCOMPARE(code, expected.join("\n"));
-}
-
-void tst_QShaderGenerator::shouldHandleNodesWithMultipleOutputPorts()
-{
- // GIVEN
- const auto gl4 = createFormat(QShaderFormat::OpenGLCoreProfile, 4, 0);
-
- auto input = createNode({
- createPort(QShaderNodePort::Output, "output0"),
- createPort(QShaderNodePort::Output, "output1")
- });
- input.addRule(gl4, QShaderNode::Rule("vec4 $output0 = globalIn0;"
- "float $output1 = globalIn1;",
- QByteArrayList() << "in vec4 globalIn0;" << "in float globalIn1;"));
-
- auto function = createNode({
- createPort(QShaderNodePort::Input, "input0"),
- createPort(QShaderNodePort::Input, "input1"),
- createPort(QShaderNodePort::Output, "output0"),
- createPort(QShaderNodePort::Output, "output1")
- });
- function.addRule(gl4, QShaderNode::Rule("vec4 $output0 = $input0;"
- "float $output1 = $input1;"));
-
- auto output = createNode({
- createPort(QShaderNodePort::Input, "input0"),
- createPort(QShaderNodePort::Input, "input1")
- });
-
- output.addRule(gl4, QShaderNode::Rule("globalOut0 = $input0;"
- "globalOut1 = $input1;",
- QByteArrayList() << "out vec4 globalOut0;" << "out float globalOut1;"));
-
- // WHEN
- const auto graph = [=] {
- auto res = QShaderGraph();
-
- res.addNode(input);
- res.addNode(function);
- res.addNode(output);
-
- res.addEdge(createEdge(input.uuid(), "output0", function.uuid(), "input0"));
- res.addEdge(createEdge(input.uuid(), "output1", function.uuid(), "input1"));
-
- res.addEdge(createEdge(function.uuid(), "output0", output.uuid(), "input0"));
- res.addEdge(createEdge(function.uuid(), "output1", output.uuid(), "input1"));
-
- return res;
- }();
-
- auto generator = QShaderGenerator();
- generator.graph = graph;
- generator.format = gl4;
-
- const auto code = generator.createShaderCode();
-
- // THEN
- const auto expected = QByteArrayList()
- << "#version 400 core"
- << ""
- << "in vec4 globalIn0;"
- << "in float globalIn1;"
- << "out vec4 globalOut0;"
- << "out float globalOut1;"
- << ""
- << "void main()"
- << "{"
- << " globalOut0 = globalIn0;"
- << " globalOut1 = globalIn1;"
- << "}"
- << "";
- QCOMPARE(code, expected.join("\n"));
-}
-
-void tst_QShaderGenerator::shouldHandleExpressionsInInputNodes()
-{
- // GIVEN
- const auto gl4 = createFormat(QShaderFormat::OpenGLCoreProfile, 4, 0);
-
- auto input = createNode({
- createPort(QShaderNodePort::Output, "output")
- });
- input.addRule(gl4, QShaderNode::Rule("float $output = 3 + 4;"));
-
- auto output = createNode({
- createPort(QShaderNodePort::Input, "input")
- });
-
- output.addRule(gl4, QShaderNode::Rule("globalOut = $input;",
- QByteArrayList() << "out float globalOut;"));
-
- // WHEN
- const auto graph = [=] {
- auto res = QShaderGraph();
-
- res.addNode(input);
- res.addNode(output);
-
- res.addEdge(createEdge(input.uuid(), "output", output.uuid(), "input"));
-
- return res;
- }();
-
- auto generator = QShaderGenerator();
- generator.graph = graph;
- generator.format = gl4;
-
- const auto code = generator.createShaderCode();
-
- // THEN
- const auto expected = QByteArrayList()
- << "#version 400 core"
- << ""
- << "out float globalOut;"
- << ""
- << "void main()"
- << "{"
- << " globalOut = 3 + 4;"
- << "}"
- << "";
- QCOMPARE(code, expected.join("\n"));
-}
-
-QTEST_MAIN(tst_QShaderGenerator)
-
-#include "tst_qshadergenerator.moc"
diff --git a/tests/auto/gui/util/qshadergraph/CMakeLists.txt b/tests/auto/gui/util/qshadergraph/CMakeLists.txt
deleted file mode 100644
index e510fffb03..0000000000
--- a/tests/auto/gui/util/qshadergraph/CMakeLists.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-# Generated from qshadergraph.pro.
-
-#####################################################################
-## tst_qshadergraph Test:
-#####################################################################
-
-qt_internal_add_test(tst_qshadergraph
- SOURCES
- tst_qshadergraph.cpp
- PUBLIC_LIBRARIES
- Qt::Gui
- Qt::GuiPrivate
-)
diff --git a/tests/auto/gui/util/qshadergraph/tst_qshadergraph.cpp b/tests/auto/gui/util/qshadergraph/tst_qshadergraph.cpp
deleted file mode 100644
index 8cf62eb387..0000000000
--- a/tests/auto/gui/util/qshadergraph/tst_qshadergraph.cpp
+++ /dev/null
@@ -1,815 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB).
-** 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 <QTest>
-
-#include <QtGui/private/qshadergraph_p.h>
-
-namespace
-{
- QShaderNodePort createPort(QShaderNodePort::Direction portDirection, const QString &portName)
- {
- auto port = QShaderNodePort();
- port.direction = portDirection;
- port.name = portName;
- return port;
- }
-
- QShaderNode createNode(const QList<QShaderNodePort> &ports,
- const QStringList &layers = QStringList())
- {
- auto node = QShaderNode();
- node.setUuid(QUuid::createUuid());
- node.setLayers(layers);
- for (const auto &port : ports)
- node.addPort(port);
- return node;
- }
-
- QShaderGraph::Edge createEdge(const QUuid &sourceUuid, const QString &sourceName,
- const QUuid &targetUuid, const QString &targetName,
- const QStringList &layers = QStringList())
- {
- auto edge = QShaderGraph::Edge();
- edge.sourceNodeUuid = sourceUuid;
- edge.sourcePortName = sourceName;
- edge.targetNodeUuid = targetUuid;
- edge.targetPortName = targetName;
- edge.layers = layers;
- return edge;
- }
-
- QShaderGraph::Statement createStatement(const QShaderNode &node,
- const QList<int> &inputs = QList<int>(),
- const QList<int> &outputs = QList<int>())
- {
- auto statement = QShaderGraph::Statement();
- statement.node = node;
- statement.inputs = inputs;
- statement.outputs = outputs;
- return statement;
- }
-
- void debugStatement(const QString &prefix, const QShaderGraph::Statement &statement)
- {
- qDebug() << prefix << statement.inputs << statement.uuid().toString() << statement.outputs;
- }
-
- void dumpStatementsIfNeeded(const QList<QShaderGraph::Statement> &statements,
- const QList<QShaderGraph::Statement> &expected)
- {
- if (statements != expected) {
- for (int i = 0; i < qMax(statements.size(), expected.size()); i++) {
- qDebug() << "----" << i << "----";
- if (i < statements.size())
- debugStatement("A:", statements.at(i));
- if (i < expected.size())
- debugStatement("E:", expected.at(i));
- qDebug() << "-----------";
- }
- }
- }
-}
-
-class tst_QShaderGraph : public QObject
-{
- Q_OBJECT
-private slots:
- void shouldHaveEdgeDefaultState();
- void shouldTestEdgesEquality_data();
- void shouldTestEdgesEquality();
- void shouldManipulateStatementMembers();
- void shouldTestStatementsEquality_data();
- void shouldTestStatementsEquality();
- void shouldFindIndexFromPortNameInStatements_data();
- void shouldFindIndexFromPortNameInStatements();
- void shouldManageNodeList();
- void shouldManageEdgeList();
- void shouldSerializeGraphForCodeGeneration();
- void shouldHandleUnboundPortsDuringGraphSerialization();
- void shouldSurviveCyclesDuringGraphSerialization();
- void shouldDealWithEdgesJumpingOverLayers();
- void shouldGenerateDifferentStatementsDependingOnActiveLayers();
- void shouldDealWithBranchesWithoutOutput();
-};
-
-void tst_QShaderGraph::shouldHaveEdgeDefaultState()
-{
- // GIVEN
- auto edge = QShaderGraph::Edge();
-
- // THEN
- QVERIFY(edge.sourceNodeUuid.isNull());
- QVERIFY(edge.sourcePortName.isEmpty());
- QVERIFY(edge.targetNodeUuid.isNull());
- QVERIFY(edge.targetPortName.isEmpty());
-}
-
-void tst_QShaderGraph::shouldTestEdgesEquality_data()
-{
- QTest::addColumn<QShaderGraph::Edge>("left");
- QTest::addColumn<QShaderGraph::Edge>("right");
- QTest::addColumn<bool>("expected");
-
- const auto sourceUuid1 = QUuid::createUuid();
- const auto sourceUuid2 = QUuid::createUuid();
- const auto targetUuid1 = QUuid::createUuid();
- const auto targetUuid2 = QUuid::createUuid();
-
- QTest::newRow("Equals") << createEdge(sourceUuid1, "foo", targetUuid1, "bar")
- << createEdge(sourceUuid1, "foo", targetUuid1, "bar")
- << true;
- QTest::newRow("SourceUuid") << createEdge(sourceUuid1, "foo", targetUuid1, "bar")
- << createEdge(sourceUuid2, "foo", targetUuid1, "bar")
- << false;
- QTest::newRow("SourceName") << createEdge(sourceUuid1, "foo", targetUuid1, "bar")
- << createEdge(sourceUuid1, "bleh", targetUuid1, "bar")
- << false;
- QTest::newRow("TargetUuid") << createEdge(sourceUuid1, "foo", targetUuid1, "bar")
- << createEdge(sourceUuid1, "foo", targetUuid2, "bar")
- << false;
- QTest::newRow("TargetName") << createEdge(sourceUuid1, "foo", targetUuid1, "bar")
- << createEdge(sourceUuid1, "foo", targetUuid1, "bleh")
- << false;
-}
-
-void tst_QShaderGraph::shouldTestEdgesEquality()
-{
- // GIVEN
- QFETCH(QShaderGraph::Edge, left);
- QFETCH(QShaderGraph::Edge, right);
-
- // WHEN
- const auto equal = (left == right);
- const auto notEqual = (left != right);
-
- // THEN
- QFETCH(bool, expected);
- QCOMPARE(equal, expected);
- QCOMPARE(notEqual, !expected);
-}
-
-void tst_QShaderGraph::shouldManipulateStatementMembers()
-{
- // GIVEN
- auto statement = QShaderGraph::Statement();
-
- // THEN (default state)
- QVERIFY(statement.inputs.isEmpty());
- QVERIFY(statement.outputs.isEmpty());
- QVERIFY(statement.node.uuid().isNull());
- QVERIFY(statement.uuid().isNull());
-
- // WHEN
- const auto node = createNode({});
- statement.node = node;
-
- // THEN
- QCOMPARE(statement.uuid(), node.uuid());
-
- // WHEN
- statement.node = QShaderNode();
-
- // THEN
- QVERIFY(statement.uuid().isNull());
-}
-
-void tst_QShaderGraph::shouldTestStatementsEquality_data()
-{
- QTest::addColumn<QShaderGraph::Statement>("left");
- QTest::addColumn<QShaderGraph::Statement>("right");
- QTest::addColumn<bool>("expected");
-
- const auto node1 = createNode({});
- const auto node2 = createNode({});
-
- QTest::newRow("EqualNodes") << createStatement(node1, {1, 2}, {3, 4})
- << createStatement(node1, {1, 2}, {3, 4})
- << true;
- QTest::newRow("EqualInvalids") << createStatement(QShaderNode(), {1, 2}, {3, 4})
- << createStatement(QShaderNode(), {1, 2}, {3, 4})
- << true;
- QTest::newRow("Nodes") << createStatement(node1, {1, 2}, {3, 4})
- << createStatement(node2, {1, 2}, {3, 4})
- << false;
- QTest::newRow("Inputs") << createStatement(node1, {1, 2}, {3, 4})
- << createStatement(node1, {1, 2, 0}, {3, 4})
- << false;
- QTest::newRow("Outputs") << createStatement(node1, {1, 2}, {3, 4})
- << createStatement(node1, {1, 2}, {3, 0, 4})
- << false;
-}
-
-void tst_QShaderGraph::shouldTestStatementsEquality()
-{
- // GIVEN
- QFETCH(QShaderGraph::Statement, left);
- QFETCH(QShaderGraph::Statement, right);
-
- // WHEN
- const auto equal = (left == right);
- const auto notEqual = (left != right);
-
- // THEN
- QFETCH(bool, expected);
- QCOMPARE(equal, expected);
- QCOMPARE(notEqual, !expected);
-}
-
-void tst_QShaderGraph::shouldFindIndexFromPortNameInStatements_data()
-{
- QTest::addColumn<QShaderGraph::Statement>("statement");
- QTest::addColumn<QString>("portName");
- QTest::addColumn<int>("expectedInputIndex");
- QTest::addColumn<int>("expectedOutputIndex");
-
- const auto inputNodeStatement = createStatement(createNode({
- createPort(QShaderNodePort::Output, "input")
- }));
- const auto outputNodeStatement = createStatement(createNode({
- createPort(QShaderNodePort::Input, "output")
- }));
- const auto functionNodeStatement = createStatement(createNode({
- createPort(QShaderNodePort::Input, "input1"),
- createPort(QShaderNodePort::Output, "output1"),
- createPort(QShaderNodePort::Input, "input2"),
- createPort(QShaderNodePort::Output, "output2"),
- createPort(QShaderNodePort::Output, "output3"),
- createPort(QShaderNodePort::Input, "input3")
- }));
-
- QTest::newRow("Invalid") << QShaderGraph::Statement() << "foo" << -1 << -1;
- QTest::newRow("InputNodeWrongName") << inputNodeStatement << "foo" << -1 << -1;
- QTest::newRow("InputNodeExistingName") << inputNodeStatement << "input" << -1 << 0;
- QTest::newRow("OutputNodeWrongName") << outputNodeStatement << "foo" << -1 << -1;
- QTest::newRow("OutputNodeExistingName") << outputNodeStatement << "output" << 0 << -1;
- QTest::newRow("FunctionNodeWrongName") << functionNodeStatement << "foo" << -1 << -1;
- QTest::newRow("FunctionNodeInput1") << functionNodeStatement << "input1" << 0 << -1;
- QTest::newRow("FunctionNodeOutput1") << functionNodeStatement << "output1" << -1 << 0;
- QTest::newRow("FunctionNodeInput2") << functionNodeStatement << "input2" << 1 << -1;
- QTest::newRow("FunctionNodeOutput2") << functionNodeStatement << "output2" << -1 << 1;
- QTest::newRow("FunctionNodeInput3") << functionNodeStatement << "input3" << 2 << -1;
- QTest::newRow("FunctionNodeOutput3") << functionNodeStatement << "output3" << -1 << 2;
-}
-
-void tst_QShaderGraph::shouldFindIndexFromPortNameInStatements()
-{
- // GIVEN
- QFETCH(QShaderGraph::Statement, statement);
- QFETCH(QString, portName);
- QFETCH(int, expectedInputIndex);
- QFETCH(int, expectedOutputIndex);
-
- // WHEN
- const auto inputIndex = statement.portIndex(QShaderNodePort::Input, portName);
- const auto outputIndex = statement.portIndex(QShaderNodePort::Output, portName);
-
- // THEN
- QCOMPARE(inputIndex, expectedInputIndex);
- QCOMPARE(outputIndex, expectedOutputIndex);
-}
-
-void tst_QShaderGraph::shouldManageNodeList()
-{
- // GIVEN
- const auto node1 = createNode({createPort(QShaderNodePort::Output, "node1")});
- const auto node2 = createNode({createPort(QShaderNodePort::Output, "node2")});
-
- auto graph = QShaderGraph();
-
- // THEN (default state)
- QVERIFY(graph.nodes().isEmpty());
-
- // WHEN
- graph.addNode(node1);
-
- // THEN
- QCOMPARE(graph.nodes().size(), 1);
- QCOMPARE(graph.nodes().at(0).uuid(), node1.uuid());
- QCOMPARE(graph.nodes().at(0).ports().at(0).name, node1.ports().at(0).name);
-
- // WHEN
- graph.addNode(node2);
-
- // THEN
- QCOMPARE(graph.nodes().size(), 2);
- QCOMPARE(graph.nodes().at(0).uuid(), node1.uuid());
- QCOMPARE(graph.nodes().at(0).ports().at(0).name, node1.ports().at(0).name);
- QCOMPARE(graph.nodes().at(1).uuid(), node2.uuid());
- QCOMPARE(graph.nodes().at(1).ports().at(0).name, node2.ports().at(0).name);
-
-
- // WHEN
- graph.removeNode(node2);
-
- // THEN
- QCOMPARE(graph.nodes().size(), 1);
- QCOMPARE(graph.nodes().at(0).uuid(), node1.uuid());
- QCOMPARE(graph.nodes().at(0).ports().at(0).name, node1.ports().at(0).name);
-
- // WHEN
- graph.addNode(node2);
-
- // THEN
- QCOMPARE(graph.nodes().size(), 2);
- QCOMPARE(graph.nodes().at(0).uuid(), node1.uuid());
- QCOMPARE(graph.nodes().at(0).ports().at(0).name, node1.ports().at(0).name);
- QCOMPARE(graph.nodes().at(1).uuid(), node2.uuid());
- QCOMPARE(graph.nodes().at(1).ports().at(0).name, node2.ports().at(0).name);
-
- // WHEN
- const auto node1bis = [node1] {
- auto res = node1;
- auto port = res.ports().at(0);
- port.name = QStringLiteral("node1bis");
- res.addPort(port);
- return res;
- }();
- graph.addNode(node1bis);
-
- // THEN
- QCOMPARE(graph.nodes().size(), 2);
- QCOMPARE(graph.nodes().at(0).uuid(), node2.uuid());
- QCOMPARE(graph.nodes().at(0).ports().at(0).name, node2.ports().at(0).name);
- QCOMPARE(graph.nodes().at(1).uuid(), node1bis.uuid());
- QCOMPARE(graph.nodes().at(1).ports().at(0).name, node1bis.ports().at(0).name);
-}
-
-void tst_QShaderGraph::shouldManageEdgeList()
-{
- // GIVEN
- const auto edge1 = createEdge(QUuid::createUuid(), "foo", QUuid::createUuid(), "bar");
- const auto edge2 = createEdge(QUuid::createUuid(), "baz", QUuid::createUuid(), "boo");
-
- auto graph = QShaderGraph();
-
- // THEN (default state)
- QVERIFY(graph.edges().isEmpty());
-
- // WHEN
- graph.addEdge(edge1);
-
- // THEN
- QCOMPARE(graph.edges().size(), 1);
- QCOMPARE(graph.edges().at(0), edge1);
-
- // WHEN
- graph.addEdge(edge2);
-
- // THEN
- QCOMPARE(graph.edges().size(), 2);
- QCOMPARE(graph.edges().at(0), edge1);
- QCOMPARE(graph.edges().at(1), edge2);
-
-
- // WHEN
- graph.removeEdge(edge2);
-
- // THEN
- QCOMPARE(graph.edges().size(), 1);
- QCOMPARE(graph.edges().at(0), edge1);
-
- // WHEN
- graph.addEdge(edge2);
-
- // THEN
- QCOMPARE(graph.edges().size(), 2);
- QCOMPARE(graph.edges().at(0), edge1);
- QCOMPARE(graph.edges().at(1), edge2);
-
- // WHEN
- graph.addEdge(edge1);
-
- // THEN
- QCOMPARE(graph.edges().size(), 2);
- QCOMPARE(graph.edges().at(0), edge1);
- QCOMPARE(graph.edges().at(1), edge2);
-}
-
-void tst_QShaderGraph::shouldSerializeGraphForCodeGeneration()
-{
- // GIVEN
- const auto input1 = createNode({
- createPort(QShaderNodePort::Output, "input1Value")
- });
- const auto input2 = createNode({
- createPort(QShaderNodePort::Output, "input2Value")
- });
- const auto output1 = createNode({
- createPort(QShaderNodePort::Input, "output1Value")
- });
- const auto output2 = createNode({
- createPort(QShaderNodePort::Input, "output2Value")
- });
- const auto function1 = createNode({
- createPort(QShaderNodePort::Input, "function1Input"),
- createPort(QShaderNodePort::Output, "function1Output")
- });
- const auto function2 = createNode({
- createPort(QShaderNodePort::Input, "function2Input1"),
- createPort(QShaderNodePort::Input, "function2Input2"),
- createPort(QShaderNodePort::Output, "function2Output")
- });
- const auto function3 = createNode({
- createPort(QShaderNodePort::Input, "function3Input1"),
- createPort(QShaderNodePort::Input, "function3Input2"),
- createPort(QShaderNodePort::Output, "function3Output1"),
- createPort(QShaderNodePort::Output, "function3Output2")
- });
-
- const auto graph = [=] {
- auto res = QShaderGraph();
- res.addNode(input1);
- res.addNode(input2);
- res.addNode(output1);
- res.addNode(output2);
- res.addNode(function1);
- res.addNode(function2);
- res.addNode(function3);
- res.addEdge(createEdge(input1.uuid(), "input1Value", function1.uuid(), "function1Input"));
- res.addEdge(createEdge(input1.uuid(), "input1Value", function2.uuid(), "function2Input1"));
- res.addEdge(createEdge(input2.uuid(), "input2Value", function2.uuid(), "function2Input2"));
- res.addEdge(createEdge(function1.uuid(), "function1Output", function3.uuid(), "function3Input1"));
- res.addEdge(createEdge(function2.uuid(), "function2Output", function3.uuid(), "function3Input2"));
- res.addEdge(createEdge(function3.uuid(), "function3Output1", output1.uuid(), "output1Value"));
- res.addEdge(createEdge(function3.uuid(), "function3Output2", output2.uuid(), "output2Value"));
- return res;
- }();
-
- // WHEN
- const auto statements = graph.createStatements();
-
- // THEN
- const auto expected = QList<QShaderGraph::Statement>()
- << createStatement(input2, {}, { 1 }) << createStatement(input1, {}, { 0 })
- << createStatement(function2, { 0, 1 }, { 3 })
- << createStatement(function1, { 0 }, { 2 })
- << createStatement(function3, { 2, 3 }, { 4, 5 }) << createStatement(output2, { 5 }, {})
- << createStatement(output1, { 4 }, {});
- dumpStatementsIfNeeded(statements, expected);
- QCOMPARE(statements, expected);
-}
-
-void tst_QShaderGraph::shouldHandleUnboundPortsDuringGraphSerialization()
-{
- // GIVEN
- const auto input = createNode({
- createPort(QShaderNodePort::Output, "input")
- });
- const auto unboundInput = createNode({
- createPort(QShaderNodePort::Output, "unbound")
- });
- const auto output = createNode({
- createPort(QShaderNodePort::Input, "output")
- });
- const auto unboundOutput = createNode({
- createPort(QShaderNodePort::Input, "unbound")
- });
- const auto function = createNode({
- createPort(QShaderNodePort::Input, "functionInput1"),
- createPort(QShaderNodePort::Input, "functionInput2"),
- createPort(QShaderNodePort::Input, "functionInput3"),
- createPort(QShaderNodePort::Output, "functionOutput1"),
- createPort(QShaderNodePort::Output, "functionOutput2"),
- createPort(QShaderNodePort::Output, "functionOutput3")
- });
-
- const auto graph = [=] {
- auto res = QShaderGraph();
- res.addNode(input);
- res.addNode(unboundInput);
- res.addNode(output);
- res.addNode(unboundOutput);
- res.addNode(function);
- res.addEdge(createEdge(input.uuid(), "input", function.uuid(), "functionInput2"));
- res.addEdge(createEdge(function.uuid(), "functionOutput2", output.uuid(), "output"));
- return res;
- }();
-
- // WHEN
- const auto statements = graph.createStatements();
-
- // THEN
- // Note that no statement has any unbound input
- const auto expected = QList<QShaderGraph::Statement>() << createStatement(input, {}, { 0 });
- dumpStatementsIfNeeded(statements, expected);
- QCOMPARE(statements, expected);
-}
-
-void tst_QShaderGraph::shouldSurviveCyclesDuringGraphSerialization()
-{
- // GIVEN
- const auto input = createNode({
- createPort(QShaderNodePort::Output, "input")
- });
- const auto output = createNode({
- createPort(QShaderNodePort::Input, "output")
- });
- const auto function1 = createNode({
- createPort(QShaderNodePort::Input, "function1Input1"),
- createPort(QShaderNodePort::Input, "function1Input2"),
- createPort(QShaderNodePort::Output, "function1Output")
- });
- const auto function2 = createNode({
- createPort(QShaderNodePort::Input, "function2Input"),
- createPort(QShaderNodePort::Output, "function2Output")
- });
- const auto function3 = createNode({
- createPort(QShaderNodePort::Input, "function3Input"),
- createPort(QShaderNodePort::Output, "function3Output")
- });
-
- const auto graph = [=] {
- auto res = QShaderGraph();
- res.addNode(input);
- res.addNode(output);
- res.addNode(function1);
- res.addNode(function2);
- res.addNode(function3);
- res.addEdge(createEdge(input.uuid(), "input", function1.uuid(), "function1Input1"));
- res.addEdge(createEdge(function1.uuid(), "function1Output", function2.uuid(), "function2Input"));
- res.addEdge(createEdge(function2.uuid(), "function2Output", function3.uuid(), "function3Input"));
- res.addEdge(createEdge(function3.uuid(), "function3Output", function1.uuid(), "function1Input2"));
- res.addEdge(createEdge(function2.uuid(), "function2Output", output.uuid(), "output"));
- return res;
- }();
-
- // WHEN
- const auto statements = graph.createStatements();
-
- // THEN
- // The cycle is ignored
- const auto expected = QList<QShaderGraph::Statement>();
- dumpStatementsIfNeeded(statements, expected);
- QCOMPARE(statements, expected);
-}
-
-void tst_QShaderGraph::shouldDealWithEdgesJumpingOverLayers()
-{
- // GIVEN
- const auto worldPosition = createNode({
- createPort(QShaderNodePort::Output, "worldPosition")
- });
- const auto texture = createNode({
- createPort(QShaderNodePort::Output, "texture")
- });
- const auto texCoord = createNode({
- createPort(QShaderNodePort::Output, "texCoord")
- });
- const auto lightIntensity = createNode({
- createPort(QShaderNodePort::Output, "lightIntensity")
- });
- const auto exposure = createNode({
- createPort(QShaderNodePort::Output, "exposure")
- });
- const auto fragColor = createNode({
- createPort(QShaderNodePort::Input, "fragColor")
- });
- const auto sampleTexture = createNode({
- createPort(QShaderNodePort::Input, "sampler"),
- createPort(QShaderNodePort::Input, "coord"),
- createPort(QShaderNodePort::Output, "color")
- });
- const auto lightFunction = createNode({
- createPort(QShaderNodePort::Input, "baseColor"),
- createPort(QShaderNodePort::Input, "position"),
- createPort(QShaderNodePort::Input, "lightIntensity"),
- createPort(QShaderNodePort::Output, "outputColor")
- });
- const auto exposureFunction = createNode({
- createPort(QShaderNodePort::Input, "inputColor"),
- createPort(QShaderNodePort::Input, "exposure"),
- createPort(QShaderNodePort::Output, "outputColor")
- });
-
- const auto graph = [=] {
- auto res = QShaderGraph();
-
- res.addNode(worldPosition);
- res.addNode(texture);
- res.addNode(texCoord);
- res.addNode(lightIntensity);
- res.addNode(exposure);
- res.addNode(fragColor);
- res.addNode(sampleTexture);
- res.addNode(lightFunction);
- res.addNode(exposureFunction);
-
- res.addEdge(createEdge(texture.uuid(), "texture", sampleTexture.uuid(), "sampler"));
- res.addEdge(createEdge(texCoord.uuid(), "texCoord", sampleTexture.uuid(), "coord"));
-
- res.addEdge(createEdge(worldPosition.uuid(), "worldPosition", lightFunction.uuid(), "position"));
- res.addEdge(createEdge(sampleTexture.uuid(), "color", lightFunction.uuid(), "baseColor"));
- res.addEdge(createEdge(lightIntensity.uuid(), "lightIntensity", lightFunction.uuid(), "lightIntensity"));
-
- res.addEdge(createEdge(lightFunction.uuid(), "outputColor", exposureFunction.uuid(), "inputColor"));
- res.addEdge(createEdge(exposure.uuid(), "exposure", exposureFunction.uuid(), "exposure"));
-
- res.addEdge(createEdge(exposureFunction.uuid(), "outputColor", fragColor.uuid(), "fragColor"));
-
- return res;
- }();
-
- // WHEN
- const auto statements = graph.createStatements();
-
- // THEN
- const auto expected = QList<QShaderGraph::Statement>()
- << createStatement(texCoord, {}, { 2 }) << createStatement(texture, {}, { 1 })
- << createStatement(lightIntensity, {}, { 3 })
- << createStatement(sampleTexture, { 1, 2 }, { 5 })
- << createStatement(worldPosition, {}, { 0 }) << createStatement(exposure, {}, { 4 })
- << createStatement(lightFunction, { 5, 0, 3 }, { 6 })
- << createStatement(exposureFunction, { 6, 4 }, { 7 })
- << createStatement(fragColor, { 7 }, {});
- dumpStatementsIfNeeded(statements, expected);
- QCOMPARE(statements, expected);
-}
-
-void tst_QShaderGraph::shouldGenerateDifferentStatementsDependingOnActiveLayers()
-{
- // GIVEN
- const auto texCoord = createNode({
- createPort(QShaderNodePort::Output, "texCoord")
- }, {
- "diffuseTexture",
- "normalTexture"
- });
- const auto diffuseUniform = createNode({
- createPort(QShaderNodePort::Output, "color")
- }, {"diffuseUniform"});
- const auto diffuseTexture = createNode({
- createPort(QShaderNodePort::Input, "coord"),
- createPort(QShaderNodePort::Output, "color")
- }, {"diffuseTexture"});
- const auto normalUniform = createNode({
- createPort(QShaderNodePort::Output, "normal")
- }, {"normalUniform"});
- const auto normalTexture = createNode({
- createPort(QShaderNodePort::Input, "coord"),
- createPort(QShaderNodePort::Output, "normal")
- }, {"normalTexture"});
- const auto lightFunction = createNode({
- createPort(QShaderNodePort::Input, "color"),
- createPort(QShaderNodePort::Input, "normal"),
- createPort(QShaderNodePort::Output, "output")
- });
- const auto fragColor = createNode({
- createPort(QShaderNodePort::Input, "fragColor")
- });
-
- const auto graph = [=] {
- auto res = QShaderGraph();
-
- res.addNode(texCoord);
- res.addNode(diffuseUniform);
- res.addNode(diffuseTexture);
- res.addNode(normalUniform);
- res.addNode(normalTexture);
- res.addNode(lightFunction);
- res.addNode(fragColor);
-
- res.addEdge(createEdge(diffuseUniform.uuid(), "color", lightFunction.uuid(), "color", {"diffuseUniform"}));
- res.addEdge(createEdge(texCoord.uuid(), "texCoord", diffuseTexture.uuid(), "coord", {"diffuseTexture"}));
- res.addEdge(createEdge(diffuseTexture.uuid(), "color", lightFunction.uuid(), "color", {"diffuseTexture"}));
-
- res.addEdge(createEdge(normalUniform.uuid(), "normal", lightFunction.uuid(), "normal", {"normalUniform"}));
- res.addEdge(createEdge(texCoord.uuid(), "texCoord", normalTexture.uuid(), "coord", {"normalTexture"}));
- res.addEdge(createEdge(normalTexture.uuid(), "normal", lightFunction.uuid(), "normal", {"normalTexture"}));
-
- res.addEdge(createEdge(lightFunction.uuid(), "output", fragColor.uuid(), "fragColor"));
-
- return res;
- }();
-
- {
- // WHEN
- const auto statements = graph.createStatements({"diffuseUniform", "normalUniform"});
-
- // THEN
- const auto expected = QList<QShaderGraph::Statement>()
- << createStatement(normalUniform, {}, { 1 })
- << createStatement(diffuseUniform, {}, { 0 })
- << createStatement(lightFunction, { 0, 1 }, { 2 })
- << createStatement(fragColor, { 2 }, {});
- dumpStatementsIfNeeded(statements, expected);
- QCOMPARE(statements, expected);
- }
-
- {
- // WHEN
- const auto statements = graph.createStatements({"diffuseUniform", "normalTexture"});
-
- // THEN
- const auto expected = QList<QShaderGraph::Statement>()
- << createStatement(texCoord, {}, { 0 })
- << createStatement(normalTexture, { 0 }, { 2 })
- << createStatement(diffuseUniform, {}, { 1 })
- << createStatement(lightFunction, { 1, 2 }, { 3 })
- << createStatement(fragColor, { 3 }, {});
- dumpStatementsIfNeeded(statements, expected);
- QCOMPARE(statements, expected);
- }
-
- {
- // WHEN
- const auto statements = graph.createStatements({"diffuseTexture", "normalUniform"});
-
- // THEN
- const auto expected = QList<QShaderGraph::Statement>()
- << createStatement(texCoord, {}, { 0 }) << createStatement(normalUniform, {}, { 2 })
- << createStatement(diffuseTexture, { 0 }, { 1 })
- << createStatement(lightFunction, { 1, 2 }, { 3 })
- << createStatement(fragColor, { 3 }, {});
- dumpStatementsIfNeeded(statements, expected);
- QCOMPARE(statements, expected);
- }
-
- {
- // WHEN
- const auto statements = graph.createStatements({"diffuseTexture", "normalTexture"});
-
- // THEN
- const auto expected = QList<QShaderGraph::Statement>()
- << createStatement(texCoord, {}, { 0 })
- << createStatement(normalTexture, { 0 }, { 2 })
- << createStatement(diffuseTexture, { 0 }, { 1 })
- << createStatement(lightFunction, { 1, 2 }, { 3 })
- << createStatement(fragColor, { 3 }, {});
- dumpStatementsIfNeeded(statements, expected);
- QCOMPARE(statements, expected);
- }
-}
-
-void tst_QShaderGraph::shouldDealWithBranchesWithoutOutput()
-{
- // GIVEN
- const auto input = createNode({
- createPort(QShaderNodePort::Output, "input")
- });
- const auto output = createNode({
- createPort(QShaderNodePort::Input, "output")
- });
- const auto danglingFunction = createNode({
- createPort(QShaderNodePort::Input, "functionInput"),
- createPort(QShaderNodePort::Output, "unbound")
- });
- const auto function = createNode({
- createPort(QShaderNodePort::Input, "functionInput"),
- createPort(QShaderNodePort::Output, "functionOutput")
- });
-
- const auto graph = [=] {
- auto res = QShaderGraph();
- res.addNode(input);
- res.addNode(function);
- res.addNode(danglingFunction);
- res.addNode(output);
- res.addEdge(createEdge(input.uuid(), "input", function.uuid(), "functionInput"));
- res.addEdge(createEdge(input.uuid(), "input", danglingFunction.uuid(), "functionInput"));
- res.addEdge(createEdge(function.uuid(), "functionOutput", output.uuid(), "output"));
- return res;
- }();
-
- // WHEN
- const auto statements = graph.createStatements();
-
- // THEN
- // Note that no edge leads to the unbound input
- const auto expected = QList<QShaderGraph::Statement>()
- << createStatement(input, {}, { 0 }) << createStatement(function, { 0 }, { 1 })
- << createStatement(output, { 1 }, {})
- << createStatement(danglingFunction, { 0 }, { 2 });
- dumpStatementsIfNeeded(statements, expected);
- QCOMPARE(statements, expected);
-}
-
-QTEST_MAIN(tst_QShaderGraph)
-
-#include "tst_qshadergraph.moc"
diff --git a/tests/auto/gui/util/qshadergraphloader/CMakeLists.txt b/tests/auto/gui/util/qshadergraphloader/CMakeLists.txt
deleted file mode 100644
index 70f99d9266..0000000000
--- a/tests/auto/gui/util/qshadergraphloader/CMakeLists.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-# Generated from qshadergraphloader.pro.
-
-#####################################################################
-## tst_qshadergraphloader Test:
-#####################################################################
-
-qt_internal_add_test(tst_qshadergraphloader
- SOURCES
- tst_qshadergraphloader.cpp
- PUBLIC_LIBRARIES
- Qt::Gui
- Qt::GuiPrivate
-)
diff --git a/tests/auto/gui/util/qshadergraphloader/tst_qshadergraphloader.cpp b/tests/auto/gui/util/qshadergraphloader/tst_qshadergraphloader.cpp
deleted file mode 100644
index 86db9edbea..0000000000
--- a/tests/auto/gui/util/qshadergraphloader/tst_qshadergraphloader.cpp
+++ /dev/null
@@ -1,627 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB).
-** 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 <QTest>
-
-#include <QtCore/qbuffer.h>
-
-#include <QtGui/private/qshadergraphloader_p.h>
-#include <QtGui/private/qshaderlanguage_p.h>
-
-using QBufferPointer = QSharedPointer<QBuffer>;
-Q_DECLARE_METATYPE(QBufferPointer);
-
-using PrototypeHash = QHash<QString, QShaderNode>;
-Q_DECLARE_METATYPE(PrototypeHash);
-
-namespace
-{
- QBufferPointer createBuffer(const QByteArray &data, QIODevice::OpenMode openMode = QIODevice::ReadOnly)
- {
- auto buffer = QBufferPointer::create();
- buffer->setData(data);
- if (openMode != QIODevice::NotOpen)
- buffer->open(openMode);
- return buffer;
- }
-
- QShaderFormat createFormat(QShaderFormat::Api api, int majorVersion, int minorVersion)
- {
- auto format = QShaderFormat();
- format.setApi(api);
- format.setVersion(QVersionNumber(majorVersion, minorVersion));
- return format;
- }
-
- QShaderNodePort createPort(QShaderNodePort::Direction portDirection, const QString &portName)
- {
- auto port = QShaderNodePort();
- port.direction = portDirection;
- port.name = portName;
- return port;
- }
-
- QShaderNode createNode(const QList<QShaderNodePort> &ports,
- const QStringList &layers = QStringList())
- {
- auto node = QShaderNode();
- node.setUuid(QUuid::createUuid());
- node.setLayers(layers);
- for (const auto &port : ports)
- node.addPort(port);
- return node;
- }
-
- QShaderGraph::Edge createEdge(const QUuid &sourceUuid, const QString &sourceName,
- const QUuid &targetUuid, const QString &targetName,
- const QStringList &layers = QStringList())
- {
- auto edge = QShaderGraph::Edge();
- edge.sourceNodeUuid = sourceUuid;
- edge.sourcePortName = sourceName;
- edge.targetNodeUuid = targetUuid;
- edge.targetPortName = targetName;
- edge.layers = layers;
- return edge;
- }
-
- QShaderGraph createGraph()
- {
- const auto openGLES2 = createFormat(QShaderFormat::OpenGLES, 2, 0);
- const auto openGL3 = createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0);
-
- auto graph = QShaderGraph();
-
- auto worldPosition = createNode({
- createPort(QShaderNodePort::Output, "value")
- });
- worldPosition.setUuid(QUuid("{00000000-0000-0000-0000-000000000001}"));
- worldPosition.setParameter("name", "worldPosition");
- worldPosition.setParameter("qualifier", QVariant::fromValue<QShaderLanguage::StorageQualifier>(QShaderLanguage::Input));
- worldPosition.setParameter("type", QVariant::fromValue<QShaderLanguage::VariableType>(QShaderLanguage::Vec3));
- worldPosition.addRule(openGLES2, QShaderNode::Rule("highp $type $value = $name;",
- QByteArrayList() << "$qualifier highp $type $name;"));
- worldPosition.addRule(openGL3, QShaderNode::Rule("$type $value = $name;",
- QByteArrayList() << "$qualifier $type $name;"));
-
- auto texture = createNode({
- createPort(QShaderNodePort::Output, "texture")
- });
- texture.setUuid(QUuid("{00000000-0000-0000-0000-000000000002}"));
- texture.addRule(openGLES2, QShaderNode::Rule("sampler2D $texture = texture;",
- QByteArrayList() << "uniform sampler2D texture;"));
- texture.addRule(openGL3, QShaderNode::Rule("sampler2D $texture = texture;",
- QByteArrayList() << "uniform sampler2D texture;"));
-
- auto texCoord = createNode({
- createPort(QShaderNodePort::Output, "texCoord")
- });
- texCoord.setUuid(QUuid("{00000000-0000-0000-0000-000000000003}"));
- texCoord.addRule(openGLES2, QShaderNode::Rule("highp vec2 $texCoord = texCoord;",
- QByteArrayList() << "varying highp vec2 texCoord;"));
- texCoord.addRule(openGL3, QShaderNode::Rule("vec2 $texCoord = texCoord;",
- QByteArrayList() << "in vec2 texCoord;"));
-
- auto lightIntensity = createNode({
- createPort(QShaderNodePort::Output, "value")
- });
- lightIntensity.setUuid(QUuid("{00000000-0000-0000-0000-000000000004}"));
- lightIntensity.setParameter("name", "defaultName");
- lightIntensity.setParameter("qualifier", QVariant::fromValue<QShaderLanguage::StorageQualifier>(QShaderLanguage::Uniform));
- lightIntensity.setParameter("type", QVariant::fromValue<QShaderLanguage::VariableType>(QShaderLanguage::Float));
- lightIntensity.addRule(openGLES2, QShaderNode::Rule("highp $type $value = $name;",
- QByteArrayList() << "$qualifier highp $type $name;"));
- lightIntensity.addRule(openGL3, QShaderNode::Rule("$type $value = $name;",
- QByteArrayList() << "$qualifier $type $name;"));
-
- auto exposure = createNode({
- createPort(QShaderNodePort::Output, "exposure")
- });
- exposure.setUuid(QUuid("{00000000-0000-0000-0000-000000000005}"));
- exposure.addRule(openGLES2, QShaderNode::Rule("highp float $exposure = exposure;",
- QByteArrayList() << "uniform highp float exposure;"));
- exposure.addRule(openGL3, QShaderNode::Rule("float $exposure = exposure;",
- QByteArrayList() << "uniform float exposure;"));
-
- auto fragColor = createNode({
- createPort(QShaderNodePort::Input, "fragColor")
- });
- fragColor.setUuid(QUuid("{00000000-0000-0000-0000-000000000006}"));
- fragColor.addRule(openGLES2, QShaderNode::Rule("gl_fragColor = $fragColor;"));
- fragColor.addRule(openGL3, QShaderNode::Rule("fragColor = $fragColor;",
- QByteArrayList() << "out vec4 fragColor;"));
-
- auto sampleTexture = createNode({
- createPort(QShaderNodePort::Input, "sampler"),
- createPort(QShaderNodePort::Input, "coord"),
- createPort(QShaderNodePort::Output, "color")
- });
- sampleTexture.setUuid(QUuid("{00000000-0000-0000-0000-000000000007}"));
- sampleTexture.addRule(openGLES2, QShaderNode::Rule("highp vec4 $color = texture2D($sampler, $coord);"));
- sampleTexture.addRule(openGL3, QShaderNode::Rule("vec4 $color = texture2D($sampler, $coord);"));
-
- auto lightFunction = createNode({
- createPort(QShaderNodePort::Input, "baseColor"),
- createPort(QShaderNodePort::Input, "position"),
- createPort(QShaderNodePort::Input, "lightIntensity"),
- createPort(QShaderNodePort::Output, "outputColor")
- });
- lightFunction.setUuid(QUuid("{00000000-0000-0000-0000-000000000008}"));
- lightFunction.addRule(openGLES2, QShaderNode::Rule("highp vec4 $outputColor = lightModel($baseColor, $position, $lightIntensity);",
- QByteArrayList() << "#pragma include es2/lightmodel.frag.inc"));
- lightFunction.addRule(openGL3, QShaderNode::Rule("vec4 $outputColor = lightModel($baseColor, $position, $lightIntensity);",
- QByteArrayList() << "#pragma include gl3/lightmodel.frag.inc"));
-
- auto exposureFunction = createNode({
- createPort(QShaderNodePort::Input, "inputColor"),
- createPort(QShaderNodePort::Input, "exposure"),
- createPort(QShaderNodePort::Output, "outputColor")
- });
- exposureFunction.setUuid(QUuid("{00000000-0000-0000-0000-000000000009}"));
- exposureFunction.addRule(openGLES2, QShaderNode::Rule("highp vec4 $outputColor = $inputColor * pow(2.0, $exposure);"));
- exposureFunction.addRule(openGL3, QShaderNode::Rule("vec4 $outputColor = $inputColor * pow(2.0, $exposure);"));
-
- graph.addNode(worldPosition);
- graph.addNode(texture);
- graph.addNode(texCoord);
- graph.addNode(lightIntensity);
- graph.addNode(exposure);
- graph.addNode(fragColor);
- graph.addNode(sampleTexture);
- graph.addNode(lightFunction);
- graph.addNode(exposureFunction);
-
- graph.addEdge(createEdge(texture.uuid(), "texture", sampleTexture.uuid(), "sampler"));
- graph.addEdge(createEdge(texCoord.uuid(), "texCoord", sampleTexture.uuid(), "coord"));
-
- graph.addEdge(createEdge(worldPosition.uuid(), "value", lightFunction.uuid(), "position"));
- graph.addEdge(createEdge(sampleTexture.uuid(), "color", lightFunction.uuid(), "baseColor"));
- graph.addEdge(createEdge(lightIntensity.uuid(), "value", lightFunction.uuid(), "lightIntensity"));
-
- graph.addEdge(createEdge(lightFunction.uuid(), "outputColor", exposureFunction.uuid(), "inputColor"));
- graph.addEdge(createEdge(exposure.uuid(), "exposure", exposureFunction.uuid(), "exposure"));
-
- graph.addEdge(createEdge(exposureFunction.uuid(), "outputColor", fragColor.uuid(), "fragColor"));
-
- return graph;
- }
-
- void debugStatement(const QString &prefix, const QShaderGraph::Statement &statement)
- {
- qDebug() << prefix << statement.inputs << statement.uuid().toString() << statement.outputs;
- }
-
- void dumpStatementsIfNeeded(const QList<QShaderGraph::Statement> &statements,
- const QList<QShaderGraph::Statement> &expected)
- {
- if (statements != expected) {
- for (int i = 0; i < qMax(statements.size(), expected.size()); i++) {
- qDebug() << "----" << i << "----";
- if (i < statements.size())
- debugStatement("A:", statements.at(i));
- if (i < expected.size())
- debugStatement("E:", expected.at(i));
- qDebug() << "-----------";
- }
- }
- }
-}
-
-class tst_QShaderGraphLoader : public QObject
-{
- Q_OBJECT
-private slots:
- void shouldManipulateLoaderMembers();
- void shouldLoadFromJsonStream_data();
- void shouldLoadFromJsonStream();
-};
-
-void tst_QShaderGraphLoader::shouldManipulateLoaderMembers()
-{
- // GIVEN
- auto loader = QShaderGraphLoader();
-
- // THEN (default state)
- QCOMPARE(loader.status(), QShaderGraphLoader::Null);
- QVERIFY(!loader.device());
- QVERIFY(loader.graph().nodes().isEmpty());
- QVERIFY(loader.graph().edges().isEmpty());
- QVERIFY(loader.prototypes().isEmpty());
-
- // WHEN
- auto device1 = createBuffer(QByteArray("..........."), QIODevice::NotOpen);
- loader.setDevice(device1.data());
-
- // THEN
- QCOMPARE(loader.status(), QShaderGraphLoader::Error);
- QCOMPARE(loader.device(), device1.data());
- QVERIFY(loader.graph().nodes().isEmpty());
- QVERIFY(loader.graph().edges().isEmpty());
-
- // WHEN
- auto device2 = createBuffer(QByteArray("..........."), QIODevice::ReadOnly);
- loader.setDevice(device2.data());
-
- // THEN
- QCOMPARE(loader.status(), QShaderGraphLoader::Waiting);
- QCOMPARE(loader.device(), device2.data());
- QVERIFY(loader.graph().nodes().isEmpty());
- QVERIFY(loader.graph().edges().isEmpty());
-
-
- // WHEN
- const auto prototypes = [&]{
- auto res = QHash<QString, QShaderNode>();
- res.insert("foo", createNode({}));
- return res;
- }();
- loader.setPrototypes(prototypes);
-
- // THEN
- QCOMPARE(loader.prototypes().size(), prototypes.size());
- QVERIFY(loader.prototypes().contains("foo"));
- QCOMPARE(loader.prototypes().value("foo").uuid(), prototypes.value("foo").uuid());
-}
-
-void tst_QShaderGraphLoader::shouldLoadFromJsonStream_data()
-{
- QTest::addColumn<QBufferPointer>("device");
- QTest::addColumn<PrototypeHash>("prototypes");
- QTest::addColumn<QShaderGraph>("graph");
- QTest::addColumn<QShaderGraphLoader::Status>("status");
-
- QTest::newRow("empty") << createBuffer("", QIODevice::ReadOnly) << PrototypeHash()
- << QShaderGraph() << QShaderGraphLoader::Error;
-
- const auto smallJson = "{"
- " \"nodes\": ["
- " {"
- " \"uuid\": \"{00000000-0000-0000-0000-000000000001}\","
- " \"type\": \"MyInput\","
- " \"layers\": [\"foo\", \"bar\"]"
- " },"
- " {"
- " \"uuid\": \"{00000000-0000-0000-0000-000000000002}\","
- " \"type\": \"MyOutput\""
- " },"
- " {"
- " \"uuid\": \"{00000000-0000-0000-0000-000000000003}\","
- " \"type\": \"MyFunction\""
- " }"
- " ],"
- " \"edges\": ["
- " {"
- " \"sourceUuid\": \"{00000000-0000-0000-0000-000000000001}\","
- " \"sourcePort\": \"input\","
- " \"targetUuid\": \"{00000000-0000-0000-0000-000000000003}\","
- " \"targetPort\": \"functionInput\","
- " \"layers\": [\"bar\", \"baz\"]"
- " },"
- " {"
- " \"sourceUuid\": \"{00000000-0000-0000-0000-000000000003}\","
- " \"sourcePort\": \"functionOutput\","
- " \"targetUuid\": \"{00000000-0000-0000-0000-000000000002}\","
- " \"targetPort\": \"output\""
- " }"
- " ]"
- "}";
-
- const auto smallProtos = [&]{
- auto protos = PrototypeHash();
-
- auto input = createNode({
- createPort(QShaderNodePort::Output, "input")
- });
- protos.insert("MyInput", input);
-
- auto output = createNode({
- createPort(QShaderNodePort::Input, "output")
- });
- protos.insert("MyOutput", output);
-
- auto function = createNode({
- createPort(QShaderNodePort::Input, "functionInput"),
- createPort(QShaderNodePort::Output, "functionOutput")
- });
- protos.insert("MyFunction", function);
- return protos;
- }();
-
- const auto smallGraph = [&]{
- auto graph = QShaderGraph();
-
- auto input = createNode({
- createPort(QShaderNodePort::Output, "input")
- }, {"foo", "bar"});
- input.setUuid(QUuid("{00000000-0000-0000-0000-000000000001}"));
- auto output = createNode({
- createPort(QShaderNodePort::Input, "output")
- });
- output.setUuid(QUuid("{00000000-0000-0000-0000-000000000002}"));
- auto function = createNode({
- createPort(QShaderNodePort::Input, "functionInput"),
- createPort(QShaderNodePort::Output, "functionOutput")
- });
- function.setUuid(QUuid("{00000000-0000-0000-0000-000000000003}"));
-
- graph.addNode(input);
- graph.addNode(output);
- graph.addNode(function);
- graph.addEdge(createEdge(input.uuid(), "input", function.uuid(), "functionInput", {"bar", "baz"}));
- graph.addEdge(createEdge(function.uuid(), "functionOutput", output.uuid(), "output"));
-
- return graph;
- }();
-
- QTest::newRow("TwoNodesOneEdge") << createBuffer(smallJson) << smallProtos << smallGraph << QShaderGraphLoader::Ready;
- QTest::newRow("NotOpen") << createBuffer(smallJson, QIODevice::NotOpen) << smallProtos << QShaderGraph() << QShaderGraphLoader::Error;
- QTest::newRow("NoPrototype") << createBuffer(smallJson) << PrototypeHash() << QShaderGraph() << QShaderGraphLoader::Error;
-
- const auto complexJson = "{"
- " \"nodes\": ["
- " {"
- " \"uuid\": \"{00000000-0000-0000-0000-000000000001}\","
- " \"type\": \"inputValue\","
- " \"parameters\": {"
- " \"name\": \"worldPosition\","
- " \"qualifier\": {"
- " \"type\": \"QShaderLanguage::StorageQualifier\","
- " \"value\": \"QShaderLanguage::Input\""
- " },"
- " \"type\": {"
- " \"type\": \"QShaderLanguage::VariableType\","
- " \"value\": \"QShaderLanguage::Vec3\""
- " }"
- " }"
- " },"
- " {"
- " \"uuid\": \"{00000000-0000-0000-0000-000000000002}\","
- " \"type\": \"texture\""
- " },"
- " {"
- " \"uuid\": \"{00000000-0000-0000-0000-000000000003}\","
- " \"type\": \"texCoord\""
- " },"
- " {"
- " \"uuid\": \"{00000000-0000-0000-0000-000000000004}\","
- " \"type\": \"inputValue\""
- " },"
- " {"
- " \"uuid\": \"{00000000-0000-0000-0000-000000000005}\","
- " \"type\": \"exposure\""
- " },"
- " {"
- " \"uuid\": \"{00000000-0000-0000-0000-000000000006}\","
- " \"type\": \"fragColor\""
- " },"
- " {"
- " \"uuid\": \"{00000000-0000-0000-0000-000000000007}\","
- " \"type\": \"sampleTexture\""
- " },"
- " {"
- " \"uuid\": \"{00000000-0000-0000-0000-000000000008}\","
- " \"type\": \"lightModel\""
- " },"
- " {"
- " \"uuid\": \"{00000000-0000-0000-0000-000000000009}\","
- " \"type\": \"exposureFunction\""
- " }"
- " ],"
- " \"edges\": ["
- " {"
- " \"sourceUuid\": \"{00000000-0000-0000-0000-000000000002}\","
- " \"sourcePort\": \"texture\","
- " \"targetUuid\": \"{00000000-0000-0000-0000-000000000007}\","
- " \"targetPort\": \"sampler\""
- " },"
- " {"
- " \"sourceUuid\": \"{00000000-0000-0000-0000-000000000003}\","
- " \"sourcePort\": \"texCoord\","
- " \"targetUuid\": \"{00000000-0000-0000-0000-000000000007}\","
- " \"targetPort\": \"coord\""
- " },"
- " {"
- " \"sourceUuid\": \"{00000000-0000-0000-0000-000000000001}\","
- " \"sourcePort\": \"value\","
- " \"targetUuid\": \"{00000000-0000-0000-0000-000000000008}\","
- " \"targetPort\": \"position\""
- " },"
- " {"
- " \"sourceUuid\": \"{00000000-0000-0000-0000-000000000007}\","
- " \"sourcePort\": \"color\","
- " \"targetUuid\": \"{00000000-0000-0000-0000-000000000008}\","
- " \"targetPort\": \"baseColor\""
- " },"
- " {"
- " \"sourceUuid\": \"{00000000-0000-0000-0000-000000000004}\","
- " \"sourcePort\": \"value\","
- " \"targetUuid\": \"{00000000-0000-0000-0000-000000000008}\","
- " \"targetPort\": \"lightIntensity\""
- " },"
- " {"
- " \"sourceUuid\": \"{00000000-0000-0000-0000-000000000008}\","
- " \"sourcePort\": \"outputColor\","
- " \"targetUuid\": \"{00000000-0000-0000-0000-000000000009}\","
- " \"targetPort\": \"inputColor\""
- " },"
- " {"
- " \"sourceUuid\": \"{00000000-0000-0000-0000-000000000005}\","
- " \"sourcePort\": \"exposure\","
- " \"targetUuid\": \"{00000000-0000-0000-0000-000000000009}\","
- " \"targetPort\": \"exposure\""
- " },"
- " {"
- " \"sourceUuid\": \"{00000000-0000-0000-0000-000000000009}\","
- " \"sourcePort\": \"outputColor\","
- " \"targetUuid\": \"{00000000-0000-0000-0000-000000000006}\","
- " \"targetPort\": \"fragColor\""
- " }"
- " ]"
- "}";
-
- const auto complexProtos = [&]{
- const auto openGLES2 = createFormat(QShaderFormat::OpenGLES, 2, 0);
- const auto openGL3 = createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0);
-
- auto protos = PrototypeHash();
-
- auto inputValue = createNode({
- createPort(QShaderNodePort::Output, "value")
- });
- inputValue.setParameter("name", "defaultName");
- inputValue.setParameter("qualifier", QVariant::fromValue<QShaderLanguage::StorageQualifier>(QShaderLanguage::Uniform));
- inputValue.setParameter("type", QVariant::fromValue<QShaderLanguage::VariableType>(QShaderLanguage::Float));
- inputValue.addRule(openGLES2, QShaderNode::Rule("highp $type $value = $name;",
- QByteArrayList() << "$qualifier highp $type $name;"));
- inputValue.addRule(openGL3, QShaderNode::Rule("$type $value = $name;",
- QByteArrayList() << "$qualifier $type $name;"));
- protos.insert("inputValue", inputValue);
-
- auto texture = createNode({
- createPort(QShaderNodePort::Output, "texture")
- });
- texture.addRule(openGLES2, QShaderNode::Rule("sampler2D $texture = texture;",
- QByteArrayList() << "uniform sampler2D texture;"));
- texture.addRule(openGL3, QShaderNode::Rule("sampler2D $texture = texture;",
- QByteArrayList() << "uniform sampler2D texture;"));
- protos.insert("texture", texture);
-
- auto texCoord = createNode({
- createPort(QShaderNodePort::Output, "texCoord")
- });
- texCoord.addRule(openGLES2, QShaderNode::Rule("highp vec2 $texCoord = texCoord;",
- QByteArrayList() << "varying highp vec2 texCoord;"));
- texCoord.addRule(openGL3, QShaderNode::Rule("vec2 $texCoord = texCoord;",
- QByteArrayList() << "in vec2 texCoord;"));
- protos.insert("texCoord", texCoord);
-
- auto exposure = createNode({
- createPort(QShaderNodePort::Output, "exposure")
- });
- exposure.addRule(openGLES2, QShaderNode::Rule("highp float $exposure = exposure;",
- QByteArrayList() << "uniform highp float exposure;"));
- exposure.addRule(openGL3, QShaderNode::Rule("float $exposure = exposure;",
- QByteArrayList() << "uniform float exposure;"));
- protos.insert("exposure", exposure);
-
- auto fragColor = createNode({
- createPort(QShaderNodePort::Input, "fragColor")
- });
- fragColor.addRule(openGLES2, QShaderNode::Rule("gl_fragColor = $fragColor;"));
- fragColor.addRule(openGL3, QShaderNode::Rule("fragColor = $fragColor;",
- QByteArrayList() << "out vec4 fragColor;"));
- protos.insert("fragColor", fragColor);
-
- auto sampleTexture = createNode({
- createPort(QShaderNodePort::Input, "sampler"),
- createPort(QShaderNodePort::Input, "coord"),
- createPort(QShaderNodePort::Output, "color")
- });
- sampleTexture.addRule(openGLES2, QShaderNode::Rule("highp vec4 $color = texture2D($sampler, $coord);"));
- sampleTexture.addRule(openGL3, QShaderNode::Rule("vec4 $color = texture2D($sampler, $coord);"));
- protos.insert("sampleTexture", sampleTexture);
-
- auto lightModel = createNode({
- createPort(QShaderNodePort::Input, "baseColor"),
- createPort(QShaderNodePort::Input, "position"),
- createPort(QShaderNodePort::Input, "lightIntensity"),
- createPort(QShaderNodePort::Output, "outputColor")
- });
- lightModel.addRule(openGLES2, QShaderNode::Rule("highp vec4 $outputColor = lightModel($baseColor, $position, $lightIntensity);",
- QByteArrayList() << "#pragma include es2/lightmodel.frag.inc"));
- lightModel.addRule(openGL3, QShaderNode::Rule("vec4 $outputColor = lightModel($baseColor, $position, $lightIntensity);",
- QByteArrayList() << "#pragma include gl3/lightmodel.frag.inc"));
- protos.insert("lightModel", lightModel);
-
- auto exposureFunction = createNode({
- createPort(QShaderNodePort::Input, "inputColor"),
- createPort(QShaderNodePort::Input, "exposure"),
- createPort(QShaderNodePort::Output, "outputColor")
- });
- exposureFunction.addRule(openGLES2, QShaderNode::Rule("highp vec4 $outputColor = $inputColor * pow(2.0, $exposure);"));
- exposureFunction.addRule(openGL3, QShaderNode::Rule("vec4 $outputColor = $inputColor * pow(2.0, $exposure);"));
- protos.insert("exposureFunction", exposureFunction);
-
- return protos;
- }();
-
- const auto complexGraph = createGraph();
-
- QTest::newRow("ComplexGraph") << createBuffer(complexJson) << complexProtos << complexGraph << QShaderGraphLoader::Ready;
-}
-
-void tst_QShaderGraphLoader::shouldLoadFromJsonStream()
-{
- // GIVEN
- QFETCH(QBufferPointer, device);
- QFETCH(PrototypeHash, prototypes);
-
- auto loader = QShaderGraphLoader();
-
- // WHEN
- loader.setPrototypes(prototypes);
- loader.setDevice(device.data());
- loader.load();
-
- // THEN
- QFETCH(QShaderGraphLoader::Status, status);
- QCOMPARE(loader.status(), status);
-
- QFETCH(QShaderGraph, graph);
- const auto statements = loader.graph().createStatements({"foo", "bar", "baz"});
- const auto expected = graph.createStatements({"foo", "bar", "baz"});
- dumpStatementsIfNeeded(statements, expected);
- QCOMPARE(statements, expected);
-
- const auto sortedParameters = [](const QShaderNode &node) {
- auto res = node.parameterNames();
- res.sort();
- return res;
- };
-
- for (int i = 0; i < statements.size(); i++) {
- const auto actualNode = statements.at(i).node;
- const auto expectedNode = expected.at(i).node;
-
- QCOMPARE(actualNode.layers(), expectedNode.layers());
- QCOMPARE(actualNode.ports(), expectedNode.ports());
- QCOMPARE(sortedParameters(actualNode), sortedParameters(expectedNode));
- for (const auto &name : expectedNode.parameterNames()) {
- QCOMPARE(actualNode.parameter(name), expectedNode.parameter(name));
- }
- QCOMPARE(actualNode.availableFormats(), expectedNode.availableFormats());
- for (const auto &format : expectedNode.availableFormats()) {
- QCOMPARE(actualNode.rule(format), expectedNode.rule(format));
- }
- }
-}
-
-QTEST_MAIN(tst_QShaderGraphLoader)
-
-#include "tst_qshadergraphloader.moc"
diff --git a/tests/auto/gui/util/qshadernodes/CMakeLists.txt b/tests/auto/gui/util/qshadernodes/CMakeLists.txt
deleted file mode 100644
index 471a203ffc..0000000000
--- a/tests/auto/gui/util/qshadernodes/CMakeLists.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-# Generated from qshadernodes.pro.
-
-#####################################################################
-## tst_qshadernodes Test:
-#####################################################################
-
-qt_internal_add_test(tst_qshadernodes
- SOURCES
- tst_qshadernodes.cpp
- PUBLIC_LIBRARIES
- Qt::Gui
- Qt::GuiPrivate
-)
diff --git a/tests/auto/gui/util/qshadernodes/tst_qshadernodes.cpp b/tests/auto/gui/util/qshadernodes/tst_qshadernodes.cpp
deleted file mode 100644
index be6239a4fd..0000000000
--- a/tests/auto/gui/util/qshadernodes/tst_qshadernodes.cpp
+++ /dev/null
@@ -1,548 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB).
-** 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 <QTest>
-
-#include <QtGui/private/qshaderformat_p.h>
-#include <QtGui/private/qshadernode_p.h>
-#include <QtGui/private/qshadernodeport_p.h>
-
-namespace
-{
- QShaderFormat createFormat(QShaderFormat::Api api, int majorVersion, int minorVersion,
- const QStringList &extensions = QStringList(),
- const QString &vendor = QString())
- {
- auto format = QShaderFormat();
- format.setApi(api);
- format.setVersion(QVersionNumber(majorVersion, minorVersion));
- format.setExtensions(extensions);
- format.setVendor(vendor);
- return format;
- }
-
- QShaderNodePort createPort(QShaderNodePort::Direction direction, const QString &name)
- {
- auto port = QShaderNodePort();
- port.direction = direction;
- port.name = name;
- return port;
- }
-}
-
-class tst_QShaderNodes : public QObject
-{
- Q_OBJECT
-private slots:
- void shouldManipulateFormatMembers();
- void shouldVerifyFormatsEquality_data();
- void shouldVerifyFormatsEquality();
- void shouldVerifyFormatsCompatibilities_data();
- void shouldVerifyFormatsCompatibilities();
-
- void shouldHaveDefaultPortState();
- void shouldVerifyPortsEquality_data();
- void shouldVerifyPortsEquality();
-
- void shouldManipulateNodeMembers();
- void shouldHandleNodeRulesSupportAndOrder();
-};
-
-void tst_QShaderNodes::shouldManipulateFormatMembers()
-{
- // GIVEN
- auto format = QShaderFormat();
-
- // THEN (default state)
- QCOMPARE(format.api(), QShaderFormat::NoApi);
- QCOMPARE(format.version().majorVersion(), 0);
- QCOMPARE(format.version().minorVersion(), 0);
- QCOMPARE(format.extensions(), QStringList());
- QCOMPARE(format.vendor(), QString());
- QVERIFY(!format.isValid());
-
- // WHEN
- format.setApi(QShaderFormat::OpenGLES);
-
- // THEN
- QCOMPARE(format.api(), QShaderFormat::OpenGLES);
- QCOMPARE(format.version().majorVersion(), 0);
- QCOMPARE(format.version().minorVersion(), 0);
- QCOMPARE(format.extensions(), QStringList());
- QCOMPARE(format.vendor(), QString());
- QVERIFY(!format.isValid());
-
- // WHEN
- format.setVersion(QVersionNumber(3));
-
- // THEN
- QCOMPARE(format.api(), QShaderFormat::OpenGLES);
- QCOMPARE(format.version().majorVersion(), 3);
- QCOMPARE(format.version().minorVersion(), 0);
- QCOMPARE(format.extensions(), QStringList());
- QCOMPARE(format.vendor(), QString());
- QVERIFY(format.isValid());
-
- // WHEN
- format.setVersion(QVersionNumber(3, 2));
-
- // THEN
- QCOMPARE(format.api(), QShaderFormat::OpenGLES);
- QCOMPARE(format.version().majorVersion(), 3);
- QCOMPARE(format.version().minorVersion(), 2);
- QCOMPARE(format.extensions(), QStringList());
- QCOMPARE(format.vendor(), QString());
- QVERIFY(format.isValid());
-
- // WHEN
- format.setExtensions({"foo", "bar"});
-
- // THEN
- QCOMPARE(format.api(), QShaderFormat::OpenGLES);
- QCOMPARE(format.version().majorVersion(), 3);
- QCOMPARE(format.version().minorVersion(), 2);
- QCOMPARE(format.extensions(), QStringList({"bar", "foo"}));
- QCOMPARE(format.vendor(), QString());
- QVERIFY(format.isValid());
-
- // WHEN
- format.setVendor(QStringLiteral("KDAB"));
-
- // THEN
- QCOMPARE(format.api(), QShaderFormat::OpenGLES);
- QCOMPARE(format.version().majorVersion(), 3);
- QCOMPARE(format.version().minorVersion(), 2);
- QCOMPARE(format.extensions(), QStringList({"bar", "foo"}));
- QCOMPARE(format.vendor(), QStringLiteral("KDAB"));
- QVERIFY(format.isValid());
-}
-
-void tst_QShaderNodes::shouldVerifyFormatsEquality_data()
-{
- QTest::addColumn<QShaderFormat>("left");
- QTest::addColumn<QShaderFormat>("right");
- QTest::addColumn<bool>("expected");
-
- QTest::newRow("Equals") << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0, {"foo", "bar"}, "KDAB")
- << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0, {"foo", "bar"}, "KDAB")
- << true;
- QTest::newRow("Apis") << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0, {"foo", "bar"}, "KDAB")
- << createFormat(QShaderFormat::OpenGLNoProfile, 3, 0, {"foo", "bar"}, "KDAB")
- << false;
- QTest::newRow("Major") << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0, {"foo", "bar"}, "KDAB")
- << createFormat(QShaderFormat::OpenGLCoreProfile, 2, 0, {"foo", "bar"}, "KDAB")
- << false;
- QTest::newRow("Minor") << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0, {"foo", "bar"}, "KDAB")
- << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 1, {"foo", "bar"}, "KDAB")
- << false;
- QTest::newRow("Extensions") << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0, {"foo", "bar"}, "KDAB")
- << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0, {"foo"}, "KDAB")
- << false;
- QTest::newRow("Vendor") << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0, {"foo", "bar"}, "KDAB")
- << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0, {"foo", "bar"})
- << false;
-}
-
-void tst_QShaderNodes::shouldVerifyFormatsEquality()
-{
- // GIVEN
- QFETCH(QShaderFormat, left);
- QFETCH(QShaderFormat, right);
-
- // WHEN
- const auto equal = (left == right);
- const auto notEqual = (left != right);
-
- // THEN
- QFETCH(bool, expected);
- QCOMPARE(equal, expected);
- QCOMPARE(notEqual, !expected);
-}
-
-void tst_QShaderNodes::shouldVerifyFormatsCompatibilities_data()
-{
- QTest::addColumn<QShaderFormat>("reference");
- QTest::addColumn<QShaderFormat>("tested");
- QTest::addColumn<bool>("expected");
-
- QTest::newRow("NoProfileVsES") << createFormat(QShaderFormat::OpenGLNoProfile, 2, 0)
- << createFormat(QShaderFormat::OpenGLES, 2, 0)
- << true;
- QTest::newRow("CoreProfileVsES") << createFormat(QShaderFormat::OpenGLCoreProfile, 2, 0)
- << createFormat(QShaderFormat::OpenGLES, 2, 0)
- << false;
- QTest::newRow("CompatProfileVsES") << createFormat(QShaderFormat::OpenGLCompatibilityProfile, 2, 0)
- << createFormat(QShaderFormat::OpenGLES, 2, 0)
- << true;
-
- QTest::newRow("ESVsNoProfile") << createFormat(QShaderFormat::OpenGLES, 2, 0)
- << createFormat(QShaderFormat::OpenGLNoProfile, 2, 0)
- << false;
- QTest::newRow("ESVsCoreProfile") << createFormat(QShaderFormat::OpenGLES, 2, 0)
- << createFormat(QShaderFormat::OpenGLCoreProfile, 2, 0)
- << false;
- QTest::newRow("ESVsCompatProfile") << createFormat(QShaderFormat::OpenGLES, 2, 0)
- << createFormat(QShaderFormat::OpenGLCompatibilityProfile, 2, 0)
- << false;
-
- QTest::newRow("CoreVsNoProfile") << createFormat(QShaderFormat::OpenGLCoreProfile, 2, 0)
- << createFormat(QShaderFormat::OpenGLNoProfile, 2, 0)
- << false;
- QTest::newRow("CoreVsCompat") << createFormat(QShaderFormat::OpenGLCoreProfile, 2, 0)
- << createFormat(QShaderFormat::OpenGLCompatibilityProfile, 2, 0)
- << false;
- QTest::newRow("CoreVsCore") << createFormat(QShaderFormat::OpenGLCoreProfile, 2, 0)
- << createFormat(QShaderFormat::OpenGLCoreProfile, 2, 0)
- << true;
-
- QTest::newRow("NoProfileVsCore") << createFormat(QShaderFormat::OpenGLNoProfile, 2, 0)
- << createFormat(QShaderFormat::OpenGLCoreProfile, 2, 0)
- << true;
- QTest::newRow("NoProvileVsCompat") << createFormat(QShaderFormat::OpenGLNoProfile, 2, 0)
- << createFormat(QShaderFormat::OpenGLCompatibilityProfile, 2, 0)
- << true;
- QTest::newRow("NoProfileVsNoProfile") << createFormat(QShaderFormat::OpenGLNoProfile, 2, 0)
- << createFormat(QShaderFormat::OpenGLNoProfile, 2, 0)
- << true;
-
- QTest::newRow("CompatVsCore") << createFormat(QShaderFormat::OpenGLCompatibilityProfile, 2, 0)
- << createFormat(QShaderFormat::OpenGLCoreProfile, 2, 0)
- << true;
- QTest::newRow("CompatVsCompat") << createFormat(QShaderFormat::OpenGLCompatibilityProfile, 2, 0)
- << createFormat(QShaderFormat::OpenGLCompatibilityProfile, 2, 0)
- << true;
- QTest::newRow("CompatVsNoProfile") << createFormat(QShaderFormat::OpenGLCompatibilityProfile, 2, 0)
- << createFormat(QShaderFormat::OpenGLNoProfile, 2, 0)
- << true;
-
- QTest::newRow("MajorForwardCompat_1") << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0)
- << createFormat(QShaderFormat::OpenGLCoreProfile, 2, 0)
- << true;
- QTest::newRow("MajorForwardCompat_2") << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0)
- << createFormat(QShaderFormat::OpenGLCoreProfile, 2, 4)
- << true;
- QTest::newRow("MajorForwardCompat_3") << createFormat(QShaderFormat::OpenGLCoreProfile, 2, 0)
- << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0)
- << false;
- QTest::newRow("MajorForwardCompat_4") << createFormat(QShaderFormat::OpenGLCoreProfile, 2, 4)
- << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0)
- << false;
-
- QTest::newRow("MinorForwardCompat_1") << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 1)
- << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0)
- << true;
- QTest::newRow("MinorForwardCompat_2") << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0)
- << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 1)
- << false;
-
- QTest::newRow("Extensions_1") << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0, {"foo", "bar"})
- << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0, {"foo"})
- << true;
- QTest::newRow("Extensions_2") << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0, {"foo"})
- << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0, {"foo", "bar"})
- << false;
-
- QTest::newRow("Vendor_1") << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0, {}, "KDAB")
- << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0, {})
- << true;
- QTest::newRow("Vendor_2") << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0, {})
- << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0, {}, "KDAB")
- << false;
- QTest::newRow("Vendor_2") << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0, {}, "KDAB")
- << createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0, {}, "KDAB")
- << true;
-}
-
-void tst_QShaderNodes::shouldVerifyFormatsCompatibilities()
-{
- // GIVEN
- QFETCH(QShaderFormat, reference);
- QFETCH(QShaderFormat, tested);
-
- // WHEN
- const auto supported = reference.supports(tested);
-
- // THEN
- QFETCH(bool, expected);
- QCOMPARE(supported, expected);
-}
-
-void tst_QShaderNodes::shouldHaveDefaultPortState()
-{
- // GIVEN
- auto port = QShaderNodePort();
-
- // THEN
- QCOMPARE(port.direction, QShaderNodePort::Output);
- QVERIFY(port.name.isEmpty());
-}
-
-void tst_QShaderNodes::shouldVerifyPortsEquality_data()
-{
- QTest::addColumn<QShaderNodePort>("left");
- QTest::addColumn<QShaderNodePort>("right");
- QTest::addColumn<bool>("expected");
-
- QTest::newRow("Equals") << createPort(QShaderNodePort::Input, "foo")
- << createPort(QShaderNodePort::Input, "foo")
- << true;
- QTest::newRow("Direction") << createPort(QShaderNodePort::Input, "foo")
- << createPort(QShaderNodePort::Output, "foo")
- << false;
- QTest::newRow("Name") << createPort(QShaderNodePort::Input, "foo")
- << createPort(QShaderNodePort::Input, "bar")
- << false;
-}
-
-void tst_QShaderNodes::shouldVerifyPortsEquality()
-{
- // GIVEN
- QFETCH(QShaderNodePort, left);
- QFETCH(QShaderNodePort, right);
-
- // WHEN
- const auto equal = (left == right);
- const auto notEqual = (left != right);
-
- // THEN
- QFETCH(bool, expected);
- QCOMPARE(equal, expected);
- QCOMPARE(notEqual, !expected);
-}
-
-void tst_QShaderNodes::shouldManipulateNodeMembers()
-{
- // GIVEN
- const auto openGLES2 = createFormat(QShaderFormat::OpenGLES, 2, 0);
- const auto openGL3 = createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0);
-
- const auto es2Rule = QShaderNode::Rule(QByteArrayLiteral("gles2"), {"#pragma include es2/foo.inc", "#pragma include es2/bar.inc"});
- const auto gl3Rule = QShaderNode::Rule(QByteArrayLiteral("gl3"), {"#pragma include gl3/foo.inc", "#pragma include gl3/bar.inc"});
- const auto gl3bisRule = QShaderNode::Rule(QByteArrayLiteral("gl3bis"), {"#pragma include gl3/foo.inc", "#pragma include gl3/bar.inc"});
-
- auto node = QShaderNode();
-
- // THEN (default state)
- QCOMPARE(node.type(), QShaderNode::Invalid);
- QVERIFY(node.uuid().isNull());
- QVERIFY(node.layers().isEmpty());
- QVERIFY(node.ports().isEmpty());
- QVERIFY(node.parameterNames().isEmpty());
- QVERIFY(node.availableFormats().isEmpty());
-
- // WHEN
- const auto uuid = QUuid::createUuid();
- node.setUuid(uuid);
-
- // THEN
- QCOMPARE(node.uuid(), uuid);
-
- // WHEN
- node.setLayers({"foo", "bar"});
-
- // THEN
- QCOMPARE(node.layers(), QStringList({"foo", "bar"}));
-
- // WHEN
- auto firstPort = QShaderNodePort();
- firstPort.direction = QShaderNodePort::Input;
- firstPort.name = QStringLiteral("foo");
- node.addPort(firstPort);
-
- // THEN
- QCOMPARE(node.type(), QShaderNode::Output);
- QCOMPARE(node.ports().size(), 1);
- QCOMPARE(node.ports().at(0), firstPort);
- QVERIFY(node.availableFormats().isEmpty());
-
- // WHEN
- auto secondPort = QShaderNodePort();
- secondPort.direction = QShaderNodePort::Output;
- secondPort.name = QStringLiteral("bar");
- node.addPort(secondPort);
-
- // THEN
- QCOMPARE(node.type(), QShaderNode::Function);
- QCOMPARE(node.ports().size(), 2);
- QCOMPARE(node.ports().at(0), firstPort);
- QCOMPARE(node.ports().at(1), secondPort);
- QVERIFY(node.availableFormats().isEmpty());
-
- // WHEN
- node.removePort(firstPort);
-
- // THEN
- QCOMPARE(node.type(), QShaderNode::Input);
- QCOMPARE(node.ports().size(), 1);
- QCOMPARE(node.ports().at(0), secondPort);
- QVERIFY(node.availableFormats().isEmpty());
-
- // WHEN
- node.setParameter(QStringLiteral("baz"), 42);
-
- // THEN
- QCOMPARE(node.type(), QShaderNode::Input);
- QCOMPARE(node.ports().size(), 1);
- QCOMPARE(node.ports().at(0), secondPort);
- auto parameterNames = node.parameterNames();
- parameterNames.sort();
- QCOMPARE(parameterNames.size(), 1);
- QCOMPARE(parameterNames.at(0), QStringLiteral("baz"));
- QCOMPARE(node.parameter(QStringLiteral("baz")), QVariant(42));
- QVERIFY(node.availableFormats().isEmpty());
-
- // WHEN
- node.setParameter(QStringLiteral("bleh"), QStringLiteral("value"));
-
- // THEN
- QCOMPARE(node.type(), QShaderNode::Input);
- QCOMPARE(node.ports().size(), 1);
- QCOMPARE(node.ports().at(0), secondPort);
- parameterNames = node.parameterNames();
- parameterNames.sort();
- QCOMPARE(parameterNames.size(), 2);
- QCOMPARE(parameterNames.at(0), QStringLiteral("baz"));
- QCOMPARE(parameterNames.at(1), QStringLiteral("bleh"));
- QCOMPARE(node.parameter(QStringLiteral("baz")), QVariant(42));
- QCOMPARE(node.parameter(QStringLiteral("bleh")), QVariant(QStringLiteral("value")));
- QVERIFY(node.availableFormats().isEmpty());
-
- // WHEN
- node.clearParameter(QStringLiteral("baz"));
-
- // THEN
- QCOMPARE(node.type(), QShaderNode::Input);
- QCOMPARE(node.ports().size(), 1);
- QCOMPARE(node.ports().at(0), secondPort);
- parameterNames = node.parameterNames();
- parameterNames.sort();
- QCOMPARE(parameterNames.size(), 1);
- QCOMPARE(parameterNames.at(0), QStringLiteral("bleh"));
- QCOMPARE(node.parameter(QStringLiteral("baz")), QVariant());
- QCOMPARE(node.parameter(QStringLiteral("bleh")), QVariant(QStringLiteral("value")));
- QVERIFY(node.availableFormats().isEmpty());
-
- // WHEN
- node.addRule(openGLES2, es2Rule);
- node.addRule(openGL3, gl3Rule);
-
- // THEN
- QCOMPARE(node.availableFormats().size(), 2);
- QCOMPARE(node.availableFormats().at(0), openGLES2);
- QCOMPARE(node.availableFormats().at(1), openGL3);
- QCOMPARE(node.rule(openGLES2), es2Rule);
- QCOMPARE(node.rule(openGL3), gl3Rule);
-
- // WHEN
- node.removeRule(openGLES2);
-
- // THEN
- QCOMPARE(node.availableFormats().size(), 1);
- QCOMPARE(node.availableFormats().at(0), openGL3);
- QCOMPARE(node.rule(openGL3), gl3Rule);
-
- // WHEN
- node.addRule(openGLES2, es2Rule);
-
- // THEN
- QCOMPARE(node.availableFormats().size(), 2);
- QCOMPARE(node.availableFormats().at(0), openGL3);
- QCOMPARE(node.availableFormats().at(1), openGLES2);
- QCOMPARE(node.rule(openGLES2), es2Rule);
- QCOMPARE(node.rule(openGL3), gl3Rule);
-
- // WHEN
- node.addRule(openGL3, gl3bisRule);
-
- // THEN
- QCOMPARE(node.availableFormats().size(), 2);
- QCOMPARE(node.availableFormats().at(0), openGLES2);
- QCOMPARE(node.availableFormats().at(1), openGL3);
- QCOMPARE(node.rule(openGLES2), es2Rule);
- QCOMPARE(node.rule(openGL3), gl3bisRule);
-}
-
-void tst_QShaderNodes::shouldHandleNodeRulesSupportAndOrder()
-{
- // GIVEN
- const auto openGLES2 = createFormat(QShaderFormat::OpenGLES, 2, 0);
- const auto openGL3 = createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0);
- const auto openGL32 = createFormat(QShaderFormat::OpenGLCoreProfile, 3, 2);
- const auto openGL4 = createFormat(QShaderFormat::OpenGLCoreProfile, 4, 0);
-
- const auto es2Rule = QShaderNode::Rule(QByteArrayLiteral("gles2"), {"#pragma include es2/foo.inc", "#pragma include es2/bar.inc"});
- const auto gl3Rule = QShaderNode::Rule(QByteArrayLiteral("gl3"), {"#pragma include gl3/foo.inc", "#pragma include gl3/bar.inc"});
- const auto gl32Rule = QShaderNode::Rule(QByteArrayLiteral("gl32"), {"#pragma include gl32/foo.inc", "#pragma include gl32/bar.inc"});
- const auto gl3bisRule = QShaderNode::Rule(QByteArrayLiteral("gl3bis"), {"#pragma include gl3/foo.inc", "#pragma include gl3/bar.inc"});
-
- auto node = QShaderNode();
-
- // WHEN
- node.addRule(openGLES2, es2Rule);
- node.addRule(openGL3, gl3Rule);
-
- // THEN
- QCOMPARE(node.availableFormats().size(), 2);
- QCOMPARE(node.availableFormats().at(0), openGLES2);
- QCOMPARE(node.availableFormats().at(1), openGL3);
- QCOMPARE(node.rule(openGLES2), es2Rule);
- QCOMPARE(node.rule(openGL3), gl3Rule);
- QCOMPARE(node.rule(openGL32), gl3Rule);
- QCOMPARE(node.rule(openGL4), gl3Rule);
-
- // WHEN
- node.addRule(openGL32, gl32Rule);
-
- // THEN
- QCOMPARE(node.availableFormats().size(), 3);
- QCOMPARE(node.availableFormats().at(0), openGLES2);
- QCOMPARE(node.availableFormats().at(1), openGL3);
- QCOMPARE(node.availableFormats().at(2), openGL32);
- QCOMPARE(node.rule(openGLES2), es2Rule);
- QCOMPARE(node.rule(openGL3), gl3Rule);
- QCOMPARE(node.rule(openGL32), gl32Rule);
- QCOMPARE(node.rule(openGL4), gl32Rule);
-
- // WHEN
- node.addRule(openGL3, gl3bisRule);
-
- // THEN
- QCOMPARE(node.availableFormats().size(), 3);
- QCOMPARE(node.availableFormats().at(0), openGLES2);
- QCOMPARE(node.availableFormats().at(1), openGL32);
- QCOMPARE(node.availableFormats().at(2), openGL3);
- QCOMPARE(node.rule(openGLES2), es2Rule);
- QCOMPARE(node.rule(openGL3), gl3bisRule);
- QCOMPARE(node.rule(openGL32), gl3bisRule);
- QCOMPARE(node.rule(openGL4), gl3bisRule);
-}
-
-QTEST_MAIN(tst_QShaderNodes)
-
-#include "tst_qshadernodes.moc"
diff --git a/tests/auto/gui/util/qshadernodesloader/CMakeLists.txt b/tests/auto/gui/util/qshadernodesloader/CMakeLists.txt
deleted file mode 100644
index 0491e4d149..0000000000
--- a/tests/auto/gui/util/qshadernodesloader/CMakeLists.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-# Generated from qshadernodesloader.pro.
-
-#####################################################################
-## tst_qshadernodesloader Test:
-#####################################################################
-
-qt_internal_add_test(tst_qshadernodesloader
- SOURCES
- tst_qshadernodesloader.cpp
- PUBLIC_LIBRARIES
- Qt::Gui
- Qt::GuiPrivate
-)
diff --git a/tests/auto/gui/util/qshadernodesloader/tst_qshadernodesloader.cpp b/tests/auto/gui/util/qshadernodesloader/tst_qshadernodesloader.cpp
deleted file mode 100644
index fd022ba83f..0000000000
--- a/tests/auto/gui/util/qshadernodesloader/tst_qshadernodesloader.cpp
+++ /dev/null
@@ -1,327 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB).
-** 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 <QTest>
-
-#include <QtCore/qbuffer.h>
-
-#include <QtGui/private/qshadernodesloader_p.h>
-#include <QtGui/private/qshaderlanguage_p.h>
-
-using QBufferPointer = QSharedPointer<QBuffer>;
-Q_DECLARE_METATYPE(QBufferPointer);
-
-using NodeHash = QHash<QString, QShaderNode>;
-Q_DECLARE_METATYPE(NodeHash);
-
-namespace
-{
- QBufferPointer createBuffer(const QByteArray &data, QIODevice::OpenMode openMode = QIODevice::ReadOnly)
- {
- auto buffer = QBufferPointer::create();
- buffer->setData(data);
- if (openMode != QIODevice::NotOpen)
- buffer->open(openMode);
- return buffer;
- }
-
- QShaderFormat createFormat(QShaderFormat::Api api, int majorVersion, int minorVersion,
- const QStringList &extensions = QStringList(),
- const QString &vendor = QString())
- {
- auto format = QShaderFormat();
- format.setApi(api);
- format.setVersion(QVersionNumber(majorVersion, minorVersion));
- format.setExtensions(extensions);
- format.setVendor(vendor);
- return format;
- }
-
- QShaderNodePort createPort(QShaderNodePort::Direction portDirection, const QString &portName)
- {
- auto port = QShaderNodePort();
- port.direction = portDirection;
- port.name = portName;
- return port;
- }
-
- QShaderNode createNode(const QList<QShaderNodePort> &ports)
- {
- auto node = QShaderNode();
- for (const auto &port : ports)
- node.addPort(port);
- return node;
- }
-}
-
-class tst_QShaderNodesLoader : public QObject
-{
- Q_OBJECT
-private slots:
- void shouldManipulateLoaderMembers();
- void shouldLoadFromJsonStream_data();
- void shouldLoadFromJsonStream();
-};
-
-void tst_QShaderNodesLoader::shouldManipulateLoaderMembers()
-{
- // GIVEN
- auto loader = QShaderNodesLoader();
-
- // THEN (default state)
- QCOMPARE(loader.status(), QShaderNodesLoader::Null);
- QVERIFY(!loader.device());
- QVERIFY(loader.nodes().isEmpty());
-
- // WHEN
- auto device1 = createBuffer(QByteArray("..........."), QIODevice::NotOpen);
- loader.setDevice(device1.data());
-
- // THEN
- QCOMPARE(loader.status(), QShaderNodesLoader::Error);
- QCOMPARE(loader.device(), device1.data());
- QVERIFY(loader.nodes().isEmpty());
-
- // WHEN
- auto device2 = createBuffer(QByteArray("..........."), QIODevice::ReadOnly);
- loader.setDevice(device2.data());
-
- // THEN
- QCOMPARE(loader.status(), QShaderNodesLoader::Waiting);
- QCOMPARE(loader.device(), device2.data());
- QVERIFY(loader.nodes().isEmpty());
-}
-
-void tst_QShaderNodesLoader::shouldLoadFromJsonStream_data()
-{
- QTest::addColumn<QBufferPointer>("device");
- QTest::addColumn<NodeHash>("nodes");
- QTest::addColumn<QShaderNodesLoader::Status>("status");
-
- QTest::newRow("empty") << createBuffer("", QIODevice::ReadOnly) << NodeHash() << QShaderNodesLoader::Error;
-
- const auto smallJson = "{"
- " \"inputValue\": {"
- " \"outputs\": ["
- " \"value\""
- " ],"
- " \"parameters\": {"
- " \"name\": \"defaultName\","
- " \"qualifier\": {"
- " \"type\": \"QShaderLanguage::StorageQualifier\","
- " \"value\": \"QShaderLanguage::Uniform\""
- " },"
- " \"type\": {"
- " \"type\": \"QShaderLanguage::VariableType\","
- " \"value\": \"QShaderLanguage::Vec3\""
- " },"
- " \"defaultValue\": {"
- " \"type\": \"float\","
- " \"value\": \"1.25\""
- " }"
- " },"
- " \"rules\": ["
- " {"
- " \"format\": {"
- " \"api\": \"OpenGLES\","
- " \"major\": 2,"
- " \"minor\": 0"
- " },"
- " \"substitution\": \"highp vec3 $value = $name;\","
- " \"headerSnippets\": [ \"varying highp vec3 $name;\" ]"
- " },"
- " {"
- " \"format\": {"
- " \"api\": \"OpenGLCompatibilityProfile\","
- " \"major\": 2,"
- " \"minor\": 1"
- " },"
- " \"substitution\": \"vec3 $value = $name;\","
- " \"headerSnippets\": [ \"in vec3 $name;\" ]"
- " }"
- " ]"
- " },"
- " \"fragColor\": {"
- " \"inputs\": ["
- " \"fragColor\""
- " ],"
- " \"rules\": ["
- " {"
- " \"format\": {"
- " \"api\": \"OpenGLES\","
- " \"major\": 2,"
- " \"minor\": 0"
- " },"
- " \"substitution\": \"gl_fragColor = $fragColor;\""
- " },"
- " {"
- " \"format\": {"
- " \"api\": \"OpenGLNoProfile\","
- " \"major\": 4,"
- " \"minor\": 0"
- " },"
- " \"substitution\": \"fragColor = $fragColor;\","
- " \"headerSnippets\": [ \"out vec4 fragColor;\" ]"
- " }"
- " ]"
- " },"
- " \"lightModel\": {"
- " \"inputs\": ["
- " \"baseColor\","
- " \"position\","
- " \"lightIntensity\""
- " ],"
- " \"outputs\": ["
- " \"outputColor\""
- " ],"
- " \"rules\": ["
- " {"
- " \"format\": {"
- " \"api\": \"OpenGLES\","
- " \"major\": 2,"
- " \"minor\": 0,"
- " \"extensions\": [ \"ext1\", \"ext2\" ],"
- " \"vendor\": \"kdab\""
- " },"
- " \"substitution\": \"highp vec4 $outputColor = lightModel($baseColor, $position, $lightIntensity);\","
- " \"headerSnippets\": [ \"#pragma include es2/lightmodel.frag.inc\" ]"
- " },"
- " {"
- " \"format\": {"
- " \"api\": \"OpenGLCoreProfile\","
- " \"major\": 3,"
- " \"minor\": 3"
- " },"
- " \"substitution\": \"vec4 $outputColor = lightModel($baseColor, $position, $lightIntensity);\","
- " \"headerSnippets\": [ \"#pragma include gl3/lightmodel.frag.inc\" ]"
- " }"
- " ]"
- " }"
- "}";
-
- const auto smallProtos = [&]{
- const auto openGLES2 = createFormat(QShaderFormat::OpenGLES, 2, 0);
- const auto openGLES2Extended = createFormat(QShaderFormat::OpenGLES, 2, 0, {"ext1", "ext2"}, "kdab");
- const auto openGL2 = createFormat(QShaderFormat::OpenGLCompatibilityProfile, 2, 1);
- const auto openGL3 = createFormat(QShaderFormat::OpenGLCoreProfile, 3, 3);
- const auto openGL4 = createFormat(QShaderFormat::OpenGLNoProfile, 4, 0);
-
- auto protos = NodeHash();
-
- auto inputValue = createNode({
- createPort(QShaderNodePort::Output, "value")
- });
- inputValue.setParameter("name", "defaultName");
- inputValue.setParameter("qualifier", QVariant::fromValue<QShaderLanguage::StorageQualifier>(QShaderLanguage::Uniform));
- inputValue.setParameter("type", QVariant::fromValue<QShaderLanguage::VariableType>(QShaderLanguage::Vec3));
- inputValue.setParameter("defaultValue", QVariant(1.25f));
- inputValue.addRule(openGLES2, QShaderNode::Rule("highp vec3 $value = $name;",
- QByteArrayList() << "varying highp vec3 $name;"));
- inputValue.addRule(openGL2, QShaderNode::Rule("vec3 $value = $name;",
- QByteArrayList() << "in vec3 $name;"));
- protos.insert("inputValue", inputValue);
-
- auto fragColor = createNode({
- createPort(QShaderNodePort::Input, "fragColor")
- });
- fragColor.addRule(openGLES2, QShaderNode::Rule("gl_fragColor = $fragColor;"));
- fragColor.addRule(openGL4, QShaderNode::Rule("fragColor = $fragColor;",
- QByteArrayList() << "out vec4 fragColor;"));
- protos.insert(QStringLiteral("fragColor"), fragColor);
-
- auto lightModel = createNode({
- createPort(QShaderNodePort::Input, "baseColor"),
- createPort(QShaderNodePort::Input, "position"),
- createPort(QShaderNodePort::Input, "lightIntensity"),
- createPort(QShaderNodePort::Output, "outputColor")
- });
- lightModel.addRule(openGLES2Extended, QShaderNode::Rule("highp vec4 $outputColor = lightModel($baseColor, $position, $lightIntensity);",
- QByteArrayList() << "#pragma include es2/lightmodel.frag.inc"));
- lightModel.addRule(openGL3, QShaderNode::Rule("vec4 $outputColor = lightModel($baseColor, $position, $lightIntensity);",
- QByteArrayList() << "#pragma include gl3/lightmodel.frag.inc"));
- protos.insert("lightModel", lightModel);
-
- return protos;
- }();
-
- QTest::newRow("NotOpen") << createBuffer(smallJson, QIODevice::NotOpen) << NodeHash() << QShaderNodesLoader::Error;
- QTest::newRow("CorrectJSON") << createBuffer(smallJson) << smallProtos << QShaderNodesLoader::Ready;
-
- // These types are normaly registered by QShaderGraphLoader
- qRegisterMetaType<QShaderLanguage::StorageQualifier>();
- qRegisterMetaType<QShaderLanguage::VariableType>();
-}
-
-void tst_QShaderNodesLoader::shouldLoadFromJsonStream()
-{
- // GIVEN
- QFETCH(QBufferPointer, device);
-
- auto loader = QShaderNodesLoader();
-
- // WHEN
- loader.setDevice(device.data());
- loader.load();
-
- // THEN
- QFETCH(QShaderNodesLoader::Status, status);
- QCOMPARE(loader.status(), status);
-
- QFETCH(NodeHash, nodes);
- const auto sortedKeys = [](const NodeHash &nodes) {
- auto res = nodes.keys();
- res.sort();
- return res;
- };
- const auto sortedParameters = [](const QShaderNode &node) {
- auto res = node.parameterNames();
- res.sort();
- return res;
- };
- QCOMPARE(sortedKeys(loader.nodes()), sortedKeys(nodes));
- for (const auto &key : nodes.keys()) {
- const auto actual = loader.nodes().value(key);
- const auto expected = nodes.value(key);
-
- QVERIFY(actual.uuid().isNull());
- QCOMPARE(actual.ports(), expected.ports());
- QCOMPARE(sortedParameters(actual), sortedParameters(expected));
- for (const auto &name : expected.parameterNames()) {
- QCOMPARE(actual.parameter(name), expected.parameter(name));
- }
- QCOMPARE(actual.availableFormats(), expected.availableFormats());
- for (const auto &format : expected.availableFormats()) {
- QCOMPARE(actual.rule(format), expected.rule(format));
- }
- }
-}
-
-QTEST_MAIN(tst_QShaderNodesLoader)
-
-#include "tst_qshadernodesloader.moc"
diff --git a/tests/auto/gui/util/qtexturefilereader/CMakeLists.txt b/tests/auto/gui/util/qtexturefilereader/CMakeLists.txt
index de809f577d..70e2c02417 100644
--- a/tests/auto/gui/util/qtexturefilereader/CMakeLists.txt
+++ b/tests/auto/gui/util/qtexturefilereader/CMakeLists.txt
@@ -1,16 +1,15 @@
-# Generated from qtexturefilereader.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
#####################################################################
## tst_qtexturefilereader Test:
#####################################################################
-qt_internal_add_test(tst_qtexturefilereader
- SOURCES
- tst_qtexturefilereader.cpp
- PUBLIC_LIBRARIES
- Qt::Gui
- Qt::GuiPrivate
-)
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_qtexturefilereader LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
# Resources:
set(qtexturefilereader_resource_files
@@ -18,15 +17,19 @@ set(qtexturefilereader_resource_files
"texturefiles/car_mips.ktx"
"texturefiles/cubemap_float32_rgba.ktx"
"texturefiles/cubemap_metadata.ktx"
+ "texturefiles/invalid.ktx"
"texturefiles/newlogo.astc"
"texturefiles/newlogo_srgb.astc"
"texturefiles/pattern.pkm"
)
-qt_internal_add_resource(tst_qtexturefilereader "qtexturefilereader"
- PREFIX
- "/"
- FILES
- ${qtexturefilereader_resource_files}
+qt_internal_add_test(tst_qtexturefilereader
+ SOURCES
+ tst_qtexturefilereader.cpp
+ LIBRARIES
+ Qt::Gui
+ Qt::GuiPrivate
+ TESTDATA ${qtexturefilereader_resource_files}
+ BUILTIN_TESTDATA
)
diff --git a/tests/auto/gui/util/qtexturefilereader/qtexturefilereader.qrc b/tests/auto/gui/util/qtexturefilereader/qtexturefilereader.qrc
deleted file mode 100644
index c4cef6cc44..0000000000
--- a/tests/auto/gui/util/qtexturefilereader/qtexturefilereader.qrc
+++ /dev/null
@@ -1,11 +0,0 @@
-<RCC>
- <qresource prefix="/">
- <file>texturefiles/car.ktx</file>
- <file>texturefiles/cubemap_float32_rgba.ktx</file>
- <file>texturefiles/cubemap_metadata.ktx</file>
- <file>texturefiles/pattern.pkm</file>
- <file>texturefiles/car_mips.ktx</file>
- <file>texturefiles/newlogo_srgb.astc</file>
- <file>texturefiles/newlogo.astc</file>
- </qresource>
-</RCC>
diff --git a/tests/auto/gui/util/qtexturefilereader/texturefiles/invalid.ktx b/tests/auto/gui/util/qtexturefilereader/texturefiles/invalid.ktx
new file mode 100644
index 0000000000..68a92221db
--- /dev/null
+++ b/tests/auto/gui/util/qtexturefilereader/texturefiles/invalid.ktx
Binary files differ
diff --git a/tests/auto/gui/util/qtexturefilereader/tst_qtexturefilereader.cpp b/tests/auto/gui/util/qtexturefilereader/tst_qtexturefilereader.cpp
index 89144eb245..62760e3844 100644
--- a/tests/auto/gui/util/qtexturefilereader/tst_qtexturefilereader.cpp
+++ b/tests/auto/gui/util/qtexturefilereader/tst_qtexturefilereader.cpp
@@ -1,30 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** 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$
-**
-****************************************************************************/
+// Copyright (C) 2018 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <private/qtexturefilereader_p.h>
#include <QTest>
@@ -36,6 +11,7 @@ class tst_qtexturefilereader : public QObject
private slots:
void checkHandlers_data();
void checkHandlers();
+ void checkInvalid();
void checkMetadata();
};
@@ -165,6 +141,18 @@ void tst_qtexturefilereader::checkMetadata()
QCOMPARE(kvs.value("test C"), QByteArrayLiteral("3\x0000"));
}
+void tst_qtexturefilereader::checkInvalid()
+{
+ QFile f(":/texturefiles/invalid.ktx");
+ QVERIFY(f.open(QIODevice::ReadOnly));
+ QTextureFileReader r(&f);
+ QTextureFileData d = r.read();
+ auto kvs = d.keyValueMetadata();
+
+ // Basically just checking that we don't crash on and invalid file
+ QVERIFY(kvs.empty());
+}
+
QTEST_MAIN(tst_qtexturefilereader)
#include "tst_qtexturefilereader.moc"
diff --git a/tests/auto/gui/util/qundogroup/CMakeLists.txt b/tests/auto/gui/util/qundogroup/CMakeLists.txt
index c1396326f7..98c2f64f88 100644
--- a/tests/auto/gui/util/qundogroup/CMakeLists.txt
+++ b/tests/auto/gui/util/qundogroup/CMakeLists.txt
@@ -1,12 +1,19 @@
-# Generated from qundogroup.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
#####################################################################
## tst_qundogroup Test:
#####################################################################
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_qundogroup LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
qt_internal_add_test(tst_qundogroup
SOURCES
tst_qundogroup.cpp
- PUBLIC_LIBRARIES
+ LIBRARIES
Qt::Gui
)
diff --git a/tests/auto/gui/util/qundogroup/tst_qundogroup.cpp b/tests/auto/gui/util/qundogroup/tst_qundogroup.cpp
index c609ab4ffd..36f72b2ca0 100644
--- a/tests/auto/gui/util/qundogroup/tst_qundogroup.cpp
+++ b/tests/auto/gui/util/qundogroup/tst_qundogroup.cpp
@@ -1,30 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** 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$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QTest>
#include <QUndoGroup>
#include <QUndoStack>
@@ -90,7 +65,7 @@ InsertCommand::InsertCommand(QString *str, int idx, const QString &text,
QUndoCommand *parent)
: QUndoCommand(parent)
{
- QVERIFY(str->length() >= idx);
+ QVERIFY(str->size() >= idx);
setText("insert");
@@ -101,22 +76,22 @@ InsertCommand::InsertCommand(QString *str, int idx, const QString &text,
void InsertCommand::redo()
{
- QVERIFY(m_str->length() >= m_idx);
+ QVERIFY(m_str->size() >= m_idx);
m_str->insert(m_idx, m_text);
}
void InsertCommand::undo()
{
- QCOMPARE(m_str->mid(m_idx, m_text.length()), m_text);
+ QCOMPARE(m_str->mid(m_idx, m_text.size()), m_text);
- m_str->remove(m_idx, m_text.length());
+ m_str->remove(m_idx, m_text.size());
}
RemoveCommand::RemoveCommand(QString *str, int idx, int len, QUndoCommand *parent)
: QUndoCommand(parent)
{
- QVERIFY(str->length() >= idx + len);
+ QVERIFY(str->size() >= idx + len);
setText("remove");
@@ -127,14 +102,14 @@ RemoveCommand::RemoveCommand(QString *str, int idx, int len, QUndoCommand *paren
void RemoveCommand::redo()
{
- QCOMPARE(m_str->mid(m_idx, m_text.length()), m_text);
+ QCOMPARE(m_str->mid(m_idx, m_text.size()), m_text);
- m_str->remove(m_idx, m_text.length());
+ m_str->remove(m_idx, m_text.size());
}
void RemoveCommand::undo()
{
- QVERIFY(m_str->length() >= m_idx);
+ QVERIFY(m_str->size() >= m_idx);
m_str->insert(m_idx, m_text);
}
@@ -156,9 +131,9 @@ void AppendCommand::redo()
void AppendCommand::undo()
{
- QCOMPARE(m_str->mid(m_str->length() - m_text.length()), m_text);
+ QCOMPARE(m_str->mid(m_str->size() - m_text.size()), m_text);
- m_str->truncate(m_str->length() - m_text.length());
+ m_str->truncate(m_str->size() - m_text.size());
}
int AppendCommand::id() const
diff --git a/tests/auto/gui/util/qundostack/CMakeLists.txt b/tests/auto/gui/util/qundostack/CMakeLists.txt
index 0e56171add..de36f4a1ad 100644
--- a/tests/auto/gui/util/qundostack/CMakeLists.txt
+++ b/tests/auto/gui/util/qundostack/CMakeLists.txt
@@ -1,12 +1,19 @@
-# Generated from qundostack.pro.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
#####################################################################
## tst_qundostack Test:
#####################################################################
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_qundostack LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
qt_internal_add_test(tst_qundostack
SOURCES
tst_qundostack.cpp
- PUBLIC_LIBRARIES
+ LIBRARIES
Qt::Gui
)
diff --git a/tests/auto/gui/util/qundostack/tst_qundostack.cpp b/tests/auto/gui/util/qundostack/tst_qundostack.cpp
index 6707c12d80..3567bc6097 100644
--- a/tests/auto/gui/util/qundostack/tst_qundostack.cpp
+++ b/tests/auto/gui/util/qundostack/tst_qundostack.cpp
@@ -1,30 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** 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$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QTest>
@@ -122,7 +97,7 @@ InsertCommand::InsertCommand(QString *str, int idx, const QString &text,
QUndoCommand *parent)
: QUndoCommand(parent)
{
- QVERIFY(str->length() >= idx);
+ QVERIFY(str->size() >= idx);
setText("insert");
@@ -133,22 +108,22 @@ InsertCommand::InsertCommand(QString *str, int idx, const QString &text,
void InsertCommand::redo()
{
- QVERIFY(m_str->length() >= m_idx);
+ QVERIFY(m_str->size() >= m_idx);
m_str->insert(m_idx, m_text);
}
void InsertCommand::undo()
{
- QCOMPARE(m_str->mid(m_idx, m_text.length()), m_text);
+ QCOMPARE(m_str->mid(m_idx, m_text.size()), m_text);
- m_str->remove(m_idx, m_text.length());
+ m_str->remove(m_idx, m_text.size());
}
RemoveCommand::RemoveCommand(QString *str, int idx, int len, QUndoCommand *parent)
: QUndoCommand(parent)
{
- QVERIFY(str->length() >= idx + len);
+ QVERIFY(str->size() >= idx + len);
setText("remove");
@@ -159,14 +134,14 @@ RemoveCommand::RemoveCommand(QString *str, int idx, int len, QUndoCommand *paren
void RemoveCommand::redo()
{
- QCOMPARE(m_str->mid(m_idx, m_text.length()), m_text);
+ QCOMPARE(m_str->mid(m_idx, m_text.size()), m_text);
- m_str->remove(m_idx, m_text.length());
+ m_str->remove(m_idx, m_text.size());
}
void RemoveCommand::undo()
{
- QVERIFY(m_str->length() >= m_idx);
+ QVERIFY(m_str->size() >= m_idx);
m_str->insert(m_idx, m_text);
}
@@ -197,9 +172,9 @@ void AppendCommand::redo()
void AppendCommand::undo()
{
- QCOMPARE(m_str->mid(m_str->length() - m_text.length()), m_text);
+ QCOMPARE(m_str->mid(m_str->size() - m_text.size()), m_text);
- m_str->truncate(m_str->length() - m_text.length());
+ m_str->truncate(m_str->size() - m_text.size());
}
int AppendCommand::id() const
@@ -349,44 +324,44 @@ static void checkState(QSignalSpy &redoTextChangedSpy,
QCOMPARE(stack.canRedo(), _canRedo);
QCOMPARE(stack.redoText(), QString(_redoText));
if (_indexChanged) {
- QCOMPARE(indexChangedSpy.count(), 1);
+ QCOMPARE(indexChangedSpy.size(), 1);
QCOMPARE(indexChangedSpy.at(0).at(0).toInt(), _index);
indexChangedSpy.clear();
} else {
- QCOMPARE(indexChangedSpy.count(), 0);
+ QCOMPARE(indexChangedSpy.size(), 0);
}
if (_cleanChanged) {
- QCOMPARE(cleanChangedSpy.count(), 1);
+ QCOMPARE(cleanChangedSpy.size(), 1);
QCOMPARE(cleanChangedSpy.at(0).at(0).toBool(), _clean);
cleanChangedSpy.clear();
} else {
- QCOMPARE(cleanChangedSpy.count(), 0);
+ QCOMPARE(cleanChangedSpy.size(), 0);
}
if (_undoChanged) {
- QCOMPARE(canUndoChangedSpy.count(), 1);
+ QCOMPARE(canUndoChangedSpy.size(), 1);
QCOMPARE(canUndoChangedSpy.at(0).at(0).toBool(), _canUndo);
QCOMPARE(undoAction->isEnabled(), _canUndo);
- QCOMPARE(undoTextChangedSpy.count(), 1);
+ QCOMPARE(undoTextChangedSpy.size(), 1);
QCOMPARE(undoTextChangedSpy.at(0).at(0).toString(), QString(_undoText));
QCOMPARE(undoAction->text(), glue("foo", _undoText));
canUndoChangedSpy.clear();
undoTextChangedSpy.clear();
} else {
- QCOMPARE(canUndoChangedSpy.count(), 0);
- QCOMPARE(undoTextChangedSpy.count(), 0);
+ QCOMPARE(canUndoChangedSpy.size(), 0);
+ QCOMPARE(undoTextChangedSpy.size(), 0);
}
if (_redoChanged) {
- QCOMPARE(canRedoChangedSpy.count(), 1);
+ QCOMPARE(canRedoChangedSpy.size(), 1);
QCOMPARE(canRedoChangedSpy.at(0).at(0).toBool(), _canRedo);
QCOMPARE(redoAction->isEnabled(), _canRedo);
- QCOMPARE(redoTextChangedSpy.count(), 1);
+ QCOMPARE(redoTextChangedSpy.size(), 1);
QCOMPARE(redoTextChangedSpy.at(0).at(0).toString(), QString(_redoText));
QCOMPARE(redoAction->text(), glue("bar", _redoText));
canRedoChangedSpy.clear();
redoTextChangedSpy.clear();
} else {
- QCOMPARE(canRedoChangedSpy.count(), 0);
- QCOMPARE(redoTextChangedSpy.count(), 0);
+ QCOMPARE(canRedoChangedSpy.size(), 0);
+ QCOMPARE(redoTextChangedSpy.size(), 0);
}
}