#include <iomanip>
#include <boost/foreach.hpp>
-#include "geometry_test_common.hpp"
+#include <geometry_test_common.hpp>
+#include <expectation_limits.hpp>
#include <boost/geometry/algorithms/envelope.hpp>
#include <boost/geometry/algorithms/area.hpp>
static std::string name() { return "flat"; }
};
-struct ut_settings
+struct ut_settings : public ut_base_settings
{
- double tolerance;
- bool test_validity;
- bool test_area;
- bool use_ln_area;
- int points_per_circle;
-
explicit ut_settings(double tol = 0.01, bool val = true, int points = 88)
- : tolerance(tol)
- , test_validity(val)
+ : ut_base_settings(val)
+ , tolerance(tol)
, test_area(true)
, use_ln_area(false)
, points_per_circle(points)
static inline ut_settings ignore_validity()
{
ut_settings result;
- result.test_validity = false;
+ result.set_test_validity(false);
return result;
}
static inline ut_settings assertions_only()
{
ut_settings result;
- result.test_validity = false;
result.test_area = false;
+ result.set_test_validity(false);
return result;
}
static inline double ignore_area() { return 9999.9; }
+
+ double tolerance;
+ bool test_area;
+ bool use_ln_area;
+ int points_per_circle;
};
template
AreaStrategy const& area_strategy,
int expected_count,
int expected_holes_count,
- double expected_area,
+ expectation_limits const& expected_area,
ut_settings const& settings)
{
namespace bg = boost::geometry;
//std::cout << complete.str() << "," << std::fixed << std::setprecision(0) << area << std::endl;
//return;
- if (bg::is_empty(buffered) && bg::math::equals(expected_area, 0.0))
+ if (bg::is_empty(buffered) && expected_area.is_zero())
{
// As expected - don't get rescale policy for output (will be invalid)
return;
if (settings.test_area)
{
- // Because areas vary hugely in buffer, the Boost.Test methods are not convenient.
- // Use just the abs - but if areas are really small that is not convenient neither.
- // Therefore there is a logarithmic option too.
- typename bg::default_area_result<GeometryOut>::type area = bg::area(buffered, area_strategy);
- double const difference = settings.use_ln_area
- ? std::log(area) - std::log(expected_area)
- : area - expected_area;
- BOOST_CHECK_MESSAGE
- (
- bg::math::abs(difference) < settings.tolerance,
- complete.str() << " not as expected. "
- << std::setprecision(18)
- << " Expected: " << expected_area
- << " Detected: " << area
- << " Diff: " << difference
- << " Tol: " << settings.tolerance
- << std::setprecision(3)
- << " , " << 100.0 * (difference / expected_area) << "%"
- );
-// if (settings.use_ln_area)
-// {
-// std::cout << complete.str()
-// << std::setprecision(6)
-// << " ln(detected)=" << std::log(area)
-// << " ln(expected)=" << std::log(expected_area)
-// << " diff=" << difference
-// << " detected=" << area
-// << std::endl;
-// }
+ typename bg::default_area_result<GeometryOut>::type area
+ = bg::area(buffered, area_strategy);
+ BOOST_CHECK_MESSAGE(expected_area.contains(area, settings.tolerance, settings.use_ln_area),
+ "difference: " << caseid << std::setprecision(20)
+ << " #area expected: " << expected_area
+ << " detected: " << area
+ << " type: " << (type_for_assert_message<Geometry, GeometryOut>())
+ );
}
-#if ! defined(BOOST_GEOMETRY_TEST_ALWAYS_CHECK_VALIDITY)
- if (settings.test_validity)
-#endif
+ if (settings.test_validity() && ! bg::is_valid(buffered))
{
- if (! bg::is_valid(buffered))
- {
- BOOST_CHECK_MESSAGE(bg::is_valid(buffered), complete.str() << " is not valid");
- }
+ BOOST_CHECK_MESSAGE(bg::is_valid(buffered), complete.str() << " is not valid");
}
#if defined(TEST_WITH_SVG_PER_TURN)
DistanceStrategy const& distance_strategy,
SideStrategy const& side_strategy,
PointStrategy const& point_strategy,
- double expected_area,
+ expectation_limits const& expected_area,
ut_settings const& settings = ut_settings())
{
typename bg::strategy::area::services::default_strategy
>
void test_one(std::string const& caseid, std::string const& wkt,
JoinStrategy const& join_strategy, EndStrategy const& end_strategy,
- int expected_count, int expected_holes_count, double expected_area,
+ int expected_count, int expected_holes_count, expectation_limits const& expected_area,
double distance_left, ut_settings const& settings = ut_settings(),
double distance_right = same_distance)
{
expected_count, expected_holes_count, expected_area,
settings);
-#if !defined(BOOST_GEOMETRY_COMPILER_MODE_DEBUG) && defined(BOOST_GEOMETRY_COMPILER_MODE_RELEASE)
+#if !defined(BOOST_GEOMETRY_COMPILER_MODE_DEBUG) \
+ && !defined(BOOST_GEOMETRY_TEST_ONLY_ONE_ORDER) \
+ && defined(BOOST_GEOMETRY_COMPILER_MODE_RELEASE)
// Also test symmetric distance strategy if right-distance is not specified
- // (only in release mode)
+ // (only in release mode, not if "one order" if speficied)
if (bg::math::equals(distance_right, same_distance))
{
bg::strategy::buffer::distance_symmetric
>
void test_one(std::string const& caseid, std::string const& wkt,
JoinStrategy const& join_strategy, EndStrategy const& end_strategy,
- double expected_area,
+ expectation_limits const& expected_area,
double distance_left, ut_settings const& settings = ut_settings(),
double distance_right = same_distance)
{
DistanceStrategy const& distance_strategy,
SideStrategy const& side_strategy,
PointStrategy const& point_strategy,
- double expected_area,
+ expectation_limits const& expected_area,
ut_settings const& settings = ut_settings())
{
namespace bg = boost::geometry;