Activity-Lang: a way how to provide a faked Execution Context

...basically just delegated to DiagnosticFun instances,
yet the actual setup is somwewhat tricky to get right
This commit is contained in:
Fischlurch 2023-08-17 19:37:38 +02:00
parent 1c6ee62c1a
commit dd44373166
5 changed files with 96 additions and 12 deletions

View file

@ -154,12 +154,10 @@ namespace gear {
"Execution-Context: " STRINGIFY(_FUN_) " expect function with signature: " STRINGIFY(_SIG_));
EXE const& ctx = std::declval<EXE>();
ASSERT_MEMBER_FUNCTOR (ctx.post, Proc(Activity&, EXE&, Time));
ASSERT_MEMBER_FUNCTOR (ctx.work, void(Time, size_t));
ASSERT_MEMBER_FUNCTOR (ctx.done, void(Time, size_t));
ASSERT_MEMBER_FUNCTOR (ctx.tick, Proc(Time));
ASSERT_MEMBER_FUNCTOR (EXE::post, Proc(Activity&, EXE&, Time));
ASSERT_MEMBER_FUNCTOR (EXE::work, void(Time, size_t));
ASSERT_MEMBER_FUNCTOR (EXE::done, void(Time, size_t));
ASSERT_MEMBER_FUNCTOR (EXE::tick, Proc(Time));
#undef ASSERT_MEMBER_FUNCTOR

View file

