Beispiel #1
0
class TestHtParams:
    @pytest.mark.parametrize("name, acl", [(name, param.acl) for name, param in HtParams.items()])
    def test_acl(self, name, acl):
        assert acl is not None, "acl must not be None"
        m = re.match("^(r-|-w|rw)$", acl)
        assert m is not None, "invalid acl definition for parameter {!r} [{!r}]".format(name, acl)
        #assert 0

    @pytest.mark.parametrize("name, min, max", [(name, param.min, param.max) for name, param in HtParams.items()])
    def test_limits(self, name, min, max):
        assert min is not None, "minimal value for parameter {!r} must not be None".format(name)
        assert max is not None, "maximal value for parameter {!r} must not be None".format(name)
        assert min <= max
        assert max >= min
        #assert 0

    @pytest.mark.run_if_connected
    @pytest.mark.parametrize("name, param", [(name, param) for name, param in HtParams.items()])
    def test_validate_param(self, hthp, name, param):
        hthp.send_request(param.cmd())
        resp = hthp.read_response()
        m = re.match("^{},.*NAME=([^,]+).*VAL=([^,]+).*MAX=([^,]+).*MIN=([^,]+).*$".format(param.cmd()), resp)
        assert m is not None, "invalid response for query of parameter {!r} [{!r}]".format(name, resp)
        dp_name = m.group(1).strip()
        assert dp_name == name,\
            "data point name doesn't match with the parameter name {!r} [{!r}]".format(name, dp_name)
        dp_value = param.from_str(m.group(2))
        assert dp_value is not None, "data point value must not be None [{}]".format(dp_value)
        dp_max = param.from_str(m.group(3))
        assert dp_max == param.max,\
            "data point max value doesn't match with the parameter's one {!s} [{!s}]".format(param.max, dp_max)
        dp_min = param.from_str(m.group(4))
        assert dp_min == param.min,\
            "data point min value doesn't match with the parameter's one {!s} [{!s}]".format(param.min, dp_min)
class TestHtParams:
    @pytest.mark.parametrize("name, acl",
                             [(name, param.acl)
                              for name, param in HtParams.items()])
    def test_acl(self, name: str, acl: str):
        assert acl is not None, "'acl' must not be None"
        m = re.match(r"^(r-|-w|rw)$", acl)
        assert m is not None, "invalid acl definition for parameter {!r} [{!r}]".format(
            name, acl)
        #assert 0

    @pytest.mark.parametrize("name, min_val, max_val",
                             [(name, param.min_val, param.max_val)
                              for name, param in HtParams.items()])
    def test_limits(self, name: str, min_val: HtParamValueType,
                    max_val: HtParamValueType):
        assert min_val is not None, "minimal value for parameter {!r} must not be None".format(
            name)
        assert max_val is not None, "maximal value for parameter {!r} must not be None".format(
            name)
        assert min_val <= max_val
        assert max_val >= min_val
        #assert 0

    @pytest.mark.parametrize("name, param", HtParams.items())
    def test_get(self, name: str, param: HtParam):
        assert HtParams.get(name) == param
        #assert 0

    def test_dump(self):
        assert HtParams.dump() is None
        #assert 0

    @pytest.mark.run_if_connected
    @pytest.mark.usefixtures("reconnect")
    @pytest.mark.parametrize("name, param", HtParams.items())
    def test_validate_param(self, hthp: HtHeatpump, name: str, param: HtParam):
        hthp.send_request(param.cmd())
        resp = hthp.read_response()
        m = re.match(
            r"^{},.*NAME=([^,]+).*VAL=([^,]+).*MAX=([^,]+).*MIN=([^,]+).*$".
            format(param.cmd()), resp)
        assert m is not None, "invalid response for query of parameter {!r} [{!r}]".format(
            name, resp)
        dp_name = m.group(1).strip()
        assert dp_name == name,\
            "data point name doesn't match with the parameter name {!r} [{!r}]".format(name, dp_name)
        dp_value = param.from_str(m.group(2))
        assert dp_value is not None, "data point value must not be None [{}]".format(
            dp_value)
        dp_max = param.from_str(m.group(3))
        assert dp_max == param.max_val,\
            "data point max value doesn't match with the parameter's one {!s} [{!s}]".format(param.max_val, dp_max)
        dp_min = param.from_str(m.group(4))
        if name == "Verdichter laeuft seit" and dp_min == 10:
            dp_min = 0  # seems to be incorrect for the data point "Verdichter laeuft seit" [10 == 0]
        assert dp_min == param.min_val,\
            "data point min value doesn't match with the parameter's one {!s} [{!s}]".format(param.min_val, dp_min)
