Skip to content

Commit 4202908

Browse files
committedMar 14, 2025·
TST #14 improve code coverage further, now >99.5%
1 parent 22b0cfa commit 4202908

File tree

3 files changed

+86
-13
lines changed

3 files changed

+86
-13
lines changed
 

‎hklpy2/backends/hkl_soleil.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,9 @@ def __init__(
222222
self._factory = libhkl.factories()[geometry]
223223
self._engine_list = self._factory.create_new_engine_list() # note!
224224
self._engine = self._engine_list.engine_get_by_name(engine)
225-
self._geometry = self._factory.create_new_geometry()
225+
self._geometry = (
226+
self._factory.create_new_geometry()
227+
) # TODO: rename as self._hkl_geometry?
226228

227229
def __repr__(self) -> str:
228230
args = [
@@ -330,7 +332,7 @@ def extras(self, values: dict) -> None:
330332
known_names = self.extra_axis_names
331333
for k in values.keys():
332334
if k not in known_names:
333-
raise ValueError(
335+
raise KeyError(
334336
f"Unexpected dictionary key received: {k!r}"
335337
f" Expected one of these: {known_names!r}"
336338
)
@@ -412,7 +414,7 @@ def inverse(self, reals: dict[str, float]) -> dict[str, float]:
412414
if False in [isinstance(v, (float, int)) for v in reals.values()]:
413415
# fmt: off
414416
raise TypeError(
415-
"All dictionary must be numbers."
417+
"All values must be numbers."
416418
f" Received: {reals!r}"
417419
)
418420
# fmt: on

‎hklpy2/backends/tests/test_hkl_soleil.py

+81
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,18 @@
11
import math
22

3+
import numpy as np
34
import pytest
45
from pyRestTable import Table
6+
from ...misc import IDENTITY_MATRIX_3X3
7+
from ...tests.common import assert_context_result
8+
from ...ops import Operations
59

610
from .. import hkl_soleil
11+
# from contextlib import nullcontext as does_not_raise
12+
# context, expected
13+
# with context as reason:
14+
# pass
15+
# assert_context_result(expected, reason)
716

817

918
def test_version():
@@ -17,6 +26,78 @@ def test_version():
1726
assert solver.version == libhkl.VERSION
1827

1928

29+
def kryptonite():
30+
"""Make a kryptonite sample for E4CV."""
31+
from ...blocks.sample import Sample
32+
from ...blocks.lattice import Lattice
33+
from ...blocks.reflection import Reflection
34+
35+
core = Operations(None, default_sample=False)
36+
sample = Sample(core, "kryptonite", Lattice(0.01)) # should be interesting
37+
r1 = Reflection(
38+
name="r1",
39+
pseudos=dict(h=1, k=0, l=0),
40+
reals=dict(omega=1, chi=0, phi=0, tth=2),
41+
wavelength=1.54,
42+
geometry="E4CV",
43+
pseudo_axis_names="h k l".split(),
44+
real_axis_names="omega chi phi tth".split(),
45+
)
46+
sample.reflections.add(r1)
47+
return sample
48+
49+
50+
def test_hkl_soleil():
51+
arr = hkl_soleil.libhkl.Matrix.new_euler(0, 0, 0)
52+
assert hkl_soleil.to_hkl(arr) == arr
53+
54+
arr = np.array([1, 2, 3])
55+
np.testing.assert_array_equal(hkl_soleil.to_numpy(arr), arr)
56+
57+
58+
def test_HklSolver():
59+
solver = hkl_soleil.HklSolver(geometry="E4CV", engine="hkl")
60+
assert solver.wavelength == 1.54
61+
assert solver.axes_c == []
62+
assert solver.axes_r == ["omega", "chi", "phi", "tth"]
63+
assert solver.axes_w == ["omega", "chi", "phi", "tth"]
64+
assert solver.engines == ["hkl", "psi", "q", "incidence", "emergence"]
65+
66+
assert solver.sample is None # pre-requisite for next assertions
67+
assert solver.U == IDENTITY_MATRIX_3X3
68+
assert solver.UB == IDENTITY_MATRIX_3X3
69+
assert solver.calculate_UB(None, None) is None
70+
71+
with pytest.raises(TypeError) as reason:
72+
solver.addReflection(1.0)
73+
assert_context_result("Must supply Reflection object", reason)
74+
75+
with pytest.raises(KeyError) as reason:
76+
solver.extras = dict(trombone=0)
77+
assert_context_result("Unexpected dictionary key received", reason)
78+
79+
with pytest.raises(ValueError) as reason:
80+
solver.inverse(dict(a=1, b=2, c=3, d=4))
81+
assert_context_result("Wrong dictionary keys received", reason)
82+
83+
with pytest.raises(TypeError) as reason:
84+
solver.inverse(dict(omega="1", chi=0, phi=0, tth=0))
85+
assert_context_result("All values must be numbers", reason)
86+
87+
with pytest.raises(TypeError) as reason:
88+
solver.lattice = 1.0
89+
assert_context_result("Must supply Lattice object", reason)
90+
91+
with pytest.raises(ValueError) as reason:
92+
solver.refineLattice([])
93+
assert_context_result("Must provide 3 or more reflections", reason)
94+
95+
with pytest.raises(TypeError) as reason:
96+
solver.sample = "kryptonite"
97+
assert_context_result("Must supply Sample object", reason)
98+
solver.sample = kryptonite()
99+
100+
20101
@pytest.mark.parametrize(
21102
"gname, ename, reals",
22103
[

‎hklpy2/backends/tests/test_no_op.py

-10
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,5 @@
11
"""Test the no_op solver class."""
22

3-
# Many features are tested, albeit indrectly, in specific solvers.
4-
5-
# import pyRestTable
6-
# import pytest
7-
# from contextlib import nullcontext as does_not_raise
8-
# context, expected
9-
# with context as reason:
10-
# pass
11-
# assert_context_result(expected, reason)
12-
133
from ..no_op import NoOpSolver
144

155

0 commit comments

Comments
 (0)
Please sign in to comment.