📄 linestringtest.cpp
字号:
// $Id: LineStringTest.cpp 1990 2007-06-10 11:08:41Z mloskot $// // Test Suite for geos::geom::LineString class.// TUT#include <tut.h>// GEOS#include <geos/geom/LineString.h>#include <geos/geom/Coordinate.h>#include <geos/geom/CoordinateArraySequence.h>#include <geos/geom/Dimension.h>#include <geos/geom/Geometry.h>#include <geos/geom/GeometryFactory.h>#include <geos/geom/PrecisionModel.h>#include <geos/io/WKTReader.h>#include <geos/util/GEOSException.h>#include <geos/util/IllegalArgumentException.h>// STL#include <cmath>#include <string>namespace tut{ // // Test Group // // Common data used by tests struct test_linestring_data { // Typedefs used as short names by test cases typedef geos::geom::Geometry* GeometryPtr; typedef geos::geom::Geometry const* GeometryCPtr; typedef geos::geom::Coordinate* CoordinatePtr; typedef geos::geom::Coordinate const* CoordinateCPtr; typedef geos::geom::CoordinateArraySequence* CoordArrayPtr; typedef geos::geom::CoordinateArraySequence const* CoordArrayCPtr; typedef geos::geom::LineString* LineStringPtr; typedef std::auto_ptr<geos::geom::LineString> LineStringAutoPtr; typedef geos::geom::LineString const* LineStringCPtr; geos::geom::PrecisionModel pm_; geos::geom::GeometryFactory factory_; geos::io::WKTReader reader_; LineStringPtr empty_line_; test_linestring_data() : pm_(1000), factory_(&pm_, 0), reader_(&factory_), empty_line_(factory_.createLineString(new geos::geom::CoordinateArraySequence())) {} }; typedef test_group<test_linestring_data> group; typedef group::object object; group test_linestring_group("geos::geom::LineString"); // // Test Cases // // Test of empty LineString created with user's constructor template<> template<> void object::test<1>() { using geos::geom::Coordinate; // Empty sequence of coordiantes CoordArrayPtr pseq = new geos::geom::CoordinateArraySequence(); ensure( "sequence is null pointer.", pseq != 0 ); // Create empty linstring instance LineStringAutoPtr ls(factory_.createLineString(pseq)); ensure( ls->isEmpty() ); ensure( ls->isSimple() ); ensure( ls->isValid() ); } // Test of non-tempty LineString created with user's constructor template<> template<> void object::test<2>() { using geos::geom::Coordinate; // Non-empty sequence of coordiantes const size_t size3 = 3; CoordArrayPtr pseq = new geos::geom::CoordinateArraySequence(); ensure( "sequence is null pointer.", pseq != 0 ); pseq->add(Coordinate(0, 0, 0)); pseq->add(Coordinate(5, 5, 5)); pseq->add(Coordinate(10, 10, 10)); ensure_equals( pseq->size(), size3 ); // Create non-empty linstring instance LineStringAutoPtr ls(factory_.createLineString(pseq)); ensure( !ls->isEmpty() ); ensure( ls->isSimple() ); ensure( ls->isValid() ); ensure( !ls->isClosed() ); ensure( !ls->isRing() ); GeometryPtr geo = 0; geo = ls->getEnvelope(); ensure( geo != 0 ); ensure( !geo->isEmpty() ); factory_.destroyGeometry(geo); geo = ls->getBoundary(); ensure( geo != 0 ); ensure( !geo->isEmpty() ); factory_.destroyGeometry(geo); geo = ls->convexHull(); ensure( geo != 0 ); ensure( !geo->isEmpty() ); factory_.destroyGeometry(geo); ensure_equals( ls->getGeometryTypeId(), geos::geom::GEOS_LINESTRING ); ensure_equals( ls->getDimension(), geos::geom::Dimension::L ); ensure_equals( ls->getBoundaryDimension(), geos::geom::Dimension::P ); ensure_equals( ls->getNumPoints(), size3 ); ensure_equals( ls->getArea(), 0.0 ); ensure_not_equals( ls->getLength(), 0.0 ); } // Test of incomplete LineString user's constructor throwing the IllegalArgumentException template<> template<> void object::test<3>() { // Single-element sequence of coordiantes CoordArrayPtr pseq = 0; try { pseq = new geos::geom::CoordinateArraySequence(); ensure( "sequence is null pointer.", pseq != 0 ); pseq->add(geos::geom::Coordinate(0, 0, 0)); ensure_equals( pseq->size(), 1u ); // Create incomplete linstring LineStringAutoPtr ls(factory_.createLineString(pseq)); fail("IllegalArgumentException expected."); } catch (geos::util::IllegalArgumentException const& e) { // TODO - mloskot - is waiting for "exception-safety" and bugs resolution // If removed, memory 3 leaks occur //delete pseq; const char* msg = e.what(); // OK ensure( msg != 0 ); } } // Test of copy constructor template<> template<> void object::test<4>() { using geos::geom::Coordinate; // Non-empty sequence of coordiantes const size_t size = 3; CoordArrayPtr pseq = new geos::geom::CoordinateArraySequence(); ensure( "sequence is null pointer.", pseq != 0 ); pseq->add(Coordinate(0, 0, 0)); pseq->add(Coordinate(5, 5, 5)); pseq->add(Coordinate(10, 10, 10)); ensure_equals( pseq->size(), size ); // Create examplar of linstring instance LineStringAutoPtr examplar(factory_.createLineString(pseq)); // Create copy LineStringAutoPtr copy(dynamic_cast<geos::geom::LineString*>(examplar->clone())); ensure( 0 != copy.get() ); ensure( !copy->isEmpty() ); ensure( copy->isSimple() ); ensure( copy->isValid() ); ensure( !copy->isClosed() ); ensure( !copy->isRing() ); GeometryPtr geo = 0; geo = copy->getEnvelope(); ensure( geo != 0 ); ensure( !geo->isEmpty() ); factory_.destroyGeometry(geo); geo = copy->getBoundary(); ensure( geo != 0 ); ensure( !geo->isEmpty() ); factory_.destroyGeometry(geo); geo = copy->convexHull(); ensure( geo != 0 ); ensure( !geo->isEmpty() ); factory_.destroyGeometry(geo); ensure_equals( copy->getGeometryTypeId(), geos::geom::GEOS_LINESTRING ); ensure_equals( copy->getDimension(), geos::geom::Dimension::L ); ensure_equals( copy->getBoundaryDimension(), geos::geom::Dimension::P ); ensure_equals( copy->getNumPoints(), size ); ensure_equals( copy->getArea(), 0.0 ); ensure_not_equals( copy->getLength(), 0.0 ); } // Test of isClosed() and isRing() for empty linestring template<> template<> void object::test<5>() { ensure( !empty_line_->isClosed() ); ensure( !empty_line_->isRing() ); } // Test of getEnvelope() for empty linestring template<> template<> void object::test<6>() { GeometryPtr geo = 0; geo = empty_line_->getEnvelope(); ensure( geo != 0 ); ensure( geo->isEmpty() ); factory_.destroyGeometry(geo); } // Test of getBoundary() for empty linestring template<> template<> void object::test<7>() { GeometryPtr geo = 0; geo = empty_line_->getBoundary(); ensure( geo != 0 ); ensure( geo->isEmpty() ); factory_.destroyGeometry(geo); } // Test of convexHull() for empty linestring template<> template<> void object::test<8>() { GeometryPtr geo = 0; geo = empty_line_->convexHull(); ensure( geo != 0 ); ensure( geo->isEmpty() ); factory_.destroyGeometry(geo); } // Test of getGeometryTypeId() for empty linestring template<> template<> void object::test<9>() { ensure_equals( empty_line_->getGeometryTypeId(), geos::geom::GEOS_LINESTRING ); } // Test of getDimension() for empty linestring template<> template<> void object::test<10>() { ensure_equals( empty_line_->getDimension(), geos::geom::Dimension::L ); } // Test of getBoundaryDimension() for empty linestring template<> template<> void object::test<11>() { ensure_equals( empty_line_->getBoundaryDimension(), geos::geom::Dimension::P ); } // Test of getNumPoints() for empty linestring template<> template<> void object::test<12>() { ensure_equals( empty_line_->getNumPoints(), 0u ); } // Test of getLength() for empty linestring template<> template<> void object::test<13>() { ensure_equals( empty_line_->getLength(), 0.0 ); } // Test of getArea() for empty linestring template<> template<> void object::test<14>() { ensure_equals( empty_line_->getArea(), 0.0 ); } // Test of isClosed() and isRing() for non-empty linestring template<> template<> void object::test<15>() { GeometryPtr geo = reader_.read("LINESTRING (0 0, 5 5, 10 5, 10 10)"); ensure( geo != 0 ); LineStringPtr line = dynamic_cast<LineStringPtr>(geo); ensure(line != 0); ensure( !line->isEmpty() ); ensure( !line->isClosed() ); ensure( !line->isRing() ); // FREE TESTED LINESTRING factory_.destroyGeometry(line); } // Test of getEnvelope() for non-empty linestring template<> template<> void object::test<16>() { GeometryPtr geo = reader_.read("LINESTRING (0 0, 5 5, 10 5, 10 10)"); ensure( geo != 0 ); LineStringPtr line = static_cast<LineStringPtr>(geo); ensure(line != 0); GeometryPtr envelope = line->getEnvelope(); ensure( envelope != 0 ); ensure( !envelope->isEmpty() ); ensure_equals( envelope->getDimension(), geos::geom::Dimension::A ); factory_.destroyGeometry(envelope); // FREE TESTED LINESTRING factory_.destroyGeometry(line); } // Test of getBoundary() for non-empty linestring template<> template<> void object::test<17>() { GeometryPtr geo = reader_.read("LINESTRING (0 0, 5 5, 10 5, 10 10)"); ensure( geo != 0 ); LineStringPtr line = static_cast<LineStringPtr>(geo); ensure(line != 0); GeometryPtr boundary = line->getBoundary(); ensure( boundary != 0 ); ensure( !boundary->isEmpty() ); ensure_equals( boundary->getGeometryTypeId(), geos::geom::GEOS_MULTIPOINT ); ensure_equals( boundary->getDimension(), geos::geom::Dimension::P ); factory_.destroyGeometry(boundary); // FREE TESTED LINESTRING factory_.destroyGeometry(line); } // Test of convexHull() for non-empty linestring template<> template<> void object::test<18>() { GeometryPtr geo = reader_.read("LINESTRING (0 0, 5 5, 10 5, 10 10)"); ensure( geo != 0 ); LineStringPtr line = static_cast<LineStringPtr>(geo); ensure(line != 0); GeometryPtr hull = line->convexHull(); ensure( hull != 0 ); ensure( !hull->isEmpty() ); ensure_equals( hull->getGeometryTypeId(), geos::geom::GEOS_POLYGON ); ensure_equals( hull->getDimension(), geos::geom::Dimension::A ); factory_.destroyGeometry(hull); // FREE TESTED LINESTRING factory_.destroyGeometry(line); } // Test of getGeometryTypeId() for non-empty linestring template<> template<> void object::test<19>() { GeometryPtr geo = reader_.read("LINESTRING (0 0, 5 5, 10 5, 10 10)"); ensure( geo != 0 ); ensure_equals( geo->getGeometryTypeId(), geos::geom::GEOS_LINESTRING ); // FREE TESTED LINESTRING factory_.destroyGeometry(geo); } // Test of getDimension() for non-empty linestring template<> template<> void object::test<20>() { GeometryPtr geo = reader_.read("LINESTRING (0 0, 5 5, 10 5, 10 10)"); ensure( geo != 0 ); ensure_equals( geo->getDimension(), geos::geom::Dimension::L ); // FREE TESTED LINESTRING factory_.destroyGeometry(geo); } // Test of getBoundaryDimension() for non-empty linestring template<> template<> void object::test<21>() { GeometryPtr geo = reader_.read("LINESTRING (0 0, 5 5, 10 5, 10 10)"); ensure( geo != 0 ); ensure_equals( geo->getBoundaryDimension(), geos::geom::Dimension::P ); // FREE TESTED LINESTRING factory_.destroyGeometry(geo); } // Test of getNumPoints() for non-empty linestring template<> template<> void object::test<22>() { const size_t size = 4; GeometryPtr geo = reader_.read("LINESTRING (0 0, 5 5, 10 5, 10 10)"); ensure( geo != 0 ); ensure_equals( geo->getNumPoints(), size ); // FREE TESTED LINESTRING factory_.destroyGeometry(geo); } // Test of getLength() for non-empty linestring template<> template<> void object::test<23>() { const double tolerance = 0.0001; const double expected = 2 * 14.142135600000000; GeometryPtr geo = reader_.read("LINESTRING (0 0, 10 10, 20 0)"); ensure( geo != 0 ); ensure_not_equals( geo->getLength(), 0.0 ); const double diff = std::fabs(geo->getLength() - expected); ensure( diff <= tolerance ); // FREE TESTED LINESTRING factory_.destroyGeometry(geo); } // Test of getArea() for non-empty linestring template<> template<> void object::test<24>() { GeometryPtr geo = reader_.read("LINESTRING (0 0, 10 10, 20 0)"); ensure( geo != 0 ); ensure_equals( geo->getArea(), 0.0 ); // FREE TESTED LINESTRING factory_.destroyGeometry(geo); } // Test of getGeometryType() for non-empty Polygon template<> template<> void object::test<25>() { GeometryPtr geo = reader_.read("LINESTRING (0 0, 10 10, 20 0)"); ensure( geo != 0 ); const std::string type("LineString"); ensure_equals( geo->getGeometryType(), type ); // FREE MEMORY factory_.destroyGeometry(geo); }} // namespace tut
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -