# guild_war_skill_test —— 公会窗「技能 / 公会战」两页 headless 自检。 # godot --headless --path project --script guild_war_skill_test.gd extends SceneTree const GuildUI = preload("res://ui/guild_ui.gd") class FakeTable extends Node: func for_category(cat: String) -> Array: return [4051, 4052, 4053] if cat == "GUILD" else [] func name_of(id: int) -> String: return {4051: "축복", 4052: "미리내", 4053: "무장"}.get(id, "skill %d" % id) class FakeClient extends Node: signal guild_changed() signal guild_skill_changed() signal guild_war_changed() signal guild_comments_changed() var guild := {"in_guild": true, "id": 77, "name": "Dragons", "level": 12, "member_count": 2, "max_member_count": 32, "gold": 5} var skill := {"valid": false} var wars := [] var war := {"opp_guild_id": 0, "opp_name": "", "type": 0, "state": 0} var comments := [] var calls := [] func is_in_game() -> bool: return true func get_guild() -> Dictionary: return guild func get_guild_members() -> Array: return [] func get_guild_grades() -> Array: return [] func get_guild_skill() -> Dictionary: return skill func get_guild_wars() -> Array: return wars func get_guild_war() -> Dictionary: return war func get_guild_comments() -> Array: return comments func use_guild_skill(vnum: int, target: int) -> bool: calls.append(["use", vnum, target]); return true func declare_guild_war(name: String) -> bool: calls.append(["war", name]); return true func guild_post_comment(text: String) -> bool: calls.append(["post_comment", text]); return true func guild_refresh_comments() -> bool: calls.append(["refresh_comments"]); return true func guild_delete_comment(comment_id: int) -> bool: calls.append(["delete_comment", comment_id]); return true var _fail := 0 func _ck(c: bool, m: String) -> void: if not c: _fail += 1 printerr("FAIL: " + m) func _init() -> void: await _run() if _fail == 0: print("PASS: guild_war_skill_test") quit(0) else: printerr("%d check(s) failed" % _fail) quit(1) func _btn(root: Node, label: String) -> Button: for b in root.find_children("*", "Button", true, false): if String(b.text) == label: return b return null func _labels_text(page: Node) -> String: var s := "" for c in page.find_children("*", "Label", true, false): s += String(c.text) + "\n" return s func _run() -> void: var canvas := CanvasLayer.new() get_root().add_child(canvas) var fc := FakeClient.new() get_root().add_child(fc) var tbl := FakeTable.new() get_root().add_child(tbl) var gu: Node = GuildUI.new() get_root().add_child(gu) gu.setup(fc, canvas, tbl) gu.toggle() _ck(gu.is_open(), "公会窗打开") _ck(gu._pages.size() == 4, "4 页(成员/技能/公会战/公告)") # --- 技能页 --- gu._set_tab(1) _ck(_labels_text(gu._pages[1]).contains("还没收到"), "技能页:无数据提示") fc.skill = {"valid": true, "skill_point": 5, "guild_point": 1200, "max_guild_point": 5000, "levels": [3, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 7]} fc.guild_skill_changed.emit() var st := _labels_text(gu._pages[1]) _ck(st.contains("技能点 5") and st.contains("1200 / 5000"), "技能页:点数行") _ck(st.contains("축복") and st.contains("Lv 3"), "技能页:GUILD 技能名 + 等级") _ck(st.contains("무장") and st.contains("Lv 7"), "技能页:第 12 个技能配到 levels[11]") # 축복 lv3 -> 有「施放」按钮;미리내 lv0 -> 无 var cast := _btn(gu._pages[1], "施放") _ck(cast != null, "技能页:可施放技能有按钮") cast.pressed.emit() _ck(fc.calls == [["use", 4051, 0]], "施放 -> use_guild_skill(4051, 0)") # --- 公会战页 --- gu._set_tab(2) _ck(_labels_text(gu._pages[2]).contains("当前无公会战"), "公会战页:无战提示") _ck(_labels_text(gu._pages[2]).contains("无"), "公会战页:进行中列表为空") # 宣战 gu._war_name_edit.text = "Tigers" _btn(gu._pages[2], "宣战").pressed.emit() _ck(fc.calls[-1] == ["war", "Tigers"], "宣战 -> declare_guild_war(\"Tigers\")") # 收到 WAR ON_WAR + WAR_LIST fc.war = {"opp_guild_id": 88, "opp_name": "Tigers", "type": 1, "state": 6} fc.wars = [{"src": 77, "dst": 88, "src_name": "Dragons", "dst_name": "Tigers"}] fc.guild_war_changed.emit() var wt := _labels_text(gu._pages[2]) _ck(wt.contains("对 Tigers") and wt.contains("交战中"), "公会战页:当前战状态") _ck(wt.contains("Dragons vs Tigers") and wt.contains("◀我方"), "公会战页:GvG 行 + 我方标记") # --- 公告页 --- gu._set_tab(3) _ck(_labels_text(gu._pages[3]).contains("暂无公告"), "公告页:无数据提示") fc.comments = [{"id": 9, "name": "Alice", "content": "今晚攻城"}] fc.guild_comments_changed.emit() await process_frame var ct := _labels_text(gu._pages[3]) _ck(ct.contains("Alice:今晚攻城"), "公告页:公告内容") var edits: Array = gu._pages[3].find_children("*", "LineEdit", true, false) _ck(edits.size() == 1, "公告页:输入框") if edits.size() == 1: edits[0].text = "明晚集合" _btn(gu._pages[3], "发布").pressed.emit() _ck(fc.calls[-1] == ["post_comment", "明晚集合"], "公告页:发布") _btn(gu._pages[3], "刷新").pressed.emit() _ck(fc.calls[-1] == ["refresh_comments"], "公告页:刷新") for b in gu._pages[3].find_children("*", "Button", true, false): if String(b.text) == "删": b.pressed.emit() break _ck(fc.calls[-1] == ["delete_comment", 9], "公告页:删除")