File: remote_value_setepoint_shift_test.py

package info (click to toggle)
python-xknx 3.6.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 4,012 kB
  • sloc: python: 39,710; javascript: 8,556; makefile: 27; sh: 12
file content (134 lines) | stat: -rw-r--r-- 5,624 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
"""Unit test for RemoteValueSetpointShift objects."""

import pytest

from xknx import XKNX
from xknx.dpt import DPTArray, DPTBinary, DPTTemperature, DPTValue1Count
from xknx.exceptions import ConversionError, CouldNotParseTelegram
from xknx.remote_value.remote_value_setpoint_shift import (
    RemoteValueSetpointShift,
    SetpointShiftMode,
)


class TestRemoteValueSetpointShift:
    """Test class for RemoteValueSetpointShift objects."""

    def test_payload_valid_mode_assignment(self) -> None:
        """Test if setpoint_shift_mode is assigned properly by payload length."""
        xknx = XKNX()
        remote_value = RemoteValueSetpointShift(xknx=xknx)
        dpt_6_payload = DPTValue1Count.to_knx(1)
        dpt_9_payload = DPTTemperature.to_knx(1)

        with pytest.raises(CouldNotParseTelegram):
            remote_value.from_knx(DPTBinary(0))
        with pytest.raises(CouldNotParseTelegram):
            remote_value.from_knx(DPTArray((0, 1, 2)))

        # DPT 6 - payload_length 1
        assert remote_value._internal_dpt_class is None
        # default setpoint_shift_step = 0.1
        assert remote_value.from_knx(dpt_6_payload) == 0.1
        assert remote_value._internal_dpt_class == SetpointShiftMode.DPT6010.value
        with pytest.raises(CouldNotParseTelegram):
            # DPT 9 is invalid now
            remote_value.from_knx(dpt_9_payload)

        remote_value._internal_dpt_class = None
        # DPT 9 - payload_length 2
        assert remote_value.from_knx(dpt_9_payload) == 1
        assert remote_value._internal_dpt_class == SetpointShiftMode.DPT9002.value
        with pytest.raises(CouldNotParseTelegram):
            # DPT 6 is invalid now
            remote_value.from_knx(dpt_6_payload)

    def test_payload_valid_preassigned_mode(self) -> None:
        """Test if setpoint_shift_mode is assigned properly by payload length."""
        xknx = XKNX()
        remote_value_6 = RemoteValueSetpointShift(
            xknx=xknx, setpoint_shift_mode=SetpointShiftMode.DPT6010
        )
        remote_value_9 = RemoteValueSetpointShift(
            xknx=xknx, setpoint_shift_mode=SetpointShiftMode.DPT9002
        )
        dpt_6_payload = DPTValue1Count.to_knx(1)
        dpt_9_payload = DPTTemperature.to_knx(1)

        assert remote_value_6._internal_dpt_class == DPTValue1Count
        with pytest.raises(CouldNotParseTelegram):
            remote_value_6.from_knx(None)
        with pytest.raises(CouldNotParseTelegram):
            remote_value_6.from_knx(dpt_9_payload)
        with pytest.raises(CouldNotParseTelegram):
            remote_value_6.from_knx(DPTArray((1, 2, 3, 4)))
        with pytest.raises(CouldNotParseTelegram):
            remote_value_6.from_knx(DPTBinary(1))
        assert remote_value_6.from_knx(dpt_6_payload) == 0.1

        assert remote_value_9._internal_dpt_class == DPTTemperature
        with pytest.raises(CouldNotParseTelegram):
            remote_value_9.from_knx(None)
        with pytest.raises(CouldNotParseTelegram):
            remote_value_9.from_knx(dpt_6_payload)
        with pytest.raises(CouldNotParseTelegram):
            remote_value_9.from_knx(DPTArray((1, 2, 3)))
        with pytest.raises(CouldNotParseTelegram):
            remote_value_9.from_knx(DPTBinary(1))
        assert remote_value_9.from_knx(dpt_9_payload) == 1

    def test_to_knx_uninitialized(self) -> None:
        """Test to_knx raising ConversionError."""
        xknx = XKNX()
        remote_value = RemoteValueSetpointShift(xknx=xknx)

        assert remote_value._internal_dpt_class is None
        with pytest.raises(ConversionError):
            remote_value.to_knx(1)

    def test_to_knx_dpt_6(self) -> None:
        """Test to_knx returning DPT 6.010 payload."""
        xknx = XKNX()
        remote_value = RemoteValueSetpointShift(
            xknx=xknx, setpoint_shift_mode=SetpointShiftMode.DPT6010
        )
        assert remote_value.setpoint_shift_step == 0.1
        assert remote_value.to_knx(1) == DPTArray((10,))

    def test_to_knx_dpt_9(self) -> None:
        """Test to_knx returning DPT 9.002 payload."""
        xknx = XKNX()
        remote_value = RemoteValueSetpointShift(
            xknx=xknx, setpoint_shift_mode=SetpointShiftMode.DPT9002
        )
        assert remote_value.to_knx(1) == DPTArray((0x00, 0x64))

    def test_from_knx_uninitialized(self) -> None:
        """Test from_knx for uninitialized setpoint_shift_mode."""
        xknx = XKNX()
        remote_value = RemoteValueSetpointShift(xknx=xknx)
        with pytest.raises(CouldNotParseTelegram):
            remote_value.from_knx(1)
        # assign DPT 9.002 mode
        assert remote_value.from_knx(DPTArray((0x00, 0x64))) == 1
        assert remote_value.from_knx(DPTArray((0x07, 0xD0))) == 20
        # wrong payload length raises, once assigned
        with pytest.raises(CouldNotParseTelegram):
            remote_value.from_knx(DPTArray((10,)))

    def test_from_knx_dpt_6(self) -> None:
        """Test from_knx for DPT 6.010 setpoint_shift_mode."""
        xknx = XKNX()
        remote_value = RemoteValueSetpointShift(
            xknx=xknx, setpoint_shift_mode=SetpointShiftMode.DPT6010
        )
        assert remote_value.setpoint_shift_step == 0.1
        assert remote_value.from_knx(DPTArray((10,))) == 1

    def test_from_knx_dpt_9(self) -> None:
        """Test from_knx for DPT 9.002 setpoint_shift_mode."""
        xknx = XKNX()
        remote_value = RemoteValueSetpointShift(
            xknx=xknx, setpoint_shift_mode=SetpointShiftMode.DPT9002
        )
        assert remote_value.from_knx(DPTArray((0x00, 0x64))) == 1