-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_websocket.py
More file actions
147 lines (112 loc) · 4.52 KB
/
test_websocket.py
File metadata and controls
147 lines (112 loc) · 4.52 KB
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
146
147
"""Tests for the Hypercolor WebSocket helpers."""
from __future__ import annotations
import struct
from pathlib import Path
from typing import Any
import msgspec
import pytest
from hypercolor import ws_protocol
from hypercolor.websocket import (
CanvasData,
EventMessage,
FrameData,
HelloMessage,
HypercolorEventStream,
SpectrumData,
)
PROTOCOL_MANIFEST = Path(__file__).resolve().parents[2] / "protocol" / "websocket-v1.json"
def test_ws_protocol_constants_match_manifest() -> None:
manifest = msgspec.json.decode(PROTOCOL_MANIFEST.read_bytes())
assert isinstance(manifest, dict)
channels = _expect_list(manifest["channels"])
binary_messages = _expect_list(manifest["binary_messages"])
preview_formats = _expect_dict(_expect_dict(manifest["preview_frame"])["formats"])
assert manifest["version"] == ws_protocol.WS_PROTOCOL_VERSION
assert manifest["subprotocol"] == ws_protocol.WS_SUBPROTOCOL
assert list(ws_protocol.WS_CHANNELS) == [str(channel["name"]) for channel in channels]
assert list(ws_protocol.WS_CAPABILITIES) == _expect_list(manifest["capabilities"])
assert dict(ws_protocol.BINARY_MESSAGE_TAGS) == {
str(message["name"]): int(message["tag"]) for message in binary_messages
}
assert dict(ws_protocol.PREVIEW_CHANNEL_TAGS) == {
int(message["tag"]): str(message["channel"])
for message in binary_messages
if message["layout"] == "preview_frame"
}
assert dict(ws_protocol.CANVAS_FORMAT_TAGS) == {
int(tag): name for name, tag in preview_formats.items()
}
def test_decode_hello_message() -> None:
message = HypercolorEventStream._decode_json(
'{"type":"hello","version":"1.0","state":{"running":true},"capabilities":["events"],"subscriptions":["events"]}'
)
assert isinstance(message, HelloMessage)
assert message.version == "1.0"
assert message.capabilities == ["events"]
def test_parse_led_frame() -> None:
zone_id = b"zone_0"
rgb = bytes([255, 0, 255, 0, 255, 255])
payload = bytearray()
payload.extend(b"\x01")
payload.extend(struct.pack("<II", 7, 1234))
payload.extend(b"\x01")
payload.extend(struct.pack("<H", len(zone_id)))
payload.extend(zone_id)
payload.extend(struct.pack("<H", 2))
payload.extend(rgb)
message = HypercolorEventStream._parse_led_frame(bytes(payload))
assert isinstance(message, FrameData)
assert message.frame_number == 7
assert message.zones[0].zone_id == "zone_0"
assert message.zones[0].rgb == rgb
def test_parse_spectrum() -> None:
payload = bytearray()
payload.extend(b"\x02")
payload.extend(struct.pack("<I", 4321))
payload.extend(b"\x02")
payload.extend(struct.pack("<ffff", 0.5, 0.6, 0.4, 0.2))
payload.extend(b"\x01")
payload.extend(struct.pack("<f", 0.75))
payload.extend(struct.pack("<2f", 0.1, 0.9))
message = HypercolorEventStream._parse_spectrum(bytes(payload))
assert isinstance(message, SpectrumData)
assert message.beat is True
assert message.bins == pytest.approx([0.1, 0.9])
def test_parse_canvas() -> None:
pixels = b"\x00\x11\x22\x33\x44\x55"
payload = bytearray()
payload.extend(b"\x03")
payload.extend(struct.pack("<II", 5, 999))
payload.extend(struct.pack("<HH", 1, 2))
payload.extend(b"\x00")
payload.extend(pixels)
message = HypercolorEventStream._parse_canvas(bytes(payload))
assert isinstance(message, CanvasData)
assert message.format == "rgb"
assert message.channel == "canvas"
assert message.height == 2
assert message.pixels == pixels
def test_parse_display_preview_jpeg() -> None:
jpeg = b"\xff\xd8\xff\xe0preview"
payload = bytearray()
payload.extend(b"\x07")
payload.extend(struct.pack("<II", 8, 1001))
payload.extend(struct.pack("<HH", 64, 32))
payload.extend(b"\x02")
payload.extend(jpeg)
message = HypercolorEventStream._parse_canvas(bytes(payload))
assert isinstance(message, CanvasData)
assert message.channel == "display_preview"
assert message.format == "jpeg"
assert message.width == 64
assert message.pixels == jpeg
def test_unknown_json_message_falls_back_to_event() -> None:
message = HypercolorEventStream._decode_json('{"type":"subscribed","channels":["events"]}')
assert isinstance(message, EventMessage)
assert message.event == "subscribed"
def _expect_dict(value: Any) -> dict[str, Any]:
assert isinstance(value, dict)
return value
def _expect_list(value: Any) -> list[Any]:
assert isinstance(value, list)
return value