diff --git a/src/easyscience/Objects/new_variable/descriptor_number.py b/src/easyscience/Objects/new_variable/descriptor_number.py index 95c6fc5e..4fd25709 100644 --- a/src/easyscience/Objects/new_variable/descriptor_number.py +++ b/src/easyscience/Objects/new_variable/descriptor_number.py @@ -101,7 +101,7 @@ def full_value(self) -> Variable: @full_value.setter def full_value(self, full_value: Variable) -> None: - raise AttributeError(f'Full_value is read-only. Change the value and variance seperately. Or create a new {self.__class__.__name__}.') # noqa: E501 + raise AttributeError(f'Full_value is read-only. Change the value and variance seperately. or create a new {self.__class__.__name__}.') # noqa: E501 @property def value(self) -> numbers.Number: @@ -122,7 +122,7 @@ def value(self, value: numbers.Number) -> None: """ if not isinstance(value, numbers.Number) or isinstance(value, bool): raise TypeError(f'{value=} must be a number') - self._scalar.value = float(value) + self._scalar.value = value @property def unit(self) -> str: diff --git a/src/easyscience/Objects/new_variable/parameter.py b/src/easyscience/Objects/new_variable/parameter.py index 56dad214..b48f6a91 100644 --- a/src/easyscience/Objects/new_variable/parameter.py +++ b/src/easyscience/Objects/new_variable/parameter.py @@ -147,8 +147,24 @@ def full_value(self) -> Variable: return self._scalar @full_value.setter + @property_stack_deco def full_value(self, scalar: Variable) -> None: - raise AttributeError(f'Full_value is read-only. Change the value and variance seperately. Or create a new {self.__class__.__name__}.') # noqa: E501 + """ + Set the value of self. This creates a scipp scalar with a unit. + + :param full_value: New value of self + """ + if not self.enabled: + if global_object.debug: + raise CoreSetException(f'{str(self)} is not enabled.') + return + if not isinstance(scalar, Variable) and len(scalar.dims) == 0: + raise TypeError(f'{scalar=} must be a Scipp scalar') + if not isinstance(scalar.value, numbers.Number) or isinstance(scalar.value, bool): + raise TypeError('value of Scipp scalar must be a number') + self._scalar = scalar + if self._callback.fset is not None: + self._callback.fset(scalar) @property def value(self) -> numbers.Number: @@ -199,7 +215,7 @@ def value(self, value: numbers.Number) -> None: value = self._constraint_runner(self._constraints.virtual, value) - self._scalar.value = float(value) + self._scalar.value = value if self._callback.fset is not None: self._callback.fset(self._scalar.value) diff --git a/tests/unit_tests/Objects/new_variable/test_parameter.py b/tests/unit_tests/Objects/new_variable/test_parameter.py index 5269d81b..017e76bd 100644 --- a/tests/unit_tests/Objects/new_variable/test_parameter.py +++ b/tests/unit_tests/Objects/new_variable/test_parameter.py @@ -292,9 +292,15 @@ def test_full_value_no_match_callback(self, parameter: Parameter): assert parameter._callback.fget.call_count == 1 def test_set_full_value(self, parameter: Parameter): - # When Then Expect - with pytest.raises(AttributeError): - parameter.full_value = sc.scalar(2, unit='s') + # When + self.mock_callback.fget.return_value = sc.scalar(1, unit='m') + + # Then + parameter.full_value = sc.scalar(2, unit='m') + + # Expect + parameter._callback.fset.assert_called_once_with(sc.scalar(2, unit='m')) + assert parameter._scalar == sc.scalar(2, unit='m') def test_copy(self, parameter: Parameter): # When Then