This closes a ''conceptual gap.'' There was a `lib::TestFrame::reseed()` function, which should be invoked whenever a clean / deterministinc seed is required for computations involving `TestFrame` data. On occasion I noticed that most actual usages of `TestFrame`, which became quite common lately, were missing this `reseed()` call, while the enclosing test had indeed a proper Test::seedRand() call. So my conclusion is: if even ''I myself'' miss that fine point frequently, it is justified to automated this setup, even while `TestFrame` is right now the only client of such a setup-facility. There is a twist though. `TestFrame` is part of the ''Engine'' test coverage, i.e. it is linked into `libtest-core.so`. While the support for random numbers and reseeding is obviously a very basic library feature, and linked into `liblumiera.so` **Oh well**. So now we have ''yet another'' static registration service. I kept everything as simple as possible, which means, we continue to use the ''common, global random generator'' from the library, and there is no protection against some other code using those library functions in a non-deterministic way. `lib/random-reseed.cpp` is just a glorified hard-wired setup, beware!
86 lines
3.1 KiB
C++
86 lines
3.1 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-adaptor.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...
|
||
* @todo 2/2026 now using this setup for prototyping /////////////////////////////////////////////////TICKET #1415 : explore this design idea through prototyping
|
||
*/
|
||
class OutputProxyProvider_test : public Test
|
||
{
|
||
virtual void
|
||
run (Arg)
|
||
{
|
||
size_t seenID{0};
|
||
BufferState lastState{NIL};
|
||
// setup with notification callback
|
||
BufferProxyAdaptor proxPro{};
|
||
|
||
// Assuming some data block is »given«
|
||
seedRand();
|
||
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
|