Skip to content

Commit cdfd352

Browse files
committed
Added tests and placeholder tests for the FIBContext class
1 parent 61d48e5 commit cdfd352

1 file changed

Lines changed: 249 additions & 0 deletions

File tree

tests/client/contexts/test_fib.py

Lines changed: 249 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,249 @@
1+
import xml.etree.ElementTree as ET
2+
from pathlib import Path
3+
from typing import Any
4+
5+
import pytest
6+
7+
from murfey.client.contexts.fib import FIBContext
8+
9+
# -------------------------------------------------------------------------------------
10+
# FIBContext test utilty functions and fixtures
11+
# -------------------------------------------------------------------------------------
12+
13+
14+
def create_fib_maps_dataset_element(
15+
id: int,
16+
name: str,
17+
relative_path: str,
18+
center_x: float,
19+
center_y: float,
20+
center_z: float,
21+
size_x: float,
22+
size_y: float,
23+
size_z: float,
24+
rotation_angle: float,
25+
):
26+
# Create dataset node
27+
dataset = ET.Element("Dataset")
28+
# ID node
29+
id_node = ET.Element("Id")
30+
id_node.text = str(id)
31+
dataset.append(id_node)
32+
33+
# Name node
34+
name_node = ET.Element("Name")
35+
name_node.text = name
36+
dataset.append(name_node)
37+
38+
# Stage position node
39+
box_center = ET.Element("BoxCenter")
40+
for tag, value in (
41+
("CenterX", center_x),
42+
("CenterY", center_y),
43+
("CenterZ", center_z),
44+
):
45+
node = ET.Element(tag)
46+
node.text = str(value)
47+
box_center.append(node)
48+
dataset.append(box_center)
49+
50+
# Image size node
51+
box_size = ET.Element("BoxSize")
52+
for tag, value in (
53+
("SizeX", size_x),
54+
("SizeY", size_y),
55+
("SizeZ", size_z),
56+
):
57+
node = ET.Element(tag)
58+
node.text = str(value)
59+
box_size.append(node)
60+
dataset.append(box_size)
61+
62+
# Rotation angle
63+
angle_node = ET.Element("RotationAngle")
64+
angle_node.text = str(rotation_angle)
65+
dataset.append(angle_node)
66+
67+
# Relative path
68+
image_path_node = ET.Element("FinalImages")
69+
image_path_node.text = relative_path.replace("/", "\\")
70+
dataset.append(image_path_node)
71+
72+
return dataset
73+
74+
75+
def create_fib_maps_xml_metadata(
76+
project_name: str,
77+
datasets: list[dict[str, Any]],
78+
):
79+
# Create root node
80+
root = ET.Element("EMProject")
81+
82+
# Project name node
83+
project_name_node = ET.Element("ProjectName")
84+
project_name_node.text = project_name
85+
root.append(project_name_node)
86+
87+
# Datasets node
88+
datasets_node = ET.Element("Datasets")
89+
for id, dataset in enumerate(datasets):
90+
datasets_node.append(create_fib_maps_dataset_element(id, **dataset))
91+
root.append(datasets_node)
92+
93+
return root
94+
95+
96+
fib_maps_test_datasets = [
97+
{
98+
"name": name,
99+
"relative_path": relative_path,
100+
"center_x": cx,
101+
"center_y": cy,
102+
"center_z": cz,
103+
"size_x": sx,
104+
"size_y": sy,
105+
"size_z": sz,
106+
"rotation_angle": ra,
107+
}
108+
for (name, relative_path, cx, cy, cz, sx, sy, sz, ra) in (
109+
(
110+
"Electron Snapshot",
111+
"LayersData/Layer/Electron Snapshot",
112+
-0.002,
113+
-0.004,
114+
0.00000008,
115+
0.0036,
116+
0.0024,
117+
0.0,
118+
3.1415926535897931,
119+
),
120+
(
121+
"Electron Snapshot (2)",
122+
"LayersData/Layer/Electron Snapshot (2)",
123+
-0.002,
124+
-0.004,
125+
0.00000008,
126+
0.0036,
127+
0.0024,
128+
0.0,
129+
3.1415926535897931,
130+
),
131+
(
132+
"Electron Snapshot (3)",
133+
"LayersData/Layer/Electron Snapshot (3)",
134+
0.002,
135+
0.004,
136+
0.00000008,
137+
0.0036,
138+
0.0024,
139+
0.0,
140+
3.1415926535897931,
141+
),
142+
(
143+
"Electron Snapshot (4)",
144+
"LayersData/Layer/Electron Snapshot (4)",
145+
0.002,
146+
0.004,
147+
0.00000008,
148+
0.0036,
149+
0.0024,
150+
0.0,
151+
3.1415926535897931,
152+
),
153+
)
154+
]
155+
156+
157+
@pytest.fixture
158+
def fib_maps_metadata_file(tmp_path: Path):
159+
metadata = create_fib_maps_xml_metadata(
160+
"test-project",
161+
fib_maps_test_datasets,
162+
)
163+
tree = ET.ElementTree(metadata)
164+
ET.indent(tree, space=" ")
165+
save_path = tmp_path / "EMproject.emxml"
166+
tree.write(save_path, encoding="utf-8")
167+
return save_path
168+
169+
170+
@pytest.fixture
171+
def fib_maps_images(tmp_path: Path):
172+
image_list = []
173+
for dataset in fib_maps_test_datasets:
174+
name = str(dataset["name"])
175+
relative_path = str(dataset["relative_path"])
176+
file = tmp_path / relative_path / f"{name}.tiff"
177+
if not file.exists():
178+
file.parent.mkdir(parents=True, exist_ok=True)
179+
file.touch()
180+
image_list.append(file)
181+
return image_list
182+
183+
184+
# -------------------------------------------------------------------------------------
185+
# Tests
186+
# -------------------------------------------------------------------------------------
187+
def test_fib_autotem_context():
188+
pass
189+
190+
191+
@pytest.mark.parametrize("metadata_first", ((False, True)))
192+
def test_fib_maps_context(
193+
tmp_path: Path,
194+
fib_maps_metadata_file: Path,
195+
fib_maps_images: list[Path],
196+
metadata_first: bool,
197+
):
198+
# Initialise the FIBContext
199+
basepath = tmp_path
200+
context = FIBContext(
201+
acquisition_software="maps",
202+
basepath=basepath,
203+
token="",
204+
)
205+
# Assert that its initial state is correct
206+
assert not context._electron_snapshots
207+
assert not context._electron_snapshot_metadata
208+
assert not context._electron_snapshots_submitted
209+
210+
if metadata_first:
211+
# Read the metadata first
212+
context.post_transfer(fib_maps_metadata_file)
213+
# Metadata field should now be populated
214+
assert all(
215+
name in context._electron_snapshot_metadata.keys()
216+
for name in [image.stem for image in fib_maps_images]
217+
)
218+
# Parse the images one-by-one
219+
for image in fib_maps_images:
220+
name = image.stem
221+
context.post_transfer(image)
222+
# Entries should now start being removed from 'metadata' and 'images' fields
223+
assert (
224+
name not in context._electron_snapshots.keys()
225+
and name not in context._electron_snapshot_metadata.keys()
226+
and name in context._electron_snapshots_submitted
227+
)
228+
else:
229+
# Read in images first
230+
for image in fib_maps_images:
231+
name = image.stem
232+
context.post_transfer(image)
233+
assert (
234+
name in context._electron_snapshots.keys()
235+
and name not in context._electron_snapshot_metadata.keys()
236+
and name not in context._electron_snapshots_submitted
237+
)
238+
# Read in the metadata
239+
context.post_transfer(fib_maps_metadata_file)
240+
assert all(
241+
name in context._electron_snapshots_submitted
242+
and name not in context._electron_snapshots.keys()
243+
and name not in context._electron_snapshot_metadata.keys()
244+
for name in [file.stem for file in fib_maps_images]
245+
)
246+
247+
248+
def test_fib_meteor_context():
249+
pass

0 commit comments

Comments
 (0)