danvratil / qcoro

C++ Coroutines for Qt
https://qcoro.dvratil.cz
MIT License
331 stars 53 forks source link

Make the coroutine-friendly versions of QTest macros public #143

Closed danvratil closed 1 year ago

danvratil commented 1 year ago

QCoro has a re-defined some of the common QTest macros (QCOMPARE, QVERIFY, ...) to a be coroutine-friendly (i.e. using co_return instead of return) in its own test suite. This might be useful for our users who want to test their QCoro-based code. With a little bit of polishing we could have a QCoroTest module with those macros as part of public API

malachib commented 1 year ago

On this note, can one use QCoro in general with QTest? Specifically slumming it and doing waitFor? So far I can't do it since waitFor (and I wager QCoro::Task) needs a QApplication, and it's mysterious to me how to satisfy that requirement

danvratil commented 1 year ago

QTest actually requires QApplication (that's what's hidden inside the QTEST_(GUILESS)_MAIN macro), so QCoro coroutines work very well with QTest. You can use waitFor() just fine, it waits with a nested event loop, so the test doesn't get stuck or anything. You can check the test folder in this repo, although the infrastructure here is slightly more complex than just waitFor.

What you need (and what this ticket is about) are coroutine-compatible assertions, i.e. you can't use QVERIFY inside a coroutine, because the macro calls return internally. I have most of the basic QTest assertions reimplemented in coroutine-compatible way in QCoro (= they use co_return instead of return, see here: https://github.com/danvratil/qcoro/blob/main/tests/testlibs/testmacros.h for the list. This ticket is basically about making that header more complete and public :)

malachib commented 1 year ago

@danvratil Thank you for the clarifications. I was overthinking my problem to the max. Keep up the good work!