Changeset View
Changeset View
Standalone View
Standalone View
src/tests/qt-promise-handler-test.cpp
| /* | /* | ||||
| * This file is part of kazv. | * This file is part of kazv. | ||||
| * SPDX-FileCopyrightText: 2020-2021 Tusooa Zhu <tusooa@kazv.moe> | * SPDX-FileCopyrightText: 2020-2021 Tusooa Zhu <tusooa@kazv.moe> | ||||
| * SPDX-License-Identifier: AGPL-3.0-or-later | * SPDX-License-Identifier: AGPL-3.0-or-later | ||||
| */ | */ | ||||
| #include <libkazv-config.hpp> | #include <libkazv-config.hpp> | ||||
| #include <memory> | #include <memory> | ||||
| #include <vector> | #include <vector> | ||||
| #include <QTimer> | #include <QTimer> | ||||
| #include "promise-interface.hpp" | |||||
| #include "qt-promise-handler-test.hpp" | #include "qt-promise-handler-test.hpp" | ||||
| #include "qt-promise-handler.hpp" | #include "qt-promise-handler.hpp" | ||||
| namespace | namespace | ||||
| { | { | ||||
| struct MockDataStruct | struct MockDataStruct | ||||
| { | { | ||||
| ▲ Show 20 Lines • Show All 105 Lines • ▼ Show 20 Lines | QObject::connect(obj, &QObject::destroyed, | ||||
| qDebug() << "QObject::destroyed()"; | qDebug() << "QObject::destroyed()"; | ||||
| }); | }); | ||||
| QTimer::singleShot(2000, this, [&loop]() { | QTimer::singleShot(2000, this, [&loop]() { | ||||
| qDebug() << "stop loop"; | qDebug() << "stop loop"; | ||||
| loop.quit(); | loop.quit(); | ||||
| }); | }); | ||||
| loop.exec(); | |||||
| } | |||||
| void QtPromiseHandlerTest::testSingleTypePromise() | |||||
| { | |||||
| QEventLoop loop; | |||||
| QObject *obj = new QObject(&loop); | |||||
| auto ph = Kazv::SingleTypePromiseInterface<int>(QtPromiseHandler(std::ref(*obj))); | |||||
| std::vector<int> v; | |||||
| auto p1 = ph.create([&v](auto resolve) { | |||||
| qDebug() << "p1"; | |||||
| v.push_back(1); | |||||
| resolve(2); | |||||
| }); | |||||
| auto p2 = p1.then([&v, &ph](int val) { | |||||
| qDebug() << "p2"; | |||||
| v.push_back(val); | |||||
| return ph.createResolved(0) | |||||
| .then([&ph](int) { | |||||
| qDebug() << "within p2"; | |||||
| return ph.createResolved(3); | |||||
| }); | |||||
| }); | |||||
| auto p3 = p2.then([&v, &ph](int val) { | |||||
| qDebug() << "p3"; | |||||
| v.push_back(val); | |||||
| return ph.createResolved(-1); | |||||
| }); | |||||
| auto p4 = p3.then([](int val) { | |||||
| qDebug() << "p4" << val; | |||||
| [=] { QVERIFY(val == -1); }(); | |||||
| return 5; | |||||
| }); | |||||
| auto p5 = p4.then([obj, &loop](int val) { | |||||
| qDebug() << "p5" << val; | |||||
| [=] { QVERIFY(val == 5); }(); | |||||
| obj->deleteLater(); | |||||
| loop.quit(); | |||||
| return 0; | |||||
| }); | |||||
| loop.exec(); | |||||
| QVERIFY((v == std::vector<int>{ 1, 2, 3 })); | |||||
| } | |||||
| void QtPromiseHandlerTest::testResolveToPromise() | |||||
| { | |||||
| QEventLoop loop; | |||||
| QObject *obj = new QObject(&loop); | |||||
| auto ph = Kazv::SingleTypePromiseInterface<int>(QtPromiseHandler(std::ref(*obj))); | |||||
| auto p1 = ph.createResolveToPromise([&ph](auto resolve) { | |||||
| qDebug() << "p1"; | |||||
| resolve(ph.createResolved(1) | |||||
| .then([&ph](auto) { | |||||
| return ph.createResolved(2); | |||||
| })); | |||||
| }); | |||||
| p1.then([obj, &loop](int val) { | |||||
| [=] { QVERIFY(val == 2); }(); | |||||
| obj->deleteLater(); | |||||
| loop.quit(); | |||||
| return 0; | |||||
| }); | |||||
| loop.exec(); | loop.exec(); | ||||
| } | } | ||||
| QTEST_MAIN(QtPromiseHandlerTest) | QTEST_MAIN(QtPromiseHandlerTest) | ||||