File indexing completed on 2024-04-28 15:34:47

0001 /* -*- C++ -*-
0002     Helper class for unit tests.
0003 
0004     SPDX-FileCopyrightText: 2005-2013 Mirko Boehm <mirko@kde.org>
0005 
0006     SPDX-License-Identifier: LGPL-2.0-or-later
0007 */
0008 
0009 #ifndef APPENDCHARACTER_JOB
0010 #define APPENDCHARACTER_JOB
0011 
0012 #include <QMutex>
0013 #include <QObject>
0014 
0015 #include <ThreadWeaver/DebuggingAids>
0016 #include <ThreadWeaver/Job>
0017 #include <ThreadWeaver/JobPointer>
0018 
0019 // define in test binary:
0020 
0021 extern QMutex s_GlobalMutex;
0022 
0023 class AppendCharacterJob : public ThreadWeaver::Job
0024 {
0025 public:
0026     AppendCharacterJob(QChar c = QChar(), QString *stringref = nullptr)
0027         : ThreadWeaver::Job()
0028     {
0029         setValues(c, stringref);
0030     }
0031 
0032     void setValues(QChar c, QString *stringref)
0033     {
0034         m_c = c;
0035         m_stringref = stringref;
0036     }
0037 
0038     void run(ThreadWeaver::JobPointer, ThreadWeaver::Thread *) override
0039     {
0040         QMutexLocker locker(&s_GlobalMutex);
0041         m_stringref->append(m_c);
0042         using namespace ThreadWeaver;
0043         TWDEBUG(3, "AppendCharacterJob::run: %c appended, result is %s.\n", m_c.toLatin1(), qPrintable(*m_stringref));
0044     }
0045 
0046     QChar character() const
0047     {
0048         return m_c;
0049     }
0050 
0051 protected:
0052     QString *stringRef() const
0053     {
0054         return m_stringref;
0055     }
0056 
0057 private:
0058     QChar m_c;
0059     QString *m_stringref;
0060 };
0061 
0062 class FailingAppendCharacterJob : public AppendCharacterJob
0063 {
0064 public:
0065     FailingAppendCharacterJob(QChar c = QChar(), QString *stringref = nullptr)
0066         : AppendCharacterJob(c, stringref)
0067     {
0068     }
0069 
0070     void run(ThreadWeaver::JobPointer job, ThreadWeaver::Thread *thread) override
0071     {
0072         AppendCharacterJob::run(job, thread);
0073         setStatus(Job::Status_Failed);
0074     }
0075 };
0076 
0077 class BusyJob : public ThreadWeaver::Job
0078 {
0079 public:
0080     BusyJob()
0081         : ThreadWeaver::Job()
0082     {
0083         using namespace ThreadWeaver;
0084         TWDEBUG(3, "BusyJob ctor\n");
0085     }
0086 
0087     ~BusyJob() override
0088     {
0089         using namespace ThreadWeaver;
0090         TWDEBUG(3, "~BusyJob\n");
0091     }
0092 
0093     void run(ThreadWeaver::JobPointer, ThreadWeaver::Thread *) override
0094     {
0095         using namespace ThreadWeaver;
0096         TWDEBUG(3, "BusyJob: entered run()\n");
0097         for (int i = 0; i < 100; ++i) {
0098             int k = (i << 3) + (i >> 4);
0099             Q_UNUSED(k);
0100         }
0101     }
0102 };
0103 
0104 #endif