@ -69,6 +69,7 @@ namespace test {
verifyMockInvocation();
verifyMockJobFunctor();
verifyFakeExeContext();
detect_activation();
detect_gate();
}
@ -179,8 +180,26 @@ namespace test {
/** @test faked execution context to perform Activity activation
* @todo WIP 8/23 🔁 define implement
*/
void
verifyFakeExeContext()
{
ActivityDetector detector;
auto& ctx = detector.executionCtx;
// an otherwise opaque object fulfilling the "Concept"
activity::_verify_usable_as_ExecutionContext<decltype(detector.executionCtx)>();
Time t = lib::test::randTime();
CHECK (activity::PASS == ctx.tick(t));
cout<<detector.showLog()<<endl;
}
/** @test TODO diagnostic setup to detect Activity activation and propagation
* @todo WIP 7/23 define implement
* @todo WIP 8/23 🔁 define implement
*/
void
detect_activation()

View file

@ -124,6 +124,11 @@ namespace test {
using SIG_JobDiagnostic = void(TimeValue, int32_t);
const size_t JOB_ARG_POS_TIME = 0;
const string CTX_POST{"post"};
const string CTX_WORK{"work"};
const string CTX_DONE{"done"};
const string CTX_TICK{"tick"};
}
class ActivityDetector;
@ -282,7 +287,7 @@ namespace test {
/** mock function call operator: logs all invocations */
RET
operator() (ARGS const& ...args)
operator() (ARGS ...args)
{
log_->call (log_->getID(), id_, args...)
.addAttrib (MARK_SEQ, util::toString(*seqNr_));
@ -401,6 +406,39 @@ namespace test {
}
struct FakeExecutionCtx;
using SIG_post = activity::Proc(Activity&, FakeExecutionCtx&, Time);
using SIG_work = void(Time, size_t);
using SIG_done = void(Time, size_t);
using SIG_tick = activity::Proc(Time);
/**
* Mock setup of the execution context for Activity activation.
* The instance #executionCtx is wired back with the #eventLog_
* and allows thus to detect and verify all callbacks from the Activities.
* @note the return value of the #post and #tick functions can be changed
* to another fixed response by calling DiagnosticFun::returning
*/
struct FakeExecutionCtx
{
_DiagnosticFun<SIG_post>::Type post;
_DiagnosticFun<SIG_work>::Type work;
_DiagnosticFun<SIG_done>::Type done;
_DiagnosticFun<SIG_tick>::Type tick;
FakeExecutionCtx (ActivityDetector& adi)
: post{adi.buildDiagnosticFun<SIG_post>(CTX_POST).returning(activity::PASS)}
, work{adi.buildDiagnosticFun<SIG_work>(CTX_WORK)}
, done{adi.buildDiagnosticFun<SIG_done>(CTX_DONE)}
, tick{adi.buildDiagnosticFun<SIG_tick>(CTX_TICK).returning(activity::PASS)}
{ }
};
FakeExecutionCtx executionCtx{*this};
ActivityMatch
verifyInvocation (string fun)
{

View file

@ -26,6 +26,7 @@
#include "lib/test/run.hpp"
#include "activity-detector.hpp"
#include "vault/gear/activity-lang.hpp"
#include "lib/time/timevalue.hpp"
//#include "lib/format-cout.hpp"
@ -78,7 +79,7 @@ namespace test {
/** @test TODO demonstrate a simple usage scenario
* @todo WIP 7/23 define implement
* @todo WIP 7/23 🔁 define 🔁 implement
*/
void
simpleUsage()
@ -94,11 +95,12 @@ namespace test {
/** @test TODO behaviour of Activity::INVOKE
* @todo WIP 7/23 define implement
* @todo WIP 7/23 🔁 define implement
*/
void
verifyActivity_Invoke()
{
ActivityDetector detector;
}

View file

@ -78454,7 +78454,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="button_ok"/>
</node>
</node>
<node CREATED="1690068793535" ID="ID_1906823317" MODIFIED="1690068819476" TEXT="ist implementiert durch die ActivityLang selber"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1690068793535" ID="ID_1906823317" MODIFIED="1692286273670" TEXT="ist implementiert durch die ActivityLang selber">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1692286145852" ID="ID_596906210" MODIFIED="1692286248899" TEXT="Fake-Setup f&#xfc;r Tests (ActivityDetector)">
<arrowlink COLOR="#433d62" DESTINATION="ID_902152915" ENDARROW="Default" ENDINCLINATION="656;-38;" ID="Arrow_ID_644734597" STARTARROW="None" STARTINCLINATION="1154;77;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1690068830605" ID="ID_330404913" MODIFIED="1690068833053" TEXT="Invocation">
@ -79425,10 +79431,14 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1689201354393" HGAP="24" ID="ID_1250518280" MODIFIED="1689201365333" TEXT="Hilfsmittel" VSHIFT="2">
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1689201660559" ID="ID_747497995" MODIFIED="1692057369715" TEXT="ActivityDetector">
<icon BUILTIN="pencil"/>
<node CREATED="1689201667734" ID="ID_901153159" MODIFIED="1689201676495" TEXT="speziell verdrahtete Activity">
<node CREATED="1689201667734" ID="ID_901153159" MODIFIED="1692286015665" TEXT="speziell verdrahtetes Setup">
<icon BUILTIN="info"/>
<node CREATED="1689201677836" ID="ID_166879509" MODIFIED="1689201693231" TEXT="kann ihre Aktivierung dokumentieren"/>
<node CREATED="1689201999161" ID="ID_554259263" MODIFIED="1689202008524" TEXT="kann Gate-Verhalten aufzeichnen"/>
<node CREATED="1692286019936" ID="ID_902152915" MODIFIED="1692286702295" TEXT="bietet ExecutionContext-Fake">
<arrowlink COLOR="#7d5f6b" DESTINATION="ID_1648694746" ENDARROW="Default" ENDINCLINATION="-155;-594;" ID="Arrow_ID_1288986872" STARTARROW="None" STARTINCLINATION="668;64;"/>
<linktarget COLOR="#433d62" DESTINATION="ID_902152915" ENDARROW="Default" ENDINCLINATION="656;-38;" ID="Arrow_ID_644734597" SOURCE="ID_596906210" STARTARROW="None" STARTINCLINATION="1154;77;"/>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1689202062345" ID="ID_373470992" MODIFIED="1692057818268" TEXT="implementiert als eigenst&#xe4;ndiges Test-Hilfsmittel">
<richcontent TYPE="NOTE"><html>
@ -82030,6 +82040,23 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1692286331547" ID="ID_1648694746" MODIFIED="1692286680929" TEXT="FakeExecutionCtx bereitstellen">
<linktarget COLOR="#7d5f6b" DESTINATION="ID_1648694746" ENDARROW="Default" ENDINCLINATION="-155;-594;" ID="Arrow_ID_1288986872" SOURCE="ID_902152915" STARTARROW="None" STARTINCLINATION="668;64;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1692286350353" ID="ID_592111396" MODIFIED="1692293651780" TEXT="bietet die notwendingen &#x3bb;-Bindings">
<icon BUILTIN="pencil"/>
<node CREATED="1690069222750" ID="ID_1750846288" MODIFIED="1692293582767" TEXT="&#x3bb;-post: (Activity, ExecutionCtx, Time) activity::Proc &#x27fc; activity::Proc"/>
<node CREATED="1690069365933" ID="ID_832098393" MODIFIED="1692286755765" TEXT="&#x3bb;-work: (Time, quality)"/>
<node CREATED="1690069480630" ID="ID_320780008" MODIFIED="1692286762564" TEXT="&#x3bb;-done: (Time, quality)"/>
<node CREATED="1690069554609" ID="ID_761100089" MODIFIED="1692286770500" TEXT="&#x3bb;-tick: (Time) &#x27fc; activity::Proc"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1692286383148" ID="ID_675137089" MODIFIED="1692286389285" TEXT="diese sind per Log verifizierbar">
<icon BUILTIN="flag-yellow"/>
</node>
<node COLOR="#338800" CREATED="1692286398114" ID="ID_482490572" MODIFIED="1692293638298" TEXT="pr&#xe4;parierte R&#xfc;ckgabewerte">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689205081622" ID="ID_1440811513" MODIFIED="1689205086027" TEXT="Me&#xdf;punkte">