The outward interface has stood the test of time quite well. But the back-side towards the implementation is a tangled mess, presumably due to being developed from prototyping code: the actual implementation is completely overgrown by diagnostics and test instrumentation, since running in unit test setup was the only actual usage of this code ever since. My first attempt with decomposing into a decorator-chain failed. Thus the new line of attack is to introduce two implementation pillars right from top-level - `BufferStage` : the state and metadata handling - `BufferStore` : the storage backend These are defined as nested interfaces, and the further refactoring starts with subclassing everything, nested as it is.
91 lines
3.2 KiB
C++
91 lines
3.2 KiB
C++
/*
|
||
OutputProxyProvider(Test) - verify accessing an output sink via BufferProvider protocol
|
||
|
||
Copyright (C)
|
||
2024, Hermann Vosseler <Ichthyostega@web.de>
|
||
|
||
**Lumiera** 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. See the file COPYING for further details.
|
||
|
||
* *****************************************************************/
|
||
|
||
/** @file output-proxy-provider-test.cpp
|
||
** unit test \ref OutputProxyProvider_test
|
||
*/
|
||
|
||
|
||
#include "lib/test/run.hpp"
|
||
|
||
//#include "steam/play/diagnostic-output-slot.hpp"
|
||
#include "steam/engine/buffer-proxy-provider.hpp"
|
||
#include "steam/engine/test-rand-ontology.hpp"
|
||
|
||
|
||
|
||
namespace steam {
|
||
namespace engine{
|
||
namespace test {
|
||
|
||
|
||
|
||
|
||
/***************************************************************//**
|
||
* @test verify the design of OutputSlot and BufferProvider by
|
||
* implementing a delegating BufferProvider to expose
|
||
* output data buffers provided from _some implementation._
|
||
* @todo WIP-WIP 12/2024 this turned out to be impossible,
|
||
* due to inconsistencies in the default implementation. /////////////////////////////////////////////TICKET #1387 : need to consolidate BufferProvider default implementation
|
||
* @todo 2/2026 broken by refactoring of BufferProvider //////////////////////////////////////////////TICKET #1410 : refactoring to separate external and implementation API
|
||
* @todo however, something along this lines *must*
|
||
* be made possible, somehow, for OutputSlot...
|
||
*/
|
||
class OutputProxyProvider_test : public Test
|
||
{
|
||
virtual void
|
||
run (Arg)
|
||
{
|
||
size_t seenID{0};
|
||
BufferState lastState{NIL};
|
||
auto listener = [&](size_t id, BufferState state)
|
||
{
|
||
seenID = id;
|
||
lastState = state;
|
||
};
|
||
// setup with notification callback
|
||
BufferProxyProvider proxPro{listener};
|
||
|
||
// Assuming some data block is »given«
|
||
seedRand();
|
||
TestFrame::reseed();
|
||
size_t frameNr = defaultGen.u64();
|
||
TestFrame dataBlock (frameNr);
|
||
CHECK ( dataBlock.isPristine());
|
||
|
||
BuffHandle handle = proxPro.lockBuffer (dataBlock); ///////////////////////////////////////////////TICKET #1387 : unable to implement this
|
||
|
||
// Now a »client« can do awful things to the buffer...
|
||
CHECK (handle.isValid());
|
||
auto& data = handle.accessAs<TestFrame>();
|
||
uint64_t param = defaultGen.u64();
|
||
ont::manipulateFrame (&data, &data, param);
|
||
|
||
// »client« is done...
|
||
handle.emit();
|
||
|
||
// end usage cycle
|
||
handle.release();
|
||
CHECK (not handle.isValid());
|
||
CHECK (not dataBlock.isPristine());
|
||
CHECK ( dataBlock.isValid());
|
||
}
|
||
};
|
||
|
||
|
||
/** Register this test class... */
|
||
LAUNCHER (OutputProxyProvider_test, "unit play");
|
||
|
||
|
||
|
||
}}} // namespace steam::play::test
|