Files
logos-cpp-sdk/cpp/implementations/mock/mock_store.h
Iuri MatiasandLogos Workspace 4197ee1830 Finish Abstraction & Refactor (Ongoing) - part 1 (#25)
* refactor: abstract connection/transport; and clearly separate qt remote obj and qt local into separate implementations

* abstract qt remote registry

* add mock implementation; these serves to further test the abstraction but also useful for testing modules later

* use LogosObject instead of QObject

* abstract provider side

* updates to use new api

* re-add async api back

---------

Co-authored-by: Logos Workspace <logos@workspace.local>
2026-03-23 11:45:25 -04:00

110 lines
3.4 KiB
C++

#ifndef MOCK_STORE_H
#define MOCK_STORE_H
#include <QString>
#include <QVariant>
#include <QVariantList>
#include <QList>
#include <QMutex>
/**
* @brief Records a single intercepted call to a mocked module method.
*/
struct MockCallRecord {
QString module;
QString method;
QVariantList args;
};
/**
* @brief Stores a single configured expectation (module + method -> return value).
*
* If matchAnyArgs is true the expectation matches regardless of arguments.
* Otherwise it only matches when args equal expectedArgs exactly.
*/
struct MockExpectation {
QString module;
QString method;
QVariantList expectedArgs;
QVariant returnValue;
bool matchAnyArgs = true;
};
/**
* @brief Singleton store that holds mock expectations and records calls.
*
* MockStore is the central registry used by MockTransportConnection.
* Tests set up expectations via when() and verify them via wasCalled() etc.
* Call reset() at the start of every test to clear state from previous runs.
*/
class MockStore {
public:
static MockStore& instance();
/**
* @brief Remove all expectations and call records.
*/
void reset();
// ── Fluent expectation builder ───────────────────────────────────────────
class ExpectationBuilder {
public:
ExpectationBuilder(MockStore& store, const QString& module, const QString& method);
/**
* @brief Restrict this expectation to calls with exactly these arguments.
*/
ExpectationBuilder& withArgs(const QVariantList& args);
/**
* @brief Set the value returned when the expectation is matched.
*/
ExpectationBuilder& thenReturn(const QVariant& value);
private:
MockStore& m_store;
int m_index; // index into m_expectations
};
/**
* @brief Begin configuring an expectation for module::method.
*
* Multiple calls to when() for the same module/method are allowed; the
* last matching expectation wins (LIFO order).
*/
ExpectationBuilder when(const QString& module, const QString& method);
// ── Called by MockTransportConnection ───────────────────────────────────
/**
* @brief Record a call and return the configured return value.
*
* If no expectation matches an invalid QVariant() is returned.
*/
QVariant recordAndReturn(const QString& module, const QString& method,
const QVariantList& args);
// ── Verification helpers ─────────────────────────────────────────────────
bool wasCalled(const QString& module, const QString& method) const;
bool wasCalledWith(const QString& module, const QString& method,
const QVariantList& args) const;
int callCount(const QString& module, const QString& method) const;
QVariantList lastArgs(const QString& module, const QString& method) const;
QList<MockCallRecord> allCalls() const;
private:
MockStore() = default;
MockStore(const MockStore&) = delete;
MockStore& operator=(const MockStore&) = delete;
mutable QMutex m_mutex;
QList<MockExpectation> m_expectations;
QList<MockCallRecord> m_calls;
friend class ExpectationBuilder;
};
#endif // MOCK_STORE_H