Segmentation: integrate SplitSplice and build mock-segmentation

...now able to build a mock segmentation which issues dummy jobs,
and is wired such as to verify the right job is invoked for each segment.

And this allows to build and verify the Dispatcher,
without being able to invoke actual render jobs yet.
This commit is contained in:
Fischlurch 2023-05-05 03:46:42 +02:00
parent 256045f91d
commit e5cdb86ac3
6 changed files with 85 additions and 32 deletions

View file

@ -75,9 +75,15 @@ namespace fixture {
// TODO: ownership??
///////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #725 : placeholder code
public:
Segment (TimeSpan covered =TimeSpan::ALL)
Segment (TimeSpan covered =TimeSpan::ALL
,const engine::JobTicket* ticket =nullptr)
: span_{covered}
, jobTicket_{&engine::JobTicket::NOP}
, jobTicket_{ticket? ticket : &engine::JobTicket::NOP}
{ }
Segment (Segment const& original, TimeSpan changed)
: span_{changed}
, jobTicket_{original.jobTicket_}
{ }
// default copy acceptable

View file

@ -33,6 +33,9 @@
#include "lib/time/timevalue.hpp"
#include "lib/split-splice.hpp"
using lib::time::Time;
using lib::time::TimeSpan;
namespace steam {
namespace fixture {
@ -73,14 +76,15 @@ namespace fixture {
Segment const&
Segmentation::splitSplice (OptTime start, OptTime after, const engine::JobTicket* jobTicket)
{
ASSERT (!start or !after or start != after);
using Iter = typename list<Segment>::iterator;
auto getStart = [](Iter elm) -> Time { return elm->start(); };
auto getAfter = [](Iter elm) -> Time { return elm->after(); };
auto createSeg= [](Iter pos, Time start, Time after) -> Iter { UNIMPLEMENTED ("create new Segment"); };
auto emptySeg = [](Iter pos, Time start, Time after) -> Iter { UNIMPLEMENTED ("create empty Segment");};
auto cloneSeg = [](Iter pos, Time start, Time after, Iter src) -> Iter { UNIMPLEMENTED ("clone Segment and modify time"); };
auto discard = [](Iter pos, Iter after) -> Iter { UNIMPLEMENTED ("discard Segments"); };
auto getStart = [](Iter elm) -> Time { return elm->start(); };
auto getAfter = [](Iter elm) -> Time { return elm->after(); };
auto createSeg= [&](Iter pos, Time start, Time after) -> Iter { return segments_.emplace (pos, TimeSpan{start, after}, jobTicket); };
auto emptySeg = [&](Iter pos, Time start, Time after) -> Iter { return segments_.emplace (pos, TimeSpan{start, after}); };
auto cloneSeg = [&](Iter pos, Time start, Time after, Iter src) -> Iter { return segments_.emplace (pos, *src, TimeSpan{start, after}); };
auto discard = [&](Iter pos, Iter after) -> Iter { return segments_.erase (pos,after); };
lib::splitsplice::Algo splicer{ getStart

View file

@ -208,8 +208,8 @@ namespace test {
for (auto& spec : specs)
{
JobTicket* newTicket = nullptr;
auto seed = spec.retrieveAttribute<HashVal> ("mark");
tickets_.emplace_back (seed? *seed : HashVal(rand() % 1000));
auto seed = spec.retrieveAttribute<int> ("mark");
tickets_.emplace_back (seed? HashVal(*seed) : HashVal(rand() % 1000));
newTicket = & tickets_.back();
auto start = spec.retrieveAttribute<Time> ("start");

View file

@ -149,9 +149,11 @@ namespace test {
CHECK (util::isSameObject (ticket, JobTicket::NOP));
}
{
MockSegmentation mockSeg{MakeRec().genNode()};
CHECK (1 == mockSeg.size());
JobTicket const& ticket = mockSeg[someTime].jobTicket();
MockSegmentation mockSegs{MakeRec().genNode()};
CHECK (1 == mockSegs.size());
CHECK (Time::MIN == mockSegs[someTime].start());
CHECK (Time::MAX == mockSegs[someTime].after());
JobTicket const& ticket = mockSegs[someTime].jobTicket();
CHECK (not util::isSameObject (ticket, JobTicket::NOP));
Job someJob = ticket.createJobFor(coord);
@ -163,9 +165,41 @@ namespace test {
CHECK (RealClock::wasRecently (DummyJob::invocationTime (someJob)));
CHECK (someTime == DummyJob::invocationNominalTime (someJob));
}
{
// Marker to verify the job calls back into the right segment
int marker = rand() % 1000;
// Build a Segmentation partitioned at 10s
MockSegmentation mockSegs{MakeRec()
.attrib ("start", Time{0,10}
,"mark", marker)
.genNode()};
CHECK (2 == mockSegs.size());
// since only start-time was given, the SplitSplice-Algo will attach
// the new Segment starting at 10s and expand towards +∞,
// while the left part of the axis is marked as NOP / empty
fixture::Segment const& seg1 = mockSegs[Time::ZERO]; // access anywhere < 10s
fixture::Segment const& seg2 = mockSegs[Time{0,20}]; // access anywhere >= 10s
CHECK ( util::isSameObject (seg1.jobTicket(), JobTicket::NOP));
CHECK (not util::isSameObject (seg2.jobTicket(), JobTicket::NOP));// this one is the active segment
Job job = seg2.jobTicket().createJobFor(coord);
CHECK (not MockJobTicket::isAssociated (job, seg1.jobTicket()));
CHECK ( MockJobTicket::isAssociated (job, seg2.jobTicket()));
CHECK (marker == job.parameter.invoKey.part.a);
job.triggerJob();
CHECK (DummyJob::was_invoked (job));
CHECK (RealClock::wasRecently (DummyJob::invocationTime (job)));
CHECK (marker == DummyJob::invocationAdditionalKey (job)); // DummyClosure is rigged such as to feed back the seed in `part.a`
// and thus we can prove this job really belongs to the marked segment
// create another job from the (empty) seg1
job = seg1.jobTicket().createJobFor (coord);
InvocationInstanceID empty; /////////////////////////////////////////////////////////////////////TICKET #1287 : temporary workaround until we get rid of the C base structs
CHECK (lumiera_invokey_eq (&job.parameter.invoKey, &empty)); // indiate that it's just a placeholder to mark a "NOP"-Job
}
TODO ("cover details of MockSegmentation");
TODO ("cover more details of MockSegmentation");
}
};

View file

@ -106,9 +106,9 @@ namespace engine {
InvocationInstanceID
buildInstanceID (HashVal seed) const override
{
InvocationInstanceID res;
res.part.a = seed;
return res;
InvocationInstanceID instance;
instance.part.a = seed;
return instance;
}
size_t

View file

@ -70145,8 +70145,8 @@
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1682993086565" ID="ID_469257294" MODIFIED="1683076810216" TEXT="Implementierung">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1682993086565" FOLDED="true" ID="ID_469257294" MODIFIED="1683250875747" TEXT="Implementierung">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1683042576253" ID="ID_1878728765" MODIFIED="1683076796339" TEXT="Konzept">
<icon BUILTIN="yes"/>
<node COLOR="#435e98" CREATED="1683042638127" ID="ID_1570983964" MODIFIED="1683076788355" TEXT="Deskriptor SpliceAct">
@ -70236,8 +70236,8 @@
<icon BUILTIN="idea"/>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1683046722945" ID="ID_113209914" MODIFIED="1683081268947" TEXT="Generalisierung">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1683046722945" ID="ID_113209914" MODIFIED="1683245591577" TEXT="Generalisierung">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1683046728800" ID="ID_1510597200" MODIFIED="1683081137760" STYLE="fork" TEXT="pr&#xfc;fen ob machbar">
<icon BUILTIN="help"/>
</node>
@ -70249,17 +70249,23 @@
<node COLOR="#338800" CREATED="1683046786608" ID="ID_106487591" MODIFIED="1683081327011" TEXT="getEnd(elm)">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683081197660" ID="ID_357336924" MODIFIED="1683081311584" TEXT="createSeg(pos, start,after)">
<icon BUILTIN="bell"/>
<node COLOR="#338800" CREATED="1683081197660" ID="ID_357336924" MODIFIED="1683245525718" TEXT="createSeg(pos, start,after)">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1683245530718" HGAP="29" ID="ID_1771563243" MODIFIED="1683245560983" TEXT="hierf&#xfc;r einfach das JobTicket per &#x3bb;-closure durchbeben" VSHIFT="3">
<font NAME="SansSerif" SIZE="11"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683081213154" ID="ID_180921781" MODIFIED="1683081311584" TEXT="emptySeg(pos, start,after)">
<icon BUILTIN="bell"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683081224201" ID="ID_886281397" MODIFIED="1683081311584" TEXT="cloneSeg(pos, start,after, src)">
<icon BUILTIN="bell"/>
<node COLOR="#338800" CREATED="1683081213154" ID="ID_180921781" MODIFIED="1683245525719" TEXT="emptySeg(pos, start,after)">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683081234023" ID="ID_263936802" MODIFIED="1683081311584" TEXT="discard(start,after)">
<icon BUILTIN="bell"/>
<node COLOR="#338800" CREATED="1683081224201" ID="ID_886281397" MODIFIED="1683245525718" TEXT="cloneSeg(pos, start,after, src)">
<icon BUILTIN="button_ok"/>
<node COLOR="#435e98" CREATED="1683245530718" HGAP="29" ID="ID_883714171" MODIFIED="1683245584960" TEXT="hierf&#xfc;r neue Segment-ctor Variante" VSHIFT="3">
<font NAME="SansSerif" SIZE="11"/>
</node>
</node>
<node COLOR="#338800" CREATED="1683081234023" ID="ID_263936802" MODIFIED="1683245525718" TEXT="discard(start,after)">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node COLOR="#338800" CREATED="1683046873340" ID="ID_347563039" MODIFIED="1683081262904" TEXT="Template Parameter deduction einrichten">
@ -70315,7 +70321,7 @@
<icon BUILTIN="info"/>
</node>
<node CREATED="1682993108314" ID="ID_317827435" MODIFIED="1682993122827" TEXT="hinzu kommt die Variante, da&#xdf; leere Intervalle zusammengef&#xfc;hrt werden"/>
<node COLOR="#338800" CREATED="1683046966788" ID="ID_1714211009" MODIFIED="1683208598606" TEXT="splitSplice-Algo isoliert testen">
<node COLOR="#338800" CREATED="1683046966788" FOLDED="true" ID="ID_1714211009" MODIFIED="1683208598606" TEXT="splitSplice-Algo isoliert testen">
<linktarget COLOR="#2ec3d8" DESTINATION="ID_1714211009" ENDARROW="Default" ENDINCLINATION="-141;9;" ID="Arrow_ID_816334190" SOURCE="ID_226373762" STARTARROW="None" STARTINCLINATION="-192;20;"/>
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1683120139366" ID="ID_255513798" MODIFIED="1683120148509" TEXT="Test-Setup mit einfachen int-Intevallen">
@ -70508,8 +70514,11 @@
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683120235864" ID="ID_1312143276" MODIFIED="1683120244568" TEXT="Segmentation-Standardf&#xe4;lle">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1683120235864" ID="ID_1312143276" MODIFIED="1683250859522" TEXT="Segmentation-Standardf&#xe4;lle">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1683250843877" ID="ID_608613083" MODIFIED="1683250856171" TEXT="einfache Segmentation mit einem Segment ab 10s">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1683047063010" ID="ID_1142231389" MODIFIED="1683047144754" TEXT="degenerierte F&#xe4;lle">
<icon BUILTIN="flag-yellow"/>