File: dpt_18_scene_control_test.py

package info (click to toggle)
python-xknx 3.10.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,044 kB
  • sloc: python: 40,087; javascript: 8,556; makefile: 32; sh: 12
file content (102 lines) | stat: -rw-r--r-- 3,416 bytes parent folder | download | duplicates (2)
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
"""Unit test for KNX DPT 18 objects."""

from typing import Any

import pytest

from xknx.dpt import DPTArray, DPTBinary, DPTSceneControl, SceneControl
from xknx.exceptions import ConversionError, CouldNotParseTelegram


class TestSceneControl:
    """Test SceneControl class."""

    @pytest.mark.parametrize(
        ("data", "value"),
        [
            (
                {"scene_number": 5, "learn": False},
                SceneControl(5, False),
            ),
            (
                {"scene_number": 2},
                SceneControl(scene_number=2),
            ),
            (
                {"scene_number": 17, "learn": True},
                SceneControl(scene_number=17, learn=True),
            ),
        ],
    )
    def test_dict(self, data: dict[str, Any], value: SceneControl) -> None:
        """Test from_dict and as_dict methods."""
        test_value = SceneControl.from_dict(data)
        assert test_value == value
        # learn defaults to `False`
        default_dict = {"learn": False}
        assert value.as_dict() == default_dict | data

    @pytest.mark.parametrize(
        "data",
        [
            # invalid data
            {"learn": False},
            {"scene_number": "a"},
            {"scene_number": None, "learn": True},
            {"scene_number": 1, "learn": "a"},
            {"scene_number": 1, "learn": None},
        ],
    )
    def test_dict_invalid(self, data: dict[str, Any]) -> None:
        """Test from_dict and as_dict methods."""
        with pytest.raises(ValueError):
            SceneControl.from_dict(data)


class TestDPTSceneControl:
    """Test class for KNX DPTSceneControl objects."""

    @pytest.mark.parametrize(
        ("value", "raw"),
        [
            (SceneControl(1, False), (0b00000000,)),
            (SceneControl(1, True), (0b10000000,)),
            (SceneControl(64, False), (0b00111111,)),
            (SceneControl(64, True), (0b10111111,)),
        ],
    )
    def test_parse(self, value: SceneControl, raw: tuple[int]) -> None:
        """Test DPTTariffActiveEnergy parsing and streaming."""
        knx_value = DPTSceneControl.to_knx(value)
        assert knx_value == DPTArray(raw)
        assert DPTSceneControl.from_knx(knx_value) == value

    @pytest.mark.parametrize(
        ("value", "raw"),
        [
            ({"scene_number": 17, "learn": False}, (0x10,)),
            ({"scene_number": 21, "learn": True}, (0x94,)),
        ],
    )
    def test_to_knx_from_dict(self, value: dict[str, Any], raw: tuple[int]) -> None:
        """Test DPTTariffActiveEnergy parsing from a dict."""
        assert DPTSceneControl.to_knx(value) == DPTArray(raw)

    @pytest.mark.parametrize(
        ("value"),
        [
            SceneControl(scene_number=0, learn=False),
            SceneControl(scene_number=65, learn=True),
        ],
    )
    def test_to_knx_limits(self, value: SceneControl) -> None:
        """Test initialization of DPTTariffActiveEnergy with wrong value."""
        with pytest.raises(ConversionError):
            DPTSceneControl.to_knx(value)

    def test_from_knx_wrong_value(self) -> None:
        """Test DPTTariffActiveEnergy parsing with wrong value."""
        with pytest.raises(CouldNotParseTelegram):
            DPTSceneControl.from_knx(DPTArray((0xFF, 0x4E)))
        with pytest.raises(CouldNotParseTelegram):
            DPTSceneControl.from_knx(DPTBinary(True))