Files
mtgodot-poc/project/test_messenger_parity.gd
T
shenandshen 66d217b313 feat(client): 完成40250客户端核心功能1:1对齐与桥梁高度采样修复
- 桥梁与静态物体高度采样修复:
  - 严格对齐 40250 CMapOutdoor::GetHeight 与 CAttributeInstance::GetHeight
  - 解析 .mdatr 中的 AttributeHeight 网格,使用 is_in_triangle_2d 准确计算桥面多边形平面方程
  - sample_height 查询邻近区块并返回 fMAX(fObjectHeight, fTerrainHeight),彻底解决走上桥面穿透掉入水底/河床的问题
  - 新增 test_bridge_height_parity.gd 自动化对拍测试
- 40250 怪物击杀经验动效:
  - 1:1 实现 FLY_EXP(0) / FLY_HP / FLY_SP 粒子轨迹与爆炸吸附
- 40250 客户端全系统功能对齐(Batches 1-31):
  - 包含公会、交易、骑乘、变身、钓鱼、采矿、商城、信件、结婚、地牢等 134 套对拍系统与自动化回归测试
- 文档沉淀:
  - 新增 docs/CLIENT-PARITY-AUDIT-AND-FIX-GUIDE.md 客户端对拍缺陷发现与修复工程指南
2026-09-19 08:51:25 -07:00

135 lines
5.2 KiB
GDScript

# test_messenger_parity.gd —— 40250 好友/行会/家族联络人系统回归测试
extends SceneTree
const SystemClass = preload("res://messenger_system.gd")
var _passed: int = 0
var _failed: int = 0
func _assert(cond: bool, msg: String) -> void:
if cond:
_passed += 1
print(" [PASS] %s" % msg)
else:
_failed += 1
printerr(" [FAIL] %s" % msg)
func _init() -> void:
print("\n=== Running test_messenger_parity (Batch 27 Direction 1) ===")
_test_friend_addition_and_validation()
_test_friend_status_transitions()
_test_guild_member_management()
_test_family_partner_mechanics()
_test_filtering_and_counts()
print("\n=== Result: %d Passed, %d Failed ===" % [_passed, _failed])
if _failed == 0:
print("ALL TESTS PASSED!\n")
else:
printerr("SOME TESTS FAILED!\n")
quit(0 if _failed == 0 else 1)
func _test_friend_addition_and_validation() -> void:
print("\n--- Test 1: Friend Addition & Constraints ---")
var m = SystemClass.new("Hero")
# Reject empty name
var r_empty = m.add_friend("")
_assert(r_empty["error_code"] == "EMPTY_NAME", "Reject empty friend name")
# Reject adding self
var r_self = m.add_friend("Hero")
_assert(r_self["error_code"] == "CANNOT_ADD_SELF", "Reject adding self as friend")
# Add friend successfully
var r_ok = m.add_friend("Alice", SystemClass.STATE_ONLINE)
_assert(r_ok["success"] == true, "Add Alice as friend successfully")
_assert(m.is_friend("Alice") == true, "Alice is recognized as friend")
_assert(m.get_friend_state("Alice") == SystemClass.STATE_ONLINE, "Alice initial state is ONLINE")
# Reject duplicate friend
var r_dup = m.add_friend("Alice")
_assert(r_dup["error_code"] == "ALREADY_FRIEND", "Reject duplicate friend addition")
# Remove friend
var rm_ok = m.remove_friend("Alice")
_assert(rm_ok == true, "Alice removed from friends")
_assert(m.is_friend("Alice") == false, "Alice is no longer friend")
func _test_friend_status_transitions() -> void:
print("\n--- Test 2: Friend Status Transitions (Online/Offline/Mobile) ---")
var m = SystemClass.new("Hero")
m.add_friend("Bob", SystemClass.STATE_OFFLINE)
# Transition to ONLINE
m.set_friend_state("Bob", SystemClass.STATE_ONLINE)
_assert(m.get_friend_state("Bob") == SystemClass.STATE_ONLINE, "Bob transitioned to ONLINE")
var last_event = m.event_logs[m.event_logs.size() - 1]
_assert(last_event["type"] == "FRIEND_LOGIN", "Emitted FRIEND_LOGIN event")
# Transition to MOBILE
m.set_friend_state("Bob", SystemClass.STATE_MOBILE)
_assert(m.get_friend_state("Bob") == SystemClass.STATE_MOBILE, "Bob transitioned to MOBILE")
last_event = m.event_logs[m.event_logs.size() - 1]
_assert(last_event["type"] == "FRIEND_MOBILE", "Emitted FRIEND_MOBILE event")
# Transition to OFFLINE
m.set_friend_state("Bob", SystemClass.STATE_OFFLINE)
_assert(m.get_friend_state("Bob") == SystemClass.STATE_OFFLINE, "Bob transitioned to OFFLINE")
last_event = m.event_logs[m.event_logs.size() - 1]
_assert(last_event["type"] == "FRIEND_LOGOUT", "Emitted FRIEND_LOGOUT event")
func _test_guild_member_management() -> void:
print("\n--- Test 3: Guild Member Synchronization ---")
var m = SystemClass.new("Hero")
m.append_guild_member("Leader", "Guild Master", SystemClass.STATE_ONLINE)
m.append_guild_member("Knight", "General", SystemClass.STATE_ONLINE)
m.append_guild_member("Novice", "Member", SystemClass.STATE_OFFLINE)
_assert(m.guild_members.size() == 3, "Guild has 3 members")
_assert(m.guild_members["Leader"].rank == "Guild Master", "Leader rank is Guild Master")
# Remove single member
var rm_ok = m.remove_guild_member("Novice")
_assert(rm_ok == true, "Novice removed from guild list")
_assert(m.guild_members.size() == 2, "Guild has 2 members remaining")
# Clear all guild members
m.clear_all_guild_members()
_assert(m.guild_members.is_empty(), "All guild members cleared on guild leave")
func _test_family_partner_mechanics() -> void:
print("\n--- Test 4: Family / Spouse Partner Mechanics ---")
var m = SystemClass.new("Hero")
# Bind partner
m.set_family_partner("Eva", 100, SystemClass.STATE_ONLINE)
_assert(m.family_partner != null, "Family partner bound")
_assert(m.family_partner.name == "Eva", "Partner name is Eva")
_assert(m.family_partner.love_point == 100, "Initial Love Points is 100")
# Update love points
m.update_partner_love_points(85)
_assert(m.family_partner.love_point == 85, "Love Points updated to 85")
# Remove partner (Divorce)
m.remove_family_partner()
_assert(m.family_partner == null, "Partner cleared on divorce")
func _test_filtering_and_counts() -> void:
print("\n--- Test 5: Filtering and Online Counts ---")
var m = SystemClass.new("Hero")
m.add_friend("User1", SystemClass.STATE_ONLINE)
m.add_friend("User2", SystemClass.STATE_MOBILE)
m.add_friend("User3", SystemClass.STATE_OFFLINE)
var friend_list = m.get_group_members(SystemClass.GROUP_FRIEND)
_assert(friend_list.size() == 3, "Total 3 friends in group")
_assert(m.get_online_count(SystemClass.GROUP_FRIEND) == 2, "2 friends currently online (ONLINE + MOBILE)")
m.append_guild_member("Guildie1", "Member", SystemClass.STATE_ONLINE)
m.append_guild_member("Guildie2", "Member", SystemClass.STATE_OFFLINE)
_assert(m.get_online_count(SystemClass.GROUP_GUILD) == 1, "1 guild member online")