Dispatcher-Pipeline: prepare test for the new NodeGraphAttachment

It turns out that the real (not mocked) implementation of JobTicket creation
is already required now for this planned (mock)Dispatcher setup;
moreover, this real implementation turns out to be almost identical
to the mock implementation written recently -- just nested structure
of prerequiste JobTickets need to be changed into a similar structur
of ExitNodes

-- as an aside: rearrange various tests to be more in-line
   with the envisioned architecture of playback and engine
This commit is contained in:
Fischlurch 2023-06-07 04:03:00 +02:00
parent 3b2e5db7b4
commit f6af4c6a16
30 changed files with 419 additions and 121 deletions

View file

@ -33,8 +33,9 @@
#include "lib/error.hpp"
#include "lib/nocopy.hpp"
#include "lib/hash-value.h"
#include "lib/iter-adapter-stl.hpp"
#include <vector>
#include <deque>
using lib::HashVal;
@ -43,7 +44,7 @@ namespace steam {
namespace engine {
class ExitNode;
using ExitNodes = std::vector<engine::ExitNode>;
using ExitNodes = std::deque<engine::ExitNode>;
@ -55,7 +56,7 @@ namespace engine {
* remains still to be settled. So this is a placeholder to support mock testing for now.
*/
class ExitNode
: util::NonCopyable
: util::MoveOnly
{
HashVal pipelineIdentity_; //////////////////////////////////////////////////////////TICKET #1293 : Hash-Chaining for invocation-ID... derive from ProcNode wiring
ExitNodes prerequisites_; ///////////////////////////////////////////////////////////TICKET #1306 : actual access to low-level-Model (ProcNode)
@ -66,7 +67,25 @@ namespace engine {
, prerequisites_{}
{ }
ExitNode (HashVal id, ExitNodes&& prereq =ExitNodes{})
: pipelineIdentity_{id}
, prerequisites_{std::move (prereq)}
{ }
static ExitNode NIL;
HashVal
getPipelineIdentity() const
{
return pipelineIdentity_;
}
auto
getPrerequisites() const
{
return lib::iter_stl::eachElm (prerequisites_);
}
};

View file

@ -40,8 +40,8 @@
*/
#ifndef STEAM_MOBJECT_BUILDER_FIXTURE_CHANGE_DETECTOR_H
#define STEAM_MOBJECT_BUILDER_FIXTURE_CHANGE_DETECTOR_H
#ifndef STEAM_FIXTURE_FIXTURE_CHANGE_DETECTOR_H
#define STEAM_FIXTURE_FIXTURE_CHANGE_DETECTOR_H
#include "lib/error.hpp"
//#include "lib/optional-ref.hpp"
@ -52,8 +52,7 @@
//#include <map>
namespace steam {
namespace mobject {
namespace builder {
namespace fixture {
using asset::ID;
using asset::Pipe;
@ -78,5 +77,5 @@ namespace builder {
}}} // namespace steam::mobject::builder
#endif
}} // namespace steam::fixture
#endif /*STEAM_FIXTURE_FIXTURE_CHANGE_DETECTOR_H*/

View file

@ -41,17 +41,20 @@
#include "lib/sync-classlock.hpp"
#include "steam/mobject/builderfacade.hpp"
#include "steam/mobject/model-port.hpp"
#include "steam/mobject/builder/model-port-registry.hpp"
#include "steam/fixture/model-port-registry.hpp"
namespace steam {
namespace mobject {
namespace builder {
namespace fixture {
namespace error = lumiera::error;
using mobject::LUMIERA_ERROR_BUILDER_LIFECYCLE;
using mobject::LUMIERA_ERROR_INVALID_MODEL_PORT;
using mobject::LUMIERA_ERROR_UNCONNECTED_MODEL_PORT;
typedef ModelPortRegistry::ModelPortDescriptor const& MPDescriptor;
typedef lib::ClassLock<ModelPortRegistry> LockRegistry;
using MPDescriptor = ModelPortRegistry::ModelPortDescriptor const&;
using LockRegistry = lib::ClassLock<ModelPortRegistry>;
/** storage for the link to the global
@ -238,10 +241,10 @@ namespace mobject {
LUMIERA_ERROR_DEFINE (DUPLICATE_MODEL_PORT, "Attempt to define a new model port with an pipe-ID already denoting an existing port");
}// namespace builder
}// namespace fixture
namespace mobject {
LUMIERA_ERROR_DEFINE (INVALID_MODEL_PORT, "Referral to unknown model port");
LUMIERA_ERROR_DEFINE (UNCONNECTED_MODEL_PORT, "Attempt to operate on an existing but unconnected model port");
@ -250,7 +253,7 @@ namespace mobject {
ModelPort::ModelPort (ID<asset::Pipe> refID)
: id_(refID)
{
builder::ModelPortRegistry::accessDescriptor (refID);
fixture::ModelPortRegistry::accessDescriptor (refID);
}
@ -259,7 +262,7 @@ namespace mobject {
bool
ModelPort::exists (ID<asset::Pipe> key)
{
return builder::ModelPortRegistry::globalInstance().isRegistered (key);
return fixture::ModelPortRegistry::globalInstance().isRegistered (key);
}
@ -270,9 +273,9 @@ namespace mobject {
ID<asset::Pipe>
ModelPort::pipe() const
{
ENSURE (this->id_ == builder::ModelPortRegistry::accessDescriptor(this->id_).id());
ENSURE (this->id_ == fixture::ModelPortRegistry::accessDescriptor(this->id_).id());
return builder::ModelPortRegistry::accessDescriptor(this->id_).id();
return fixture::ModelPortRegistry::accessDescriptor(this->id_).id();
}
@ -283,7 +286,7 @@ namespace mobject {
ID<asset::Struct>
ModelPort::holder() const
{
return builder::ModelPortRegistry::accessDescriptor(this->id_).holder();
return fixture::ModelPortRegistry::accessDescriptor(this->id_).holder();
}

View file

@ -46,8 +46,8 @@
*/
#ifndef STEAM_MOBJECT_BUILDER_MODEL_PORT_REGISTRY_H
#define STEAM_MOBJECT_BUILDER_MODEL_PORT_REGISTRY_H
#ifndef STEAM_FIXTURE_MODEL_PORT_REGISTRY_H
#define STEAM_FIXTURE_MODEL_PORT_REGISTRY_H
#include "lib/error.hpp"
#include "lib/optional-ref.hpp"
@ -58,8 +58,7 @@
#include <map>
namespace steam {
namespace mobject {
namespace builder {
namespace fixture {
using asset::ID;
using asset::Pipe;
@ -178,5 +177,5 @@ namespace builder {
}}} // namespace steam::mobject::builder
#endif
}} // namespace steam::fixture
#endif /*STEAM_FIXTURE_MODEL_PORT_REGISTRY_H*/

View file

@ -44,7 +44,8 @@
namespace steam {
namespace fixture {
using ExitNodes = engine::ExitNodes;
using engine::ExitNode;
using engine::ExitNodes;
/**
@ -69,6 +70,13 @@ namespace fixture {
{ }
// default copy acceptable
ExitNode const&
operator[] (size_t idx) const
{
return idx < exitNodes_.size()? exitNodes_[idx]
: ExitNode::NIL;
}
};

View file

@ -33,6 +33,11 @@ return: 0
END
TEST "Output pipe mapping" OutputMapping_test <<END
return: 0
END
TEST "SessionElementTracker_test" SessionElementTracker_test <<END
return: 0
END

View file

@ -127,16 +127,16 @@ return: 0
END
TEST "Dispatcher loop control logic" DispatcherLooper_test <<END
TEST "Steam-Dispatcher loop control logic" DispatcherLooper_test <<END
return: 0
END
TEST "Dispatcher command queue" CommandQueue_test <<END
TEST "Steam-Dispatcher command queue" CommandQueue_test <<END
return: 0
END
TEST "Dispatcher function test" SessionCommandFunction_test <<END
TEST "Steam-Dispatcher function test" SessionCommandFunction_test <<END
return: 0
END

View file

@ -14,24 +14,3 @@ END
PLANNED "BuildSegment_test" BuildSegment_test <<END
END
PLANNED "detecting Fixture changes" FixtureChangeDetector_test <<END
return: 0
END
TEST "ModelPort registry" ModelPortRegistry_test <<END
return: 0
END
TEST "Output pipe mapping" OutputMapping_test <<END
return: 0
END
PLANNED "Segmentation datastructure" SegmentationDatastructure_test <<END
return: 0
END

22
tests/46fixture.tests Normal file
View file

@ -0,0 +1,22 @@
TESTING "Component Test Suite: Fixture" ./test-suite --group=fixture
PLANNED "detecting Fixture changes" FixtureChangeDetector_test <<END
return: 0
END
TEST "ModelPort registry" ModelPortRegistry_test <<END
return: 0
END
PLANNED "Fixture Node-Graph connection" NodeGraphAttachment_test <<END
return: 0
END
PLANNED "Segmentation datastructure" SegmentationDatastructure_test <<END
return: 0
END

18
tests/46node.tests Normal file
View file

@ -0,0 +1,18 @@
TESTING "Component Test Suite: Render Engine parts" ./test-suite --group=node
PLANNED "Proc Node basics" NodeBasic_test <<END
END
PLANNED "Proc Node fabrication" NodeFabrication_test <<END
END
PLANNED "Proc Node operation modes" NodeOperation_test <<END
END
PLANNED "source reading Node" NodeSource_test <<END
END

View file

@ -59,22 +59,6 @@ return: 0
END
PLANNED "Proc Node basics" NodeBasic_test <<END
END
PLANNED "Proc Node fabrication" NodeFabrication_test <<END
END
PLANNED "Proc Node operation modes" NodeOperation_test <<END
END
PLANNED "source reading Node" NodeSource_test <<END
END
PLANNED "scheduler interface" SchedulerInterface_test <<END
END

View file

@ -1,4 +1,4 @@
TESTING "Component Test Suite: Player and Output" ./test-suite --group=player
TESTING "Component Test Suite: Player and Output" ./test-suite --group=play

View file

@ -1,4 +1,4 @@
TESTING "Steam Layer combined operations Test Suite" ./test-suite --group=operate
TESTING "Steam and Vault Layer integration Test Suite" ./test-suite --group=integration

View file

@ -47,6 +47,7 @@
#include "lib/test/test-helper.hpp"
#include "steam/play/dummy-play-connection.hpp"
#include "steam/fixture/node-graph-attachment.hpp"
#include "steam/fixture/segmentation.hpp"
#include "steam/mobject/model-port.hpp"
#include "steam/engine/dispatcher.hpp"
@ -198,6 +199,13 @@ namespace test {
}
ExitNode
buildExitNodeFromSpec (GenNode const& spec)
{
UNIMPLEMENTED ("rewrite the mock builder code to generate a network of ExitNodes instead of JobTickets");
}
private: /* ======== Implementation: build mock JobTickes from test specification ==== */
HashVal

View file

@ -103,7 +103,7 @@ namespace test {
/** Register this test class... */
LAUNCHER (NodeBasic_test, "unit engine");
LAUNCHER (NodeBasic_test, "unit node");

View file

@ -52,7 +52,7 @@ namespace test {
/** Register this test class... */
LAUNCHER (NodeFabrication_test, "unit engine");
LAUNCHER (NodeFabrication_test, "unit node");

View file

@ -52,7 +52,7 @@ namespace test {
/** Register this test class... */
LAUNCHER (NodeOperation_test, "unit engine");
LAUNCHER (NodeOperation_test, "unit node");

View file

@ -52,7 +52,7 @@ namespace test {
/** Register this test class... */
LAUNCHER (NodeSource_test, "unit engine");
LAUNCHER (NodeSource_test, "unit node");

View file

@ -27,7 +27,7 @@
#include "lib/test/run.hpp"
#include "lib/test/test-helper.hpp"
#include "steam/mobject/builder/fixture-change-detector.hpp"
#include "steam/fixture/fixture-change-detector.hpp"
#include "steam/asset/timeline.hpp"
#include "steam/asset/pipe.hpp"
#include "common/query.hpp"
@ -35,8 +35,7 @@
namespace steam {
namespace mobject {
namespace builder {
namespace fixture {
namespace test {
// using util::isSameObject;
@ -112,8 +111,8 @@ namespace test {
/** Register this test class... */
LAUNCHER (FixtureChangeDetector_test, "unit builder");
LAUNCHER (FixtureChangeDetector_test, "unit fixture");
}}}} // namespace steam::mobject::builder::test
}}} // namespace steam::fixture::test

View file

@ -27,7 +27,7 @@
#include "lib/test/run.hpp"
#include "lib/test/test-helper.hpp"
#include "steam/mobject/builder/model-port-registry.hpp"
#include "steam/fixture/model-port-registry.hpp"
#include "steam/asset/timeline.hpp"
#include "steam/asset/pipe.hpp"
#include "common/query.hpp"
@ -35,8 +35,7 @@
namespace steam {
namespace mobject {
namespace builder {
namespace fixture {
namespace test {
using util::isSameObject;
@ -47,12 +46,16 @@ namespace test {
using asset::Struct;
using asset::Timeline;
using asset::PTimeline;
using mobject::ModelPort;
using lumiera::Query;
typedef asset::ID<Pipe> PID;
typedef asset::ID<Struct> TID;
using PID = asset::ID<Pipe>;
using TID = asset::ID<Struct>;
typedef ModelPortRegistry::ModelPortDescriptor const& MPDescriptor;
using MPDescriptor = ModelPortRegistry::ModelPortDescriptor const&;
using mobject::LUMIERA_ERROR_INVALID_MODEL_PORT;
using mobject::LUMIERA_ERROR_UNCONNECTED_MODEL_PORT;
namespace { // test environment
@ -274,8 +277,8 @@ namespace test {
/** Register this test class... */
LAUNCHER (ModelPortRegistry_test, "unit session builder");
LAUNCHER (ModelPortRegistry_test, "unit fixture session builder");
}}}} // namespace steam::mobject::builder::test
}}} // namespace steam::fixture::test

View file

@ -0,0 +1,155 @@
/*
NodeGraphAttachment(Test) - verify link from fixture to low-level-model
Copyright (C) Lumiera.org
2023, Hermann Vosseler <Ichthyostega@web.de>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* *****************************************************/
/** @file node-graph-attachment-test.cpp
** unit test \ref NodeGraphAttachment_test
*/
#include "lib/test/run.hpp"
//#include "lib/test/test-helper.hpp"
#include "steam/fixture/node-graph-attachment.hpp"
#include "steam/engine/exit-node.hpp"
#include "steam/engine/mock-dispatcher.hpp"
#include "lib/util.hpp"
#include <utility>
namespace steam {
namespace fixture {
namespace test {
// using util::isSameObject;
using std::move;
using util::isnil;
//
// using asset::Pipe;
// using asset::PPipe;
// using asset::Struct;
// using asset::Timeline;
// using asset::PTimeline;
// using lumiera::Query;
using engine::ExitNode;
//
// typedef asset::ID<Pipe> PID;
// typedef asset::ID<Struct> TID;
//
// typedef ModelPortRegistry::ModelPortDescriptor const& MPDescriptor;
namespace { // test environment
}
/*****************************************************************************//**
* @test Verify the facade object used to connect from the Segments in the Fixture
* into the actual render nodes network
* @see mobject::builder::FixtureChangeDetector
*/
class NodeGraphAttachment_test : public Test
{
virtual void
run (Arg)
{
access_ExitNode();
fabricate_MockExitNode();
}
/** @test access to ExitNode and fall back on ExitNode::NIL when undefined
* - verify ExitNode::NIL
* - build a simple ExitNode without prerequisites
* - use this as prerequisite(s) for another ExitNode
* - put a third ExitNode(id=13) also into the same collection
* - use this to construct a NodeGraphAttachment
* - access existing and non-existing index positions
*/
void
access_ExitNode()
{
CHECK (0 == ExitNode::NIL.getPipelineIdentity());
CHECK (isnil (ExitNode::NIL.getPrerequisites()));
ExitNodes subDead;
subDead.emplace_back(55);
CHECK (55 == subDead[0].getPipelineIdentity());
CHECK (isnil (subDead[0].getPrerequisites()));
ExitNodes superDead;
superDead.emplace_back(23, move (subDead));
superDead.emplace_front(13);
CHECK (13 == superDead[0].getPipelineIdentity());
CHECK (23 == superDead[1].getPipelineIdentity());
CHECK (not isnil (superDead[1].getPrerequisites()));
CHECK (55 == superDead[1].getPrerequisites()->getPipelineIdentity());
NodeGraphAttachment succubus{move (superDead)};
CHECK (13 == succubus[0].getPipelineIdentity());
CHECK (23 == succubus[1].getPipelineIdentity());
CHECK (55 == succubus[1].getPrerequisites()->getPipelineIdentity());
}
/** @test setup a properly structured ExitNode graph using the
* specification scheme supported by MockSegmentation
*/
void
fabricate_MockExitNode()
{
using lib::diff::MakeRec;
engine::test::MockSegmentation builder;
ExitNode incubus =
builder.buildExitNodeFromSpec(MakeRec()
.attrib("mark", 13)
.scope(MakeRec()
.attrib("mark",23)
.genNode()
,MakeRec()
.attrib("mark",55)
.genNode()
)
.genNode());
CHECK (13 == incubus.getPipelineIdentity());
auto feed = incubus.getPrerequisites();
CHECK (not isnil (feed));
CHECK (23 == feed->getPipelineIdentity());
++feed;
CHECK (55 == feed->getPipelineIdentity());
++feed;
CHECK (isnil (feed));
}
};
/** Register this test class... */
LAUNCHER (NodeGraphAttachment_test, "unit fixture");
}}} // namespace steam::fixture::test

View file

@ -27,7 +27,7 @@
#include "lib/test/run.hpp"
#include "lib/test/test-helper.hpp"
#include "steam/mobject/builder/fixture-change-detector.hpp"
#include "steam/fixture/fixture-change-detector.hpp"
#include "steam/asset/timeline.hpp"
#include "steam/asset/pipe.hpp"
#include "common/query.hpp"
@ -35,8 +35,7 @@
namespace steam {
namespace mobject {
namespace builder {
namespace fixture {
namespace test {
// using util::isSameObject;
@ -111,8 +110,8 @@ namespace test {
/** Register this test class... */
LAUNCHER (SegmentationDatastructure_test, "unit builder");
LAUNCHER (SegmentationDatastructure_test, "unit fixture");
}}}} // namespace steam::mobject::builder::test
}}} // namespace steam::fixture::test

View file

@ -45,6 +45,7 @@ namespace test {
using asset::Pipe;
using asset::PPipe;
using mobject::OutputMapping;
typedef asset::ID<Pipe> PID;
@ -180,7 +181,7 @@ namespace test {
/** Register this test class... */
LAUNCHER (OutputMapping_test, "unit session builder");
LAUNCHER (OutputMapping_test, "unit session");

View file

@ -48,7 +48,7 @@
#include "steam/mobject/model-port.hpp"
#include "steam/mobject/builder/model-port-registry.hpp"
#include "steam/fixture/model-port-registry.hpp"
#include "steam/play/output-slot-connection.hpp"
#include "steam/play/output-manager.hpp"
#include "steam/asset/timeline.hpp"
@ -66,6 +66,8 @@ namespace steam{
namespace play {
namespace test {
using fixture::ModelPortRegistry;
/**
* @todo 5/2023 quick-n-dirty placeholder to be able to fabricate fake DataSink handles (`Handle<Connection>`)
@ -92,7 +94,7 @@ namespace test {
using asset::Timeline;
using asset::PTimeline;
using mobject::ModelPort;
using mobject::builder::ModelPortRegistry;
using fixture::ModelPortRegistry;
using util::contains;
using lumiera::Query;

View file

@ -101,7 +101,7 @@ namespace test {
/** Register this test class... */
LAUNCHER (DummyPlayConnection_test, "unit player");
LAUNCHER (DummyPlayConnection_test, "unit play");

View file

@ -132,7 +132,7 @@ namespace test {
/** Register this test class... */
LAUNCHER (OutputSlotProtocol_test, "unit player");
LAUNCHER (OutputSlotProtocol_test, "unit play");

View file

@ -85,7 +85,7 @@ namespace test {
/** Register this test class... */
LAUNCHER (TimingConstraints_test, "unit player");
LAUNCHER (TimingConstraints_test, "unit play");

View file

@ -32,8 +32,6 @@
namespace steam {
namespace mobject {
namespace controller {
namespace test {
@ -59,8 +57,8 @@ namespace test {
/** Register this test class... */
LAUNCHER (RenderSegment_test, "function operate");
LAUNCHER (RenderSegment_test, "function integration");
}}}} // namespace steam::mobject::controller::test
}} // namespace steam::test

View file

@ -88,7 +88,7 @@ namespace test {
/** Register this test class... */
LAUNCHER (MediaAccessMock_test, "unit operate");
LAUNCHER (MediaAccessMock_test, "unit integration");

View file

@ -74096,18 +74096,25 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node COLOR="#5b280f" CREATED="1685988037609" ID="ID_1118666398" MODIFIED="1686009850660" TEXT="nun stets eager alle m&#xf6;glichen Duplikate (pro ModelPort) generieren">
<icon BUILTIN="button_cancel"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1686009860309" ID="ID_1088673306" MODIFIED="1686009875811" TEXT="Hexagonale Kacke!">
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1686009860309" ID="ID_1088673306" MODIFIED="1686090242224" TEXT="Generierung via Mock-ExitNodes">
<icon BUILTIN="flag-pink"/>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1686009877359" ID="ID_224370768" MODIFIED="1686009907838" TEXT="mu&#xdf; ich jetzt schon wieder die JobTicket-Erzeugung umprogrammieren??">
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1686009877359" ID="ID_224370768" MODIFIED="1686090285802" TEXT="bisheriger Zugang via MockJobTicket f&#xe4;llt praktisch weg">
<icon BUILTIN="smiley-angry"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686009918647" ID="ID_1552363345" MODIFIED="1686009941452" TEXT="und stattdessen die Prerequisites-Struktur in Form von Exit-Nodes aufbauen...">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686009918647" ID="ID_1552363345" MODIFIED="1686091174947" TEXT="Spec nun in Fake-ExitNode(s) &#xfc;bersetzen">
<linktarget COLOR="#599eb9" DESTINATION="ID_1552363345" ENDARROW="Default" ENDINCLINATION="623;43;" ID="Arrow_ID_940031570" SOURCE="ID_929102409" STARTARROW="None" STARTINCLINATION="738;-108;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1686092906718" HGAP="35" ID="ID_515771" MODIFIED="1686102821898" TEXT="NodeGraphAttachment_test" VSHIFT="-3">
<icon BUILTIN="pencil"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1686011373412" ID="ID_1341039933" MODIFIED="1686011421307" TEXT="Problem: das w&#xe4;re dann ja der echte JobTicket-ctor (nicht MockJobTicket)">
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1686011373412" ID="ID_1341039933" MODIFIED="1686090506568" TEXT="Erzeugung l&#xe4;uft nun &#xfc;ber den realen JobTicket-ctor">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1686011430516" ID="ID_373808709" MODIFIED="1686011467978" TEXT="damit m&#xfc;&#xdf;te ich jetzt die Spec-Erzeugung ein zweites Mal programmieren"/>
<node CREATED="1686011478528" ID="ID_1762441208" MODIFIED="1686011502058" TEXT="und obendrein ein drittes Mal f&#xfc;r die Fake-ExitNode"/>
<node CREATED="1686090517445" ID="ID_7221274" MODIFIED="1686090544501" TEXT="zum Gl&#xfc;ck bleibt die eigentliche Logik strukturell gleich"/>
<node CREATED="1686090545569" ID="ID_1454267269" MODIFIED="1686090574166" TEXT="nun werden eben geFakete Exit-Nodes intern gehalten"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1686090622242" ID="ID_671795357" MODIFIED="1686090648184" TEXT="MockSupport_test l&#xe4;uft weiterhin ohne jedwede Anpassung">
<icon BUILTIN="flag-pink"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685988083711" ID="ID_1973560674" MODIFIED="1685988105725" TEXT="Prerequisites von der Wurzel aus optional nach ModelPort-Nr filtern">
@ -74140,6 +74147,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685988152809" ID="ID_255556137" MODIFIED="1685988181493" TEXT="API erweitern : portNum">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1685990098487" ID="ID_829030768" MODIFIED="1685990110152" TEXT="grunds&#xe4;tzlich: YAGNI">
<linktarget COLOR="#67a7cd" DESTINATION="ID_829030768" ENDARROW="Default" ENDINCLINATION="22;176;" ID="Arrow_ID_1621721947" SOURCE="ID_1835927835" STARTARROW="None" STARTINCLINATION="-485;0;"/>
<icon BUILTIN="yes"/>
<node CREATED="1685990112190" ID="ID_463883334" MODIFIED="1685990125693" TEXT="blo&#xdf; nicht verr&#xfc;ckt machen mit dem konkreten Model"/>
<node CREATED="1685990126424" ID="ID_933157694" MODIFIED="1685990149034" TEXT="sehr wahrscheinlich werden die Mocks niemals ein differenziertes Model bespielen"/>
@ -74150,20 +74158,109 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686000316132" ID="ID_826544806" LINK="#ID_1237481687" MODIFIED="1686000406522" TEXT="Kopplung per &#xbb;NodeGraphAttachment&#xab;">
<linktarget COLOR="#656486" DESTINATION="ID_826544806" ENDARROW="Default" ENDINCLINATION="469;-18;" ID="Arrow_ID_1372033454" SOURCE="ID_551644524" STARTARROW="None" STARTINCLINATION="486;32;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686008339600" HGAP="28" ID="ID_181839329" MODIFIED="1686008351273" TEXT="Dummy-Implementierung anlegen" VSHIFT="13">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686008354738" ID="ID_1875142825" MODIFIED="1686008361709" TEXT="ExitNode : Platzhalter">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1686008339600" HGAP="28" ID="ID_181839329" MODIFIED="1686092787399" TEXT="Dummy-Implementierung anlegen" VSHIFT="13">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1686008354738" ID="ID_1875142825" MODIFIED="1686092748594" TEXT="ExitNode : Platzhalter">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686008421806" ID="ID_14455291" MODIFIED="1686008427283" TEXT="ExitNode::NIL">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1686008421806" ID="ID_14455291" MODIFIED="1686092744552" TEXT="ExitNode::NIL">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686008437892" ID="ID_665376680" MODIFIED="1686008449710" TEXT="weitere rekursiv f&#xfc;r die &#xbb;Prerequisites&#xab;">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1686008437892" HGAP="22" ID="ID_665376680" MODIFIED="1686092763453" TEXT="weitere rekursiv f&#xfc;r die &#xbb;Prerequisites&#xab;" VSHIFT="-11">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1686090677045" HGAP="17" ID="ID_1835927835" MODIFIED="1686090835594" TEXT="f&#xfc;r sp&#xe4;ter: fake-ExitNode ohne reales Modell dahinter erm&#xf6;glichen">
<arrowlink COLOR="#67a7cd" DESTINATION="ID_829030768" ENDARROW="Default" ENDINCLINATION="22;176;" ID="Arrow_ID_1621721947" STARTARROW="None" STARTINCLINATION="-485;0;"/>
<icon BUILTIN="hourglass"/>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1686009434197" ID="ID_1874481686" MODIFIED="1686009466526" TEXT="mu&#xdf; nun Segment / JobTicket-Erzeugung umstellen">
<icon BUILTIN="messagebox_warning"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686088955494" ID="ID_683990266" MODIFIED="1686088990055" TEXT="Segment bekommt nun ein NodeGraphAttachment">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686089017579" ID="ID_178364599" MODIFIED="1686089082884" TEXT="dieses bietet Array-Access auf die ExitNodes">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1686089092489" ID="ID_579545168" MODIFIED="1686089092489" TEXT="...in ModelPort-Reihenfolge"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686089096760" ID="ID_306119444" MODIFIED="1686089158236" TEXT="fehlertolerant &#x2016; ersatzweise ExitNode::NIL">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686089194310" ID="ID_1557640858" MODIFIED="1686089229114" TEXT="ExitNode bietet Pipeline identity hash">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686089236690" ID="ID_1356337031" MODIFIED="1686089259589" TEXT="und Iteration &#xfc;ber prerequisite - ExitNodes">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686089280610" ID="ID_331300527" MODIFIED="1686089333490" TEXT="Segment alloziert on-demand neues JobTicket">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686089580864" ID="ID_1949359516" MODIFIED="1686089591287" TEXT="Zugriff indiziert nach NodePort-Nr">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686089592469" ID="ID_1688607797" MODIFIED="1686089703788" TEXT="Storage mu&#xdf; stabil + erweiterungsf&#xe4;hig sein">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
und das hei&#223;t im Klartext: <font face="Monospaced" color="#262a9c">std::deque</font>&#160;&#8212; sp&#228;ter kombiniert mit einem custom-Allocator, der auf den AllocationCluster delegiert
</p>
</body>
</html></richcontent>
<icon BUILTIN="yes"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686089743535" ID="ID_1592596965" MODIFIED="1686089766715" TEXT="JobTicket-Erzeugung (vorl&#xe4;ufig) endg&#xfc;litig implementieren">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686089827509" ID="ID_213320277" MODIFIED="1686089890626" TEXT="Spec-Erzeugung in das Segment verlagern">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686089789689" ID="ID_1968297332" MODIFIED="1686090078439" STYLE="bubble" TEXT="Aufruf: bekommt ExitNode">
<edge COLOR="#4b6f99"/>
<linktarget COLOR="#334242" DESTINATION="ID_1968297332" ENDARROW="Default" ENDINCLINATION="-57;70;" ID="Arrow_ID_1911874934" SOURCE="ID_634741286" STARTARROW="None" STARTINCLINATION="14;65;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686089934319" ID="ID_1303596509" MODIFIED="1686090078438" STYLE="bubble" TEXT="entnimmt Pipeline-Identity">
<edge COLOR="#4b6f99"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686089946582" ID="ID_1500234215" MODIFIED="1686090078439" STYLE="bubble" TEXT="entnimmt ExitNode*">
<edge COLOR="#4b6f99"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686089957609" ID="ID_634741286" MODIFIED="1686090078440" STYLE="bubble" TEXT="on-demand-Mapping &#x27fc; prerequisite-ExitNode(s)">
<edge COLOR="#4b6f99"/>
<arrowlink COLOR="#334242" DESTINATION="ID_1968297332" ENDARROW="Default" ENDINCLINATION="-57;70;" ID="Arrow_ID_1911874934" STARTARROW="None" STARTINCLINATION="14;65;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686090113552" HGAP="35" ID="ID_1222153026" MODIFIED="1686090132027" TEXT="Spec (wie bisher) an JobTicket-ctor weitergeben" VSHIFT="43">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1686090919949" HGAP="27" ID="ID_929102409" MODIFIED="1686091184043" VSHIFT="10">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
bisherige Mock-L&#246;sung<br />nun darauf aufsetzen
</p>
</body>
</html></richcontent>
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
nach dem <i>ersten Schreck</i>&#160;<font size="1" color="#70005e">(weil ich es doch grade erst neu programmiert hatte...)</font>&#160;zeigt sich, da&#223; die bisherige Mock-Implementierung bereits sehr gut ist, und strukturell direkt in die endg&#252;ltige Implementierung &#252;bersetzt werden kann; wir machen dann lediglich zweimal eine strukturgleiche rekursive Verarbeitung (GenNode &#10236; ExitNode-Struktur sowie dann ExitNode-Struktur &#10236; JobTicket)
</p>
</body>
</html></richcontent>
<arrowlink COLOR="#599eb9" DESTINATION="ID_1552363345" ENDARROW="Default" ENDINCLINATION="623;43;" ID="Arrow_ID_940031570" STARTARROW="None" STARTINCLINATION="738;-108;"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1686014291202" ID="ID_252150549" MODIFIED="1686014413608" TEXT="Problem: wie kommt man an die portNum?">
@ -74743,8 +74840,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<linktarget COLOR="#b9234e" DESTINATION="ID_1133872595" ENDARROW="Default" ENDINCLINATION="78;-135;" ID="Arrow_ID_1952784533" SOURCE="ID_891227892" STARTARROW="Default" STARTINCLINATION="-66;89;"/>
<icon BUILTIN="help"/>
<node CREATED="1685985051895" ID="ID_377967489" MODIFIED="1685986596181" TEXT="ein JobTicket gilt jeweils nur f&#xfc;r eine ExitNode">
<linktarget COLOR="#1d4574" DESTINATION="ID_377967489" ENDARROW="Default" ENDINCLINATION="-5;-27;" ID="Arrow_ID_265259078" SOURCE="ID_1941085260" STARTARROW="None" STARTINCLINATION="44;34;"/>
<linktarget COLOR="#6290c0" DESTINATION="ID_377967489" ENDARROW="Default" ENDINCLINATION="1458;-612;" ID="Arrow_ID_1683217879" SOURCE="ID_545092486" STARTARROW="None" STARTINCLINATION="36;5;"/>
<linktarget COLOR="#1d4574" DESTINATION="ID_377967489" ENDARROW="Default" ENDINCLINATION="-5;-27;" ID="Arrow_ID_265259078" SOURCE="ID_1941085260" STARTARROW="None" STARTINCLINATION="44;34;"/>
<icon BUILTIN="yes"/>
<node CREATED="1685985128633" ID="ID_1088306991" MODIFIED="1685985343741" TEXT="Knackpunkt sind die Prerequisites">
<richcontent TYPE="NOTE"><html>