class TestHtParam:
    @pytest.mark.parametrize(
        "s, data_type, exp_value, strict",
        [
            ("0", HtDataTypes.BOOL, False, False),
            ("1", HtDataTypes.BOOL, True, False),
            ("123", HtDataTypes.INT, 123, False),
            ("-321", HtDataTypes.INT, -321, False),
            ("123.456", HtDataTypes.FLOAT, 123.456, False),
            ("-321.456", HtDataTypes.FLOAT, -321.456, False),
            ("789", HtDataTypes.FLOAT, 789.0, False),
            # -- should raise a 'ValueError':
            ("True", HtDataTypes.BOOL, None, False),
            ("False", HtDataTypes.BOOL, None, False),
            ("true", HtDataTypes.BOOL, None, False),
            ("false", HtDataTypes.BOOL, None, False),
            ("yes", HtDataTypes.BOOL, None, False),
            ("no", HtDataTypes.BOOL, None, False),
            ("y", HtDataTypes.BOOL, None, False),
            ("n", HtDataTypes.BOOL, None, False),
            ("TRUE", HtDataTypes.BOOL, None, False),
            ("FALSE", HtDataTypes.BOOL, None, False),
            ("YES", HtDataTypes.BOOL, None, False),
            ("NO", HtDataTypes.BOOL, None, False),
            ("Y", HtDataTypes.BOOL, None, False),
            ("N", HtDataTypes.BOOL, None, False),
            ("abc", HtDataTypes.BOOL, None, False),
            ("def", HtDataTypes.INT, None, False),
            ("--99", HtDataTypes.INT, None, False),
            ("12+55", HtDataTypes.INT, None, False),
            ("ghi", HtDataTypes.FLOAT, None, False),
            ("--99.0", HtDataTypes.FLOAT, None, False),
            ("12.3+55.9", HtDataTypes.FLOAT, None, False),
            ("789", HtDataTypes.FLOAT, None, True),
            # ...
        ])
    def test_from_str_static(self, s: str, data_type: HtDataTypes,
                             exp_value: Optional[HtParamValueType],
                             strict: bool):
        if exp_value is None:
            with pytest.raises(ValueError):
                HtParam.from_str(s, data_type, strict)
        else:
            assert HtParam.from_str(s, data_type, strict) == exp_value
        #assert 0

    def test_from_str_static_assert(self):
        with pytest.raises(AssertionError):
            HtParam.from_str("", 0)
        #assert 0

    @pytest.mark.parametrize("param", HtParams.values())
    def test_from_str_member(self, param: HtParam):
        assert param.from_str(param.to_str(
            param.min_val)) == param.min_val  # type: ignore
        assert param.from_str(param.to_str(
            param.max_val)) == param.max_val  # type: ignore
        #assert 0

    @pytest.mark.parametrize(
        "val, data_type, exp_str",
        [
            (False, HtDataTypes.BOOL, "0"),
            (True, HtDataTypes.BOOL, "1"),
            (123, HtDataTypes.INT, "123"),
            (-321, HtDataTypes.INT, "-321"),
            (123.456, HtDataTypes.FLOAT, "123.456"),
            (-321.456, HtDataTypes.FLOAT, "-321.456"),
            (789, HtDataTypes.FLOAT, "789.0"),
            (-789, HtDataTypes.FLOAT, "-789.0"),
            (789.0, HtDataTypes.FLOAT, "789.0"),
            (-789.0, HtDataTypes.FLOAT, "-789.0"),
            # ... add some more samples here!
        ])
    def test_to_str_static(self, val: HtParamValueType, data_type: HtDataTypes,
                           exp_str: str):
        assert HtParam.to_str(val, data_type) == exp_str
        #assert 0

    @pytest.mark.parametrize("param", HtParams.values())
    def test_to_str_member(self, param: HtParam):
        assert param.to_str(param.min_val) == HtParam.to_str(
            param.min_val, param.data_type)  # type: ignore
        assert param.to_str(param.max_val) == HtParam.to_str(
            param.max_val, param.data_type)  # type: ignore
        #assert 0

    @pytest.mark.parametrize("name, param", HtParams.items())
    def test_repr(self, name: str, param: HtParam):
        assert repr(param) == "HtParam({},{:d},{!r},{}[{},{}])".format(
            param.dp_type, param.dp_number, param.acl, param.data_type,
            param.min_val, param.max_val)
        #assert 0

    @pytest.mark.parametrize("name, cmd",
                             [(name, param.cmd())
                              for name, param in HtParams.items()])
    def test_cmd(self, name: str, cmd: str):
        m = re.match(r"^[S|M]P,NR=(\d+)$", cmd)
        assert m is not None, "non valid command string for parameter {!r} [{!r}]".format(
            name, cmd)
        #assert 0

    @pytest.mark.parametrize("name, param", HtParams.items())
    def test_set_limits(self, name: str, param: HtParam):
        assert not param.set_limits(param.min_val, param.max_val)
        #assert 0

    @pytest.mark.parametrize("name, param", HtParams.items())
    def test_in_limits(self, name: str, param: HtParam):
        assert param.in_limits(param.min_val)
        assert param.in_limits(param.max_val)
        #assert 0

    @pytest.mark.parametrize("param", HtParams.values())
    def test_in_limits_None(self, param: HtParam):
        assert param.in_limits(None)
