1cf1503b23
To ease the creation of contexts, variadic let us declare several values in one call (no extra brace) while ticky context let us add new information while they arrive. The example shows a random trial making a test fail. We force the failure for the unit tests, which does not remove the documentation value of the example.
77 lines
2.2 KiB
C++
77 lines
2.2 KiB
C++
// (C) Copyright Raffi Enficiaud 2019.
|
|
// Distributed under the Boost Software License, Version 1.0.
|
|
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
// http://www.boost.org/LICENSE_1_0.txt)
|
|
|
|
// See http://www.boost.org/libs/test for the library home page.
|
|
|
|
//[example_code
|
|
#define BOOST_TEST_MODULE example84
|
|
#include <boost/test/included/unit_test.hpp>
|
|
#include <random>
|
|
#include <cmath>
|
|
|
|
// this function does not compute properly the polynomial root estimation
|
|
// in the case of a double root.
|
|
template <class random_generator_t>
|
|
std::pair<double, double> estimate_polynomial_roots(
|
|
random_generator_t& gen,
|
|
std::function<double(double)> polynomial) {
|
|
|
|
using namespace std;
|
|
|
|
std::uniform_real_distribution<> dis(-10, 10);
|
|
double x1 = dis(gen);
|
|
double x2 = dis(gen);
|
|
double fx1 = polynomial(x1);
|
|
double fx2 = polynomial(x2);
|
|
|
|
BOOST_TEST_INFO_SCOPE("sample1 = " << x1);
|
|
BOOST_TEST_INFO_SCOPE("sample2 = " << x2);
|
|
|
|
// from Vieta formula
|
|
double minus_b = x2 + x1 - (fx2 - fx1) / (x2 - x1);
|
|
double c = (x1 * fx2 - x2 * fx1 + x2 * x1 * x1 - x1 * x2 * x2) / (x1 - x2);
|
|
|
|
BOOST_TEST(minus_b * minus_b >= 4*c);
|
|
|
|
return std::make_pair(
|
|
(minus_b - sqrt(minus_b * minus_b - 4 * c)) / 2,
|
|
(minus_b + sqrt(minus_b * minus_b - 4 * c)) / 2);
|
|
}
|
|
|
|
BOOST_AUTO_TEST_CASE(quadratic_estimation)
|
|
{
|
|
std::random_device rd;
|
|
unsigned int seed = rd();
|
|
std::mt19937 gen(seed);
|
|
std::uniform_int_distribution<> dis(-10, 10);
|
|
|
|
BOOST_TEST_MESSAGE("Seed = " << seed);
|
|
|
|
for(int i = 0; i < 50; i++) {
|
|
BOOST_TEST_INFO_SCOPE("trial " << i+1);
|
|
int root1 = dis(gen);
|
|
int root2 = dis(gen);
|
|
if(root1 > root2) {
|
|
std::swap(root1, root2);
|
|
}
|
|
BOOST_TEST_INFO_SCOPE("root1 = " << root1);
|
|
BOOST_TEST_INFO_SCOPE("root2 = " << root2);
|
|
|
|
std::pair<double, double> estimated = estimate_polynomial_roots(
|
|
gen,
|
|
[root1, root2](double x) -> double { return (x - root1) * (x - root2); });
|
|
|
|
BOOST_TEST(estimated.first == double(root1), 10. % boost::test_tools::tolerance());
|
|
BOOST_TEST(estimated.second == double(root2), 10. % boost::test_tools::tolerance());
|
|
}
|
|
}
|
|
//]
|
|
|
|
BOOST_AUTO_TEST_CASE(making_it_fail)
|
|
{
|
|
// cheating a bit ... but shhhh, do not show in the docs ...
|
|
BOOST_FAIL("Making it fail always on all platforms");
|
|
}
|