LUMIERA.clone/tests/library/random-draw-test.cpp
Ichthyostega 651e28bac9 Library: RandomDraw - introduce policy template
to define this as a generic library component,
any reference to the actual data source moust be extracted
from the body of the implementation and supplied later
at usage site. In the actual case at hand the source
for randomness would be the node hash, and that is
absolutely an internal implementation detail.
2023-11-20 21:05:18 +01:00

200 lines
5.2 KiB
C++

/*
RandomDraw(Test) - verify the component builder for random selected values
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 random-draw-test.cpp
** unit test \ref RandomDraw_test
*/
#include "lib/test/run.hpp"
//#include "lib/test/test-helper.hpp"
#include "lib/random-draw.hpp"
#include "lib/test/diagnostic-output.hpp"////////////////////TODO
//#include "lib/util.hpp"
//#include <cstdlib>
namespace lib {
namespace test{
// using util::isSameObject;
// using std::rand;
// namespace error = lumiera::error;
// using error::LUMIERA_ERROR_FATAL;
// using error::LUMIERA_ERROR_STATE;
namespace {
// const Literal THE_END = "all dead and hero got the girl";
struct SymmetricFive
: function<Limited<int, 5,-5>(size_t)>
{
static size_t defaultSrc (size_t hash) { return hash; }
/**
* @internal helper to expose the signature `size_t(size_t)`
* by wrapping a given lambda or functor.
*/
template<class SIG>
struct Adaptor
{
static_assert (not sizeof(SIG), "Unable to adapt given functor.");
};
template<typename RES>
struct Adaptor<RES(size_t)>
{
template<typename FUN>
static decltype(auto)
build (FUN&& fun)
{
return std::forward<FUN>(fun);
}
};
template<typename RES>
struct Adaptor<RES(void)>
{
template<typename FUN>
static auto
build (FUN&& fun)
{
return [functor=std::forward<FUN>(fun)]
(size_t)
{
return functor();
};
}
};
};
}
using Draw = RandomDraw<SymmetricFive>;
/***********************************************************************************//**
* @test Verify a flexible builder for random-value generators; using a config template,
* these can be outfitted to use a suitable source of randomness and to produce
* values from a desired target type and limited range.
* - TODO
* @see result.hpp
* @see lib::ThreadJoinable usage example
*/
class RandomDraw_test
: public Test
{
void
run (Arg)
{
simpleUse();
verify_policy();
verify_numerics();
verify_buildProfile();
verify_dynamicChange();
}
/** @test TODO demonstrate a basic usage scenario
* @todo WIP 11/23 🔁 define ⟶ implement
*/
void
simpleUse()
{
auto draw = Draw().probability(0.5);
SHOW_EXPR (int(draw(0) ));
SHOW_EXPR (int(draw(127)));
SHOW_EXPR (int(draw(128)));
SHOW_EXPR (int(draw(141)));
SHOW_EXPR (int(draw(255)));
SHOW_EXPR (int(draw(256)));
// CHECK (draw(0) == 0);
// CHECK (draw(127) == 0);
// CHECK (draw(128) == 1);
// CHECK (draw(141) == 2);
// CHECK (draw(255) ==10);
// CHECK (draw(256) == 0);
}
/** @test TODO verify configuration through policy template
* @todo WIP 11/23 🔁 define ⟶ implement
*/
void
verify_policy()
{
// auto d1 = RandomDraw<random_draw::LimitedRandomGenerate<5>>().probability(1.0);
//SHOW_EXPR (uint(d1()))
}
/** @test TODO verify random number transformations
* @todo WIP 11/23 🔁 define ⟶ implement
*/
void
verify_numerics()
{
UNIMPLEMENTED ("verify random number transformations");
}
/** @test TODO verify the Builder-API to define the profile of result values.
* @todo WIP 11/23 🔁 define ⟶ implement
*/
void
verify_buildProfile()
{
UNIMPLEMENTED ("verify random number profile configuration");
}
/** @test TODO change the generation profile dynamically
* @todo WIP 11/23 🔁 define ⟶ implement
*/
void
verify_dynamicChange()
{
UNIMPLEMENTED ("change the generation profile dynamically");
}
};
/** Register this test class... */
LAUNCHER (RandomDraw_test, "unit common");
}} // namespace lib::test