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"