Skip to content

Commit ae8edfb

Browse files
committed
Add GUI utilities for test management and enhance I/O tests
(cherry picked from commit cf92d1da445fe7db1ee3a78131c05daffc29c935)
1 parent cc1866b commit ae8edfb

5 files changed

Lines changed: 66 additions & 32 deletions

File tree

cdl/tests/sigima_tests/common/io1_unit_test.py

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from sigima_.io import read_images, read_signals
1717
from sigima_.io.image import funcs as image_funcs
1818
from sigima_.obj import ImageObj, SignalObj
19-
from sigima_.tests import helpers
19+
from sigima_.tests import guiutils, helpers
2020

2121

2222
def __read_objs(fname: str) -> list[ImageObj] | list[SignalObj]:
@@ -32,70 +32,66 @@ def __read_objs(fname: str) -> list[ImageObj] | list[SignalObj]:
3232

3333

3434
@helpers.try_open_test_data("Testing TXT file reader", "*.txt")
35-
def open_txt(fname: str | None = None, request: pytest.FixtureRequest = None) -> None:
35+
def open_txt(fname: str | None = None) -> None:
3636
"""Testing TXT files"""
3737
objs = __read_objs(fname)
3838
for obj in objs:
3939
execenv.print(obj)
40-
if request is not None and request.config.getoption("--gui"):
40+
if guiutils.is_gui_enabled():
4141
from sigima_.tests import vistools # pylint: disable=import-outside-toplevel
4242

43-
vistools.view_curves_and_images(objs)
43+
vistools.view_curves_and_images(objs, title="TXT file")
4444

4545

4646
@helpers.try_open_test_data("Testing CSV file reader", "*.csv")
47-
def open_csv(fname: str | None = None, request: pytest.FixtureRequest = None) -> None:
47+
def open_csv(fname: str | None = None) -> None:
4848
"""Testing CSV files"""
4949
objs = __read_objs(fname)
5050
for obj in objs:
5151
execenv.print(obj)
52-
if request is not None and request.config.getoption("--gui"):
52+
if guiutils.is_gui_enabled():
5353
from sigima_.tests import vistools # pylint: disable=import-outside-toplevel
5454

55-
vistools.view_curves_and_images(objs)
55+
vistools.view_curves_and_images(objs, title="CSV file")
5656

5757

5858
@helpers.try_open_test_data("Testing MAT-File reader", "*.mat")
59-
def open_mat(fname: str | None = None, request: pytest.FixtureRequest = None) -> None:
59+
def open_mat(fname: str | None = None) -> None:
6060
"""Testing MAT files"""
6161
objs = __read_objs(fname)
6262
for obj in objs:
6363
execenv.print(obj)
64-
if request is not None and request.config.getoption("--gui"):
64+
if guiutils.is_gui_enabled():
6565
from sigima_.tests import vistools # pylint: disable=import-outside-toplevel
6666

67-
if isinstance(objs[0], SignalObj):
68-
vistools.view_curves(objs)
69-
else:
70-
vistools.view_images(objs)
67+
vistools.view_curves_and_images(objs, title="MAT file")
7168

7269

7370
@helpers.try_open_test_data("Testing SIF file handler", "*.sif")
74-
def open_sif(fname: str | None = None, request: pytest.FixtureRequest = None) -> None:
71+
def open_sif(fname: str | None = None) -> None:
7572
"""Testing SIF files"""
7673
execenv.print(image_funcs.SIFFile(fname))
7774
datalist = image_funcs.imread_sif(fname)
78-
if request is not None and request.config.getoption("--gui"):
75+
if guiutils.is_gui_enabled():
7976
from sigima_.tests import vistools # pylint: disable=import-outside-toplevel
8077

8178
vistools.view_images(datalist)
8279

8380

8481
@helpers.try_open_test_data("Testing SCOR-DATA file handler", "*.scor-data")
85-
def open_scordata(
86-
fname: str | None = None, request: pytest.FixtureRequest = None
87-
) -> None:
82+
def open_scordata(fname: str | None = None) -> None:
8883
"""Testing SCOR-DATA files"""
8984
execenv.print(image_funcs.SCORFile(fname))
9085
data = image_funcs.imread_scor(fname)
91-
if request is not None and request.config.getoption("--gui"):
86+
if guiutils.is_gui_enabled():
9287
from sigima_.tests import vistools # pylint: disable=import-outside-toplevel
9388

94-
vistools.view_images(data)
89+
vistools.view_images(data, title="SCOR-DATA file")
9590

9691

97-
def test_io1() -> None:
92+
def test_io1(request: pytest.FixtureRequest | None = None) -> None:
9893
"""I/O test"""
94+
guiutils.set_current_request(request)
9995
with qt_app_context():
10096
open_txt()
10197
open_csv()
@@ -105,4 +101,4 @@ def test_io1() -> None:
105101

106102

107103
if __name__ == "__main__":
108-
test_io1()
104+
test_io1(request=guiutils.DummyRequest(gui=True))

