|
| 1 | +"""Integration tests for grass.jupyter.utils.get_region()""" |
| 2 | + |
| 3 | +import pytest |
| 4 | +import grass.script as gs |
| 5 | +from grass.jupyter.utils import get_region |
| 6 | + |
| 7 | +REGION_KEYS = ["north", "south", "east", "west", "nsres", "ewres"] |
| 8 | + |
| 9 | + |
| 10 | +@pytest.mark.integration |
| 11 | +def test_get_region_returns_dict(session): |
| 12 | + """get_region() must return a dict.""" |
| 13 | + result = get_region(env=session.env) |
| 14 | + assert isinstance(result, dict), f"Expected dict, got {type(result).__name__}" |
| 15 | + |
| 16 | + |
| 17 | +@pytest.mark.integration |
| 18 | +def test_get_region_has_required_keys(session): |
| 19 | + """get_region() must contain all six geographic keys.""" |
| 20 | + result = get_region(env=session.env) |
| 21 | + missing = [k for k in REGION_KEYS if k not in result] |
| 22 | + assert not missing, f"Missing keys: {missing}" |
| 23 | + |
| 24 | + |
| 25 | +@pytest.mark.integration |
| 26 | +def test_get_region_values_are_numeric(session): |
| 27 | + """All geographic values in the region dict must be numeric.""" |
| 28 | + result = get_region(env=session.env) |
| 29 | + non_numeric = { |
| 30 | + k: result[k] for k in REGION_KEYS if not isinstance(result[k], (int, float)) |
| 31 | + } |
| 32 | + assert not non_numeric, f"Non-numeric values: {non_numeric}" |
| 33 | + |
| 34 | + |
| 35 | +@pytest.mark.integration |
| 36 | +def test_get_region_geographic_sanity(session): |
| 37 | + """North > South, East > West, resolutions positive.""" |
| 38 | + r = get_region(env=session.env) |
| 39 | + assert r["north"] > r["south"], f"north={r['north']} is not > south={r['south']}" |
| 40 | + assert r["east"] > r["west"], f"east={r['east']} is not > west={r['west']}" |
| 41 | + assert r["nsres"] > 0, f"nsres={r['nsres']} is not positive" |
| 42 | + assert r["ewres"] > 0, f"ewres={r['ewres']} is not positive" |
| 43 | + |
| 44 | + |
| 45 | +@pytest.mark.integration |
| 46 | +def test_get_region_reflects_live_state(session): |
| 47 | + """get_region() must return current region, not a cached snapshot.""" |
| 48 | + gs.run_command("g.region", n=60, s=50, e=30, w=10, res=1, env=session.env) |
| 49 | + r = get_region(env=session.env) |
| 50 | + assert abs(r["north"] - 60) < 1e-6, f"Expected north=60, got {r['north']}" |
| 51 | + assert abs(r["south"] - 50) < 1e-6, f"Expected south=50, got {r['south']}" |
| 52 | + assert abs(r["east"] - 30) < 1e-6, f"Expected east=30, got {r['east']}" |
| 53 | + assert abs(r["west"] - 10) < 1e-6, f"Expected west=10, got {r['west']}" |
| 54 | + |
| 55 | + |
| 56 | +@pytest.mark.integration |
| 57 | +def test_get_region_is_read_only(session): |
| 58 | + """Calling get_region() must not modify the active GRASS region.""" |
| 59 | + before = gs.region(env=session.env) |
| 60 | + get_region(env=session.env) |
| 61 | + after = gs.region(env=session.env) |
| 62 | + for key in ("n", "s", "e", "w", "nsres", "ewres"): |
| 63 | + assert before[key] == after[key], ( |
| 64 | + f"get_region() changed '{key}': {before[key]} -> {after[key]}" |
| 65 | + ) |
0 commit comments