diff --git a/pygmt/src/project.py b/pygmt/src/project.py index c6910b56ac1..e7a3008bb19 100644 --- a/pygmt/src/project.py +++ b/pygmt/src/project.py @@ -229,6 +229,15 @@ def project( # noqa: PLR0913 if kwargs.get("G") is not None and kwargs.get("F") is not None: raise GMTParameterError(at_most_one=["convention", "generate"]) + # Input validation for only one geometry parameter + geometry_params = [ + kwargs.get("A", azimuth) is not None, + kwargs.get("E", endpoint) is not None, + kwargs.get("T", pole) is not None, + ] + if sum(geometry_params) > 1: + raise GMTParameterError(at_most_one=["azimuth", "endpoint", "pole"]) + output_type = validate_output_table_type(output_type, outfile=outfile) column_names = None diff --git a/pygmt/tests/test_project.py b/pygmt/tests/test_project.py index f6580aa6fa5..4d00709c039 100644 --- a/pygmt/tests/test_project.py +++ b/pygmt/tests/test_project.py @@ -90,3 +90,18 @@ def test_project_incorrect_parameters(): with pytest.raises(GMTParameterError): # Using `generate` with `convention` project(center=[0, -1], generate=0.5, convention="xypqrsz") + + +def test_project_geometry_definition_validation(dataframe): + """ + Validate input validation for mutually exclusive projection geometry parameters. + """ + kwdict = {"center": [0, -1], "data": dataframe} + with pytest.raises(GMTParameterError): + project(endpoint=[0, 1], azimuth=45, **kwdict) + with pytest.raises(GMTParameterError): + project(endpoint=[0, 1], pole=[0, 90], **kwdict) + with pytest.raises(GMTParameterError): + project(pole=[0, 90], azimuth=45, **kwdict) + with pytest.raises(GMTParameterError): + project(pole=[0, 90], azimuth=45, endpoint=[0, 1], **kwdict)