Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions maps/python/Packet.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
##
## @author Zoey Rose

import Atrinik

## Send a notification command to the player.
## @param pl The player.
## @param msg Message contents of the notification.
Expand Down Expand Up @@ -32,7 +34,7 @@ def Notification(pl, msg, action = None, shortcut = None, delay = 0):
data += [3, delay]

# Send it off...
pl.SendPacket(27, fmt, *data)
pl.SendPacket(Atrinik.CLIENT_CMD_NOTIFICATION, fmt, *data)

## Send a map stats command.
## @pl Player to send the command to.
Expand All @@ -59,4 +61,4 @@ def MapStats(pl, name = None, music = None, weather = None):
data += [3, weather]

# Send it off...
pl.SendPacket(13, fmt, *data)
pl.SendPacket(Atrinik.CLIENT_CMD_MAPSTATS, fmt, *data)
97 changes: 97 additions & 0 deletions tools/tests/test_packet_commands.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
from __future__ import annotations

import importlib.util
from pathlib import Path
import sys
import types
import unittest
from unittest import mock


ROOT = Path(__file__).resolve().parents[2]
PACKET_PATH = ROOT / "maps" / "python" / "Packet.py"
NOTIFICATION_COMMAND = 26026
MAPSTATS_COMMAND = 12012


def load_packet():
atrinik = types.ModuleType("Atrinik")
atrinik.CLIENT_CMD_NOTIFICATION = NOTIFICATION_COMMAND
atrinik.CLIENT_CMD_MAPSTATS = MAPSTATS_COMMAND
spec = importlib.util.spec_from_file_location("content_test_packet", PACKET_PATH)
assert spec is not None and spec.loader is not None
module = importlib.util.module_from_spec(spec)
with mock.patch.dict(sys.modules, {"Atrinik": atrinik}):
spec.loader.exec_module(module)
return module


class RecordingPlayer:
def __init__(self):
self.packets = []

def SendPacket(self, command, fmt, *data):
self.packets.append((command, fmt, data))


class PacketCommandTests(unittest.TestCase):
def setUp(self):
self.packet = load_packet()
self.player = RecordingPlayer()

def test_notification_uses_exported_command_and_preserves_optional_fields(self):
cases = (
(
{},
(NOTIFICATION_COMMAND, "Bs", (0, "Message")),
),
(
{"action": "apply"},
(NOTIFICATION_COMMAND, "BsBs", (0, "Message", 1, "apply")),
),
(
{"shortcut": "?HELP", "delay": 4000},
(NOTIFICATION_COMMAND, "BsBi", (0, "Message", 3, 4000)),
),
(
{"action": "apply", "shortcut": "?HELP", "delay": 120000},
(
NOTIFICATION_COMMAND,
"BsBsBsBi",
(0, "Message", 1, "apply", 2, "?HELP", 3, 120000),
),
),
)

for kwargs, expected in cases:
with self.subTest(kwargs=kwargs):
self.player.packets.clear()
self.packet.Notification(self.player, "Message", **kwargs)
self.assertEqual([expected], self.player.packets)

def test_map_stats_uses_exported_command_and_preserves_field_order(self):
cases = (
({}, (MAPSTATS_COMMAND, "", ())),
(
{"name": "The Lake", "music": "lake.ogg", "weather": "rain"},
(
MAPSTATS_COMMAND,
"BsBsBs",
(1, "The Lake", 2, "lake.ogg", 3, "rain"),
),
),
(
{"music": "lake.ogg"},
(MAPSTATS_COMMAND, "Bs", (2, "lake.ogg")),
),
)

for kwargs, expected in cases:
with self.subTest(kwargs=kwargs):
self.player.packets.clear()
self.packet.MapStats(self.player, **kwargs)
self.assertEqual([expected], self.player.packets)


if __name__ == "__main__":
unittest.main()
1 change: 1 addition & 0 deletions tools/validate.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ def main() -> int:
"tools.tests.test_release_guidance",
"tools.tests.test_release_line_parity",
"tools.tests.test_pr_metadata",
"tools.tests.test_packet_commands",
"tools.tests.test_python_commands",
"tools.tests.test_status_icons",
"tools.tests.test_validate_exits",
Expand Down
Loading