File indexing completed on 2024-12-08 12:44:37

0001 /*
0002     SPDX-FileCopyrightText: 2019 Daniel Vrátil <dvratil@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 */
0006 
0007 #include <QObject>
0008 #include <QTest>
0009 
0010 #define KASYNC_TEST
0011 
0012 #include "../src/continuations_p.h"
0013 
0014 namespace KAsync
0015 {
0016 // Simplified definition of KAsync::Job so we can return it from
0017 // the test continuations
0018 template<typename T, typename ... U>
0019 class Job {};
0020 }
0021 
0022 Q_DECLARE_METATYPE(std::function<bool()>)
0023 
0024 #define STATIC_COMPARE(actual, expected) \
0025     static_assert((actual) == (expected), "Check failed: " #actual " == " #expected)
0026 
0027 class ContinuationHolderTest : public QObject
0028 {
0029     Q_OBJECT
0030 
0031     using TestedHolder = KAsync::Private::ContinuationHolder<void>;
0032     template<typename Continuation, typename T>
0033     void testContinuation(T &&func, int index)
0034     {
0035 
0036         #define CHECK(Cont) \
0037             QCOMPARE(KAsync::Private::continuationIs<KAsync::Cont<void>>(holder), (std::is_same<Continuation, KAsync::Cont<void>>::value))
0038 
0039         TestedHolder holder(Continuation(std::move(func)));
0040         QCOMPARE(holder.mIndex, index);
0041         CHECK(SyncContinuation);
0042         CHECK(SyncErrorContinuation);
0043         CHECK(AsyncContinuation);
0044         CHECK(AsyncErrorContinuation);
0045         CHECK(JobContinuation);
0046         CHECK(JobErrorContinuation);
0047 
0048         //KAsync::Private::continuation_get<Continuation>(holder)();
0049     }
0050 
0051 private Q_SLOTS:
0052     void testTupleMax()
0053     {
0054         using TestHolder = KAsync::Private::ContinuationHolder<int>;
0055         using Tuple = std::tuple<uint8_t, uint32_t, uint16_t>;
0056 
0057         STATIC_COMPARE(TestHolder::tuple_max<Tuple>::size, sizeof(uint32_t));
0058         STATIC_COMPARE(TestHolder::tuple_max<Tuple>::alignment, alignof(uint32_t));
0059     }
0060 
0061     void testTupleIndex()
0062     {
0063         using TestHolder = KAsync::Private::ContinuationHolder<int>;
0064         using Tuple = std::tuple<uint8_t, uint32_t, uint16_t>;
0065 
0066         STATIC_COMPARE((TestHolder::tuple_index<uint8_t, Tuple>::value), 0);
0067         STATIC_COMPARE((TestHolder::tuple_index<uint32_t, Tuple>::value), 1);
0068         STATIC_COMPARE((TestHolder::tuple_index<uint16_t, Tuple>::value), 2);
0069     }
0070 
0071     void testContinuationHolder_data()
0072     {
0073         QTest::addColumn<std::function<bool()>>("func");
0074 
0075 #define ADD_ROW(name, lambda, index) \
0076         QTest::newRow(#name) << std::function<bool()>([this]() { \
0077             bool called = true; \
0078             testContinuation<KAsync::name<void>>(lambda, index); \
0079             return called; \
0080         });
0081 
0082         ADD_ROW(AsyncContinuation, [&called](KAsync::Future<void> &) mutable { called = true; }, 0);
0083         ADD_ROW(AsyncErrorContinuation, [&called](const KAsync::Error &, KAsync::Future<void> &) mutable { called = true; }, 1);
0084 ADD_ROW(SyncContinuation, [&called]() mutable { called = true; }, 2)
0085         ADD_ROW(SyncErrorContinuation, [&called](const KAsync::Error &) mutable { called = true; }, 3);
0086         ADD_ROW(JobContinuation, [&called]() mutable { called = true; return KAsync::Job<void>(); }, 4);
0087         ADD_ROW(JobErrorContinuation, [&called](const KAsync::Error &) mutable { called = true; return KAsync::Job<void>(); }, 5);
0088     }
0089 
0090     void testContinuationHolder()
0091     {
0092         QFETCH(std::function<bool()>, func);
0093 
0094         QVERIFY(func());
0095     }
0096 };
0097 
0098 QTEST_GUILESS_MAIN(ContinuationHolderTest)
0099 
0100 #include "continuationstest.moc"
0101