Beispiel #4
0
class TestHtHeatpump:
    @pytest.mark.run_if_connected
    def test_open_connection(self, hthp: HtHeatpump):
        assert hthp.is_open
        with pytest.raises(IOError):
            hthp.open_connection()
        #assert 0

    @pytest.mark.parametrize("action", [
        VerifyAction.NONE(), {VerifyAction.NAME},
        {VerifyAction.NAME, VerifyAction.MIN},
        {VerifyAction.NAME, VerifyAction.MIN, VerifyAction.MAX},
        {
            VerifyAction.NAME, VerifyAction.MIN, VerifyAction.MAX,
            VerifyAction.VALUE
        }, {VerifyAction.MIN, VerifyAction.MAX, VerifyAction.VALUE},
        {VerifyAction.MAX, VerifyAction.VALUE}, {VerifyAction.VALUE},
        VerifyAction.ALL()
    ])
    def test_verify_param_action(self, cmdopt_device: str,
                                 cmdopt_baudrate: int, action: set):
        hp = HtHeatpump(device=cmdopt_device, baudrate=cmdopt_baudrate)
        val = hp.verify_param_action
        assert isinstance(val, set)
        hp.verify_param_action = action
        assert hp.verify_param_action == action
        hp.verify_param_action = val
        #assert 0

    def test_verify_param_error(self, cmdopt_device: str,
                                cmdopt_baudrate: int):
        hp = HtHeatpump(device=cmdopt_device, baudrate=cmdopt_baudrate)
        val = hp.verify_param_error
        assert isinstance(val, bool)
        hp.verify_param_error = True
        assert hp.verify_param_error is True
        hp.verify_param_error = False
        assert hp.verify_param_error is False
        hp.verify_param_error = val
        #assert 0

    def test_send_request(self, cmdopt_device: str, cmdopt_baudrate: int):
        hp = HtHeatpump(device=cmdopt_device, baudrate=cmdopt_baudrate)
        with pytest.raises(IOError):
            hp.send_request(r"LIN")
        #assert 0

    def test_read_response(self, cmdopt_device: str, cmdopt_baudrate: int):
        hp = HtHeatpump(device=cmdopt_device, baudrate=cmdopt_baudrate)
        with pytest.raises(IOError):
            hp.read_response()
        #assert 0

    @pytest.mark.run_if_connected
    @pytest.mark.usefixtures("reconnect")
    def test_get_serial_number(self, hthp: HtHeatpump):
        rid = hthp.get_serial_number()
        assert isinstance(rid, int), "'rid' must be of type int"
        assert rid > 0
        #assert 0

    @pytest.mark.run_if_connected
    @pytest.mark.usefixtures("reconnect")
    def test_get_version(self, hthp: HtHeatpump):
        version = hthp.get_version()
        # ( "3.0.20", 2321 )
        assert isinstance(version, tuple), "'version' must be of type tuple"
        assert len(version) == 2
        ver_str, ver_num = version
        assert isinstance(ver_str, str), "'ver_str' must be of type str"
        m = re.match(r"^(\d+).(\d+).(\d+)$", ver_str)
        assert m is not None, "invalid version string [{!r}]".format(ver_str)
        assert isinstance(ver_num, int), "'ver_num' must be of type int"
        assert ver_num > 0
        hthp.send_request(r"SP,NR=9")
        resp = hthp.read_response()
        m = re.match(r"^SP,NR=9,.*NAME=([^,]+).*VAL=([^,]+).*$", resp)
        assert m is not None, "invalid response for query of the software version [{!r}]".format(
            resp)
        assert ver_str == m.group(1).strip()
        assert ver_num == int(m.group(2))
        #assert 0

    @pytest.mark.run_if_connected
    @pytest.mark.usefixtures("reconnect")
    def test_get_date_time(self, hthp: HtHeatpump):
        date_time = hthp.get_date_time()
        # (datetime.datetime(...), 2)  # 2 = Tuesday
        assert isinstance(date_time,
                          tuple), "'date_time' must be of type tuple"
        assert len(date_time) == 2
        dt, weekday = date_time
        assert isinstance(dt,
                          datetime.datetime), "'dt' must be of type datetime"
        assert isinstance(weekday, int), "'weekday' must be of type int"
        assert weekday in range(1, 8)
        #assert 0

    @pytest.mark.run_if_connected
    @pytest.mark.usefixtures("reconnect")
    def test_set_date_time(self, hthp: HtHeatpump):
        pass  # TODO
        #assert 0

    def test_set_date_time_raises_TypeError(self, cmdopt_device: str,
                                            cmdopt_baudrate: int):
        hp = HtHeatpump(device=cmdopt_device, baudrate=cmdopt_baudrate)
        with pytest.raises(TypeError):
            hp.set_date_time(123)  # type: ignore
        #assert 0

    @pytest.mark.run_if_connected
    @pytest.mark.usefixtures("reconnect")
    def test_get_last_fault(self, hthp: HtHeatpump):
        fault = hthp.get_last_fault()
        # (29, 20, datetime.datetime(...), "EQ_Spreizung")
        assert isinstance(fault, tuple), "'fault' must be of type tuple"
        assert len(fault) == 4
        index, error, dt, msg = fault
        assert isinstance(index, int), "'index' must be of type int"
        assert 0 <= index < hthp.get_fault_list_size()
        assert isinstance(error, int), "'error' must be of type int"
        assert error >= 0
        assert isinstance(dt,
                          datetime.datetime), "'dt' must be of type datetime"
        assert isinstance(msg, str), "'msg' must be of type str"
        #assert 0

    @pytest.mark.run_if_connected
    @pytest.mark.usefixtures("reconnect")
    def test_get_fault_list_size(self, hthp: HtHeatpump):
        size = hthp.get_fault_list_size()
        assert isinstance(size, int), "'size' must be of type int"
        assert size >= 0
        #assert 0

    @pytest.mark.run_if_connected
    @pytest.mark.usefixtures("reconnect")
    def test_get_fault_list(self, hthp: HtHeatpump):
        fault_list = hthp.get_fault_list()
        # [ { "index": 29,  # fault list index
        #     "error": 20,  # error code
        #     "datetime": datetime.datetime(...),  # date and time of the entry
        #     "message": "EQ_Spreizung",  # error message
        #     },
        #   # ...
        #   ]
        assert isinstance(fault_list,
                          list), "'fault_list' must be of type list"
        for entry in fault_list:
            assert isinstance(entry, dict), "'entry' must be of type dict"
            index = entry["index"]
            assert isinstance(index, int), "'index' must be of type int"
            assert 0 <= index < hthp.get_fault_list_size()
            error = entry["error"]
            assert isinstance(error, int), "'error' must be of type int"
            assert error >= 0
            dt = entry["datetime"]
            assert isinstance(
                dt, datetime.datetime), "'dt' must be of type datetime"
            msg = entry["message"]
            assert isinstance(msg, str), "'msg' must be of type str"
        #assert 0

    @pytest.mark.run_if_connected
    @pytest.mark.usefixtures("reconnect")
    def test_get_fault_list_with_index(self, hthp: HtHeatpump):
        size = hthp.get_fault_list_size()
        assert isinstance(size, int), "'size' must be of type int"
        assert size >= 0
        for i in range(size):
            fault_list = hthp.get_fault_list(i)
            assert isinstance(fault_list,
                              list), "'fault_list' must be of type list"
            assert len(fault_list) == 1
            entry = fault_list[0]
            assert isinstance(entry, dict), "'entry' must be of type dict"
            index = entry["index"]
            assert isinstance(index, int), "'index' must be of type int"
            assert 0 <= index < hthp.get_fault_list_size()
            error = entry["error"]
            assert isinstance(error, int), "'error' must be of type int"
            assert error >= 0
            dt = entry["datetime"]
            assert isinstance(
                dt, datetime.datetime), "'dt' must be of type datetime"
            msg = entry["message"]
            assert isinstance(msg, str), "'msg' must be of type str"
        #assert 0

    @pytest.mark.run_if_connected
    @pytest.mark.usefixtures("reconnect")
    def test_get_fault_list_with_index_raises_IOError(self, hthp: HtHeatpump):
        with pytest.raises(IOError):
            hthp.get_fault_list(-1)  # index=-1 is invalid
        with pytest.raises(IOError):
            hthp.get_fault_list(9999)  # index=9999 is invalid
        #assert 0

    @pytest.mark.run_if_connected
    @pytest.mark.usefixtures("reconnect")
    def test_get_fault_list_with_indices(self, hthp: HtHeatpump):
        size = hthp.get_fault_list_size()
        for cnt in range(size + 1):
            indices = random.sample(range(size), cnt)
            fault_list = hthp.get_fault_list(*indices)
            assert isinstance(fault_list,
                              list), "'fault_list' must be of type list"
            for entry in fault_list:
                assert isinstance(entry, dict), "'entry' must be of type dict"
                index = entry["index"]
                assert isinstance(index, int), "'index' must be of type int"
                assert 0 <= index < hthp.get_fault_list_size()
                error = entry["error"]
                assert isinstance(error, int), "'error' must be of type int"
                assert error >= 0
                dt = entry["datetime"]
                assert isinstance(
                    dt, datetime.datetime), "'dt' must be of type datetime"
                msg = entry["message"]
                assert isinstance(msg, str), "'msg' must be of type str"
        #assert 0

    @pytest.mark.run_if_connected
    @pytest.mark.usefixtures("reconnect")
    @pytest.mark.parametrize("name, param", HtParams.items())
    def test_get_param(self, hthp: HtHeatpump, name: str, param: HtParam):
        value = hthp.get_param(name)
        assert value is not None, "'value' must not be None"
        assert param.in_limits(value)
        #assert 0

    def test_get_param_raises_KeyError(self, cmdopt_device: str,
                                       cmdopt_baudrate: int):
        hp = HtHeatpump(device=cmdopt_device, baudrate=cmdopt_baudrate)
        with pytest.raises(KeyError):
            hp.get_param("BlaBlaBla")
        #assert 0

    @pytest.mark.run_if_connected
    @pytest.mark.usefixtures("reconnect")
    @pytest.mark.parametrize("name, param", HtParams.items())
    def test_set_param(self, hthp: HtHeatpump, name: str, param: HtParam):
        pass  # TODO
        #assert 0

    def test_set_param_raises_KeyError(self, cmdopt_device: str,
                                       cmdopt_baudrate: int):
        hp = HtHeatpump(device=cmdopt_device, baudrate=cmdopt_baudrate)
        with pytest.raises(KeyError):
            hp.set_param("BlaBlaBla", 123)
        #assert 0

    @pytest.mark.parametrize(
        "name, param",
        [(name, param) for name, param in HtParams.items()
         if param.data_type in (HtDataTypes.INT, HtDataTypes.FLOAT)])
    def test_set_param_raises_ValueError(self, cmdopt_device: str,
                                         cmdopt_baudrate: int, name: str,
                                         param: HtParam):
        hp = HtHeatpump(device=cmdopt_device, baudrate=cmdopt_baudrate)
        with pytest.raises(ValueError):
            hp.set_param(name, param.min_val - 1,
                         ignore_limits=False)  # type: ignore
        with pytest.raises(ValueError):
            hp.set_param(name, param.max_val + 1,
                         ignore_limits=False)  # type: ignore
        #assert 0

    @pytest.mark.run_if_connected
    @pytest.mark.usefixtures("reconnect")
    def test_in_error(self, hthp: HtHeatpump):
        in_error = hthp.in_error
        assert isinstance(in_error, bool), "'in_error' must be of type bool"
        assert in_error == hthp.get_param("Stoerung")
        #assert 0

    @pytest.mark.run_if_connected
    @pytest.mark.usefixtures("reconnect")
    def test_query(self, hthp: HtHeatpump):
        values = hthp.query()
        # { "HKR Soll_Raum": 21.0,
        #   "Stoerung": False,
        #   "Temp. Aussen": 8.8,
        #   # ...
        #   }
        assert isinstance(values, dict), "'values' must be of type dict"
        assert len(values) == len(HtParams)
        for n, v in values.items():
            assert n in HtParams
            assert v is not None
            assert HtParams[n].in_limits(v)
        #assert 0

    @pytest.mark.run_if_connected
    @pytest.mark.usefixtures("reconnect")
    @pytest.mark.parametrize("names", [
        random.sample(HtParams.keys(), cnt)
        for cnt in range(len(HtParams) + 1)
    ])
    def test_query_with_names(self, hthp: HtHeatpump, names: List[str]):
        values = hthp.query(*names)
        # { "HKR Soll_Raum": 21.0,
        #   "Stoerung": False,
        #   "Temp. Aussen": 8.8,
        #   # ...
        #   }
        assert isinstance(values, dict), "'values' must be of type dict"
        assert not names or len(values) == len(set(names))
        for n, v in values.items():
            assert n in HtParams
            assert not names or n in names
            assert v is not None
            assert HtParams[n].in_limits(v)
        #assert 0

    @pytest.mark.run_if_connected
    @pytest.mark.usefixtures("reconnect")
    def test_fast_query(self, hthp: HtHeatpump):
        values = hthp.fast_query()
        assert isinstance(values, dict), "'values' must be of type dict"
        assert len(values) == len(HtParams.of_type("MP"))
        for n, v in values.items():
            assert n in HtParams
            assert v is not None
            assert HtParams[n].in_limits(v)
        #assert 0

    @pytest.mark.run_if_connected
    @pytest.mark.usefixtures("reconnect")
    @pytest.mark.parametrize("names", [
        random.sample(HtParams.of_type("MP").keys(), cnt)
        for cnt in range(len(HtParams.of_type("MP")) + 1)
    ])
    def test_fast_query_with_names(self, hthp: HtHeatpump, names: List[str]):
        values = hthp.fast_query(*names)
        assert isinstance(values, dict), "'values' must be of type dict"
        assert not names or len(values) == len(set(names))
        for n, v in values.items():
            assert n in HtParams
            assert not names or n in names
            assert v is not None
            assert HtParams[n].in_limits(v)
        #assert 0

    def test_fast_query_with_names_raises_KeyError(self, cmdopt_device: str,
                                                   cmdopt_baudrate: int):
        hp = HtHeatpump(device=cmdopt_device, baudrate=cmdopt_baudrate)
        with pytest.raises(KeyError):
            hp.fast_query("BlaBlaBla")
        #assert 0

    @pytest.mark.parametrize("names", [
        random.sample(HtParams.of_type("SP").keys(), cnt)
        for cnt in range(1,
                         len(HtParams.of_type("SP")) + 1)
    ])
    def test_fast_query_with_names_raises_ValueError(self, cmdopt_device: str,
                                                     cmdopt_baudrate: int,
                                                     names: List[str]):
        hp = HtHeatpump(device=cmdopt_device, baudrate=cmdopt_baudrate)
        with pytest.raises(ValueError):
            hp.fast_query(*names)
        #assert 0

    @pytest.mark.run_if_connected
    @pytest.mark.usefixtures("reconnect")
    def test_get_time_progs(self, hthp: HtHeatpump):
        time_progs = hthp.get_time_progs()
        assert isinstance(time_progs,
                          List), "'time_progs' must be of type list"
        assert len(time_progs) > 0
        assert all(
            [isinstance(time_prog, TimeProgram) for time_prog in time_progs])
        #assert 0

    @pytest.mark.run_if_connected
    @pytest.mark.usefixtures("reconnect")
    @pytest.mark.parametrize(
        "index",
        range(5))  # TODO range(5) -> range(len(hthp.get_time_progs()))
    def test_get_time_prog(self, hthp: HtHeatpump, index: int):
        time_prog = hthp.get_time_prog(index, with_entries=False)
        assert isinstance(
            time_prog, TimeProgram), "'time_prog' must be of type TimeProgram"
        time_prog = hthp.get_time_prog(index, with_entries=True)
        assert isinstance(
            time_prog, TimeProgram), "'time_prog' must be of type TimeProgram"
        #assert 0

    @pytest.mark.run_if_connected
    @pytest.mark.usefixtures("reconnect")
    @pytest.mark.parametrize("index", [-1, 5])
    def test_get_time_prog_raises_IOError(self, hthp: HtHeatpump, index: int):
        with pytest.raises(IOError):
            hthp.get_time_prog(index, with_entries=False)
        with pytest.raises(IOError):
            hthp.get_time_prog(index, with_entries=True)
        #assert 0

    @pytest.mark.run_if_connected
    @pytest.mark.usefixtures("reconnect")
    @pytest.mark.parametrize(
        "index, day, num",
        [  # for ALL time program entries
            (index, day, num) for index in range(5) for day in range(7)
            for num in range(7)
        ])
    def test_get_time_prog_entry(self, hthp: HtHeatpump, index: int, day: int,
                                 num: int):
        entry = hthp.get_time_prog_entry(index, day, num)
        assert isinstance(
            entry, TimeProgEntry), "'entry' must be of type TimeProgEntry"
        #assert 0

    @pytest.mark.run_if_connected
    @pytest.mark.usefixtures("reconnect")
    @pytest.mark.parametrize(
        "index, day, num",
        [
            (5, 0, 0),  # index=5 is invalid
            (0, 7, 0),  # day=7 is invalid
            (0, 0, 7),  # num=7 is invalid
        ])
    def test_get_time_prog_entry_raises_IOError(self, hthp: HtHeatpump,
                                                index: int, day: int,
                                                num: int):
        with pytest.raises(IOError):
            hthp.get_time_prog_entry(index, day, num)
        #assert 0

    @pytest.mark.run_if_connected
    @pytest.mark.usefixtures("reconnect")
    def test_set_time_prog_entry(self, hthp: HtHeatpump):
        pass  # TODO
        #assert 0

    @pytest.mark.run_if_connected
    @pytest.mark.usefixtures("reconnect")
    def test_set_time_prog(self, hthp: HtHeatpump):
        pass  # TODO
