iter(36卡③): 状态面板瘦身——八键投影换代+本局信息面板三段新装两段退役+两角标tooltip换代+断言面换代(theme投影族九断言手拼夹具+探针真实入口三断言对拍独立oracle);变异验证按用户P0禁令零执行(正向验收测试照跑)
This commit is contained in:
1 parent
e74656b228
commit
477a73e763
6 files changed
+152
-140
No files matched your search
@@ -746,63 +746,64 @@ func _smoke_diag_button_retired() -> void:
|
||||
dbg_src.contains('UiKit.button("转储")'))
|
||||
|
||||
|
||||
# ---- 状态面板只读投影一致性(R4 数据只读同源:状态面板展示值逐项 == MetaProgression
|
||||
# 访问器读数;投影拼装与 main._status_data 同构(同访问器族同序)。只读性连接巡检与零动效
|
||||
# 断言归 ui_struct_probe 呈现侧,本段只管数据面)----
|
||||
# ---- 状态面板·本局信息面板投影一致性(迭代36 卡③——八键快照手拼夹具:展示值逐项 ==
|
||||
# 快照钉值;投影拼装口径=组合根 _status_data 八键(数据只读同源)。只读性连接巡检与零动效
|
||||
# 断言归 ui_struct_probe 呈现侧,本段只管数据面;跨关解锁概览断言族随面板换代退役——
|
||||
# 替换判据=sv5 零旧段+八键投影断言(实现报告 §8.3 申报))----
|
||||
func _status_panel_projection() -> void:
|
||||
print("--- 状态面板·只读投影一致性(隔离档 smoke_meta_buy 复用)---")
|
||||
_meta_smoke_cleanup()
|
||||
var sv = _meta_new_save(_META_SMOKE_PATHS[0])
|
||||
var mp = load("res://core/meta_progression.gd").new(_db, sv)
|
||||
# 已购态夹具:余额非零 + 秘宝匣首件解锁——投影可辨非全零白板
|
||||
sv.add_keystone(37)
|
||||
sv.unlock_item("morning_order")
|
||||
sv.write_to_disk()
|
||||
# 投影拼装(main._status_data 同构)+ 视图喂入
|
||||
var data := {"balance": mp.keystone_balance(), "workshop": mp.treasure_shop_status(),
|
||||
"tree": mp.tree_camp_rows(), "fork_groups": mp.tree_fork_groups()}
|
||||
print("--- 状态面板·本局信息面板投影一致性(迭代36 卡③——八键快照手拼夹具,同构口径不依赖 runner)---")
|
||||
_meta_smoke_cleanup() # 套件级夹具清场(生涯页 fixture 依赖此前置——旧状态段同款保留)
|
||||
# 夹具(代拍板 4——任意非零可辨值,禁读 data/tables 现值、禁与属性行断言共值致误判掩盖)
|
||||
var data := {"balance": 77, "hero_hp": 13, "max_hp": 29, "atk": 7, "ac": 11, "gp": 41,
|
||||
"curios": [{"name": "青苔密卷", "used": false}, {"name": "锈蚀怀表", "used": true}],
|
||||
"feats": ["疼痛记忆 ×2", "双管镐 ×1"]}
|
||||
var po = load("res://presentation/views/status_panel.gd").new()
|
||||
po.open_status(data)
|
||||
Kit.check("状态面板开层可见(open_status 直开——P4 甲零动效路径)", po.visible)
|
||||
Kit.check("余额徽投影 = keystone_balance() 读数(%s)" % po._balance_badge.value_label.text,
|
||||
String(po._balance_badge.value_label.text) == "钥石 %d" % mp.keystone_balance())
|
||||
var ws: Array = mp.treasure_shop_status()
|
||||
var ws_ok: bool = po._workshop_holder.get_child_count() == ws.size()
|
||||
var uikit_s = load("res://presentation/views/ui_kit.gd")
|
||||
for i in mini(ws.size(), po._workshop_holder.get_child_count()):
|
||||
var row: Dictionary = ws[i]
|
||||
var lbls2: Array = []
|
||||
for ch in po._workshop_holder.get_child(i).get_children():
|
||||
if ch is Label:
|
||||
lbls2.append(ch)
|
||||
var unlocked: bool = bool(row.get("unlocked", false))
|
||||
var expect_prog := "已入手"
|
||||
if not unlocked:
|
||||
if String(row.get("mode", "")) == "keystone":
|
||||
expect_prog = "钥石 %d" % int(row.get("price", 0))
|
||||
elif String(row.get("mode", "")) == "condition":
|
||||
var parts: Array[String] = []
|
||||
for req_v2 in (row.get("reqs", []) as Array):
|
||||
var req2: Dictionary = req_v2 as Dictionary
|
||||
var lbl2 := String(uikit_s.TREASURE_REQ_LABELS.get(String(req2.get("key", "")), "条件"))
|
||||
parts.append("%s %d/%d" % [lbl2, int(req2.get("progress", 0)), int(req2.get("threshold", 0))])
|
||||
expect_prog = "、".join(parts)
|
||||
var expect_st2 := "已解锁" if unlocked else "未解锁"
|
||||
ws_ok = ws_ok and lbls2.size() == 3 \
|
||||
and String(lbls2[0].text) == String(row.get("display_name", "")) \
|
||||
and String(lbls2[1].text) == expect_prog \
|
||||
and String(lbls2[2].text) == expect_st2
|
||||
Kit.check("秘宝匣 12 行投影 = treasure_shop_status() 逐项(名称/钥石价与条件进度/解锁态——首件解锁夹具在列)〔秘宝批 V19 呈现数据源〕",
|
||||
ws_ok)
|
||||
var owned := 0
|
||||
for trow in (mp.tree_camp_rows() as Array):
|
||||
if int(trow.get("level", 0)) > 0:
|
||||
owned += 1
|
||||
var tree_txt := String(po._tree_label.text)
|
||||
Kit.check("天赋树概览聚合文案与已购节点数一致(零已购=空态句)",
|
||||
tree_txt == "尚未购买任何节点(天赋树在营地主柜台)" or tree_txt.begins_with("已购 %d 项:" % owned))
|
||||
Kit.check("余额徽投影 = 快照 balance 读数(sv4 回归锚)〔sv4〕",
|
||||
String(po._balance_badge.value_label.text) == "钥石 77")
|
||||
Kit.check("属性行全值投影 = 契约4 钉值格式逐字(生命/上限/攻击/AC/GP 五现值)〔sv1〕",
|
||||
String(po._attrs_label.text) == "生命 13/29 · 攻击 7 · 护甲 AC 11 · GP 41")
|
||||
Kit.check("秘宝行投影 = 受理序 join+已用件「(已用)」尾缀〔sv2〕",
|
||||
String(po._curios_label.text) == "青苔密卷 · 锈蚀怀表(已用)")
|
||||
Kit.check("专长行投影 = 行串 join〔sv3〕",
|
||||
String(po._feats_label.text) == "疼痛记忆 ×2 · 双管镐 ×1")
|
||||
# 零旧段(sv5——跨关概览退役零残留:面板子树零旧文案+旧成员退役)
|
||||
var stale := ""
|
||||
for ch in _all_labels(po):
|
||||
if String(ch.text).contains("道具工坊") or String(ch.text).contains("天赋树"):
|
||||
stale += String(ch.text) + "|"
|
||||
Kit.check("面板子树零「道具工坊/天赋树」文案(跨关概览退役零残留)〔sv5〕", stale == "")
|
||||
Kit.check("旧段成员退役(_workshop_holder/_tree_label 零残留——契约2 数据/成员层面清零)〔sv5〕",
|
||||
po.get("_workshop_holder") == null and po.get("_tree_label") == null)
|
||||
# 空态句×2(curios/feats 空夹具各跑一遍——契约4 空态呈现)
|
||||
var data_empty := {"balance": 3, "hero_hp": 5, "max_hp": 6, "atk": 2, "ac": 9, "gp": 1,
|
||||
"curios": [], "feats": []}
|
||||
var po2 = load("res://presentation/views/status_panel.gd").new()
|
||||
po2.open_status(data_empty)
|
||||
Kit.check("空秘宝态句=「未携带秘宝」〔sv2〕", String(po2._curios_label.text) == "未携带秘宝")
|
||||
Kit.check("空专长态句=「未获专长」〔sv3〕", String(po2._feats_label.text) == "未获专长")
|
||||
# 提示行文案(sv8——新定位换代;旧「永久强化进度」半句随两段退役失效)
|
||||
var hint_txt := ""
|
||||
for ch in _all_labels(po):
|
||||
if String(ch.text).begins_with("查看本局"):
|
||||
hint_txt = String(ch.text)
|
||||
Kit.check("提示行=「查看本局冒险进度(只读)」(新定位换代)〔sv8〕",
|
||||
hint_txt == "查看本局冒险进度(只读)")
|
||||
po.visible = false
|
||||
po.free()
|
||||
po2.visible = false
|
||||
po2.free()
|
||||
|
||||
|
||||
# 面板子树 Label 收集(sv5 零旧段扫描辅助——递归全子树)
|
||||
func _all_labels(root: Node) -> Array:
|
||||
var out: Array = []
|
||||
if root is Label:
|
||||
out.append(root)
|
||||
for child in root.get_children():
|
||||
out.append_array(_all_labels(child))
|
||||
return out
|
||||
|
||||
|
||||
# ---- 生涯页只读投影一致性(汇总段六类九项逐行 == SaveManager 计数访问器/
|
||||
|
||||
Reference in new issue
Block a user