|
12 | 12 |
|
13 | 13 | from __future__ import annotations |
14 | 14 |
|
15 | | -from sigima.objects import Gauss2DParam, create_image_from_param |
| 15 | +from sigima.objects import Gauss2DParam, create_image_from_param, create_image_roi |
16 | 16 | from sigima.tests.data import create_paracetamol_signal |
17 | 17 |
|
18 | 18 | from datalab.adapters_metadata import GeometryAdapter, TableAdapter |
19 | 19 | from datalab.config import Conf |
20 | 20 | from datalab.env import execenv |
| 21 | +from datalab.gui.processor.base import extract_analysis_parameters |
21 | 22 | from datalab.objectmodel import get_uuid |
22 | 23 | from datalab.tests import datalab_test_app_context |
23 | 24 |
|
@@ -91,6 +92,69 @@ def test_delete_results_signal(): |
91 | 92 | execenv.print(" ✓ Stats result deleted") |
92 | 93 |
|
93 | 94 |
|
| 95 | +def test_delete_results_clears_analysis_parameters(): |
| 96 | + """Test that deleting results also clears analysis parameters. |
| 97 | +
|
| 98 | + This prevents auto_recompute_analysis from attempting to recompute |
| 99 | + deleted analyses when ROI changes. |
| 100 | + """ |
| 101 | + with datalab_test_app_context(console=False) as win: |
| 102 | + execenv.print("Test delete_results clears analysis parameters:") |
| 103 | + panel = win.imagepanel |
| 104 | + |
| 105 | + # Create a test image |
| 106 | + param = Gauss2DParam.create(height=200, width=200, sigma=20) |
| 107 | + img = create_image_from_param(param) |
| 108 | + panel.add_object(img) |
| 109 | + |
| 110 | + # Run centroid analysis to create results and store analysis parameters |
| 111 | + execenv.print(" Running centroid analysis...") |
| 112 | + with Conf.proc.show_result_dialog.temp(False): |
| 113 | + panel.processor.run_feature("centroid") |
| 114 | + |
| 115 | + # Verify that analysis parameters exist |
| 116 | + img_refreshed = panel.objmodel[get_uuid(img)] |
| 117 | + analysis_params = extract_analysis_parameters(img_refreshed) |
| 118 | + assert analysis_params is not None, ( |
| 119 | + "Analysis parameters should exist after running centroid" |
| 120 | + ) |
| 121 | + assert analysis_params.func_name == "centroid", ( |
| 122 | + "Analysis parameters should store the centroid function name" |
| 123 | + ) |
| 124 | + execenv.print(" ✓ Analysis parameters stored") |
| 125 | + |
| 126 | + # Delete all results |
| 127 | + execenv.print(" Deleting all results...") |
| 128 | + panel.objview.select_objects([get_uuid(img)]) |
| 129 | + panel.delete_results() |
| 130 | + |
| 131 | + # Verify that analysis parameters were also cleared |
| 132 | + img_after = panel.objmodel[get_uuid(img)] |
| 133 | + analysis_params_after = extract_analysis_parameters(img_after) |
| 134 | + assert analysis_params_after is None, ( |
| 135 | + "Analysis parameters should be cleared after deleting results" |
| 136 | + ) |
| 137 | + execenv.print(" ✓ Analysis parameters cleared") |
| 138 | + |
| 139 | + # Now add a ROI and verify no auto-recompute happens (no new results) |
| 140 | + execenv.print(" Adding ROI to verify no auto-recompute...") |
| 141 | + roi = create_image_roi("rectangle", [25, 25, 100, 100]) |
| 142 | + img_after.roi = roi |
| 143 | + panel.processor.auto_recompute_analysis(img_after) |
| 144 | + |
| 145 | + # Verify that no new results were created |
| 146 | + adapter_after_roi = GeometryAdapter.from_obj(img_after, "centroid") |
| 147 | + assert adapter_after_roi is None, ( |
| 148 | + "No centroid result should be created after ROI change " |
| 149 | + "because analysis parameters were cleared" |
| 150 | + ) |
| 151 | + execenv.print( |
| 152 | + " ✓ No auto-recompute after ROI change (analysis params cleared)" |
| 153 | + ) |
| 154 | + execenv.print("\n✓ All tests passed!") |
| 155 | + |
| 156 | + |
94 | 157 | if __name__ == "__main__": |
95 | 158 | test_delete_results_image() |
96 | 159 | test_delete_results_signal() |
| 160 | + test_delete_results_clears_analysis_parameters() |
0 commit comments