Beispiel #5
0
class TestHtParam:
    @pytest.mark.parametrize("str, data_type, exp_value", [
        ("TestString", HtDataTypes.STRING, "TestString"),
        ("0", HtDataTypes.BOOL, False),
        ("1", HtDataTypes.BOOL, True),
        ("True", HtDataTypes.BOOL, True),
        ("False", HtDataTypes.BOOL, False),
        ("true", HtDataTypes.BOOL, True),
        ("false", HtDataTypes.BOOL, False),
        ("yes", HtDataTypes.BOOL, True),
        ("no", HtDataTypes.BOOL, False),
        ("y", HtDataTypes.BOOL, True),
        ("n", HtDataTypes.BOOL, False),
        ("TRUE", HtDataTypes.BOOL, True),
        ("FALSE", HtDataTypes.BOOL, False),
        ("YES", HtDataTypes.BOOL, True),
        ("NO", HtDataTypes.BOOL, False),
        ("Y", HtDataTypes.BOOL, True),
        ("N", HtDataTypes.BOOL, False),
        ("123", HtDataTypes.INT, 123),
        ("-321", HtDataTypes.INT, -321),
        ("123.456", HtDataTypes.FLOAT, 123.456),
        ("-321.456", HtDataTypes.FLOAT, -321.456),
        ("789", HtDataTypes.FLOAT, 789),
        # -- should raise a 'ValueError':
        ("abc", HtDataTypes.BOOL, None),
        ("def", HtDataTypes.INT, None),
        ("--99", HtDataTypes.INT, None),
        ("12+55", HtDataTypes.INT, None),
        ("ghi", HtDataTypes.FLOAT, None),
        ("--99.0", HtDataTypes.FLOAT, None),
        ("12.3+55.9", HtDataTypes.FLOAT, None),
        # ...
    ])
    def test_from_str(self, str, data_type, exp_value):
        if exp_value is None:
            with pytest.raises(ValueError):
                HtParam.from_str(str, data_type)
        else:
            assert HtParam.from_str(str, data_type) == exp_value
        #assert 0

    @pytest.mark.parametrize("val, data_type, exp_str", [
        ("TestString", HtDataTypes.STRING, "TestString"),
        (False, HtDataTypes.BOOL, "0"),
        (True, HtDataTypes.BOOL, "1"),
        (123, HtDataTypes.INT, "123"),
        (-321, HtDataTypes.INT, "-321"),
        (123.456, HtDataTypes.FLOAT, "123.456"),
        (-321.456, HtDataTypes.FLOAT, "-321.456"),
        (789, HtDataTypes.FLOAT, "789.0"),
        (-789, HtDataTypes.FLOAT, "-789.0"),
        (789.0, HtDataTypes.FLOAT, "789.0"),
        (-789.0, HtDataTypes.FLOAT, "-789.0"),
        # ... add some more samples here!
    ])
    def test_to_str(self, val, data_type, exp_str):
        assert HtParam.to_str(val, data_type) == exp_str
        #assert 0

    @pytest.mark.parametrize("name, cmd", [(name, param.cmd()) for name, param in HtParams.items()])
    def test_cmd_format(self, name, cmd):
        m = re.match("^[S|M]P,NR=(\d+)$", cmd)
        assert m is not None, "non valid command string for parameter {!r} [{!r}]".format(name, cmd)