From 91f46a35c6fe88a86c7133b65f6761cb6e69e5f7 Mon Sep 17 00:00:00 2001 From: Vaclav Petras Date: Thu, 9 Oct 2025 15:19:34 -0400 Subject: [PATCH 1/2] tests: Add tests for errors from r.mapcalc The test with the rand function fails with higher number of threads (4 and above in tests). --- .../r.mapcalc/tests/r_mapcalc_nprocs_test.py | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 raster/r.mapcalc/tests/r_mapcalc_nprocs_test.py diff --git a/raster/r.mapcalc/tests/r_mapcalc_nprocs_test.py b/raster/r.mapcalc/tests/r_mapcalc_nprocs_test.py new file mode 100644 index 00000000000..b22826b5e5b --- /dev/null +++ b/raster/r.mapcalc/tests/r_mapcalc_nprocs_test.py @@ -0,0 +1,57 @@ +"""r.mapcalc tests focused on multiple processes""" + +import pytest + +from grass.tools import Tools + + +@pytest.mark.parametrize("nprocs", [0, 1, 4]) +def test_create_constant(session_in_mapset, nprocs): + tools = Tools(session=session_in_mapset) + tools.r_mapcalc(expression="test = 10", nprocs=nprocs) + result = tools.r_info(map="test", format="json") + assert result["mean"] == 10 + assert result["min"] == 10 + assert result["max"] == 10 + assert result["cells"] == 30 + + +@pytest.mark.parametrize("nprocs", [0, 1, 4]) +def test_syntax_error(session_in_mapset, nprocs): + tools = Tools( + session=session_in_mapset, consistent_return_value=True, errors="ignore" + ) + result = tools.r_mapcalc(expression="test = double(", nprocs=nprocs) + assert result.returncode == 1 + assert "syntax error" in result.stderr + + +@pytest.mark.parametrize("nprocs", [0, 1, 4]) +def test_raster_does_not_exist(session_in_mapset, nprocs): + tools = Tools( + session=session_in_mapset, consistent_return_value=True, errors="ignore" + ) + result = tools.r_mapcalc(expression="test = does_not_exist", nprocs=nprocs) + assert result.returncode == 1 + assert "does_not_exist" in result.stderr.lower() + + +@pytest.mark.parametrize("nprocs", [0, 1, *list(range(2, 11, 2))]) +def test_rand_no_explicit_seed_setting(session_in_mapset, nprocs): + tools = Tools( + session=session_in_mapset, consistent_return_value=True, errors="ignore" + ) + result = tools.r_mapcalc(expression="test = rand(-15.0, 5.0)", nprocs=nprocs) + assert result.returncode == 1 + assert "not seeded" in result.stderr + + +@pytest.mark.parametrize("nprocs", [0, 1, 4]) +def test_too_many_arguments(session_in_mapset, nprocs): + tools = Tools( + session=session_in_mapset, consistent_return_value=True, errors="ignore" + ) + result = tools.r_mapcalc(expression="test = double(10, 20, 30, 40)", nprocs=nprocs) + assert result.returncode == 1 + assert "too many arguments" in result.stderr.lower() + assert "double" in result.stderr From 609d844fbd89baf5e2f4ded0dc6a8a89196ebefc Mon Sep 17 00:00:00 2001 From: Vaclav Petras Date: Fri, 10 Oct 2025 09:32:11 -0400 Subject: [PATCH 2/2] Skip the test problematic test. Using skip rather than xfail because there is too many different conditions to get right (macOS does not fail, Windows fails with no stderr, Linux fails with segfault, small nprocs passes). --- raster/r.mapcalc/tests/r_mapcalc_nprocs_test.py | 1 + 1 file changed, 1 insertion(+) diff --git a/raster/r.mapcalc/tests/r_mapcalc_nprocs_test.py b/raster/r.mapcalc/tests/r_mapcalc_nprocs_test.py index b22826b5e5b..d0e92b98402 100644 --- a/raster/r.mapcalc/tests/r_mapcalc_nprocs_test.py +++ b/raster/r.mapcalc/tests/r_mapcalc_nprocs_test.py @@ -36,6 +36,7 @@ def test_raster_does_not_exist(session_in_mapset, nprocs): assert "does_not_exist" in result.stderr.lower() +@pytest.mark.skip(reason="Waiting for a fix to work on all platforms for any nprocs") @pytest.mark.parametrize("nprocs", [0, 1, *list(range(2, 11, 2))]) def test_rand_no_explicit_seed_setting(session_in_mapset, nprocs): tools = Tools(