File indexing completed on 2024-04-14 15:37:31

0001 /*
0002  *  SPDX-FileCopyrightText: 2018 Frederik Gladhorn <gladhorn@kde.org>
0003  *
0004  *  SPDX-License-Identifier: LGPL-2.1-or-later
0005  */
0006 
0007 #include <QCoreApplication>
0008 #include <QObject>
0009 #include <QtTest>
0010 
0011 #include "../src/edid.h"
0012 
0013 using namespace KScreen;
0014 
0015 class TestEdid : public QObject
0016 {
0017     Q_OBJECT
0018 
0019 private Q_SLOTS:
0020     void testInvalid();
0021     void testEdidParser_data();
0022     void testEdidParser();
0023 };
0024 
0025 void TestEdid::testInvalid()
0026 {
0027     QScopedPointer<Edid> e(new Edid());
0028     QCOMPARE(e->isValid(), false);
0029     QCOMPARE(e->name(), QString());
0030 
0031     QScopedPointer<Edid> e2(e->clone());
0032     QCOMPARE(e2->isValid(), false);
0033     QCOMPARE(e2->name(), QString());
0034 
0035     QScopedPointer<Edid> e3(new Edid("some random data"));
0036     QCOMPARE(e3->isValid(), false);
0037 }
0038 
0039 void TestEdid::testEdidParser_data()
0040 {
0041     // The raw edid data
0042     QTest::addColumn<QByteArray>("raw_edid");
0043     QTest::addColumn<QString>("deviceId");
0044     QTest::addColumn<QString>("name");
0045     QTest::addColumn<QString>("pnpId");
0046     // List of potential vendor names, this depends on the availablility
0047     // of pnp.ids, otherwise it will be a three letter abbreviation.
0048     QTest::addColumn<QStringList>("vendor");
0049     QTest::addColumn<QString>("serial");
0050     QTest::addColumn<QString>("eisaId");
0051     QTest::addColumn<QString>("hash");
0052     QTest::addColumn<uint>("width");
0053     QTest::addColumn<uint>("height");
0054     QTest::addColumn<qreal>("gamma");
0055 
0056     QTest::addColumn<QQuaternion>("red");
0057     QTest::addColumn<QQuaternion>("green");
0058     QTest::addColumn<QQuaternion>("blue");
0059     QTest::addColumn<QQuaternion>("white");
0060     // clang-format off
0061     QTest::addRow("cor")
0062         << QByteArray::fromBase64("AP///////wAN8iw0AAAAABwVAQOAHRB4CoPVlFdSjCccUFQAAAABAQEBAQEBAQEBAQEBAQEBEhtWWlAAGTAwIDYAJaQQAAAYEhtWWlAAGTAwIDYAJaQQAAAYAAAA/gBBVU8KICAgICAgICAgAAAA/gBCMTMzWFcwMyBWNCAKAIc=")
0063         << QStringLiteral("xrandr-Corollary Inc")
0064         << QStringLiteral("")
0065         << QStringLiteral("COR")
0066         << QStringList({QStringLiteral("COR"), QStringLiteral("Corollary Inc")})
0067         << QStringLiteral("")
0068         << QStringLiteral("B133XW03 V4")
0069         << QStringLiteral("82266089b3f9da3a8c48de1ec81b09e1")
0070         << 29U << 16U << 2.2
0071         << QQuaternion(1, QVector3D(0.580078, 0.339844, 0))
0072         << QQuaternion(1, QVector3D(0.320313, 0.549805, 0))
0073         << QQuaternion(1, QVector3D(0.155273, 0.110352, 0))
0074         << QQuaternion(1, QVector3D(0.313477, 0.329102, 0));
0075 
0076     QTest::addRow("dell")
0077         << QByteArray::fromBase64("AP///////wAQrBbwTExLQQ4WAQOANCB46h7Frk80sSYOUFSlSwCBgKlA0QBxTwEBAQEBAQEBKDyAoHCwI0AwIDYABkQhAAAaAAAA/wBGNTI1TTI0NUFLTEwKAAAA/ABERUxMIFUyNDEwCiAgAAAA/QA4TB5REQAKICAgICAgAToCAynxUJAFBAMCBxYBHxITFCAVEQYjCQcHZwMMABAAOC2DAQAA4wUDAQI6gBhxOC1AWCxFAAZEIQAAHgEdgBhxHBYgWCwlAAZEIQAAngEdAHJR0B4gbihVAAZEIQAAHowK0Iog4C0QED6WAAZEIQAAGAAAAAAAAAAAAAAAAAAAPg==")
0078         << QStringLiteral("xrandr-Dell Inc.-DELL U2410-F525M245AKLL")
0079         << QStringLiteral("DELL U2410")
0080         << QStringLiteral("DEL")
0081         << QStringList({QStringLiteral("DEL"), QStringLiteral("Dell Inc.")})
0082         << QStringLiteral("F525M245AKLL")
0083         << QStringLiteral("")
0084         << QStringLiteral("be55eeb5fcc1e775f321c1ae3aa02ef0")
0085         << 52U << 32U << 2.2
0086         << QQuaternion(1, QVector3D(0.679688, 0.308594, 0))
0087         << QQuaternion(1, QVector3D(0.206055, 0.693359, 0))
0088         << QQuaternion(1, QVector3D(0.151367, 0.0546875, 0))
0089         << QQuaternion(1, QVector3D(0.313477, 0.329102, 0));
0090 
0091     QTest::addRow("samsung") << QByteArray::fromBase64("AP///////wBMLcMFMzJGRQkUAQMOMx14Ku6Ro1RMmSYPUFQjCACBAIFAgYCVAKlAswABAQEBAjqAGHE4LUBYLEUA/h8RAAAeAAAA/QA4PB5REQAKICAgICAgAAAA/ABTeW5jTWFzdGVyCiAgAAAA/wBIOU1aMzAyMTk2CiAgAC4=")
0092         << QStringLiteral("xrandr-Samsung Electric Company-SyncMaster-H9MZ302196")
0093         << QStringLiteral("SyncMaster")
0094         << QStringLiteral("SAM")
0095         << QStringList({QStringLiteral("SAM"), QStringLiteral("Samsung Electric Company")})
0096         << QStringLiteral("H9MZ302196")
0097         << QStringLiteral("")
0098         << QStringLiteral("9384061b2b87ad193f841e07d60e9e1a")
0099         << 51U << 29U << 2.2
0100         << QQuaternion(1, QVector3D(0.639648, 0.328125, 0))
0101         << QQuaternion(1, QVector3D(0.299805, 0.599609, 0))
0102         << QQuaternion(1, QVector3D(0.150391, 0.0595703, 0))
0103         << QQuaternion(1, QVector3D(0.3125, 0.329102, 0));
0104 
0105     QTest::newRow("sharp")
0106         << QByteArray::fromBase64("AP///////wBNEEoUAAAAAB4ZAQSlHRF4Dt5Qo1RMmSYPUFQAAAABAQEBAQEBAQEBAQEBAQEBzZGAoMAINHAwIDUAJqUQAAAYpHSAoMAINHAwIDUAJqUQAAAYAAAA/gBSWE40OYFMUTEzM1oxAAAAAAACQQMoABIAAAsBCiAgAMw=")
0107         << QStringLiteral("xrandr-Sharp Corporation")
0108         << QString() // unsure why, this screen reports no name
0109         << QStringLiteral("SHP")
0110         << QStringList({QStringLiteral("SHP"), QStringLiteral("Sharp Corporation")})
0111         << QStringLiteral("")
0112         << QStringLiteral("RXN49-LQ133Z1")
0113         << QStringLiteral("3627c3534e4c82871967b57237bf5b83")
0114         << 29U << 17U << 2.2
0115         << QQuaternion(1, QVector3D(0.639648, 0.328125, 0))
0116         << QQuaternion(1, QVector3D(0.299805, 0.599609, 0))
0117         << QQuaternion(1, QVector3D(0.149414, 0.0595703, 0))
0118         << QQuaternion(1, QVector3D(0.3125, 0.328125, 0));
0119     // clang-format on
0120 }
0121 
0122 void TestEdid::testEdidParser()
0123 {
0124     QFETCH(QByteArray, raw_edid);
0125     QFETCH(QString, deviceId);
0126     QFETCH(QString, name);
0127     QFETCH(QString, pnpId);
0128     QFETCH(QStringList, vendor);
0129     QFETCH(QString, serial);
0130     QFETCH(QString, eisaId);
0131     QFETCH(QString, hash);
0132     QFETCH(uint, width);
0133     QFETCH(uint, height);
0134     QFETCH(qreal, gamma);
0135     QFETCH(QQuaternion, red);
0136     QFETCH(QQuaternion, green);
0137     QFETCH(QQuaternion, blue);
0138     QFETCH(QQuaternion, white);
0139 
0140     QScopedPointer<Edid> e(new Edid(raw_edid));
0141     QCOMPARE(e->isValid(), true);
0142 
0143     // FIXME: we hard-code all deviceIds as xrandr-something, that makes no sense
0144     QCOMPARE(e->deviceId(), deviceId);
0145     QCOMPARE(e->name(), name);
0146     QCOMPARE(e->pnpId(), pnpId);
0147     // FIXME: needs to return at least the short ID
0148     //    QVERIFY2(vendor.contains(e->vendor()), qPrintable(QString::fromLatin1("%1 not in list").arg(e->vendor())));
0149     QCOMPARE(e->serial(), serial);
0150     QCOMPARE(e->eisaId(), eisaId);
0151     QCOMPARE(e->hash(), hash);
0152     QCOMPARE(e->width(), width);
0153     QCOMPARE(e->height(), height);
0154     QCOMPARE(e->gamma(), gamma);
0155 
0156     QVERIFY(qFuzzyCompare(e->red(), red));
0157     QVERIFY(qFuzzyCompare(e->green(), green));
0158     QVERIFY(qFuzzyCompare(e->blue(), blue));
0159     QVERIFY(qFuzzyCompare(e->white(), white));
0160 }
0161 
0162 QTEST_GUILESS_MAIN(TestEdid)
0163 
0164 #include "testedid.moc"