import numpy
import pint
import pytest
from ..units import convert_units_to_group_reference
from ..units import convert_values_to_units
[docs]
def test_group_reference_already_normalized():
values = [numpy.array([1.0]), numpy.array([2.0])]
units = ["mm", "mm"]
new_values, new_units = convert_units_to_group_reference(
values, units, fallback="largest"
)
assert new_units == ["mm", "mm"]
assert numpy.allclose(new_values, [[1.0], [2.0]])
[docs]
def test_group_reference_first_fallback():
values = [numpy.array([1.0]), numpy.array([1.0])]
units = ["mm", "um"]
new_values, new_units = convert_units_to_group_reference(
values, units, fallback="first"
)
assert new_units == ["mm", "mm"]
assert numpy.allclose(new_values[1], [0.001])
[docs]
def test_group_reference_largest_fallback():
values = [numpy.array([1.0]), numpy.array([1000.0])]
units = ["mm", "um"]
new_values, new_units = convert_units_to_group_reference(
values, units, fallback="largest"
)
assert new_units == ["mm", "mm"]
assert numpy.allclose(new_values[1], [1.0])
[docs]
def test_group_reference_smallest_fallback():
values = [numpy.array([1.0]), numpy.array([1.0])]
units = ["mm", "um"]
new_values, new_units = convert_units_to_group_reference(
values, units, fallback="smallest"
)
assert new_units == ["um", "um"]
assert numpy.allclose(new_values[0], [1000.0])
[docs]
def test_group_reference_explicit_override():
values = [numpy.array([1.0]), numpy.array([1.0])]
units = ["mm", "um"]
new_values, new_units = convert_units_to_group_reference(
values,
units,
reference_units={"[length]": "mm"},
)
assert new_units == ["mm", "mm"]
assert numpy.allclose(new_values[1], [0.001])
[docs]
def test_group_reference_mixed_dimensions():
values = [
numpy.array([1.0]),
numpy.array([1000.0]),
numpy.array([180]),
numpy.array([numpy.pi]),
]
units = ["m", "mm", "deg", "rad"]
new_values, new_units = convert_units_to_group_reference(
values,
units,
reference_units={"dimensionless": "deg"},
fallback="largest",
)
assert new_units == ["m", "m", "deg", "deg"]
assert numpy.allclose(new_values, [[1], [1], [180], [180]])
[docs]
def test_group_reference_no_fallback_keeps_units_partial_override():
values = [
numpy.array([1.0]),
numpy.array([1000.0]),
numpy.array([180]),
numpy.array([numpy.pi]),
]
units = ["m", "mm", "deg", "rad"]
new_values, new_units = convert_units_to_group_reference(
values,
units,
reference_units={"dimensionless": "deg"},
fallback=None,
)
assert new_units == ["m", "mm", "deg", "deg"]
assert numpy.allclose(new_values, [[1], [1000], [180], [180]])
[docs]
def test_group_reference_dimensionless():
values = [numpy.array([1.0]), numpy.array([2.0])]
units = [None, None]
new_values, new_units = convert_units_to_group_reference(values, units)
assert new_units == ["dimensionless", "dimensionless"]
assert numpy.allclose(new_values, [[1.0], [2.0]])
[docs]
def test_group_reference_invalid_fallback():
values = [numpy.array([1.0])]
units = ["m"]
with pytest.raises(ValueError):
convert_units_to_group_reference(values, units, fallback="invalid")
[docs]
def test_convert_values_simple():
values = [1.0, 2.0]
target_units = ["m", "s"]
result = convert_values_to_units(values, target_units)
assert result == [1.0, 2.0]
[docs]
def test_convert_values_with_units():
values = [(1000.0, "mm"), (2.0, "s")]
target_units = ["m", "s"]
result = convert_values_to_units(values, target_units)
assert result == [1.0, 2.0]
[docs]
def test_convert_values_dimensionless():
values = [(1.0, "dimensionless")]
target_units = [None]
result = convert_values_to_units(values, target_units)
assert result == [1.0]
[docs]
def test_convert_values_incompatible_units():
values = [(1.0, "m")]
target_units = ["s"]
with pytest.raises(pint.DimensionalityError):
convert_values_to_units(values, target_units)
[docs]
def test_convert_values_precision():
values = [(1.0, "km")]
target_units = ["m"]
result = convert_values_to_units(values, target_units)
assert result == [1000.0]
[docs]
def test_group_reference_partial_override_with_fallback():
values = [numpy.array([1.0]), numpy.array([1000.0])]
units = ["mm", "um"]
new_values, new_units = convert_units_to_group_reference(
values,
units,
reference_units={},
fallback="largest",
)
assert new_units == ["mm", "mm"]
assert numpy.allclose(new_values[1], [1.0])