cdl/tests/sigima_tests/common/io3_unit_test.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ def read_data(filename: str) -> np.ndarray:
4646
np.ndarray: image data
4747
"""
4848
# Implement reading logic here
49-
pass
5049

5150
return MyImageFormat
5251

@@ -62,8 +61,7 @@ def test_add_image_format() -> None:
6261
execenv.print("OK")
6362
execenv.print(f"New number of image formats: {n2}")
6463
assert (
65-
sum([isinstance(fmt, image_class) for fmt in ImageIORegistry.get_formats()])
66-
== 1
64+
sum(isinstance(fmt, image_class) for fmt in ImageIORegistry.get_formats()) == 1
6765
)
6866
finfo = image_class.FORMAT_INFO
6967
finfo_str = "\n".join([(" " * 4) + line for line in str(finfo).splitlines()])
@@ -88,7 +86,6 @@ class MySignalFormat(SignalFormatBase):
8886
writeable=False,
8987
)
9088

91-
@staticmethod
9289
def read_xydata(self, filename: str) -> np.ndarray:
9390
"""Read data and metadata from file, write metadata to object, return xydata
9491
@@ -99,7 +96,7 @@ def read_xydata(self, filename: str) -> np.ndarray:
9996
NumPy array xydata
10097
"""
10198
# Implement reading logic here
102-
pass
99+
print(f"Reading data from {filename}")
103100

104101
return MySignalFormat
105102

@@ -115,7 +112,7 @@ def test_add_signal_format() -> None:
115112
execenv.print("OK")
116113
execenv.print(f"New number of signal formats: {n2}")
117114
assert (
118-
sum([isinstance(fmt, signal_class) for fmt in SignalIORegistry.get_formats()])
115+
sum(isinstance(fmt, signal_class) for fmt in SignalIORegistry.get_formats())
119116
== 1
120117
)
121118
finfo = signal_class.FORMAT_INFO

cdl/tests/sigima_tests/images/operation_unit_test.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import sigima_.obj
2525
import sigima_.param
2626
from sigima_.env import execenv
27+
from sigima_.tests import guiutils
2728
from sigima_.tests.data import create_noisygauss_image
2829
from sigima_.tests.helpers import check_array_result
2930

@@ -154,6 +155,7 @@ def test_image_product() -> None:
154155
@pytest.mark.validation
155156
def test_image_division(request: pytest.FixtureRequest = None) -> None:
156157
"""Image division test."""
158+
guiutils.set_current_request(request)
157159
execenv.print("*** Testing image division:")
158160
for ima1, ima2 in __iterate_image_couples():
159161
ima2.data = np.ones_like(ima2.data)
@@ -162,7 +164,7 @@ def test_image_division(request: pytest.FixtureRequest = None) -> None:
162164
exp = ima1.data.astype(float) / ima2.data.astype(float)
163165
ima3 = sigima_image.division(ima1, ima2)
164166
if not np.allclose(ima3.data, exp):
165-
if request.config.getoption("--gui"):
167+
if guiutils.is_gui_enabled():
166168
# pylint: disable=import-outside-toplevel
167169
from guidata.qthelpers import qt_app_context
168170

@@ -459,7 +461,7 @@ def test_image_rotate() -> None:
459461
test_image_addition()
460462
test_image_average()
461463
test_image_product()
462-
test_image_division()
464+
test_image_division(request=guiutils.DummyRequest(gui=True))
463465
test_image_difference()
464466
test_image_quadratic_difference()
465467
test_image_addition_constant()

sigima_/io/image/formats.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -313,10 +313,10 @@ def read_data(filename: str) -> np.ndarray:
313313

314314

315315
class XYZImageFormat(ImageFormatBase):
316-
"""Object representing Dürr NDT XYZ image file type"""
316+
"""Object representing Dürr NDT XYZ image file type"""
317317

318318
FORMAT_INFO = FormatInfo(
319-
name="Dürr NDT",
319+
name="Dürr NDT",
320320
extensions="*.xyz",
321321
readable=True,
322322
writeable=False,

sigima_/tests/guiutils.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# Copyright (c) DataLab Platform Developers, BSD 3-Clause license, see LICENSE file.
2+
3+
"""
4+
Utilities to manage GUI activation for tests executed with pytest
5+
or as standalone scripts.
6+
"""
7+
8+
import types
9+
10+
import pytest
11+
12+
CURRENT_REQUEST: pytest.FixtureRequest | None = None
13+
14+
15+
def set_current_request(request: pytest.FixtureRequest | None) -> None:
16+
"""Store the current pytest request object (for use in is_gui_enabled)"""
17+
global CURRENT_REQUEST # pylint: disable=global-statement
18+
CURRENT_REQUEST = request
19+
20+
21+
def is_gui_enabled() -> bool:
22+
"""
23+
Return True if GUI mode is enabled (i.e. pytest was run with --gui),
24+
or if a DummyRequest with --gui was set (for __main__ execution).
25+
"""
26+
return bool(CURRENT_REQUEST and CURRENT_REQUEST.config.getoption("--gui"))
27+
28+
29+
class DummyRequest:
30+
"""
31+
Dummy request object to simulate pytest --gui when running a test manually.
32+
33+
Example usage:
34+
test_x(request=DummyRequest(gui=True))
35+
"""
36+
37+
def __init__(self, gui: bool = True):
38+
self.config = types.SimpleNamespace()
39+
self.config.getoption = lambda name: gui if name == "--gui" else None

0 commit comments

Comments
 (0)