diff --git a/temporal/t.vect.db.select/test.t.vect.db.select.sh b/temporal/t.vect.db.select/test.t.vect.db.select.sh deleted file mode 100755 index 383143e6fdc..00000000000 --- a/temporal/t.vect.db.select/test.t.vect.db.select.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/sh -# Test the database output of vector maps in a space time vector dataset -# We need to set a specific region in the -# @preprocess step of this test. -# The region setting should work for UTM and LL test locations -g.region s=0 n=80 w=0 e=120 b=0 t=50 res=10 res3=10 -p3 - -r.mapcalc --o expr="prec_1 = 100.0" -r.mapcalc --o expr="prec_2 = 200.0" -r.mapcalc --o expr="prec_3 = 300" -r.mapcalc --o expr="prec_4 = 400" -r.mapcalc --o expr="prec_5 = 500.0" -r.mapcalc --o expr="prec_6 = 600.0" - -v.random --o -z output=prec n=5 seed=1 - -t.create --o type=strds temporaltype=absolute output=precip_abs1 title="A test" descr="A test" -t.register -i input=precip_abs1 maps=prec_1,prec_2,prec_3,prec_4,prec_5,prec_6 start="2001-03-01 00:00:00" increment="1 months" - -# The @test -# We need to create a nice space time vector dataset with layers for testing -t.vect.observe.strds input=prec strds=precip_abs1 output=prec_observer vector=prec_observer column=observation -t.vect.list input=prec_observer -t.vect.db.select input=prec_observer -t.vect.db.select input=prec_observer where="cat = 1" separator=" | " -t.vect.db.select input=prec_observer where="cat = 1" separator=" | " columns=observation - -# Time instances -t.register --o input=precip_abs1 maps=prec_1,prec_2,prec_3,prec_4,prec_5,prec_6 start="2004-01-01 00:00:00" increment="3 months" - -t.vect.observe.strds --o input=prec strds=precip_abs1 output=prec_observer vector=prec_observer column=observation -t.vect.list input=prec_observer -t.vect.db.select input=prec_observer -t.vect.db.select input=prec_observer where="cat = 1" separator=" | " - -# @postprocess -t.unregister type=raster maps=prec_1,prec_2,prec_3,prec_4,prec_5,prec_6 -t.remove type=strds input=precip_abs1 -t.remove type=stvds input=prec_observer -t.unregister type=vector maps=prec_observer:1,prec_observer:2,prec_observer:3,prec_observer:4,prec_observer:5,prec_observer:6 - -g.remove -f type=vector name=prec_observer,test_extract -g.remove -f type=raster name=prec_1,prec_2,prec_3,prec_4,prec_5,prec_6 diff --git a/temporal/t.vect.db.select/tests/conftest.py b/temporal/t.vect.db.select/tests/conftest.py new file mode 100644 index 00000000000..d84aafba056 --- /dev/null +++ b/temporal/t.vect.db.select/tests/conftest.py @@ -0,0 +1,88 @@ +"""Fixture for t.vect.db.select tests""" + +import os +from types import SimpleNamespace + +import pytest + +import grass.script as gs +from grass.tools import Tools + + +@pytest.fixture(scope="module") +def space_time_vector_dataset(tmp_path_factory): + """Start a temporary session and create space time vector datasets. + + Returns an object containing metadata attributes about the generated datasets. + """ + tmp_path = tmp_path_factory.mktemp("vector_time_series") + project = tmp_path / "test_project_vector" + gs.create_project(project) + + with gs.setup.init(project, env=os.environ.copy()) as session: + tools = Tools(session=session) + + tools.g_region(s=0, n=80, w=0, e=120, b=0, t=50, res=10, res3=10) + + for i in range(1, 4): + tools.r_mapcalc(expression=f"prec_int_{i} = {i}00.0", overwrite=True) + tools.r_mapcalc(expression=f"prec_inst_{i} = {i}00.0", overwrite=True) + + tools.v_random(output="prec_points", n=3, seed=1, flags="z", overwrite=True) + + interval_strds = "precip_abs1" + tools.t_create( + type="strds", + temporaltype="absolute", + output=interval_strds, + title="A test", + description="A test", + ) + tools.t_register( + type="raster", + flags="i", + input=interval_strds, + maps=",".join([f"prec_int_{i}" for i in range(1, 4)]), + start="2001-03-01 00:00:00", + increment="1 months", + ) + + interval_stvds = "prec_observer_interval" + tools.t_vect_observe_strds( + input="prec_points", + strds=interval_strds, + output=interval_stvds, + vector=interval_stvds, + column="observation", + ) + + instance_strds = "precip_abs2" + tools.t_create( + type="strds", + temporaltype="absolute", + output=instance_strds, + title="B test", + description="B test", + ) + tools.t_register( + type="raster", + input=instance_strds, + maps=",".join([f"prec_inst_{i}" for i in range(1, 4)]), + start="2004-01-01 00:00:00", + increment="3 months", + ) + + instance_stvds = "prec_observer_instance" + tools.t_vect_observe_strds( + input="prec_points", + strds=instance_strds, + output=instance_stvds, + vector=instance_stvds, + column="observation", + ) + + yield SimpleNamespace( + session=session, + interval_name=interval_stvds, + instance_name=instance_stvds, + ) diff --git a/temporal/t.vect.db.select/tests/t_vect_db_select_test.py b/temporal/t.vect.db.select/tests/t_vect_db_select_test.py new file mode 100644 index 00000000000..f0e09c0dd47 --- /dev/null +++ b/temporal/t.vect.db.select/tests/t_vect_db_select_test.py @@ -0,0 +1,123 @@ +"""Test t.vect.db.select functionality against expected outputs.""" + +from grass.tools import Tools + + +def test_t_vect_db_select_interval_default(space_time_vector_dataset): + """Verify standard plain text layout for interval datasets.""" + tools = Tools(session=space_time_vector_dataset.session) + + result = tools.t_vect_db_select(input=space_time_vector_dataset.interval_name) + assert result.returncode == 0 + + expected_output = """start_time|end_time|cat|observation +2001-03-01 00:00:00|2001-04-01 00:00:00|1|100 +2001-03-01 00:00:00|2001-04-01 00:00:00|2|100 +2001-03-01 00:00:00|2001-04-01 00:00:00|3|100 +2001-04-01 00:00:00|2001-05-01 00:00:00|1|200 +2001-04-01 00:00:00|2001-05-01 00:00:00|2|200 +2001-04-01 00:00:00|2001-05-01 00:00:00|3|200 +2001-05-01 00:00:00|2001-06-01 00:00:00|1|300 +2001-05-01 00:00:00|2001-06-01 00:00:00|2|300 +2001-05-01 00:00:00|2001-06-01 00:00:00|3|300""" + + actual_lines = result.text_split("\n") + expected_lines = expected_output.strip().splitlines() + + for actual, expected in zip(actual_lines, expected_lines, strict=True): + assert actual == expected + + +def test_t_vect_db_select_interval_where(space_time_vector_dataset): + """Verify filtering via attribute clauses with custom separators on intervals.""" + tools = Tools(session=space_time_vector_dataset.session) + + result = tools.t_vect_db_select( + input=space_time_vector_dataset.interval_name, + where="cat = 1", + separator=" | ", + ) + assert result.returncode == 0 + + expected_output = """start_time | end_time | cat | observation +2001-03-01 00:00:00 | 2001-04-01 00:00:00 | 1 | 100 +2001-04-01 00:00:00 | 2001-05-01 00:00:00 | 1 | 200 +2001-05-01 00:00:00 | 2001-06-01 00:00:00 | 1 | 300""" + + actual_lines = result.text_split("\n") + expected_lines = expected_output.strip().splitlines() + + for actual, expected in zip(actual_lines, expected_lines, strict=True): + assert actual == expected + + +def test_t_vect_db_select_interval_columns(space_time_vector_dataset): + """Verify selective attribute column specification on intervals.""" + tools = Tools(session=space_time_vector_dataset.session) + + result = tools.t_vect_db_select( + input=space_time_vector_dataset.interval_name, + where="cat = 1", + separator=" | ", + columns="observation", + ) + assert result.returncode == 0 + + expected_output = """start_time | end_time | observation +2001-03-01 00:00:00 | 2001-04-01 00:00:00 | 100 +2001-04-01 00:00:00 | 2001-05-01 00:00:00 | 200 +2001-05-01 00:00:00 | 2001-06-01 00:00:00 | 300""" + + actual_lines = result.text_split("\n") + expected_lines = expected_output.strip().splitlines() + + for actual, expected in zip(actual_lines, expected_lines, strict=True): + assert actual == expected + + +def test_t_vect_db_select_instance_default(space_time_vector_dataset): + """Verify standard plain text layout for instance datasets.""" + tools = Tools(session=space_time_vector_dataset.session) + + result = tools.t_vect_db_select(input=space_time_vector_dataset.instance_name) + assert result.returncode == 0 + + expected_output = """start_time|end_time|cat|observation +2004-01-01 00:00:00||1|100 +2004-01-01 00:00:00||2|100 +2004-01-01 00:00:00||3|100 +2004-04-01 00:00:00||1|200 +2004-04-01 00:00:00||2|200 +2004-04-01 00:00:00||3|200 +2004-07-01 00:00:00||1|300 +2004-07-01 00:00:00||2|300 +2004-07-01 00:00:00||3|300""" + + actual_lines = result.text_split("\n") + expected_lines = expected_output.strip().splitlines() + + for actual, expected in zip(actual_lines, expected_lines, strict=True): + assert actual == expected + + +def test_t_vect_db_select_instance_where(space_time_vector_dataset): + """Verify filtering via attribute clauses with custom separators on instances.""" + tools = Tools(session=space_time_vector_dataset.session) + + result = tools.t_vect_db_select( + input=space_time_vector_dataset.instance_name, + where="cat = 1", + separator=" | ", + ) + assert result.returncode == 0 + + expected_output = """start_time | end_time | cat | observation +2004-01-01 00:00:00 | | 1 | 100 +2004-04-01 00:00:00 | | 1 | 200 +2004-07-01 00:00:00 | | 1 | 300""" + + actual_lines = result.text_split("\n") + expected_lines = expected_output.strip().splitlines() + + for actual, expected in zip(actual_lines, expected_lines, strict=True): + assert actual == expected