DI: port the old Singleton unit tests

all these tests are ported by drop-in replacement
and should work afterwards exactly as before (and they do indeed)

A minor twist was spotted though (nice to have more unit tests indeed!):
Sometimes we want to pass a custom constructor *not* as modern-style lambda,
but rather as direct function reference, function pointer or even member
function pointer. However, we can not store those types into the closure
for later lazy invocation. This is basically the same twist I run into
yesterday, when modernising the thread-wrapper. And the solution is
similar. Our traits class _Fun<FUN> has a new typedef Functor
with a suitable functor type to be instantiated and copied. In case of
the Lambda this is the (anonymous) lamda class itself, but in case of
a function reference or pointer it is a std::function.
This commit is contained in:
Fischlurch 2018-03-26 07:47:59 +02:00
parent 4d783770d0
commit d6786870f3
9 changed files with 256 additions and 126 deletions

View file

@ -150,7 +150,7 @@ Lifecycle Events
~~~~~~~~~~~~~~~~
The Application as a whole conducts a well defined lifecycle; whenever transitioning to the next phase,
a _Lifecycle Event_ is issued. Components may register a notification hook with the central _Lifecycle Manager_
(see 'include/lifecycle.h) to be invoked whenever a specific event is emitted. The process of registration
(see 'include/lifecycle.h') to be invoked whenever a specific event is emitted. The process of registration
can be simplified by planting a static variable of type `lumiera::LifecycleHook`.
WARNING: A callback enrolled this way needs to be callable at the respective point in the lifecycle,

View file

@ -103,6 +103,7 @@
** persistent history and UNDO.
**
** @see DependencyConfiguration_test
** @see SingletonSubclass_test
** @see subsys.hpp
*/
@ -117,6 +118,7 @@
#include "lib/error.hpp"
#include "lib/nocopy.hpp"
#include "lib/depend2.hpp"
#include "lib/meta/trait.hpp"
#include "lib/meta/function.hpp"
#include "lib/sync-classlock.hpp"
@ -179,14 +181,11 @@ namespace lib {
static void
useSingleton(FUN&& ctor)
{
using Fun = typename SubclassFactory<FUN>::Fun;
using Sub = typename SubclassFactory<FUN>::Sub;
__assert_compatible<Sub>();
static InstanceHolder<Sub> singleton;
installFactory ([ctor]()
{
return singleton.buildInstance (ctor);
});
installFactory (buildCustomSingleton<Sub,Fun> (forward<FUN> (ctor)));
}
@ -329,6 +328,7 @@ namespace lib {
static_assert (meta::_Fun<FUN>(),
"Need a Lambda or Function object to create a heap allocated instance");
using Fun = typename meta::_Fun<FUN>::Functor; // suitable type to store for later invocation
using Res = typename meta::_Fun<FUN>::Ret;
using Sub = typename meta::Strip<Res>::TypePlain;
@ -348,6 +348,22 @@ namespace lib {
Depend<SRV>::factory = move (otherFac);
}
/** wrap custom factory function to plant a singleton instance
* @remark call through this intermediary function because we need to capture a _copy_ of the functor,
* to invoke it later, on-demand. Especially we need the ability to change the type of this functor,
* since sometimes the argument is passed as function reference, which can not be instantiated,
* but needs to be wrapped into a std::function. */
template<class SUB, class FUN>
static Factory
buildCustomSingleton (FUN&& ctor)
{
static InstanceHolder<SUB> singleton;
return ([ctor]() // copy of ctor in the closure
{
return singleton.buildInstance (ctor);
});
}
static void
temporarilyInstallAlternateFactory (SRV*& stashInstance, Factory& stashFac, Factory&& newFac)
{

View file

@ -67,12 +67,15 @@ namespace meta{
/**
* Helper for uniform access to function signature types.
* Extract the type information contained in a function or functor type,
* so it can be manipulated by metaprogramming. The embedded typedefs
* allow to pick up the return type, the sequence of argument types
* and the bare function signature type. This template works on
* so it can be manipulated by metaprogramming. This template works on
* anything _function like_, irrespective if the parameter is given
* as function reference, function pointer, member function pointer,
* functor object, `std::function` or lambda.
* functor object, `std::function` or lambda. The embedded typedefs
* allow to pick up
* - `Ret` : the return type
* - `Args`: the sequence of argument types as type sequence `Types<ARGS...>`
* - `Sig` : the bare function signature type
* - `Functor` : corresponding Functor type which can be instantiated or copied.
*
* This template can also be used in metaprogramming with `enable_if` to enable
* some definition or specialisation only if a function-like type was detected; thus

View file

@ -686,15 +686,15 @@ END
TEST "SingletonTestMock_test" SingletonTestMock_test <<END
out-lit: TestSingletonO::doIt() call=1
out-lit: TestSingletonO::doIt() call=2
out-lit: TestSingO::doIt() call=1
out-lit: TestSingO::doIt() call=2
out-lit: Mock_1::doIt() call=1
out-lit: Mock_1::doIt() call=2
out-lit: Mock_1::doIt() call=3
out-lit: Mock_1::doIt() call=4
out-lit: Mock_1::doIt() call=5
out-lit: Mock_2::doIt() call=1
out-lit: TestSingletonO::doIt() call=3
out: Mock_.::doIt\(\) call=1
out-lit: TestSingO::doIt() call=3
return: 0
END

View file

@ -33,8 +33,8 @@
#include "lib/format-obj.hpp"
#include "lib/util.hpp"
#include "lib/depend.hpp"
#include "lib/test/depend-4test.hpp"
#include "lib/depend2.hpp"
#include "lib/depend-inject.hpp"
#include "test-target-obj.hpp"
#include <cstdlib>
@ -73,12 +73,7 @@ namespace test{
struct SubSub
: Sub
{
/** marker typedef for Depend4Test,
* allowing to pick the correct Depend<ServiceInterface>
* to apply the instrumentation with the test mock. */
typedef Sub ServiceInterface;
};
{ };
struct SubSubSub
: SubSub
@ -111,7 +106,6 @@ namespace test{
verify_SubclassCreation();
verify_FactoryDefinition_is_sticky();
verify_customFactory();
verify_temporaryReplacement();
verify_automaticReplacement();
}
@ -131,9 +125,12 @@ namespace test{
void
verify_SubclassCreation()
{
Depend<SubSub> specialAccessor(buildSingleton<SubSubSub>());
Depend<SubSub> specialAccessor;
Depend<Sub> genericAccessor;
// configure singleton subclass (prior to first use)
DependInject<SubSub>::useSingleton<SubSubSub>();
SubSub& oSub = specialAccessor();
Sub& o = genericAccessor();
@ -155,13 +152,18 @@ namespace test{
SubSub& yetAnotherInstance = yetAnotherSpecialAccessor();
CHECK ( INSTANCEOF (SubSubSub, &yetAnotherInstance));
// both refer to the same configuration and thus access the singleton
CHECK (isSameObject (oSub, yetAnotherInstance));
}
void
verify_customFactory()
{
Depend<SubSubSub> customisedAccessor(&customFactoryFunction);
DependInject<SubSubSub>::useSingleton (customFactoryFunction);
Depend<SubSubSub> customisedAccessor;
Depend<SubSub> otherSpecialAccessor;
SubSub& oSub = otherSpecialAccessor();
@ -175,47 +177,12 @@ namespace test{
CHECK (MAX_ID + 10 == oSubS.instanceID_);
}
static void*
static SubSubSub*
customFactoryFunction (void)
{
static SubSubSub specialInstance;
// NOTE: the factory function is responsible
// for managing the instance's lifecycle
specialInstance.instanceID_ = MAX_ID + 10;
return &specialInstance;
}
void
verify_temporaryReplacement()
{
typedef Depend<Sub> GenericAccessor;
GenericAccessor genericAccessor;
Sub& original = genericAccessor();
uint oID = original.instanceID_;
SubSubSub mockObject;
Sub* shaddowedOriginal = GenericAccessor::injectReplacement (&mockObject);
Sub& replacement = genericAccessor();
CHECK ( isSameObject (replacement, mockObject));
CHECK (!isSameObject (original, replacement));
CHECK ( isSameObject (original, *shaddowedOriginal));
Depend<SubSub> special;
Depend<SubSubSub> custom;
CHECK(!isSameObject (replacement, special() ));
CHECK(!isSameObject (replacement, custom() ));
GenericAccessor::injectReplacement (shaddowedOriginal);
Sub& nextFetch = genericAccessor();
CHECK (isSameObject (original, nextFetch));
CHECK (oID == nextFetch.instanceID_);
SubSubSub* specialInstance = new SubSubSub;
specialInstance->instanceID_ = MAX_ID + 10;
return specialInstance;
}
@ -227,8 +194,26 @@ namespace test{
Sub& original = genericAccessor();
uint oID = original.instanceID_;
{
Depend4Test<SubSub> withinThisScope;
{////////////////////////////////////////////////////TEST-Scope
DependInject<Sub>::Local<SubSubSub> mockObject;
Sub& replacement = genericAccessor();
CHECK ( isSameObject (replacement, *mockObject));
CHECK (!isSameObject (original, replacement));
Depend<SubSub> special;
Depend<SubSubSub> custom;
CHECK(!isSameObject (replacement, special() ));
CHECK(!isSameObject (replacement, custom() ));
}////////////////////////////////////////////////////(End)TEST-Scope
Sub& nextFetch = genericAccessor();
CHECK (isSameObject (original, nextFetch));
CHECK (oID == nextFetch.instanceID_);
{////////////////////////////////////////////////////TEST-Scope-2
DependInject<Sub>::Local<SubSub> otherMock;
Sub& replacement = genericAccessor();
uint repID = replacement.instanceID_;
@ -254,11 +239,10 @@ namespace test{
CHECK (!isSameObject (original, subTypeAccess));
CHECK (repID != subTypeAccess.instanceID_);
CHECK ( oID != subTypeAccess.instanceID_);
}
}////////////////////////////////////////////////////(End)TEST-Scope-2
Sub& nextFetch = genericAccessor();
CHECK (isSameObject (original, nextFetch));
CHECK (oID == nextFetch.instanceID_);
CHECK (isSameObject (original, genericAccessor()));
CHECK (oID == genericAccessor().instanceID_);
}
};

View file

@ -32,7 +32,8 @@
#include "lib/util.hpp"
#include "test-target-obj.hpp"
#include "lib/depend.hpp"
#include "lib/depend2.hpp"
#include "lib/depend-inject.hpp"
#include <boost/lexical_cast.hpp>
@ -65,7 +66,8 @@ namespace test{
Interface () : TestTargetObj(cnt) {}
virtual ~Interface() {}
friend class lib::DependencyFactory;
friend class lib::InstanceHolder<Interface>;
friend class std::default_delete<Interface>;
};
int Interface::cnt = 0;
@ -86,13 +88,12 @@ namespace test{
/***************************************************************//**
* @test specialised variant of the Singleton Factory, for creating
* subclasses (implementation classes) without coupling the
* caller to the concrete class type.
* Expected results: an instance of the subclass is created.
* @test specific dependency-injection setup, to create a singleton
* subclass (implementation class) instance, without coupling
* the caller to the concrete type.
* @remark Expected results: an instance of the subclass is created.
* @see lib::Depend
* @see lib::buildSingleton()
* @see lib/dependency-factory.hpp
* @see lib/depend-inject.hpp
*/
class SingletonSubclass_test : public Test
{
@ -106,12 +107,11 @@ namespace test{
Interface::setCountParam(num);
// marker to declare the concrete type to be created
DependencyFactory::InstanceConstructor factoryFunction = buildSingleton<Impl>();
// configuration to use the subclass on demand
DependInject<Interface>::useSingleton<Impl>();
// define an instance of the Singleton factory,
// specialised to create the concrete Type passed in
Depend<Interface> instance (factoryFunction);
// define an instance of the Singleton factory as always...
Depend<Interface> instance;
// Now use the Singleton factory...
// Note: we get the Base type
@ -119,6 +119,8 @@ namespace test{
Interface& t2 = instance();
CHECK (isSameObject (t1, t2), "not a Singleton, got two different instances." );
CHECK ( INSTANCEOF (Impl,&t1)); // got the subclass as expected
CHECK ("Implementation" == t2.identify());
cout << "calling a non-static method on the Singleton-"
<< t1.identify() << endl
@ -132,11 +134,13 @@ namespace test{
void
verify_error_detection ()
{
VERIFY_ERROR (LIFECYCLE, Depend<Interface> instance (buildSingleton<Impl_XXX>()) );
VERIFY_ERROR (LIFECYCLE, Depend<Interface> instance (buildSingleton<Unrelated>()) );
VERIFY_ERROR (LIFECYCLE, DependInject<Interface>::useSingleton<Impl_XXX>() );
Depend<Interface> newFactory;
CHECK ( INSTANCEOF (Impl, &newFactory() )); // works as before
//////////does not compile due to incompatible baseclass
// DependInject<Interface>::useSingleton<Unrelated>();
}
};

View file

@ -31,7 +31,7 @@
#include "lib/util.hpp"
#include "test-target-obj.hpp"
#include "lib/depend.hpp"
#include "lib/depend2.hpp"
#include <boost/lexical_cast.hpp>
@ -59,7 +59,7 @@ namespace test{
protected:
TargetObj () : TestTargetObj(cnt) {}
friend class lib::DependencyFactory;
friend class lib::InstanceHolder<TargetObj>;
};
int TargetObj::cnt = 0;

View file

@ -27,7 +27,7 @@
#include "lib/test/run.hpp"
#include "lib/depend.hpp"
#include "lib/depend-inject.hpp"
#include "lib/util.hpp"
#include "lib/format-cout.hpp"
@ -45,14 +45,14 @@ namespace test{
* Client Class normally to be instantiated as Singleton.
* But for tests, this class should be replaced by a Mock....
*/
class TestSingletonO
class TestSingO
{
int callCnt_;
Symbol typid_;
_Fmt msg_;
public:
TestSingletonO(Symbol ty="TestSingletonO")
TestSingO(Symbol ty="TestSingO")
: callCnt_(0)
, typid_(ty)
, msg_("%s::doIt() call=%d\n")
@ -61,7 +61,7 @@ namespace test{
}
virtual
~TestSingletonO()
~TestSingO()
{
TRACE (test, "dtor %s", typid_.c());
}
@ -83,17 +83,23 @@ namespace test{
/**
* Mock-1 to replace the Client Class...
*/
struct Mock_1 : TestSingletonO
struct Mock_1 : TestSingO
{
Mock_1() : TestSingletonO("Mock_1") { };
Mock_1() : TestSingO("Mock_1") { };
};
/**
* Mock-2 to replace the Client Class...
* @note no default ctor
*/
struct Mock_2 : TestSingletonO
struct Mock_2 : TestSingO
{
Mock_2() : TestSingletonO("Mock_2") { };
int id;
Mock_2(Literal specialID, int i)
: TestSingO{Symbol (_Fmt{"%s_%d"} % specialID % i)}
, id{i}
{ };
};
@ -112,7 +118,7 @@ namespace test{
* Client Object, then replace it by two different mocks,
* and finally restore the original Client Object.
* @see lib::Depend
* @see lib::test::Depend4Test
* @see depend-inject.hpp
* @see DependencyFactory_test
*/
class SingletonTestMock_test : public Test
@ -121,28 +127,36 @@ namespace test{
void
run (Arg)
{
Depend<TestSingletonO> sing;
Depend<TestSingO> sing;
sing().doIt();
sing().doIt();
CHECK (sing().getCnt() == 2);
Mock_1 mock_1;
TestSingletonO* original =
sing.injectReplacement (&mock_1);
sing().doIt();
sing().doIt();
sing().doIt();
sing().doIt();
sing().doIt();
CHECK (sing().getCnt() == 5);
{
// shadow by local Mock instance
DependInject<TestSingO>::Local<Mock_1> mock_1;
sing().doIt();
sing().doIt();
sing().doIt();
sing().doIt();
sing().doIt();
CHECK (sing().getCnt() == 5);
// shadow again by different local Mock, this time with special ctor call
int instanceID = 0;
DependInject<TestSingO>::Local<Mock_2> mock_2 ([&]{ return new Mock_2{"Mock", instanceID}; });
// NOTE: the ctor call for the Mock really happens delayed...
instanceID = rand() % 10;
sing().doIt(); // ctor invoked on first access
CHECK (sing().getCnt() == 1);
// can access the Mock for instrumentation
CHECK (instanceID == mock_2->id);
}// original instance automatically un-shadowed here
Mock_2 mock_2;
sing.injectReplacement (&mock_2);
sing().doIt();
CHECK (sing().getCnt() == 1);
sing.injectReplacement (original); // un-shadowing original instance
CHECK (sing().getCnt() == 2);
sing().doIt();
CHECK (sing().getCnt() == 3);

View file

@ -27775,28 +27775,29 @@
</node>
</node>
<node CREATED="1520722160591" ID="ID_135546699" MODIFIED="1520722168810" TEXT="Unit-Test">
<node CREATED="1521419576303" ID="ID_726128967" MODIFIED="1521419582850" TEXT="alte Tests">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1521418937870" ID="ID_906296527" MODIFIED="1521418940664" TEXT="Singleton_test">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1521419576303" ID="ID_726128967" MODIFIED="1522042418343" TEXT="alte Tests portieren">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1521418937870" ID="ID_906296527" MODIFIED="1522033081893" TEXT="Singleton_test">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1521419045649" ID="ID_839295062" MODIFIED="1521419048033" TEXT="SingletonSubclass_test">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1521419045649" ID="ID_839295062" MODIFIED="1522035642960" TEXT="SingletonSubclass_test">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1521419134046" ID="ID_1638082455" MODIFIED="1521419136661" TEXT="SingletonTestMock_test">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1521419134046" ID="ID_1638082455" MODIFIED="1522037930919" TEXT="SingletonTestMock_test">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1521419300765" ID="ID_417098537" MODIFIED="1521419778465" TEXT="DependencyFactory_test">
<linktarget COLOR="#b9274f" DESTINATION="ID_417098537" ENDARROW="Default" ENDINCLINATION="159;18;" ID="Arrow_ID_606259386" SOURCE="ID_914313570" STARTARROW="Default" STARTINCLINATION="18;-57;"/>
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1521419300765" ID="ID_417098537" MODIFIED="1522042501641" TEXT="DependencyFactory_test">
<linktarget COLOR="#b9274f" DESTINATION="ID_417098537" ENDARROW="Default" ENDINCLINATION="-118;36;" ID="Arrow_ID_606259386" SOURCE="ID_914313570" STARTARROW="Default" STARTINCLINATION="-127;0;"/>
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1521419730442" HGAP="42" ID="ID_657803548" MODIFIED="1521419793254" TEXT="nach der Umstellung etwas straffen" VSHIFT="-13">
<icon BUILTIN="yes"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1521419563657" ID="ID_733291707" MODIFIED="1521433847496" TEXT="DependencyConfiguration_test">
<icon BUILTIN="pencil"/>
<node CREATED="1521419590709" ID="ID_914313570" MODIFIED="1521419778465" TEXT="ziemlich redundant">
<arrowlink COLOR="#b9274f" DESTINATION="ID_417098537" ENDARROW="Default" ENDINCLINATION="159;18;" ID="Arrow_ID_606259386" STARTARROW="Default" STARTINCLINATION="18;-57;"/>
<node COLOR="#338800" CREATED="1521419563657" ID="ID_733291707" MODIFIED="1522034193646" TEXT="DependencyConfiguration_test">
<icon BUILTIN="button_ok"/>
<node CREATED="1521419590709" ID="ID_914313570" MODIFIED="1522042501641" TEXT="ziemlich redundant">
<arrowlink COLOR="#b9274f" DESTINATION="ID_417098537" ENDARROW="Default" ENDINCLINATION="-118;36;" ID="Arrow_ID_606259386" STARTARROW="Default" STARTINCLINATION="-127;0;"/>
<node CREATED="1521419624065" HGAP="29" ID="ID_477987875" MODIFIED="1521419637660" TEXT="weiterhin sinnvoll?" VSHIFT="14">
<node CREATED="1521419638943" ID="ID_717613154" MODIFIED="1521419705073" TEXT="TDD w&#xe4;hrend der re-Implementirung"/>
<node CREATED="1521419657356" ID="ID_1381265753" MODIFIED="1521419674957" TEXT="der alte Test mu&#xdf; weiterhin laufen (ohne nachzudenken!)"/>
@ -27824,6 +27825,54 @@
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522033106576" ID="ID_278956866" MODIFIED="1522034101344" TEXT="weitere Tests...">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
die von der alten DependencyFactory abh&#228;ngen
</p>
</body>
</html>
</richcontent>
<linktarget COLOR="#b8154d" DESTINATION="ID_278956866" ENDARROW="Default" ENDINCLINATION="32;436;" ID="Arrow_ID_1985884795" SOURCE="ID_513111416" STARTARROW="None" STARTINCLINATION="223;-69;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522033940685" ID="ID_447878554" MODIFIED="1522034123685" TEXT="media-access-mock-test.cpp">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522033969821" ID="ID_1706164763" MODIFIED="1522034133500" TEXT="create-asset-test.cpp">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522033977816" ID="ID_15822506" MODIFIED="1522034139730" TEXT="dependent-assets-test.cpp">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522033997907" ID="ID_458476877" MODIFIED="1522034144346" TEXT="identity-of-assets-test.cpp">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522034004825" ID="ID_1008413222" MODIFIED="1522034149105" TEXT="make-clip-test.cpp">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522034011921" ID="ID_1809290651" MODIFIED="1522034153425" TEXT="ordering-of-assets-test.cpp">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522034021470" ID="ID_466658369" MODIFIED="1522034157376" TEXT="builder-tool-test.cpp">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522034029190" ID="ID_1418985959" MODIFIED="1522034158463" TEXT="testclip.cpp">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522034035772" ID="ID_1574270320" MODIFIED="1522034164514" TEXT="mobject-interface-test.cpp">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522034044775" ID="ID_984134175" MODIFIED="1522034168774" TEXT="mobject-ref-test.cpp">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522034052507" ID="ID_1667049787" MODIFIED="1522034171815" TEXT="placement-hierarchy-test.cpp">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
<node CREATED="1520722155112" ID="ID_1512641426" MODIFIED="1520722159028" TEXT="Integration">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1521160755182" ID="ID_678080556" MODIFIED="1521160802831" TEXT="Umbenennen">
@ -27831,6 +27880,63 @@
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1521160765588" ID="ID_1857896991" MODIFIED="1521160801792" TEXT="Konfig-Aufrufe anpassen">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522033578207" HGAP="18" ID="ID_252429770" MODIFIED="1522035653422" TEXT="Name f&#xfc;r Freunschaft+?" VSHIFT="-20">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1522033614743" ID="ID_1110690522" MODIFIED="1522033614743" TEXT="friend class lib::InstanceHolder&lt;TargetObj&gt;;">
<node CREATED="1522033621114" ID="ID_1807735289" MODIFIED="1522033629872" TEXT="nicht so sexy">
<icon BUILTIN="smiley-oh"/>
</node>
<node CREATED="1522035656233" ID="ID_678532992" MODIFIED="1522035672143" TEXT="und std::checked_deltet&lt;TargetObj&gt; auch noch">
<icon BUILTIN="smiley-angry"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522033635991" ID="ID_321432260" MODIFIED="1522033646528" TEXT="k&#xf6;nnte das Depend selber sein?">
<icon BUILTIN="help"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522033193572" ID="ID_508353720" MODIFIED="1522033212243" TEXT="DependencyFactory">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522033199726" ID="ID_314595550" MODIFIED="1522033214370" TEXT="engine-config.h">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522033210086" ID="ID_638295060" MODIFIED="1522033214889" TEXT="demo-gui-roundtrip.cpp">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522033231644" ID="ID_1199449420" MODIFIED="1522033861273" TEXT="config-facade.h">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522033250207" ID="ID_322012422" MODIFIED="1522033862009" TEXT="asset/db.hpp">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522033810436" ID="ID_1074903860" MODIFIED="1522033862649" TEXT="assetmanager.hpp">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522033264576" ID="ID_1266730565" MODIFIED="1522033863264" TEXT="stypemanager.hpp">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522033697671" ID="ID_522765001" MODIFIED="1522033863808" TEXT="diagnostic-buffer-provider.hpp">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522033733342" ID="ID_711202966" MODIFIED="1522033864312" TEXT="fake-configrules.hpp">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522033740662" ID="ID_1194803087" MODIFIED="1522033864856" TEXT="dummy-session-connection.hpp">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522033747205" ID="ID_1409425930" MODIFIED="1522033865352" TEXT="scope-locator.hpp">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522033753484" ID="ID_1909328069" MODIFIED="1522033865896" TEXT="sess-manager-impl.hpp">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522033760875" ID="ID_1097826895" MODIFIED="1522033866703" TEXT="output-director.hpp">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522034066988" ID="ID_513111416" MODIFIED="1522034101345" TEXT="alle Mock-Tests">
<arrowlink COLOR="#b8154d" DESTINATION="ID_278956866" ENDARROW="Default" ENDINCLINATION="32;436;" ID="Arrow_ID_1985884795" STARTARROW="None" STARTINCLINATION="223;-69;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1521858774321" ID="ID_302686020" MODIFIED="1521858778744" TEXT="aufr&#xe4;umen">
<icon BUILTIN="flag-yellow"/>
@ -27866,6 +27972,8 @@
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522033564057" ID="ID_1294295502" MODIFIED="1522033567713" TEXT="Nacharbeiten">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522018567685" ID="ID_1619059123" MODIFIED="1522018578992" TEXT="Frage: was ist mit AppState?">
<icon BUILTIN="help"/>
<node CREATED="1522018581283" ID="ID_132446315" MODIFIED="1522018592182" TEXT="macht es Sinn, das via Depend zug&#xe4;nglich zu machen?"/>
@ -27891,6 +27999,7 @@
<icon BUILTIN="smiley-oh"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1521160792856" ID="ID_367925099" MODIFIED="1521160800344" TEXT="System l&#xe4;uft wie zuvor">
<icon BUILTIN="flag-yellow"/>
</node>