From e78c30832a3505725a8e5b271670b47ae70f3cf7 Mon Sep 17 00:00:00 2001 From: saket0187 Date: Mon, 15 Jun 2026 15:16:28 +0530 Subject: [PATCH 1/2] Add pytest --- .../t.vect.db.select/test.t.vect.db.select.sh | 43 ----- temporal/t.vect.db.select/tests/conftest.py | 88 +++++++++ .../tests/t_vect_db_select_test.py | 174 ++++++++++++++++++ 3 files changed, 262 insertions(+), 43 deletions(-) delete mode 100755 temporal/t.vect.db.select/test.t.vect.db.select.sh create mode 100644 temporal/t.vect.db.select/tests/conftest.py create mode 100644 temporal/t.vect.db.select/tests/t_vect_db_select_test.py 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..0cf09edfe56 --- /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, 7): + 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=5, 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, 7)]), + 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, 7)]), + 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..92446a24cdb --- /dev/null +++ b/temporal/t.vect.db.select/tests/t_vect_db_select_test.py @@ -0,0 +1,174 @@ +"""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-03-01 00:00:00|2001-04-01 00:00:00|4|100 +2001-03-01 00:00:00|2001-04-01 00:00:00|5|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-04-01 00:00:00|2001-05-01 00:00:00|4|200 +2001-04-01 00:00:00|2001-05-01 00:00:00|5|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 +2001-05-01 00:00:00|2001-06-01 00:00:00|4|300 +2001-05-01 00:00:00|2001-06-01 00:00:00|5|300 +2001-06-01 00:00:00|2001-07-01 00:00:00|1|400 +2001-06-01 00:00:00|2001-07-01 00:00:00|2|400 +2001-06-01 00:00:00|2001-07-01 00:00:00|3|400 +2001-06-01 00:00:00|2001-07-01 00:00:00|4|400 +2001-06-01 00:00:00|2001-07-01 00:00:00|5|400 +2001-07-01 00:00:00|2001-08-01 00:00:00|1|500 +2001-07-01 00:00:00|2001-08-01 00:00:00|2|500 +2001-07-01 00:00:00|2001-08-01 00:00:00|3|500 +2001-07-01 00:00:00|2001-08-01 00:00:00|4|500 +2001-07-01 00:00:00|2001-08-01 00:00:00|5|500 +2001-08-01 00:00:00|2001-09-01 00:00:00|1|600 +2001-08-01 00:00:00|2001-09-01 00:00:00|2|600 +2001-08-01 00:00:00|2001-09-01 00:00:00|3|600 +2001-08-01 00:00:00|2001-09-01 00:00:00|4|600 +2001-08-01 00:00:00|2001-09-01 00:00:00|5|600""" + + 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 +2001-06-01 00:00:00 | 2001-07-01 00:00:00 | 1 | 400 +2001-07-01 00:00:00 | 2001-08-01 00:00:00 | 1 | 500 +2001-08-01 00:00:00 | 2001-09-01 00:00:00 | 1 | 600""" + + 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 +2001-06-01 00:00:00 | 2001-07-01 00:00:00 | 400 +2001-07-01 00:00:00 | 2001-08-01 00:00:00 | 500 +2001-08-01 00:00:00 | 2001-09-01 00:00:00 | 600""" + + 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-01-01 00:00:00||4|100 +2004-01-01 00:00:00||5|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-04-01 00:00:00||4|200 +2004-04-01 00:00:00||5|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 +2004-07-01 00:00:00||4|300 +2004-07-01 00:00:00||5|300 +2004-10-01 00:00:00||1|400 +2004-10-01 00:00:00||2|400 +2004-10-01 00:00:00||3|400 +2004-10-01 00:00:00||4|400 +2004-10-01 00:00:00||5|400 +2005-01-01 00:00:00||1|500 +2005-01-01 00:00:00||2|500 +2005-01-01 00:00:00||3|500 +2005-01-01 00:00:00||4|500 +2005-01-01 00:00:00||5|500 +2005-04-01 00:00:00||1|600 +2005-04-01 00:00:00||2|600 +2005-04-01 00:00:00||3|600 +2005-04-01 00:00:00||4|600 +2005-04-01 00:00:00||5|600""" + + 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 +2004-10-01 00:00:00 | | 1 | 400 +2005-01-01 00:00:00 | | 1 | 500 +2005-04-01 00:00:00 | | 1 | 600""" + + 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 From c2039a30efaa6a528fdde74c3a04ecf88e2fb3e3 Mon Sep 17 00:00:00 2001 From: saket0187 Date: Tue, 16 Jun 2026 23:04:35 +0530 Subject: [PATCH 2/2] Reduce maps --- temporal/t.vect.db.select/tests/conftest.py | 8 +-- .../tests/t_vect_db_select_test.py | 61 ++----------------- 2 files changed, 9 insertions(+), 60 deletions(-) diff --git a/temporal/t.vect.db.select/tests/conftest.py b/temporal/t.vect.db.select/tests/conftest.py index 0cf09edfe56..d84aafba056 100644 --- a/temporal/t.vect.db.select/tests/conftest.py +++ b/temporal/t.vect.db.select/tests/conftest.py @@ -24,11 +24,11 @@ def space_time_vector_dataset(tmp_path_factory): tools.g_region(s=0, n=80, w=0, e=120, b=0, t=50, res=10, res3=10) - for i in range(1, 7): + 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=5, seed=1, flags="z", overwrite=True) + tools.v_random(output="prec_points", n=3, seed=1, flags="z", overwrite=True) interval_strds = "precip_abs1" tools.t_create( @@ -42,7 +42,7 @@ def space_time_vector_dataset(tmp_path_factory): type="raster", flags="i", input=interval_strds, - maps=",".join([f"prec_int_{i}" for i in range(1, 7)]), + maps=",".join([f"prec_int_{i}" for i in range(1, 4)]), start="2001-03-01 00:00:00", increment="1 months", ) @@ -67,7 +67,7 @@ def space_time_vector_dataset(tmp_path_factory): tools.t_register( type="raster", input=instance_strds, - maps=",".join([f"prec_inst_{i}" for i in range(1, 7)]), + maps=",".join([f"prec_inst_{i}" for i in range(1, 4)]), start="2004-01-01 00:00:00", increment="3 months", ) 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 index 92446a24cdb..f0e09c0dd47 100644 --- 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 @@ -14,33 +14,12 @@ def test_t_vect_db_select_interval_default(space_time_vector_dataset): 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-03-01 00:00:00|2001-04-01 00:00:00|4|100 -2001-03-01 00:00:00|2001-04-01 00:00:00|5|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-04-01 00:00:00|2001-05-01 00:00:00|4|200 -2001-04-01 00:00:00|2001-05-01 00:00:00|5|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 -2001-05-01 00:00:00|2001-06-01 00:00:00|4|300 -2001-05-01 00:00:00|2001-06-01 00:00:00|5|300 -2001-06-01 00:00:00|2001-07-01 00:00:00|1|400 -2001-06-01 00:00:00|2001-07-01 00:00:00|2|400 -2001-06-01 00:00:00|2001-07-01 00:00:00|3|400 -2001-06-01 00:00:00|2001-07-01 00:00:00|4|400 -2001-06-01 00:00:00|2001-07-01 00:00:00|5|400 -2001-07-01 00:00:00|2001-08-01 00:00:00|1|500 -2001-07-01 00:00:00|2001-08-01 00:00:00|2|500 -2001-07-01 00:00:00|2001-08-01 00:00:00|3|500 -2001-07-01 00:00:00|2001-08-01 00:00:00|4|500 -2001-07-01 00:00:00|2001-08-01 00:00:00|5|500 -2001-08-01 00:00:00|2001-09-01 00:00:00|1|600 -2001-08-01 00:00:00|2001-09-01 00:00:00|2|600 -2001-08-01 00:00:00|2001-09-01 00:00:00|3|600 -2001-08-01 00:00:00|2001-09-01 00:00:00|4|600 -2001-08-01 00:00:00|2001-09-01 00:00:00|5|600""" +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() @@ -63,10 +42,7 @@ def test_t_vect_db_select_interval_where(space_time_vector_dataset): 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 -2001-06-01 00:00:00 | 2001-07-01 00:00:00 | 1 | 400 -2001-07-01 00:00:00 | 2001-08-01 00:00:00 | 1 | 500 -2001-08-01 00:00:00 | 2001-09-01 00:00:00 | 1 | 600""" +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() @@ -90,10 +66,7 @@ def test_t_vect_db_select_interval_columns(space_time_vector_dataset): 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 -2001-06-01 00:00:00 | 2001-07-01 00:00:00 | 400 -2001-07-01 00:00:00 | 2001-08-01 00:00:00 | 500 -2001-08-01 00:00:00 | 2001-09-01 00:00:00 | 600""" +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() @@ -113,33 +86,12 @@ def test_t_vect_db_select_instance_default(space_time_vector_dataset): 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-01-01 00:00:00||4|100 -2004-01-01 00:00:00||5|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-04-01 00:00:00||4|200 -2004-04-01 00:00:00||5|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 -2004-07-01 00:00:00||4|300 -2004-07-01 00:00:00||5|300 -2004-10-01 00:00:00||1|400 -2004-10-01 00:00:00||2|400 -2004-10-01 00:00:00||3|400 -2004-10-01 00:00:00||4|400 -2004-10-01 00:00:00||5|400 -2005-01-01 00:00:00||1|500 -2005-01-01 00:00:00||2|500 -2005-01-01 00:00:00||3|500 -2005-01-01 00:00:00||4|500 -2005-01-01 00:00:00||5|500 -2005-04-01 00:00:00||1|600 -2005-04-01 00:00:00||2|600 -2005-04-01 00:00:00||3|600 -2005-04-01 00:00:00||4|600 -2005-04-01 00:00:00||5|600""" +2004-07-01 00:00:00||3|300""" actual_lines = result.text_split("\n") expected_lines = expected_output.strip().splitlines() @@ -162,10 +114,7 @@ def test_t_vect_db_select_instance_where(space_time_vector_dataset): 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 -2004-10-01 00:00:00 | | 1 | 400 -2005-01-01 00:00:00 | | 1 | 500 -2005-04-01 00:00:00 | | 1 | 600""" +2004-07-01 00:00:00 | | 1 | 300""" actual_lines = result.text_split("\n") expected_lines = expected_output.strip().splitlines()