mud/tests/test_caps.py
Jared Miller 388e693f8c
Add MTTS capability parsing module with client color detection
Parses MTTS bitfield values from telnetlib3 ttype3 into a ClientCaps dataclass.
Includes color_depth property that returns the best available color mode
(truecolor, 256, or 16) based on client capabilities.
2026-02-07 22:44:23 -05:00

117 lines
3.2 KiB
Python

"""Tests for MTTS capability parsing."""
from mudlib.caps import parse_mtts
def test_parse_mtts_tintin():
"""Parse tintin++ MTTS 2825 correctly.
2825 in binary = 0b101100001001
Bits set: 0, 3, 8, 9, 11
= ANSI(1) + 256colors(8) + truecolor(256) + MNES(512) + SSL(2048)
"""
caps = parse_mtts("MTTS 2825")
assert caps.ansi is True
assert caps.vt100 is False
assert caps.utf8 is False
assert caps.colors_256 is True
assert caps.mouse_tracking is False
assert caps.osc_color_palette is False
assert caps.screen_reader is False
assert caps.proxy is False
assert caps.truecolor is True
assert caps.mnes is True
assert caps.mslp is False
assert caps.ssl is True
assert caps.color_depth == "truecolor"
def test_parse_mtts_basic():
"""Parse MTTS 137 (ANSI + 256colors + proxy)."""
# 137 = 1 (ANSI) + 8 (256colors) + 128 (proxy)
caps = parse_mtts("MTTS 137")
assert caps.ansi is True
assert caps.utf8 is False
assert caps.colors_256 is True
assert caps.proxy is True
assert caps.truecolor is False
assert caps.color_depth == "256"
def test_parse_mtts_zero():
"""Parse MTTS 0 (nothing supported)."""
caps = parse_mtts("MTTS 0")
assert caps.ansi is False
assert caps.utf8 is False
assert caps.colors_256 is False
assert caps.truecolor is False
assert caps.color_depth == "16"
def test_parse_mtts_256_colors_only():
"""Parse MTTS with JUST 256 colors (no truecolor)."""
# 9 = 1 (ANSI) + 8 (256colors)
caps = parse_mtts("MTTS 9")
assert caps.ansi is True
assert caps.utf8 is False
assert caps.colors_256 is True
assert caps.truecolor is False
assert caps.color_depth == "256"
def test_parse_mtts_utf8_no_colors():
"""Parse MTTS with UTF-8 but no extended colors."""
# 5 = 1 (ANSI) + 4 (UTF-8)
caps = parse_mtts("MTTS 5")
assert caps.ansi is True
assert caps.utf8 is True
assert caps.colors_256 is False
assert caps.truecolor is False
assert caps.color_depth == "16"
def test_parse_mtts_empty():
"""Handle empty string gracefully."""
caps = parse_mtts("")
assert caps.ansi is False
assert caps.utf8 is False
assert caps.color_depth == "16"
def test_parse_mtts_none():
"""Handle None gracefully."""
caps = parse_mtts(None)
assert caps.ansi is False
assert caps.utf8 is False
assert caps.color_depth == "16"
def test_parse_mtts_non_mtts():
"""Handle non-MTTS ttype3 strings (e.g., UNKNOWN-TERMINAL)."""
caps = parse_mtts("UNKNOWN-TERMINAL")
assert caps.ansi is False
assert caps.utf8 is False
assert caps.color_depth == "16"
def test_parse_mtts_malformed():
"""Handle malformed MTTS strings."""
caps = parse_mtts("MTTS")
assert caps.ansi is False
assert caps.utf8 is False
assert caps.color_depth == "16"
def test_color_depth_priority():
"""Verify color_depth returns best available mode."""
# truecolor wins
caps = parse_mtts("MTTS 2825")
assert caps.color_depth == "truecolor"
# 256 wins over 16
caps = parse_mtts("MTTS 9")
assert caps.color_depth == "256"
# fallback to 16
caps = parse_mtts("MTTS 5") # 1 (ANSI) + 4 (UTF-8)
assert caps.color_depth == "16"