// docker-finance | modern accounting for the power-user // // Copyright (C) 2021-2024 Aaron Fiore (Founder, Evergreen Crypto LLC) // // 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 3 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, see . //! \file //! \author Aaron Fiore (Founder, Evergreen Crypto LLC) //! \note File intended to be loaded into ROOT.cern framework / Cling interpreter //! \since docker-finance 1.0.0 #ifndef CONTAINER_SRC_ROOT_TEST_UNIT_RANDOM_HH_ #define CONTAINER_SRC_ROOT_TEST_UNIT_RANDOM_HH_ #include #include #include #include #include "../common/random.hh" //! \namespace docker_finance //! \since docker-finance 1.0.0 namespace docker_finance { //! \namespace docker_finance::tests //! \brief docker-finance common test framework //! \ingroup cpp_tests //! \since docker-finance 1.0.0 namespace tests { //! \namespace docker_finance::tests::unit //! \brief docker-finance unit test cases //! \ingroup cpp_tests //! \since docker-finance 1.0.0 namespace unit { //! \brief Generic random generator interface (specializations) fixture //! \since docker-finance 1.0.0 template struct RandomInterfaceFixture : public ::testing::Test, protected t_interface { }; //! \brief Primary random generator interface fixture w/ mockup impl //! \since docker-finance 1.0.0 struct RandomInterface : public RandomInterfaceFixture { }; TEST_F(RandomInterface, generate_uint16_t) { ASSERT_EQ(random.generate(), std::numeric_limits::max()); } TEST_F(RandomInterface, generate_uint32_t) { ASSERT_EQ(random.generate(), std::numeric_limits::max()); } TEST_F(RandomInterface, generate_int16_t) { ASSERT_EQ(random.generate(), std::numeric_limits::max()); } TEST_F(RandomInterface, generate_int32_t) { ASSERT_EQ(random.generate(), std::numeric_limits::max()); } //! \brief Generic random generator fixture //! \since docker-finance 1.0.0 template struct RandomFixture : public ::testing::Test, protected t_impl { protected: template void generate() { // NOTE: Why auto? Because no accidental type casting or under/overflow auto one = t_impl::random.template generate(); static_assert(std::is_same_v); auto two = t_impl::random.template generate(); static_assert(std::is_same_v); // NOTE: t_random limits are implementation-specific ASSERT_NEAR(0, one, std::numeric_limits::max()); ASSERT_NEAR(0, two, std::numeric_limits::max()); // Exceedingly rare (tests the obvious, but is not an accurate entropy test) // If fails, re-run tests to confirm ASSERT_NE(one, two); }; }; // // Botan // //! \brief Botan random number fixture //! \since docker-finance 1.0.0 struct RandomBotan : public RandomFixture { }; TEST_F(RandomBotan, generate_uint16_t) { ASSERT_NO_THROW(generate()); } TEST_F(RandomBotan, generate_uint32_t) { ASSERT_NO_THROW(generate()); } // // Crypto++ // //! \brief Crypto++ random number fixture //! \since docker-finance 1.0.0 struct RandomCryptoPP : public RandomFixture { }; TEST_F(RandomCryptoPP, generate_uint16_t) { ASSERT_NO_THROW(generate()); } TEST_F(RandomCryptoPP, generate_uint32_t) { ASSERT_NO_THROW(generate()); } TEST_F(RandomCryptoPP, generate_int16_t) { ASSERT_NO_THROW(generate()); } TEST_F(RandomCryptoPP, generate_int32_t) { ASSERT_NO_THROW(generate()); } // // libsodium // //! \brief libsodium random number fixture //! \since docker-finance 1.0.0 struct RandomLibsodium : public RandomFixture { }; TEST_F(RandomLibsodium, generate_uint16_t) { ASSERT_NO_THROW(generate()); } TEST_F(RandomLibsodium, generate_uint32_t) { ASSERT_NO_THROW(generate()); } } // namespace unit } // namespace tests } // namespace docker_finance #endif // CONTAINER_SRC_ROOT_TEST_UNIT_RANDOM_HH_ // # vim: sw=2 sts=2 si ai et