Files
Fighting_Rthythm_game/tests/test_combo_window.gd
2026-07-02 09:47:52 -07:00

122 lines
4.7 KiB
GDScript

extends SceneTree
var failures: Array[String] = []
func _init() -> void:
var tracker_script: Script = load("res://scenes/components/combo_window.gd")
var resolver_script: Script = load("res://scenes/combat/action_resolver.gd")
if tracker_script == null:
failures.append("Missing combo_window.gd")
_finish()
return
if resolver_script == null:
failures.append("Missing action_resolver.gd")
_finish()
return
var window = tracker_script.new()
window.record(&"A")
window.record(&"Ø")
window.record(&"SP")
_expect_array(window.get_slots(), [&"A", &"Ø", &"SP"], "miss placeholder should be visible in slots")
_expect_bool(window.has_pending_clear(), false, "miss placeholder should not request a clear")
_expect_string(window.get_pattern(), "ASP", "miss placeholder should be ignored by pattern")
_expect_string(window.get_contiguous_pattern(), "SP", "miss should break contiguous pattern")
window.clear(&"test-reset")
window.record(&"W")
_expect_skill(resolver_script.resolve(window), &"skill_w", &"warrior_w", &"", false, "W alone")
window.record(&"A")
_expect_skill(resolver_script.resolve(window), &"skill_wa", &"warrior_wa", &"left", false, "W+A")
window.clear(&"test-reset")
window.record(&"W")
window.record(&"D")
_expect_skill(resolver_script.resolve(window), &"skill_wd", &"warrior_wa", &"right", false, "W+D")
window.clear(&"test-reset")
window.record(&"A")
_expect_skill(resolver_script.resolve(window), &"skill_a", &"warrior_a", &"left", false, "A")
window.record(&"A")
_expect_skill(resolver_script.resolve(window), &"skill_aa", &"warrior_aa", &"left", false, "A+A")
window.record(&"A")
_expect_skill(resolver_script.resolve(window), &"skill_aaa", &"warrior_aaa", &"left", false, "A+A+A")
window.clear(&"test-reset")
window.record(&"D")
window.record(&"D")
window.record(&"D")
_expect_skill(resolver_script.resolve(window), &"skill_ddd", &"warrior_aaa", &"right", false, "D+D+D")
window.clear(&"test-reset")
window.record(&"A")
window.record(&"SP")
_expect_skill(resolver_script.resolve(window), &"skill_a_space", &"warrior_a_space", &"left", true, "A+Space")
window.record(&"SP")
_expect_bool(resolver_script.resolve(window) == null, true, "A+Space+Space should not resolve")
window.clear(&"test-reset")
window.record(&"S")
_expect_skill(resolver_script.resolve(window), &"skill_s", &"warrior_s", &"", false, "S")
window.record(&"SP")
_expect_skill(resolver_script.resolve(window), &"skill_s_projectile_1", &"warrior_s_projectile", &"", false, "S+Space")
window.record(&"SP")
_expect_skill(resolver_script.resolve(window), &"skill_s_projectile_2", &"warrior_s_projectile", &"", false, "S+Space+Space")
window.record(&"SP")
_expect_skill(resolver_script.resolve(window), &"skill_s_projectile_3", &"warrior_s_projectile", &"", false, "S+Space+Space+Space")
_expect_array(window.get_slots(), [&"S", &"SP", &"SP", &"SP"], "projectile chain should fill four slots")
_expect_string(str(window.consume_pending_clear_reason()), "full", "fourth slot should request full clear")
window.clear(&"test-reset")
window.record(&"S")
window.record(&"Ø")
window.record(&"SP")
_expect_bool(resolver_script.resolve(window) == null, true, "S miss Space should not resolve")
window.clear(&"test-reset")
window.record(&"A")
window.record(&"D")
window.record(&"S")
window.record(&"SP")
_expect_skill(resolver_script.resolve(window), &"skill_s_projectile_1", &"warrior_s_projectile", &"", false, "S+Space in trailing slots")
resolver_script.clear_cache()
window.free()
_finish()
func _expect_skill(skill: Resource, expected_id: StringName, expected_animation: StringName, expected_displacement: StringName, expected_clear: bool, label: String) -> void:
if skill == null:
failures.append("%s should resolve a skill" % label)
return
_expect_string(str(skill.get("id")), str(expected_id), "%s id" % label)
_expect_string(str(skill.get("animation")), str(expected_animation), "%s animation" % label)
_expect_string(str(skill.get("displacement")), str(expected_displacement), "%s displacement" % label)
_expect_bool(bool(skill.get("clear_window")), expected_clear, "%s clear_window" % label)
func _expect_array(actual: Array, expected: Array, label: String) -> void:
if actual != expected:
failures.append("%s: expected %s, got %s" % [label, expected, actual])
func _expect_string(actual: String, expected: String, label: String) -> void:
if actual != expected:
failures.append("%s: expected %s, got %s" % [label, expected, actual])
func _expect_bool(actual: bool, expected: bool, label: String) -> void:
if actual != expected:
failures.append("%s: expected %s, got %s" % [label, expected, actual])
func _finish() -> void:
if failures.is_empty():
print("PASS combo window")
quit(0)
else:
for failure: String in failures:
push_error(failure)
quit(1)