101 lines
4.3 KiB
GDScript
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)
|