libcruft-util/test/region.cpp

107 lines
3.4 KiB
C++
Raw Normal View History

2015-04-13 16:45:56 +10:00
#include "region.hpp"
#include "point.hpp"
#include "tap.hpp"
2012-05-11 12:21:47 +10:00
#include <vector>
2012-05-11 12:21:47 +10:00
2016-01-19 18:31:49 +11:00
//-----------------------------------------------------------------------------
2012-05-11 12:21:47 +10:00
int
2016-01-19 18:31:49 +11:00
main (int, char **)
{
cruft::TAP::logger tap;
2016-01-19 18:31:49 +11:00
// check that two overlapping regions successfully test for intersection
2012-05-11 12:21:47 +10:00
{
const cruft::point2d ap { 32.7, -6.09703 };
const cruft::extent2d ae { 0.8, 2. };
const cruft::region2d a (ap, ae);
const cruft::point2d bp {33.5, -4.5};
const cruft::extent2d be { 0.5, 0.5 };
const cruft::region2d b (bp, be);
2012-05-11 12:21:47 +10:00
2016-01-19 18:31:49 +11:00
tap.expect (!a.intersects (b), "simple 2d intersection");
2012-05-11 12:21:47 +10:00
}
// check various floating point maximums successfully test for
// intersection. the concern is that infinities are incorrectly handled
// in some comparisons.
tap.expect (
cruft::region2d::max ().intersects (
cruft::region2d::unit ()
),
"maximal region2d intersection"
);
tap.expect (
cruft::region2f::max ().intersects (
cruft::region2f::unit ()
),
"maximal region2f intersection"
);
2012-06-15 16:38:57 +10:00
// ensure unit regions are... unit sized...
tap.expect_eq (cruft::region2d::unit ().area (), 1.0, "unit region2d area");
tap.expect_eq (cruft::region2f::unit ().area (), 1.0f, "unit region2f area");
2012-06-15 16:38:57 +10:00
// test boundary cases of includes and contains
{
const cruft::point2f p0 { 0 };
const cruft::extent2f e0 { 2 };
const cruft::region2f r {p0, e0};
tap.expect (!r.inclusive (cruft::point2f {-1, 1}), "region/point inclusive, invalid x");
tap.expect (!r.inclusive (cruft::point2f { 1, 3}), "region/point inclusive, invalid y ");
2012-06-08 16:48:33 +10:00
tap.expect (r.inclusive (cruft::point2f {1, 1}), "region/point inclusive, centre");
tap.expect (r.inclusive (cruft::point2f {0, 0}), "region/point inclusive, base");
tap.expect (r.inclusive (cruft::point2f {2, 2}), "region/point inclusive, corner");
}
2012-06-08 16:48:33 +10:00
// ensure union operator behaves as expected
2017-07-31 15:42:05 +10:00
{
const cruft::point2f p { -1 };
const cruft::extent2f e { 2 };
const cruft::region2f r { p, e };
2017-07-31 15:42:05 +10:00
tap.expect_eq (r | cruft::point2f { 0, 0 }, r, "identity union");
2017-07-31 15:42:05 +10:00
tap.expect_eq (
r | cruft::point2f { 2, 3 },
cruft::region2f { p, cruft::extent2f { 3, 4 } },
2017-07-31 15:42:05 +10:00
"positive expanding union"
);
tap.expect_eq (
r | cruft::point2f { -3, -2 },
cruft::region2f {
cruft::point2f { -3, -2 },
cruft::extent2f { 4, 3 }
2017-07-31 15:42:05 +10:00
},
"negative expanding union"
);
};
// ensure make_region covers the expected values
{
const cruft::region2i REGION {
cruft::point2i { -1, 1 },
cruft::point2i { 1, 2 }
};
const cruft::point2i EXPECTED[] = {
{ -1, 1 }, { 0, 1 }, { 1, 1 },
{ -1, 2 }, { 0, 2 }, { 1, 2 },
};
std::vector<cruft::point2i> values;
std::copy (std::cbegin (REGION.step ()), std::cend (REGION.step ()), std::back_inserter (values));
bool success = values.size () == std::size (EXPECTED)
&& std::equal (std::cbegin (values), std::cend (values),
std::cbegin (EXPECTED), std::cend (EXPECTED));
tap.expect (success, "make_range(region2i)");
};
2016-01-19 18:31:49 +11:00
return tap.status ();
2012-05-11 12:21:47 +10:00
}