unittest/gunit/gis_relops-t.cc (125 lines of code) (raw):
/*
Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
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; version 2 of the License.
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, write to the Free Software Foundation,
51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA
*/
#include <memory> // unique_ptr
#include <gtest/gtest.h>
#include "dd/dd.h"
#include "dd/impl/types/spatial_reference_system_impl.h"
#include "dd/properties.h"
#include "dd/types/spatial_reference_system.h"
#include "gis/geometries.h"
#include "gis/geometries_cs.h"
#include "gis/relops.h"
#include "my_config.h"
namespace gis_relops_unittest {
struct Cartesian_types {
typedef gis::Cartesian_point Point;
typedef gis::Cartesian_linestring Linestring;
typedef gis::Cartesian_linearring Linearring;
typedef gis::Cartesian_polygon Polygon;
typedef gis::Cartesian_geometrycollection Geometrycollection;
typedef gis::Cartesian_multipoint Multipoint;
typedef gis::Cartesian_multilinestring Multilinestring;
typedef gis::Cartesian_multipolygon Multipolygon;
static gis::Coordinate_system coordinate_system() {
return gis::Coordinate_system::kCartesian;
}
};
struct Geographic_types {
typedef gis::Geographic_point Point;
typedef gis::Geographic_linestring Linestring;
typedef gis::Geographic_linearring Linearring;
typedef gis::Geographic_polygon Polygon;
typedef gis::Geographic_geometrycollection Geometrycollection;
typedef gis::Geographic_multipoint Multipoint;
typedef gis::Geographic_multilinestring Multilinestring;
typedef gis::Geographic_multipolygon Multipolygon;
static gis::Coordinate_system coordinate_system() {
return gis::Coordinate_system::kGeographic;
}
};
template <typename Types>
class RelopsTest : public ::testing::Test {
protected:
dd::Spatial_reference_system_impl *m_srs;
public:
RelopsTest() {
switch (Types::coordinate_system()) {
case gis::Coordinate_system::kCartesian:
// Use SRID 0.
m_srs = nullptr;
break;
case gis::Coordinate_system::kGeographic:
// EPSG 4326, but with long-lat axes (E-N).
m_srs = dynamic_cast<dd::Spatial_reference_system_impl *>(
dd::create_object<dd::Spatial_reference_system>());
m_srs->set_id(4326);
m_srs->set_name("WGS 84");
m_srs->set_created(0UL);
m_srs->set_last_altered(0UL);
m_srs->set_organization("EPSG");
m_srs->set_organization_coordsys_id(4326);
m_srs->set_definition(
"GEOGCS[\"WGS 84\",DATUM[\"World Geodetic System "
"1984\",SPHEROID[\"WGS "
"84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],"
"AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY["
"\"EPSG\",\"8901\"]],UNIT[\"degree\",0.017453292519943278,"
"AUTHORITY[\"EPSG\",\"9122\"]],AXIS[\"Lon\",EAST],AXIS[\"Lat\","
"NORTH],AUTHORITY[\"EPSG\",\"4326\"]]");
m_srs->set_description("");
m_srs->parse_definition();
break;
}
}
~RelopsTest() { delete m_srs; }
};
typedef ::testing::Types<Cartesian_types, Geographic_types> Types;
TYPED_TEST_CASE(RelopsTest, Types);
// The purpose of this test is to cover all type combinations, not to check if
// the results are correct.
TYPED_TEST(RelopsTest, CodeCoverage) {
typename TypeParam::Geometrycollection gc;
gc.push_back(typename TypeParam::Point(0.0, 0.0));
typename TypeParam::Linestring ls;
ls.push_back(typename TypeParam::Point(0.0, 0.0));
ls.push_back(typename TypeParam::Point(1.0, 1.0));
gc.push_back(ls);
typename TypeParam::Polygon py;
typename TypeParam::Linearring lr;
lr.push_back(typename TypeParam::Point(0.0, 0.0));
lr.push_back(typename TypeParam::Point(1.0, 0.0));
lr.push_back(typename TypeParam::Point(1.0, 1.0));
lr.push_back(typename TypeParam::Point(0.0, 1.0));
lr.push_back(typename TypeParam::Point(0.0, 0.0));
py.push_back(lr);
gc.push_back(py);
typename TypeParam::Geometrycollection gc_empty;
gc.push_back(gc_empty);
typename TypeParam::Geometrycollection gc_inner;
gc_inner.push_back(typename TypeParam::Point(0.0, 0.0));
gc.push_back(gc_inner);
typename TypeParam::Multipoint mpt;
mpt.push_back(typename TypeParam::Point(0.0, 0.0));
gc.push_back(mpt);
typename TypeParam::Multilinestring mls;
mls.push_back(ls);
gc.push_back(mls);
typename TypeParam::Multipolygon mpy;
mpy.push_back(py);
gc.push_back(mpy);
for (auto g1 : gc) {
for (auto g2 : gc) {
bool result = false;
bool is_null = false;
gis::crosses(this->m_srs, g1, g2, "unittest", &result, &is_null);
gis::disjoint(this->m_srs, g1, g2, "unittest", &result, &is_null);
gis::equals(this->m_srs, g1, g2, "unittest", &result, &is_null);
gis::intersects(this->m_srs, g1, g2, "unittest", &result, &is_null);
gis::mbr_covered_by(this->m_srs, g1, g2, "unittest", &result, &is_null);
gis::mbr_disjoint(this->m_srs, g1, g2, "unittest", &result, &is_null);
gis::mbr_equals(this->m_srs, g1, g2, "unittest", &result, &is_null);
gis::mbr_intersects(this->m_srs, g1, g2, "unittest", &result, &is_null);
gis::mbr_overlaps(this->m_srs, g1, g2, "unittest", &result, &is_null);
gis::mbr_touches(this->m_srs, g1, g2, "unittest", &result, &is_null);
gis::mbr_within(this->m_srs, g1, g2, "unittest", &result, &is_null);
gis::overlaps(this->m_srs, g1, g2, "unittest", &result, &is_null);
gis::touches(this->m_srs, g1, g2, "unittest", &result, &is_null);
gis::within(this->m_srs, g1, g2, "unittest", &result, &is_null);
}
}
}
} // namespace gis_relops_unittest