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:
parent
256045f91d
commit
e5cdb86ac3
6 changed files with 85 additions and 32 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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ü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ür einfach das JobTicket per λ-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ü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ß leere Intervalle zusammengefü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älle">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1683120235864" ID="ID_1312143276" MODIFIED="1683250859522" TEXT="Segmentation-Standardfä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älle">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
|
|
|
|||
Loading…
Reference in a new issue