71#include <gmock/gmock.h>
72#include <gtest/gtest.h>
82template <
class T,
class G >
92template <
class T,
class G>
106static inline void random_init(std::uniform_random_bit_generator
auto& gen, std::integral
auto& t)
108 using T = std::remove_reference_t<
decltype(t)>;
109 t = std::uniform_int_distribution<T>(std::numeric_limits<T>::min())(gen);
116static inline void random_init(std::uniform_random_bit_generator
auto& gen, std::floating_point
auto& t)
118 t = std::normal_distribution<std::remove_reference_t<
decltype(t)>>{}(gen);
125static inline void random_init(std::uniform_random_bit_generator
auto& gen, std::ranges::input_range
auto& t)
127 std::for_each(std::begin(t), std::end(t), [&](std::ranges::range_value_t<
decltype(t)>& v) { random_init(gen, v); });
134static inline void random_init(std::uniform_random_bit_generator
auto& gen,
initializable_from<
decltype(gen)>
auto& t)
143template <
typename T, std::uniform_random_bit_generator G>
145static inline void random_init(G& gen, T& t)
153template <
typename T, std::uniform_random_bit_generator G>
155static inline T make_random(G& gen)
163template <
typename T, std::uniform_random_bit_generator G>
165static inline T make_random(G& gen)
168 random_init(gen, result);
182 std::filesystem::path m_workdir;
185 std::filesystem::path m_tmpdir;
188 PC_tree_t m_conf = {PC_NODE_NOT_FOUND,
nullptr,
nullptr};
191 std::mt19937_64 m_random_generator;
194 static void s_pdi_errhandler(
PDI_status_t status,
const char* message,
void* context)
196 static_cast<PdiTest*
>(context)->PdiError(status, message);
206 template <
typename T>
209 return ::PDI::make_random<T>(m_random_generator);
219 inline void InitPdi(PC_tree_t tree);
231 : m_workdir(
std::filesystem::canonical(
std::filesystem::current_path()))
233 static thread_local auto random_generator([]() {
234 if (
int gseed = ::testing::UnitTest::GetInstance()->random_seed()) {
235 return std::mt19937_64(gseed);
237 std::random_device source;
238 std::array<unsigned, std::mt19937_64::state_size> random_seed_data;
239 std::generate(std::begin(random_seed_data), std::end(random_seed_data), std::ref(source));
240 std::seed_seq seed(std::begin(random_seed_data), std::end(random_seed_data));
241 return std::mt19937_64(seed);
244 auto const filename = [&]() {
245 static constexpr char const VALID_FILE_CHARS[] =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-";
246 std::uniform_int_distribution<size_t> random(0, std::ranges::size(VALID_FILE_CHARS) - 1);
247 std::string filename(16,
'\0');
248 std::generate(filename.begin(), filename.end(), [&]() { return VALID_FILE_CHARS[random(random_generator)]; });
249 auto&& test_info = *::testing::UnitTest::GetInstance()->current_test_info();
250 return std::string(
"pdi_tst_dir.") + test_info.test_suite_name() +
"." + test_info.name() +
"." + filename;
252 m_tmpdir = m_workdir / filename;
253 std::filesystem::create_directory(m_tmpdir);
254 std::filesystem::current_path(m_tmpdir);
255 EXPECT_CALL(*
this, PdiError(testing::_, testing::_)).Times(0);
262 ASSERT_EQ(PC_OK, PC_status(m_conf));
269 if (!PC_status(m_conf)) {
271 EXPECT_EQ(PC_OK, PC_tree_destroy(&m_conf));
272 m_conf = {PC_NODE_NOT_FOUND,
nullptr,
nullptr};
279 std::filesystem::current_path(m_workdir);
280 std::filesystem::remove_all(m_tmpdir);
void InitPdi(PC_tree_t tree)
Initialize PDI with the provided PC_tree.
Definition testing.h:258
PdiTest()
Definition testing.h:230
MOCK_METHOD(void, PdiError,(PDI_status_t, char const *),(const))
T make_a()
make a new repeatably randomly initialized object
Definition testing.h:207
void FinalizePdi()
Finalize PDI.
Definition testing.h:267
~PdiTest()
Definition testing.h:276
An object is buildable_from<G> if it can be constructed using the init_from member function from a re...
Definition testing.h:93
An object is initializable_from<G> if it can be initalized using the init_from member function from a...
Definition testing.h:83
PDI_errhandler_t PDI_errhandler(PDI_errhandler_t handler)
Sets the error handler to use.
PDI_status_t
Error codes of PDI.
Definition pdi.h:80
@ PDI_OK
everything went well
Definition pdi.h:82
PDI_status_t PDI_init(PC_tree_t conf)
Initializes PDI.
PDI_status_t PDI_finalize(void)
Finalizes PDI.
Definition array_datatype.h:38