|
|
|
|
|
|
|
|
|
|
|
|
|
#include <catch2/catch.hpp> |
|
|
|
#include <random> |
|
|
|
|
|
class RandomIntGenerator : public Catch::Generators::IGenerator<int> { |
|
std::minstd_rand m_rand; |
|
std::uniform_int_distribution<> m_dist; |
|
int current_number; |
|
public: |
|
|
|
RandomIntGenerator(int low, int high): |
|
m_rand(std::random_device{}()), |
|
m_dist(low, high) |
|
{ |
|
static_cast<void>(next()); |
|
} |
|
|
|
int const& get() const override; |
|
bool next() override { |
|
current_number = m_dist(m_rand); |
|
return true; |
|
} |
|
}; |
|
|
|
|
|
int const& RandomIntGenerator::get() const { |
|
return current_number; |
|
} |
|
|
|
|
|
|
|
|
|
Catch::Generators::GeneratorWrapper<int> random(int low, int high) { |
|
return Catch::Generators::GeneratorWrapper<int>(std::unique_ptr<Catch::Generators::IGenerator<int>>(new RandomIntGenerator(low, high))); |
|
} |
|
|
|
|
|
|
|
TEST_CASE("Generating random ints", "[example][generator]") { |
|
SECTION("Nice UX") { |
|
auto i = GENERATE(take(100, random(-100, 100))); |
|
REQUIRE(i >= -100); |
|
REQUIRE(i <= 100); |
|
} |
|
SECTION("Creating the random generator directly") { |
|
auto i = GENERATE(take(100, GeneratorWrapper<int>(std::unique_ptr<IGenerator<int>>(new RandomIntGenerator(-100, 100))))); |
|
REQUIRE(i >= -100); |
|
REQUIRE(i <= 100); |
|
} |
|
} |
|
|
|
|
|
|