From f3b33b758a04b379023389cb115a68230b53ad91 Mon Sep 17 00:00:00 2001 From: Giovanni Condello Date: Sun, 27 Apr 2025 19:04:53 +0200 Subject: [PATCH 1/3] XML Map messages --- deebot_client/messages/xml/__init__.py | 6 ++- deebot_client/messages/xml/map.py | 63 ++++++++++++++++++++++++++ tests/messages/xml/test_map.py | 31 +++++++++++++ 3 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 deebot_client/messages/xml/map.py create mode 100644 tests/messages/xml/test_map.py diff --git a/deebot_client/messages/xml/__init__.py b/deebot_client/messages/xml/__init__.py index 02406ca95..49e4664d0 100644 --- a/deebot_client/messages/xml/__init__.py +++ b/deebot_client/messages/xml/__init__.py @@ -6,6 +6,7 @@ from deebot_client.messages.xml.battery import BatteryInfo from deebot_client.messages.xml.charge_state import ChargeState +from deebot_client.messages.xml.map import MapP, Trace from deebot_client.messages.xml.pos import Pos if TYPE_CHECKING: @@ -13,7 +14,7 @@ from deebot_client.message import Message -__all__: Sequence[str] = ["BatteryInfo", "ChargeState", "Pos"] +__all__: Sequence[str] = ["BatteryInfo", "ChargeState", "MapP", "Pos", "Trace"] # fmt: off # ordered by file asc _MESSAGES: list[type[Message]] = [ @@ -21,6 +22,9 @@ ChargeState, + MapP, + Trace, + Pos ] # fmt: on diff --git a/deebot_client/messages/xml/map.py b/deebot_client/messages/xml/map.py new file mode 100644 index 000000000..8137ef184 --- /dev/null +++ b/deebot_client/messages/xml/map.py @@ -0,0 +1,63 @@ +"""Map messages.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +from deebot_client.events.map import MapTraceEvent, MinorMapEvent +from deebot_client.message import HandlingResult +from deebot_client.messages.xml.common import XmlMessage + +if TYPE_CHECKING: + from xml.etree.ElementTree import Element + + from deebot_client.event_bus import EventBus + + +class MapP(XmlMessage): + """MapP message.""" + + NAME = "MapP" + + @classmethod + def _handle_xml(cls, event_bus: EventBus, xml: Element) -> HandlingResult: + """Handle xml message and notify the correct event subscribers. + + Sample message: + b"" + :return: A message response + """ + if ( + (pid := xml.attrib.get("pid")) + and (piece := xml.attrib.get("p")) + and pid.isdecimal() + ): + event_bus.notify(MinorMapEvent(index=int(pid), value=piece)) + return HandlingResult.success() + + return HandlingResult.analyse() + + +class Trace(XmlMessage): + """Trace message.""" + + NAME = "trace" + + @classmethod + def _handle_xml(cls, event_bus: EventBus, xml: Element) -> HandlingResult: + """Handle xml message and notify the correct event subscribers. + + Sample message: + + :return: A message response + """ + if ( + (tf := xml.attrib.get("tf")) + and tf.isdecimal() + and (tt := xml.attrib.get("tt")) + and tt.isdecimal() + and (tr := xml.attrib.get("tr")) + ): + event_bus.notify(MapTraceEvent(start=int(tf), total=int(tt), data=tr)) + return HandlingResult.success() + return HandlingResult.analyse() diff --git a/tests/messages/xml/test_map.py b/tests/messages/xml/test_map.py new file mode 100644 index 000000000..b202fe11c --- /dev/null +++ b/tests/messages/xml/test_map.py @@ -0,0 +1,31 @@ +from __future__ import annotations + +import pytest + +from deebot_client.events import MinorMapEvent +from deebot_client.message import HandlingState +from deebot_client.messages.xml import MapP +from tests.messages import assert_message, assert_message_failure + + +@pytest.mark.parametrize(("pid", "data"), [(42, "base64data")]) +def test_MapP(pid: int, data: str) -> None: + xml_message = f"" + assert_message( + MapP, + xml_message, + MinorMapEvent(index=pid, value=data), + ) + + +@pytest.mark.parametrize( + "xml_message", + { + "", + "", + "", + "", + }, +) +def test_MapP_error(xml_message: str) -> None: + assert_message_failure(MapP, xml_message, HandlingState.ANALYSE_LOGGED) From 7b4eb76eda400e84ac273152afe5747c47259042 Mon Sep 17 00:00:00 2001 From: Giovanni Condello Date: Sun, 27 Apr 2025 19:11:36 +0200 Subject: [PATCH 2/3] Add more tests --- tests/messages/xml/test_map.py | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/tests/messages/xml/test_map.py b/tests/messages/xml/test_map.py index b202fe11c..b729eaaea 100644 --- a/tests/messages/xml/test_map.py +++ b/tests/messages/xml/test_map.py @@ -2,9 +2,9 @@ import pytest -from deebot_client.events import MinorMapEvent +from deebot_client.events import MapTraceEvent, MinorMapEvent from deebot_client.message import HandlingState -from deebot_client.messages.xml import MapP +from deebot_client.messages.xml import MapP, Trace from tests.messages import assert_message, assert_message_failure @@ -29,3 +29,28 @@ def test_MapP(pid: int, data: str) -> None: ) def test_MapP_error(xml_message: str) -> None: assert_message_failure(MapP, xml_message, HandlingState.ANALYSE_LOGGED) + + +@pytest.mark.parametrize(("tf", "tt", "tr"), [(13, 42, "base64data")]) +def test_Trace(tf: int, tt: int, tr: str) -> None: + xml_message = f"" + assert_message( + Trace, + xml_message, + MapTraceEvent(start=tf, total=tt, data=tr), + ) + + +@pytest.mark.parametrize( + "xml_message", + { + "", + "", + "", + "", + "", + "", + }, +) +def test_Trace_error(xml_message: str) -> None: + assert_message_failure(MapP, xml_message, HandlingState.ANALYSE_LOGGED) From 7d9f2465392ecda2a2ab8689b24479e143fdd4d7 Mon Sep 17 00:00:00 2001 From: Giovanni Condello Date: Sun, 27 Apr 2025 19:25:07 +0200 Subject: [PATCH 3/3] Fix tests --- tests/messages/xml/test_map.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/messages/xml/test_map.py b/tests/messages/xml/test_map.py index b729eaaea..a5b6a01bf 100644 --- a/tests/messages/xml/test_map.py +++ b/tests/messages/xml/test_map.py @@ -53,4 +53,4 @@ def test_Trace(tf: int, tt: int, tr: str) -> None: }, ) def test_Trace_error(xml_message: str) -> None: - assert_message_failure(MapP, xml_message, HandlingState.ANALYSE_LOGGED) + assert_message_failure(Trace, xml_message, HandlingState.ANALYSE_LOGGED)