File indexing completed on 2024-05-19 04:01:08

0001 /*
0002     SPDX-FileCopyrightText: 2017 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: MIT
0005 */
0006 
0007 #include <openglinfosource.h>
0008 #include <src/provider/core/openglinfosource_p.h>
0009 
0010 #include <QDebug>
0011 #include <QtTest/qtest.h>
0012 #include <QObject>
0013 #include <QStandardPaths>
0014 
0015 using namespace KUserFeedback;
0016 
0017 class OpenGLInfoSourceTest : public QObject
0018 {
0019     Q_OBJECT
0020 private Q_SLOTS:
0021     void initTestCase()
0022     {
0023         QStandardPaths::setTestModeEnabled(true);
0024     }
0025 
0026     void testOpenGLInfoSource()
0027     {
0028         OpenGLInfoSource src;
0029         const auto m = src.data().toMap();
0030         QVERIFY(m.contains(QLatin1String("type")));
0031         const auto type = m.value(QLatin1String("type")).toString();
0032         QVERIFY(!type.isEmpty());
0033         QVERIFY(type == QLatin1String("GL") || type == QLatin1String("GLES"));
0034 
0035         QVERIFY(m.contains(QLatin1String("vendor")));
0036         QVERIFY(!m.value(QLatin1String("vendor")).toString().isEmpty());
0037         QVERIFY(m.contains(QLatin1String("renderer")));
0038         QVERIFY(!m.value(QLatin1String("renderer")).toString().isEmpty());
0039         QVERIFY(m.contains(QLatin1String("version")));
0040         QVERIFY(!m.value(QLatin1String("version")).toString().isEmpty());
0041         QVERIFY(m.contains(QLatin1String("vendorVersion")));
0042         QVERIFY(!m.value(QLatin1String("vendorVersion")).toString().isEmpty());
0043         QVERIFY(m.contains(QLatin1String("glslVersion")));
0044         QVERIFY(!m.value(QLatin1String("glslVersion")).toString().isEmpty());
0045     }
0046 
0047     void testParseGLVersion_data()
0048     {
0049         QTest::addColumn<QString>("glVersion");
0050         QTest::addColumn<QString>("vendorVersion");
0051         QTest::addColumn<QString>("version");
0052 
0053         QTest::newRow("empty") << QString() << QString() << QString();
0054         QTest::newRow("default") << QStringLiteral("3.0") << QString() << QStringLiteral("3.0");
0055         QTest::newRow("mesa") << QStringLiteral("3.0 Mesa 17.1.1") << QStringLiteral("Mesa 17.1.1") << QStringLiteral("3.0");
0056         QTest::newRow("mesa compat") << QStringLiteral("4.5 (Compatibility Profile) Mesa 19.2.1") << QStringLiteral("Mesa 19.2.1") << QStringLiteral("4.5");
0057         QTest::newRow("nvidia") << QStringLiteral("4.5 NVIDIA 375.26") << QStringLiteral("NVIDIA 375.26") << QStringLiteral("4.5");
0058         QTest::newRow("intel osx") << QStringLiteral("2.1 INTEL-10.25.13") << QStringLiteral("INTEL-10.25.13") << QStringLiteral("2.1");
0059         QTest::newRow("intel win") << QStringLiteral("4.3 - Build 20.19.15.4568") << QStringLiteral("Build 20.19.15.4568") << QStringLiteral("4.3");
0060     }
0061 
0062     void testParseGLVersion()
0063     {
0064         QFETCH(QString, glVersion);
0065         QFETCH(QString, vendorVersion);
0066         QFETCH(QString, version);
0067 
0068         QVariantMap m;
0069         OpenGLInfoSourcePrivate::parseGLVersion(glVersion.toUtf8().constData(), m);
0070         QCOMPARE(m.value(QLatin1String("vendorVersion")).toString(), vendorVersion);
0071         QCOMPARE(m.value(QLatin1String("version")).toString(), version);
0072 
0073         // don't overwrite version if we could correctly determine this by other means already
0074         m.clear();
0075         m.insert(QStringLiteral("version"), QStringLiteral("12345.6789"));
0076         OpenGLInfoSourcePrivate::parseGLVersion(glVersion.toUtf8().constData(), m);
0077         QCOMPARE(m.value(QLatin1String("vendorVersion")).toString(), vendorVersion);
0078         QCOMPARE(m.value(QLatin1String("version")).toString(), QLatin1String("12345.6789"));
0079     }
0080 
0081     void testParseGLESVersion_data()
0082     {
0083         QTest::addColumn<QString>("glVersion");
0084         QTest::addColumn<QString>("version");
0085         QTest::addColumn<QString>("vendorVersion");
0086 
0087         QTest::newRow("empty") << QString() << QStringLiteral("unknown") << QString();
0088         QTest::newRow("invalid") << QStringLiteral("OpenGL 2.0") << QStringLiteral("unknown") << QStringLiteral("OpenGL 2.0");
0089         QTest::newRow("default") << QStringLiteral("OpenGL ES 2.0") << QStringLiteral("2.0") << QString();
0090         QTest::newRow("angle") << QStringLiteral("OpenGL ES 2.0 (ANGLE 2.1.0.8613f4946861)") << QStringLiteral("2.0") << QStringLiteral("ANGLE 2.1.0.8613f4946861");
0091     }
0092 
0093     void testParseGLESVersion()
0094     {
0095         QFETCH(QString, glVersion);
0096         QFETCH(QString, version);
0097         QFETCH(QString, vendorVersion);
0098 
0099         QVariantMap m;
0100         OpenGLInfoSourcePrivate::parseGLESVersion(glVersion.toUtf8().constData(), m);
0101         QCOMPARE(m.value(QLatin1String("version")).toString(), version);
0102         QCOMPARE(m.value(QLatin1String("vendorVersion")).toString(), vendorVersion);
0103    }
0104 
0105     void testParseGLSLVersion_data()
0106     {
0107         QTest::addColumn<QString>("input");
0108         QTest::addColumn<QString>("glslVersion");
0109 
0110         QTest::newRow("empty") << QString() << QString();
0111         QTest::newRow("default") << QStringLiteral("1.30") << QStringLiteral("1.30");
0112         QTest::newRow("nvidia") << QStringLiteral("4.50 NVIDIA") << QStringLiteral("4.50");
0113     }
0114 
0115     void testParseGLSLVersion()
0116     {
0117         QFETCH(QString, input);
0118         QFETCH(QString, glslVersion);
0119 
0120         QVariantMap m;
0121         OpenGLInfoSourcePrivate::parseGLSLVersion(input.toUtf8().constData(), m);
0122         QCOMPARE(m.value(QLatin1String("glslVersion")).toString(), glslVersion);
0123    }
0124 
0125     void testParseESGLSLVersion_data()
0126     {
0127         QTest::addColumn<QString>("input");
0128         QTest::addColumn<QString>("glslVersion");
0129 
0130         QTest::newRow("empty") << QString() << QString();
0131         QTest::newRow("invalid") << QStringLiteral("GLSL 1.00") << QStringLiteral("GLSL 1.00");
0132         QTest::newRow("default") << QStringLiteral("OpenGL ES GLSL ES 1.00") << QStringLiteral("1.00");
0133         QTest::newRow("angle") << QStringLiteral("OpenGL ES GLSL ES 1.00 (ANGLE 2.1.0.8613f4946861)") << QStringLiteral("1.00");
0134     }
0135 
0136     void testParseESGLSLVersion()
0137     {
0138         QFETCH(QString, input);
0139         QFETCH(QString, glslVersion);
0140 
0141         QVariantMap m;
0142         OpenGLInfoSourcePrivate::parseESGLSLVersion(input.toUtf8().constData(), m);
0143         QCOMPARE(m.value(QLatin1String("glslVersion")).toString(), glslVersion);
0144    }
0145 
0146    void testNormalizeVendor_data()
0147    {
0148        QTest::addColumn<QString>("input");
0149        QTest::addColumn<QString>("vendor");
0150 
0151        QTest::newRow("empty") << QString() << QString();
0152        QTest::newRow("intel window") << QStringLiteral("Intel") << QStringLiteral("Intel");
0153        QTest::newRow("intel linux") << QStringLiteral("Intel Open Source Technology Center") << QStringLiteral("Intel");
0154        QTest::newRow("intel macOS") << QStringLiteral("Intel Inc.") << QStringLiteral("Intel");
0155        QTest::newRow("nvidia") << QStringLiteral("NVIDIA Corporation") << QStringLiteral("NVIDIA Corporation");
0156    }
0157 
0158    void testNormalizeVendor()
0159    {
0160        QFETCH(QString, input);
0161        QFETCH(QString, vendor);
0162 
0163        QCOMPARE(OpenGLInfoSourcePrivate::normalizeVendor(input.toLocal8Bit().constData()), vendor);
0164    }
0165 
0166    void testNormalizeRenderer_data()
0167    {
0168        QTest::addColumn<QString>("input");
0169        QTest::addColumn<QString>("renderer");
0170 
0171        QTest::newRow("empty") << QString() << QString();
0172        QTest::newRow("intel mesa") << QStringLiteral("Mesa DRI Intel(R) HD Graphics 520 (Skylake GT2)") << QStringLiteral("HD Graphics 520");
0173        QTest::newRow("intel mesa 2") << QStringLiteral("Mesa Intel HD Graphics 530 (Skylake GT2)") << QStringLiteral("HD Graphics 530");
0174        QTest::newRow("intel mesa 3") << QStringLiteral("Mesa Intel Iris Plus Graphics 640 (Kaby Lake GT3e) (KBL GT3)") << QStringLiteral("Iris Plus Graphics 640");
0175        QTest::newRow("intel macOS") << QStringLiteral("Intel Iris Pro OpenGL Engine") << QStringLiteral("Iris Pro");
0176        QTest::newRow("intel windows") << QStringLiteral("Intel(R) HD Graphics 4600") << QStringLiteral("HD Graphics 4600");
0177        QTest::newRow("nvidia") << QStringLiteral("GeForce GTX 1060 6GB/PCIe/SSE2") << QStringLiteral("GeForce GTX 1060 6GB/PCIe/SSE2");
0178        QTest::newRow("nvidia macos") << QStringLiteral("NVIDIA GeForce GT 750M OpenGL Engine") << QStringLiteral("GeForce GT 750M");
0179        QTest::newRow("angle") << QStringLiteral("ANGLE (VirtualBox Graphics Adapter for Windows 8+ Direct3D9Ex vs_3_0 ps_3_0)") << QStringLiteral("ANGLE");
0180        QTest::newRow("gallium") << QStringLiteral("Gallium 0.4 on AMD BARTS (DRM 2.49.0 / 4.11.1-1-default, LLVM 4.0.0)") << QStringLiteral("Gallium 0.4 on AMD BARTS");
0181        QTest::newRow("AMD 1") << QStringLiteral("AMD BARTS (DRM 2.50.0 / 4.17.2-1-default, LLVM 6.0.0)") << QStringLiteral("AMD BARTS");
0182        QTest::newRow("AMD 2") << QStringLiteral("AMD Radeon (TM) RX 480 Graphics (POLARIS10 / DRM 3.19.0 / 4.14.50-gentoo, LLVM 6.0.0)") << QStringLiteral("AMD Radeon RX 480 Graphics");
0183        QTest::newRow("Radeon") << QStringLiteral("Radeon RX 590 Series (POLARIS10, DRM 3.35.0, 5.4.13-zen1-1-zen, LLVM 9.0.1)") << QStringLiteral("Radeon RX 590 Series");
0184        QTest::newRow("llvmpipe") << QStringLiteral("llvmpipe (LLVM 9.0, 128 bits)") << QStringLiteral("llvmpipe");
0185    }
0186 
0187    void testNormalizeRenderer()
0188    {
0189        QFETCH(QString, input);
0190        QFETCH(QString, renderer);
0191 
0192        QCOMPARE(OpenGLInfoSourcePrivate::normalizeRenderer(input.toLocal8Bit().constData()), renderer);
0193    }
0194 
0195 };
0196 
0197 QTEST_MAIN(OpenGLInfoSourceTest)
0198 
0199 #include "openglinfosourcetest.moc"