Skip to content

Test layer changes for ScatterWidget #162

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 13, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 36 additions & 28 deletions src/napari_matplotlib/tests/test_layer_changes.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from napari_matplotlib import (
FeaturesScatterWidget,
HistogramWidget,
ScatterWidget,
SliceWidget,
)
from napari_matplotlib.base import NapariMPLWidget
Expand All @@ -18,34 +19,32 @@
)


@pytest.mark.parametrize("widget_cls", [HistogramWidget, SliceWidget])
@pytest.mark.parametrize(
"widget_cls, n_layers",
[(HistogramWidget, 1), (SliceWidget, 1), (ScatterWidget, 2)],
)
def test_change_one_layer(
make_napari_viewer, brain_data, astronaut_data, widget_cls
make_napari_viewer,
brain_data,
astronaut_data,
widget_cls,
n_layers,
):
"""
Test all widgets that take one layer as input to make sure the plot changes
when the napari layer selection changes.
"""
viewer = make_napari_viewer()
assert_one_layer_plot_changes(
viewer, widget_cls, brain_data, astronaut_data
)


def assert_one_layer_plot_changes(
viewer: Viewer,
widget_cls: Type[NapariMPLWidget],
data1: Tuple[npt.NDArray[np.generic], Dict[str, Any]],
data2: Tuple[npt.NDArray[np.generic], Dict[str, Any]],
) -> None:
"""
When the selected layer is changed, make sure the plot generated
by `widget_cls` also changes.
"""
widget = widget_cls(viewer)
viewer.add_image(data1[0], **data1[1])
viewer.add_image(data2[0], **data2[1])
assert_plot_changes(viewer, widget)
# Add n copies of two different datasets
for _ in range(n_layers):
viewer.add_image(brain_data[0], **brain_data[1])
for _ in range(n_layers):
viewer.add_image(astronaut_data[0], **astronaut_data[1])

assert len(viewer.layers) == 2 * n_layers
assert_plot_changes(viewer, widget, n_layers=n_layers)


@pytest.mark.parametrize("widget_cls", [FeaturesScatterWidget])
Expand Down Expand Up @@ -76,26 +75,35 @@ def assert_features_plot_changes(
name: data + 1 for name, data in data[1]["features"].items()
}
viewer.add_points(data[0], **data[1])
assert_plot_changes(viewer, widget)
assert_plot_changes(viewer, widget, n_layers=1)


def assert_plot_changes(viewer: Viewer, widget: NapariMPLWidget) -> None:
def assert_plot_changes(
viewer: Viewer, widget: NapariMPLWidget, *, n_layers: int
) -> None:
"""
Assert that a widget plot changes when the layer selection
is changed. The passed viewer must already have two layers
is changed. The passed viewer must already have (2 * n_layers) layers
loaded.
"""
# Select first layer
# Select first layer(s)
viewer.layers.selection.clear()
viewer.layers.selection.add(viewer.layers[0])

for i in range(n_layers):
viewer.layers.selection.add(viewer.layers[i])
assert len(viewer.layers.selection) == n_layers
fig1 = deepcopy(widget.figure)

# Re-selecting first layer should produce identical plot
# Re-selecting first layer(s) should produce identical plot
viewer.layers.selection.clear()
viewer.layers.selection.add(viewer.layers[0])
for i in range(n_layers):
viewer.layers.selection.add(viewer.layers[i])
assert len(viewer.layers.selection) == n_layers
assert_figures_equal(widget.figure, fig1)

# Plotting the second layer should produce a different plot
# Plotting the second layer(s) should produce a different plot
viewer.layers.selection.clear()
viewer.layers.selection.add(viewer.layers[1])
for i in range(n_layers):
viewer.layers.selection.add(viewer.layers[n_layers + i])
assert len(viewer.layers.selection) == n_layers
assert_figures_not_equal(widget.figure, fig1)