File: position_test.py

package info (click to toggle)
pyvlx 0.2.27-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,548 kB
  • sloc: python: 7,914; makefile: 39; sh: 5
file content (145 lines) | stat: -rw-r--r-- 6,627 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
135
136
137
138
139
140
141
142
143
144
145
"""Test for Position class."""
import unittest

from pyvlx import (
    CurrentPosition, Parameter, Position, SwitchParameter, SwitchParameterOff,
    SwitchParameterOn, UnknownPosition)
from pyvlx.exception import PyVLXException


class TestPosition(unittest.TestCase):
    """Test class for Position class."""

    # pylint: disable=invalid-name

    def test_no_position(self) -> None:
        """Test empty Position object."""
        self.assertEqual(Position().raw, b"\xF7\xFF")

    def test_raw(self) -> None:
        """Test raw assignment."""
        self.assertEqual(Position(Parameter(raw=b"\x00\x00")).raw, b"\x00\x00")
        self.assertEqual(Position(Parameter(raw=b"\x0A\x05")).raw, b"\x0A\x05")
        self.assertEqual(Position(Parameter(raw=b"\xC8\x00")).raw, b"\xC8\x00")

    def test_position(self) -> None:
        """Test initialization with position value."""
        self.assertEqual(Position(position=0).position, 0)
        self.assertEqual(Position(position=10).position, 10)
        self.assertEqual(Position(position=1234).position, 1234)
        self.assertEqual(Position(position=12345).position, 12345)
        self.assertEqual(Position(position=51200).position, 51200)

    def test_percent(self) -> None:
        """Test initialization with percent value."""
        self.assertEqual(Position(position_percent=0).position_percent, 0)
        self.assertEqual(Position(position_percent=5).position_percent, 5)
        self.assertEqual(Position(position_percent=50).position_percent, 50)
        self.assertEqual(Position(position_percent=95).position_percent, 95)
        self.assertEqual(Position(position_percent=100).position_percent, 100)

    def test_conversion(self) -> None:
        """Test conversion from one form to other."""
        self.assertEqual(Position(Parameter(raw=b"\x0A\x05")).position, 2565)
        self.assertEqual(Position(position_percent=50).position, 25600)
        self.assertEqual(Position(position=12345).position_percent, 24)
        self.assertEqual(Position(position=51200).position_percent, 100)
        # test tolerance for devices that report positions only close to 100%
        self.assertEqual(Position(position=51160).position_percent, 100)

    def test_fallback_to_unknown(self) -> None:
        """Test fallback to unknown."""
        self.assertEqual(Parameter(raw=b"\xC8\x01"), Parameter(raw=Parameter.from_int(Parameter.UNKNOWN_VALUE)))
        self.assertEqual(Parameter(raw=b"\xC9\x00"), Parameter(raw=Parameter.from_int(Parameter.UNKNOWN_VALUE)))
        self.assertEqual(Parameter(raw=b"\xD8\x00"), Parameter(raw=Parameter.from_int(Parameter.UNKNOWN_VALUE)))
        self.assertEqual(Parameter(raw=b"\xfe\x01"), Parameter(raw=Parameter.from_int(Parameter.UNKNOWN_VALUE)))

    def test_exception(self) -> None:
        """Test wrong initialization of Position."""
        with self.assertRaises(PyVLXException):
            Position(position=2.5)  # type: ignore
        with self.assertRaises(PyVLXException):
            Position(position=-1)
        with self.assertRaises(PyVLXException):
            Position(position=51201)
        with self.assertRaises(PyVLXException):
            Position(position_percent=2.5)  # type: ignore
        with self.assertRaises(PyVLXException):
            Position(position_percent=-1)
        with self.assertRaises(PyVLXException):
            Position(position_percent=101)
        with self.assertRaises(PyVLXException):
            Parameter(raw=b"\x00\x00\x00")
        with self.assertRaises(PyVLXException):
            Parameter(raw="\x00\x00")  # type: ignore

    def test_known(self) -> None:
        """Test 'known' property."""
        self.assertTrue(Position(Parameter(raw=b"\x12\x00")).known)
        self.assertTrue(Position(Parameter(raw=b"\xC8\x00")).known)
        self.assertFalse(Position(Parameter(raw=b"\xF7\xFF")).known)

        # Well, not really know. But at least not unknown:
        self.assertTrue(Position(Parameter(raw=b"\xD2\x00")).known)

    def test_open_closed(self) -> None:
        """Test open and closed property."""
        position_open = Position(position_percent=0)
        self.assertFalse(position_open.closed)
        self.assertTrue(position_open.open)
        position_closed = Position(position_percent=100)
        self.assertTrue(position_closed.closed)
        self.assertFalse(position_closed.open)
        position_closed = Position(position=51200)
        self.assertTrue(position_closed.closed)
        self.assertFalse(position_closed.open)
        position_closed = Position(position=51160)
        self.assertTrue(position_closed.closed)
        self.assertFalse(position_closed.open)
        position_half = Position(position_percent=50)
        self.assertFalse(position_half.closed)
        self.assertFalse(position_half.open)

    def test_str(self) -> None:
        """Test string representation."""
        self.assertEqual(str(Position(Parameter(raw=b"\xF7\xFF"))), "UNKNOWN")
        self.assertEqual(str(Position(position_percent=50)), "50 %")

    def test_unknown_position_class(self) -> None:
        """Test UnknownPosition class."""
        self.assertEqual(UnknownPosition().raw, b"\xF7\xFF")

    def test_current_position_class(self) -> None:
        """Test CurrentPosition class."""
        self.assertEqual(CurrentPosition().raw, b"\xD2\x00")

    def test_on_off(self) -> None:
        """Test SwitchParameter parameter."""
        parameter = SwitchParameter()
        self.assertFalse(parameter.is_on())
        self.assertFalse(parameter.is_off())
        parameter.set_on()
        self.assertTrue(parameter.is_on())
        self.assertFalse(parameter.is_off())
        parameter.set_off()
        self.assertFalse(parameter.is_on())
        self.assertTrue(parameter.is_off())

    def test_parsing_on_off(self) -> None:
        """Test parsing OnOFf from raw."""
        parameter_on = SwitchParameter(Parameter(raw=b"\x00\x00"))
        self.assertTrue(parameter_on.is_on())
        self.assertFalse(parameter_on.is_off())
        parameter_off = SwitchParameter(Parameter(raw=b"\xC8\x00"))
        self.assertFalse(parameter_off.is_on())
        self.assertTrue(parameter_off.is_off())

    def test_switch_parameter_on_class(self) -> None:
        """Test SwitchParameterOn class."""
        self.assertTrue(SwitchParameterOn().is_on())
        self.assertFalse(SwitchParameterOn().is_off())

    def test_switch_parameter_off_class(self) -> None:
        """Test SwitchParameterOff class."""
        self.assertFalse(SwitchParameterOff().is_on())
        self.assertTrue(SwitchParameterOff().is_off())