test: 八项无头回归测试(道具/弹道/Boss/海面/地面单位/浮游炮/炸弹/冒烟模拟)
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
extends SceneTree
|
||||
## Boss 回归测试(时间驱动,与无头模式实际帧率无关):
|
||||
## A) 独立 Boss:5s 内进场并开始弹幕;秒杀后 4s 内完成爆炸链释放
|
||||
## B) Game 集成:spawn_boss 血条显示→击杀后血条隐藏、得分 +5000
|
||||
## 运行:godot --headless -s tests/boss_test.gd
|
||||
|
||||
var _phase := 0
|
||||
var _time := 0.0
|
||||
var _boss: Boss
|
||||
var _game: Game
|
||||
var _bullets: Node2D
|
||||
var _bullet_time := 0.0
|
||||
var _phase_time := 0.0
|
||||
var _score_before := 0
|
||||
var _fails: Array[String] = []
|
||||
|
||||
|
||||
func _initialize() -> void:
|
||||
_bullets = Node2D.new()
|
||||
_bullets.add_to_group("enemy_bullets")
|
||||
root.add_child(_bullets)
|
||||
_boss = Boss.new()
|
||||
_boss.setup(1.0)
|
||||
root.add_child(_boss)
|
||||
print("[boss_test] phase A: standalone boss")
|
||||
|
||||
|
||||
func _fail(msg: String) -> void:
|
||||
_fails.append(msg)
|
||||
print("[FAIL] " + msg)
|
||||
|
||||
|
||||
func _process(delta: float) -> bool:
|
||||
_time += delta
|
||||
_phase_time += delta
|
||||
match _phase:
|
||||
0:
|
||||
if _bullets.get_child_count() > 0:
|
||||
_bullet_time += delta
|
||||
if _phase_time >= 5.0:
|
||||
if not _boss._entered:
|
||||
_fail("boss did not enter (pos.y=%.1f)" % _boss.position.y)
|
||||
if _bullet_time < 0.4:
|
||||
_fail("boss fired too little (%.2fs bullet time)" % _bullet_time)
|
||||
_boss.apply_damage(99999)
|
||||
_next_phase()
|
||||
1:
|
||||
if not is_instance_valid(_boss):
|
||||
print("[boss_test] phase A done: %.2fs bullet time, death chain freed boss" % _bullet_time)
|
||||
_next_phase()
|
||||
elif _phase_time > 4.0:
|
||||
_fail("death chain did not free boss in 4s")
|
||||
_next_phase()
|
||||
2:
|
||||
_game = (load("res://scenes/game.tscn") as PackedScene).instantiate()
|
||||
root.add_child(_game)
|
||||
_score_before = _game.score
|
||||
_boss = _game.spawn_boss(1.0)
|
||||
if not _game._boss_bar_bg.visible:
|
||||
_fail("boss bar not shown after spawn")
|
||||
_boss.apply_damage(99999)
|
||||
_next_phase()
|
||||
3:
|
||||
if _phase_time >= 4.0:
|
||||
if _game._boss_bar_bg.visible:
|
||||
_fail("boss bar still visible after death")
|
||||
if _game.score < _score_before + 5000:
|
||||
_fail("score not credited: %d -> %d" % [_score_before, _game.score])
|
||||
else:
|
||||
print("[boss_test] phase B done: score %d -> %d" % [_score_before, _game.score])
|
||||
if _fails.is_empty():
|
||||
print("[boss_test] PASS")
|
||||
else:
|
||||
print("[boss_test] FAIL: %d issue(s)" % _fails.size())
|
||||
quit(0 if _fails.is_empty() else 1)
|
||||
return true
|
||||
return false
|
||||
|
||||
|
||||
func _next_phase() -> void:
|
||||
_phase += 1
|
||||
_phase_time = 0.0
|
||||
Reference in New Issue
Block a user