Files
aetherbound-guild/runtime/tests/foundation/company_page_controller_test.gd
T
2026-08-25 10:29:56 +08:00

101 lines
4.3 KiB
GDScript

extends SceneTree
const Controller = preload("res://entry/company_page_controller.gd")
var failures: Array[String] = []
func _initialize() -> void:
call_deferred("run_test")
func run_test() -> void:
var controller := Controller.new()
var company := _fixture_company()
verify_roster_snapshot(controller, company)
verify_detail_snapshot(controller, company)
verify_eligibility_reasons(controller, company)
if failures.is_empty():
print("ABG_M16_COMPANY_PAGES_OK roster=true selection_fallback=true detail=true facts=true dismissal=eligible,last_member,phase_locked copies=true missing_id=true")
quit(0)
else:
for failure in failures:
push_error(failure)
quit(1)
func verify_roster_snapshot(controller, company: Dictionary) -> void:
var snapshot: Dictionary = controller.roster_snapshot(company, "missing")
expect(snapshot.ok and snapshot.page_id == "roster", "roster snapshot identifies its page")
expect(snapshot.selected_recruit_id == "r-001", "roster falls back to the first stable Recruit ID")
expect(snapshot.members.size() == 2 and snapshot.selected.recruit_id == "r-001", "roster exposes members and selected data")
expect(snapshot.dismissal.eligible and snapshot.dismissal.reason == "eligible", "Market with two members is dismissible")
var copied: Dictionary = snapshot.members[0]
copied.battle_history.victories = 99
expect(int(company.owned_recruits[0].battle_history.victories) == 2, "controller output is isolated from Company input")
func verify_detail_snapshot(controller, company: Dictionary) -> void:
var detail: Dictionary = controller.recruit_detail_snapshot(company, "r-002")
expect(detail.ok and detail.page_id == "recruit_detail", "detail snapshot identifies its page")
if detail.ok:
expect(detail.recruit.profession_id == "PF-B02" and detail.recruit.trait_id == "TR-02", "detail preserves profession and trait facts")
expect(int(detail.recruit.level) == 3 and int(detail.recruit.xp) == 7, "detail preserves level and XP")
expect(detail.recruit.equipped_item_id == "EQ-002" and int(detail.recruit.battle_history.knockouts) == 1, "detail preserves equipment and battle history")
var missing: Dictionary = controller.recruit_detail_snapshot(company, "r-404")
expect(not missing.ok and missing.code == "RECRUIT_NOT_FOUND", "detail rejects unknown stable IDs")
func verify_eligibility_reasons(controller, company: Dictionary) -> void:
var one_member := company.duplicate(true)
one_member.owned_recruits = [one_member.owned_recruits[0]]
var last_member: Dictionary = controller.roster_snapshot(one_member, "r-001")
expect(not last_member.dismissal.eligible and last_member.dismissal.reason == "last_member", "last member dismissal is explicitly blocked")
var locked := company.duplicate(true)
locked.active_contract.status = "battle"
var phase_locked: Dictionary = controller.roster_snapshot(locked, "r-001")
expect(not phase_locked.dismissal.eligible and phase_locked.dismissal.reason == "phase_locked", "non-Market dismissal is explicitly blocked")
func _fixture_company() -> Dictionary:
return {
"owned_recruits": [
{
"recruit_id": "r-001",
"rendered_name_snapshot": {"en": "Ari", "zh_CN": "阿里"},
"profession_id": "PF-B01",
"profession_job": "front",
"profession_name": {"en": "Guard", "zh_CN": "守卫"},
"trait_id": "TR-01",
"trait_name": {"en": "Steady", "zh_CN": "沉稳"},
"level": 2,
"xp": 4,
"equipped_item_id": "EQ-001",
"starting_item_id": "EQ-001",
"starting_item_name": {"en": "Oak Shield", "zh_CN": "橡木盾"},
"battle_history": {"battles_entered": 3, "victories": 2, "knockouts": 0},
},
{
"recruit_id": "r-002",
"rendered_name_snapshot": {"en": "Bex", "zh_CN": "贝克斯"},
"profession_id": "PF-B02",
"profession_job": "rear",
"profession_name": {"en": "Wayfinder", "zh_CN": "寻路者"},
"trait_id": "TR-02",
"trait_name": {"en": "Keen", "zh_CN": "敏锐"},
"level": 3,
"xp": 7,
"equipped_item_id": "EQ-002",
"starting_item_id": "EQ-001",
"starting_item_name": {"en": "Oak Shield", "zh_CN": "橡木盾"},
"battle_history": {"battles_entered": 4, "victories": 3, "knockouts": 1},
},
],
"active_contract": {"status": "market"},
}
func expect(condition: bool, message: String) -> void:
if not condition:
failures.append("M16 Company Pages: %s" % message)