Skip to content

Commit

Permalink
CoordinateSequence: Raise error on invalid ordinateIndex
Browse files Browse the repository at this point in the history
Co-authored-by: Mike Taves <mwtoews@gmail.com>
  • Loading branch information
dbaston and mwtoews committed Feb 26, 2025
1 parent 91e8010 commit 5b2f551
Show file tree
Hide file tree
Showing 2 changed files with 95 additions and 1 deletion.
10 changes: 9 additions & 1 deletion src/geom/CoordinateSequence.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -547,10 +547,18 @@ CoordinateSequence::setOrdinate(std::size_t index, std::size_t ordinateIndex, do
getAt<CoordinateXY>(index).y = value;
break;
case CoordinateSequence::Z:
getAt<Coordinate>(index).z = value;
{
if (!hasZ()) {
throw util::IllegalArgumentException("Coordinate type is not XYZ or XYZM");
}
getAt<Coordinate>(index).z = value;
}
break;
case CoordinateSequence::M:
{
if (!hasM()) {
throw util::IllegalArgumentException("Coordinate type is not XYM or XYZM.");
}
if (getCoordinateType() == CoordinateType::XYZM) {
getAt<CoordinateXYZM>(index).m = value;
} else {
Expand Down
86 changes: 86 additions & 0 deletions tests/unit/capi/GEOSCoordSeqTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -766,4 +766,90 @@ void object::test<21>()
GEOS_finish_r(handle);
}

template<>
template<>
void object::test<22>()
{
set_test_name("setOrdinate on XYZM coordinate");

cs_ = GEOSCoordSeq_create(1, 4);

ensure("setX", GEOSCoordSeq_setOrdinate(cs_, 0, 0, 1));
ensure("setY", GEOSCoordSeq_setOrdinate(cs_, 0, 1, 2));
ensure("setZ", GEOSCoordSeq_setOrdinate(cs_, 0, 2, 3));
ensure("setM", GEOSCoordSeq_setOrdinate(cs_, 0, 3, 4));

double x, y, z, m;
ensure(GEOSCoordSeq_copyToArrays(cs_, &x, &y, &z, &m));

ensure_equals("X", x, 1);
ensure_equals("Y", y, 2);
ensure_equals("Z", z, 3);
ensure_equals("M", m, 4);
}

template<>
template<>
void object::test<23>()
{
set_test_name("setOrdinate on XYZ coordinate");

cs_ = GEOSCoordSeq_create(1, 3);

ensure("setX", GEOSCoordSeq_setOrdinate(cs_, 0, 0, 1));
ensure("setY", GEOSCoordSeq_setOrdinate(cs_, 0, 1, 2));
ensure("setZ", GEOSCoordSeq_setOrdinate(cs_, 0, 2, 3));
ensure("setM", !GEOSCoordSeq_setOrdinate(cs_, 0, 3, 4));

double x, y, z;
ensure(GEOSCoordSeq_copyToArrays(cs_, &x, &y, &z, nullptr));

ensure_equals("X", x, 1);
ensure_equals("Y", y, 2);
ensure_equals("Z", z, 3);
}

template<>
template<>
void object::test<24>()
{
set_test_name("setOrdinate on XY coordinate");

cs_ = GEOSCoordSeq_create(1, 2);

ensure("setX", GEOSCoordSeq_setOrdinate(cs_, 0, 0, 1));
ensure("setY", GEOSCoordSeq_setOrdinate(cs_, 0, 1, 2));
ensure("setZ", !GEOSCoordSeq_setOrdinate(cs_, 0, 2, 3));
ensure("setM", !GEOSCoordSeq_setOrdinate(cs_, 0, 3, 4));

double x, y;
ensure(GEOSCoordSeq_copyToArrays(cs_, &x, &y, nullptr, nullptr));

ensure_equals("X", x, 1);
ensure_equals("Y", y, 2);
}

template<>
template<>
void object::test<25>()
{
set_test_name("setOrdinate on XYM coordinate");

/* TODO: use GEOSCoordSeq_createWithDimensions() instead */
double buffer[3];
cs_ = GEOSCoordSeq_copyFromBuffer(buffer, 1, 0, 1);

ensure("setX", GEOSCoordSeq_setOrdinate(cs_, 0, 0, 1));
ensure("setY", GEOSCoordSeq_setOrdinate(cs_, 0, 1, 2));
ensure("setZ", !GEOSCoordSeq_setOrdinate(cs_, 0, 2, 3));
ensure("setM", GEOSCoordSeq_setOrdinate(cs_, 0, 3, 4));

double x, y, m;
ensure(GEOSCoordSeq_copyToArrays(cs_, &x, &y, nullptr, &m));

ensure_equals("X", x, 1);
ensure_equals("Y", y, 2);
ensure_equals("M", m, 4);
}

} // namespace tut

0 comments on commit 5b2f551

Please sign in to comment.