#ifndef COROUTINES_INCLUDE_CORO_INTERNAL_COTEST_CRF_PAYLOADS_H_ #define COROUTINES_INCLUDE_CORO_INTERNAL_COTEST_CRF_PAYLOADS_H_ #include #include #include "cotest-coro-common.h" #include "cotest-util-logging.h" #include "cotest-util-types.h" namespace testing { namespace crf { using UntypedMockerPointer = const void *; using UntypedMockObjectPointer = const void *; using UntypedArgsPointer = const void *; using UntypedReturnValuePointer = const void *; // ------------------ Classes ------------------ class MockSource; class TestCoroutine; class LaunchCoroutine; class MockRoutingSession; class InteriorEventSession; class InteriorLaunchSessionBase; class InteriorMockCallSession; class InteriorLaunchResultSession; template class InteriorLaunchSession; enum class PayloadKind { PreMock = 1000, // =1000 just to make valid values easy to spot in debugger PreMockAck, MockSeen, DropMock, AcceptMock, MockAction, ReturnMock, Launch, LaunchResult, ResumeMain, TCExited, TCDestructing }; class Payload : public coro_impl::Payload { public: virtual PayloadKind GetKind() const = 0; }; class PreMockPayload final : public Payload { public: PreMockPayload(std::weak_ptr originator_, std::string name_, UntypedMockObjectPointer mock_object_, UntypedMockerPointer mocker_); PayloadKind GetKind() const final; PreMockPayload *Clone() const; std::weak_ptr GetOriginator() const; std::string GetName() const; UntypedMockObjectPointer GetMockObject() const; UntypedMockerPointer GetMocker() const; std::string DebugString() const final; private: const std::weak_ptr originator; const std::string name; const UntypedMockObjectPointer mock_object; const UntypedMockerPointer mocker; }; class PreMockAckPayload : public Payload { public: explicit PreMockAckPayload(std::weak_ptr originator_); PayloadKind GetKind() const; std::weak_ptr GetOriginator() const; std::string DebugString() const final; private: const std::weak_ptr originator; }; class MockSeenPayload final : public Payload { public: MockSeenPayload(std::weak_ptr originator_, UntypedArgsPointer args_, std::string name_, UntypedMockObjectPointer mock_object_, UntypedMockerPointer mocker_); PayloadKind GetKind() const final; std::weak_ptr GetOriginator() const; UntypedArgsPointer GetArgsUntyped() const; std::string GetName() const; UntypedMockObjectPointer GetMockObject() const; UntypedMockerPointer GetMocker() const; std::string DebugString() const final; private: const std::weak_ptr originator; const UntypedArgsPointer args; const std::string name; const UntypedMockObjectPointer mock_object; const UntypedMockerPointer mocker; }; class MockResponsePayload : public Payload { public: MockResponsePayload(std::weak_ptr originator_, std::weak_ptr responder_); std::weak_ptr GetOriginator() const; std::weak_ptr GetResponder() const; protected: const std::weak_ptr originator; const std::weak_ptr responder; }; class DropMockPayload final : public MockResponsePayload { public: using MockResponsePayload::MockResponsePayload; PayloadKind GetKind() const final; std::string DebugString() const final; }; class AcceptMockPayload final : public MockResponsePayload { public: using MockResponsePayload::MockResponsePayload; PayloadKind GetKind() const final; std::string DebugString() const final; }; class MockActionPayload final : public MockResponsePayload { public: using MockResponsePayload::MockResponsePayload; PayloadKind GetKind() const final; std::string DebugString() const final; }; class ReturnMockPayload final : public MockResponsePayload { public: ReturnMockPayload(std::weak_ptr originator_, std::weak_ptr responder_, UntypedReturnValuePointer result_); PayloadKind GetKind() const final; UntypedReturnValuePointer GetResult(); std::string DebugString() const final; private: const UntypedReturnValuePointer return_val_ptr; }; class LaunchPayload final : public Payload { public: LaunchPayload(std::weak_ptr originator_, internal::LaunchLambdaWrapperType wrapper_lambda_, std::string name_); PayloadKind GetKind() const final; std::weak_ptr GetOriginator() const; internal::LaunchLambdaWrapperType GetLambdaWrapper() const; std::string GetName() const; std::string DebugString() const final; private: const std::weak_ptr originator; const internal::LaunchLambdaWrapperType wrapper_lambda; const std::string name; }; class LaunchResultPayload final : public Payload { public: LaunchResultPayload(std::weak_ptr originator_, std::weak_ptr responder_, UntypedReturnValuePointer result_); PayloadKind GetKind() const final; std::weak_ptr GetOriginator() const; std::weak_ptr GetResponder() const; UntypedReturnValuePointer GetResult(); std::string DebugString() const final; private: const std::weak_ptr originator; const std::weak_ptr responder; const UntypedReturnValuePointer return_val_ptr; }; class ResumeMainPayload : public Payload { public: explicit ResumeMainPayload(std::weak_ptr originator_); PayloadKind GetKind() const; std::weak_ptr GetOriginator() const; std::string DebugString() const final; private: const std::weak_ptr originator; }; // Test Coroutine Exited class TCExitedPayload : public Payload { public: explicit TCExitedPayload(std::weak_ptr originator_); PayloadKind GetKind() const; std::weak_ptr GetOriginator() const; std::string DebugString() const final; private: const std::weak_ptr originator; }; // Test Coroutine Destructing class TCDestructingPayload : public Payload { public: explicit TCDestructingPayload(std::weak_ptr originator_); PayloadKind GetKind() const; std::weak_ptr GetOriginator() const; std::string DebugString() const final; private: const std::weak_ptr originator; }; } // namespace crf } // namespace testing #endif