File indexing completed on 2024-04-21 03:58:29
0001 /* 0002 * SPDX-FileCopyrightText: 2009 Petri Damstén <damu@iki.fi> 0003 * 0004 * SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "convertertest.h" 0008 #include <QList> 0009 #include <QSignalSpy> 0010 #include <QStandardPaths> 0011 #include <QThread> 0012 #include <currency_p.h> 0013 #include <kunitconversion/unitcategory.h> 0014 0015 using namespace KUnitConversion; 0016 using namespace std::chrono_literals; 0017 0018 void ConverterTest::initTestCase() 0019 { 0020 QStandardPaths::setTestModeEnabled(true); 0021 0022 // Remove currency cache to force a download 0023 const QString cache = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QStringLiteral("/libkunitconversion/currency.xml"); 0024 QFile::remove(cache); 0025 } 0026 0027 void ConverterTest::testCategory() 0028 { 0029 Converter c; 0030 QCOMPARE(c.categoryForUnit(QStringLiteral("km")).id(), LengthCategory); 0031 QCOMPARE(c.category(QStringLiteral("Length")).id(), LengthCategory); 0032 QCOMPARE(c.category(LengthCategory).name(), QStringLiteral("Length")); 0033 QVERIFY(c.categories().size() > 0); 0034 } 0035 0036 void ConverterTest::testUnits() 0037 { 0038 Converter c; 0039 QCOMPARE(c.unit(QStringLiteral("km")).symbol(), QStringLiteral("km")); 0040 QCOMPARE(c.unit(Kilogram).symbol(), QStringLiteral("kg")); 0041 } 0042 0043 void ConverterTest::testConvert() 0044 { 0045 Converter c; 0046 Value v = c.convert(Value(3.14, Kilometer), QStringLiteral("m")); 0047 QCOMPARE(v.number(), 3140.0); 0048 v = c.convert(v, QStringLiteral("cm")); 0049 QCOMPARE(v.number(), 314000.0); 0050 v = c.convert(v, c.category(LengthCategory).defaultUnit()); 0051 QCOMPARE(v.number(), 3140.0); 0052 0053 v = Value(8.0, LitersPer100Kilometers); 0054 v = c.convert(v, QStringLiteral("mpg")); 0055 QCOMPARE(v.number(), 29.401875); 0056 v = c.convert(v, QStringLiteral("mpg (imperial)")); 0057 QCOMPARE(v.number(), 35.310125); 0058 v = c.convert(v, QStringLiteral("kmpl")); 0059 QCOMPARE(v.number(), 12.5); 0060 v = c.convert(v, QStringLiteral("l/100 km")); 0061 QCOMPARE(v.number(), 8.0); 0062 0063 v = Value(33.0, MilePerUsGallon); 0064 v = c.convert(v, QStringLiteral("mpg (imperial)")); 0065 QCOMPARE(v.number(), 39.63128627); 0066 v = c.convert(v, QStringLiteral("kmpl")); 0067 QCOMPARE(v.number(), 14.0297174925); 0068 v = c.convert(v, QStringLiteral("l/100 km")); 0069 QCOMPARE(v.number(), 7.12772727273); 0070 v = c.convert(v, QStringLiteral("mpg")); 0071 QCOMPARE(v.number(), 33.0); 0072 } 0073 0074 void ConverterTest::testInvalid() 0075 { 0076 Converter c; 0077 QCOMPARE(c.categoryForUnit(QStringLiteral("does not exist")).id(), InvalidCategory); 0078 QCOMPARE(c.unit(QStringLiteral("does not exist")).symbol(), QString()); 0079 QCOMPARE(c.category(QStringLiteral("does not exist")).name(), QString()); 0080 } 0081 0082 class CurrencyTestThread : public QThread 0083 { 0084 public: 0085 CurrencyTestThread(Converter &c) 0086 : m_c(c) 0087 { 0088 } 0089 void run() override 0090 { 0091 Value input = Value(1000, Eur); 0092 Value v = m_c.convert(input, QStringLiteral("$")); 0093 number = v.number(); 0094 } 0095 int number; 0096 Converter &m_c; 0097 }; 0098 0099 void ConverterTest::testCurrency() 0100 { 0101 Converter c; 0102 auto job = c.category(CurrencyCategory).syncConversionTable(); 0103 QSignalSpy finishedSpy(job, &UpdateJob::finished); 0104 finishedSpy.wait(); 0105 0106 // 2 threads is enough for tsan to notice races, let's not hammer the website with more concurrent requests 0107 const int numThreads = 2; 0108 QList<CurrencyTestThread *> threads; 0109 threads.resize(numThreads); 0110 for (int i = 0; i < numThreads; ++i) { 0111 threads[i] = new CurrencyTestThread(c); 0112 } 0113 for (int i = 0; i < numThreads; ++i) { 0114 threads[i]->start(); 0115 } 0116 for (int i = 0; i < numThreads; ++i) { 0117 threads[i]->wait(); 0118 QVERIFY(threads.at(i)->number > 100); 0119 } 0120 qDeleteAll(threads); 0121 } 0122 0123 QTEST_MAIN(ConverterTest) 0124 0125 #include "moc_convertertest.cpp"