Skip to content
Open
Show file tree
Hide file tree
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
8 changes: 7 additions & 1 deletion openhtf/core/measurements.py
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,10 @@ def with_args(self, **kwargs: Any) -> '_ConditionalValidator':
return self


def _round_value(value: Any, ndigits: int) -> Any:
return round(value, ndigits=ndigits) if value is not None else None


def _coordinates_len(coordinates: Any) -> int:
"""Returns count of measurement coordinates.

Expand Down Expand Up @@ -397,7 +401,9 @@ def with_precision(self, precision: int) -> 'Measurement':
if not isinstance(precision, int):
raise TypeError('Precision must be specified as an int, not %s' %
type(precision))
return self.with_transform(functools.partial(round, ndigits=precision))
return self.with_transform(
functools.partial(_round_value, ndigits=precision)
)

def with_transform(self, transform_fn: Callable[[Any], Any]) -> 'Measurement':
"""Set the transform function."""
Expand Down
24 changes: 24 additions & 0 deletions test/core/measurements_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,30 @@ def test_precision(self):
m.measured_value[42] = 1.2346
self.assertAlmostEqual(m.measured_value[42], 1.235)

def test_precision_handles_none(self):
"""Check that with_precision handles None values gracefully."""
m = htf.Measurement('meas_with_precision').with_precision(3)
m.measured_value.set(None)
self.assertIsNone(m.measured_value.value)

m_dim = htf.Measurement('meas_with_precision_and_dims').with_precision(
3
).with_dimensions('x')
m_dim.measured_value[42] = None
self.assertIsNone(m_dim.measured_value[42])

def test_precision_with_validator_none(self):
"""Check that with_precision with InRange validator handles None without crashing."""
m = (
htf.Measurement('meas_with_precision_and_range')
.with_precision(2)
.in_range(1.0, 5.0)
)
m.measured_value.set(None)
m.notify_value_set()
self.assertEqual(m.outcome, measurements.Outcome.FAIL)
self.assertIsNone(m.measured_value.value)

def test_cache_same_object(self):
m = htf.Measurement('measurement')
basetypes0 = m.as_base_types()
Expand Down
Loading