extends "res://tests/test_case.gd" const MatchNet = preload("res://scripts/match_net.gd") # Adversarial-review regression: _hello's player_name used to be broadcast # to every peer completely unvalidated — a multi-MB name head-of-line- # blocked the reliable control channel hard enough that a concurrently- # joining client's own _welcome never arrived. _sanitize_player_name() is # the fix; these are pure-function tests for it, independent of the live # two-process rejection test in tests/match_net_smoke.gd (--role=client-longname). func test_normal_name_unchanged() -> void: assert_eq(MatchNet._sanitize_player_name("Alice"), "Alice", "a normal name passes through unchanged") func test_strips_control_characters() -> void: var bell := String.chr(7) # a control char with no named GDScript escape var raw := "Bad\nName\twith\rcontrol" + bell + "chars" var clean := MatchNet._sanitize_player_name(raw) assert_true(not clean.contains("\n"), "no newline") assert_true(not clean.contains("\t"), "no tab") assert_true(not clean.contains("\r"), "no carriage return") assert_true(not clean.contains(bell), "no bell/control char") func test_clamps_to_max_display_length() -> void: var raw := "X".repeat(1000) var clean := MatchNet._sanitize_player_name(raw) assert_eq(clean.length(), MatchNet.MAX_PLAYER_NAME_LENGTH, "clamped to MAX_PLAYER_NAME_LENGTH") func test_empty_or_whitespace_only_falls_back_to_default() -> void: assert_eq(MatchNet._sanitize_player_name(""), "Player", "empty string falls back") assert_eq(MatchNet._sanitize_player_name(" "), "Player", "whitespace-only falls back") assert_eq(MatchNet._sanitize_player_name("\n\t\r"), "Player", "control-characters-only falls back") func test_leading_trailing_whitespace_trimmed() -> void: assert_eq(MatchNet._sanitize_player_name(" Bob "), "Bob", "surrounding whitespace trimmed")