非 Boss 敌人访问 IAiContext.Boss 显式抛 InvalidOperationException, 不返回空对象掩盖小怪图误挂 Boss 边的错误。BossResource 补 IsFull 供图条件边判定。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
47 lines
1.5 KiB
C#
47 lines
1.5 KiB
C#
using System;
|
|
using NUnit.Framework;
|
|
using UnityEngine;
|
|
using UnityEngine.TestTools;
|
|
using BaseGames.Enemies;
|
|
|
|
namespace BaseGames.Tests.EditMode.Enemies
|
|
{
|
|
public class EnemyBrainContextBossFacetTests
|
|
{
|
|
// EnemyBase.Awake 会对缺失的碰撞体/引用报错,这些与本测试无关。
|
|
[SetUp] public void SetUp() => LogAssert.ignoreFailingMessages = true;
|
|
[TearDown] public void TearDown() => LogAssert.ignoreFailingMessages = false;
|
|
|
|
static T MakeEnemy<T>(string name) where T : EnemyBase
|
|
{
|
|
var go = new GameObject(name);
|
|
return go.AddComponent<T>();
|
|
}
|
|
|
|
[Test]
|
|
public void NonBoss_AccessingBossFacet_Throws()
|
|
{
|
|
var enemy = MakeEnemy<EnemyBase>("plain-enemy");
|
|
var ctx = new EnemyBrainContext(enemy);
|
|
|
|
Assert.Throws<InvalidOperationException>(() => { var _ = ctx.Boss; });
|
|
|
|
UnityEngine.Object.DestroyImmediate(enemy.gameObject);
|
|
}
|
|
|
|
[Test]
|
|
public void Boss_AccessingBossFacet_ReturnsTheBoss()
|
|
{
|
|
var boss = MakeEnemy<BossBase>("boss");
|
|
var ctx = new EnemyBrainContext(boss);
|
|
|
|
Assert.AreSame(boss, ctx.Boss);
|
|
Assert.AreEqual(0, ctx.Boss.CurrentPhase);
|
|
Assert.IsFalse(ctx.Boss.IsPhaseTransitioning);
|
|
Assert.IsFalse(ctx.Boss.ResourceFull); // 未挂 BossResource
|
|
|
|
UnityEngine.Object.DestroyImmediate(boss.gameObject);
|
|
}
|
|
}
|
|
}
|