diff --git a/pymodbus/client/mixin.py b/pymodbus/client/mixin.py index a5c9d46d7..f91268cc1 100644 --- a/pymodbus/client/mixin.py +++ b/pymodbus/client/mixin.py @@ -927,7 +927,7 @@ def convert_from_registers( # noqa: C901 if not (data_len := data_type.value[1]): byte_list = bytearray() if word_order == "little": - registers.reverse() + registers = list(reversed(registers)) for x in registers: byte_list.extend(int.to_bytes(x, 2, "big")) if data_type == cls.DATATYPE.STRING: diff --git a/test/client/test_client.py b/test/client/test_client.py index faf791521..2128ae7ae 100755 --- a/test/client/test_client.py +++ b/test/client/test_client.py @@ -366,6 +366,34 @@ def test_client_mixin_convert_1234(self, datatype, registers, value): assert result == value assert regs == registers + @pytest.mark.parametrize("word_order", ["big", "little"]) + @pytest.mark.parametrize( + ("datatype", "value"), + [ + (ModbusClientMixin.DATATYPE.STRING, "Hello"), + (ModbusClientMixin.DATATYPE.STRING, "abcdefghij"), + (ModbusClientMixin.DATATYPE.BITS, [True, False, True] + [False] * 17), + (ModbusClientMixin.DATATYPE.INT32, 123456), + (ModbusClientMixin.DATATYPE.INT32, [1, 2, 3, 4]), + ], + ) + def test_client_mixin_convert_from_registers_no_mutation( + self, datatype, value, word_order + ): + """convert_from_registers must not mutate input and stay deterministic.""" + registers = ModbusClientMixin.convert_to_registers( + value, datatype, word_order=word_order + ) + snapshot = list(registers) + first = ModbusClientMixin.convert_from_registers( + registers, datatype, word_order=word_order + ) + assert registers == snapshot + second = ModbusClientMixin.convert_from_registers( + registers, datatype, word_order=word_order + ) + assert first == second + def test_client_mixin_convert_fail(self): """Test convert fail.""" with pytest.raises(TypeError):