File indexing completed on 2024-12-08 04:19:21
0001 // SPDX-FileCopyrightText: Lukas Sommer <sommerluk@gmail.com> 0002 // SPDX-License-Identifier: BSD-2-Clause OR MIT 0003 0004 // First included header is the public header of the class we are testing; 0005 // this forces the header to be self-contained. 0006 #include "helperconversion.h" 0007 0008 #include "lchdouble.h" 0009 #include <cmath> 0010 #include <lcms2.h> 0011 #include <qglobal.h> 0012 #include <qmetatype.h> 0013 #include <qobject.h> 0014 #include <qtest.h> 0015 #include <qtestcase.h> 0016 0017 #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) 0018 #include <qtmetamacros.h> 0019 #else 0020 #include <qobjectdefs.h> 0021 #include <qstring.h> 0022 #endif 0023 0024 Q_DECLARE_METATYPE(cmsCIELab) 0025 0026 namespace PerceptualColor 0027 { 0028 0029 class TestHelperConversion : public QObject 0030 { 0031 Q_OBJECT 0032 0033 public: 0034 explicit TestHelperConversion(QObject *parent = nullptr) 0035 : QObject(parent) 0036 { 0037 } 0038 0039 private Q_SLOTS: 0040 0041 void initTestCase() 0042 { 0043 // Called before the first test function is executed 0044 } 0045 0046 void cleanupTestCase() 0047 { 0048 // Called after the last test function was executed 0049 } 0050 0051 void init() 0052 { 0053 // Called before each test function is executed 0054 } 0055 void cleanup() 0056 { 0057 // Called after every test function 0058 } 0059 0060 void testLchConvertion() 0061 { 0062 // Check if round-trips work fine. 0063 // One sense 0064 cmsCIELCh startValue; 0065 startValue.L = 50.1; 0066 startValue.C = 20.1; 0067 startValue.h = 80.1; 0068 QCOMPARE(toCmsLch(toLchDouble(startValue)).L, startValue.L); 0069 QCOMPARE(toCmsLch(toLchDouble(startValue)).C, startValue.C); 0070 QCOMPARE(toCmsLch(toLchDouble(startValue)).h, startValue.h); 0071 // The other sense 0072 LchDouble startValue2; 0073 startValue2.l = 50.1; 0074 startValue2.c = 20.1; 0075 startValue2.h = 80.1; 0076 QCOMPARE(toLchDouble(toCmsLch(startValue2)).l, startValue2.l); 0077 QCOMPARE(toLchDouble(toCmsLch(startValue2)).c, startValue2.c); 0078 QCOMPARE(toLchDouble(toCmsLch(startValue2)).h, startValue2.h); 0079 } 0080 0081 void testFromXyzToOklabCubeRoot() 0082 { 0083 // The function fromXyzToOklab relies on the assumption that 0084 // std::cbrt() returns negative results for negative radicands, 0085 // and not simply “nan”. As std::cbrt() isn’t constexpr, we cannot 0086 // use a static assert within the function. Therefore, we have this 0087 // unit test: 0088 const auto actual = std::cbrt(-27); 0089 const decltype(actual) expected = -3; 0090 QCOMPARE(actual, expected); 0091 } 0092 }; 0093 0094 } // namespace PerceptualColor 0095 0096 QTEST_MAIN(PerceptualColor::TestHelperConversion) 0097 // The following “include” is necessary because we do not use a header file: 0098 #include "testhelperconversion.moc"