Files
Seek-Battle-Evacuate/Assets/GameMain/Scripts/Tests/EditMode/Battle/BattleRuntimeCreateTests.cs
T
huangjun 7dcac0ac87 M1 回合制战斗架构收敛与 1v1 攻击闭环:BattleRuntime 内核、组件唯一入口、UI 数据驱动与 EditMode 测试
- 删除中间契约(BattleStartRequest/BattlePlayerInput/BattleReturnPlan/桥接与策略接口/FlowState),收敛为 BattleViewState/BattleStep/一层 BattleEvent
- 新增内部 BattleRuntime/BattleUnit/BattleStatus 共享上下文;TurnBattleComponent 成为唯一外部入口,吸收启动/暂停/回写职责
- 内核支持 1v1 攻击闭环:效果公式、HP/MP 钳制、阵亡、Victory/TotalDefeat、敌人随机决策;敌人行动间歇 0.6s 由组件协程编排并经 StepListener 推送
- UI:玩家卡片/敌人槽/回合槽按战局重建,图标配置驱动(含新增 EnemyConfig.Icon),每轮刷新一次 TurnSlots 且轮内只移动高亮
- 新增 Tests 程序集 + InternalsVisibleTo,25 个 BattleRuntime 纯逻辑用例全部通过
2026-09-02 08:42:04 +08:00

79 lines
3.2 KiB
C#

using System.Collections.Generic;
using NUnit.Framework;
using SepCore.Battle;
using SepCore.CustomComponent;
namespace SepCore.Tests
{
[TestFixture]
public class BattleRuntimeCreateTests
{
[Test]
public void Create_WithStandard1v1Inputs_BuildsExpectedUnits()
{
BattleRuntime runtime = TestBattle.Create1v1(TestBattle.Player());
Assert.NotNull(runtime);
Assert.False(runtime.IsCompleted);
Assert.AreEqual(1, runtime.RoundNumber);
Assert.AreEqual(2, runtime.Units.Length);
BattleUnit player = runtime.Units[0];
Assert.AreEqual(1, player.UnitId);
Assert.AreEqual(BattleFaction.Player, player.Faction);
Assert.AreEqual(1001, player.ConfigId);
Assert.AreEqual(1, player.PartyOrder);
Assert.AreEqual(120, player.CurrentHp);
Assert.AreEqual(120, player.MaxHp);
Assert.AreEqual(40, player.CurrentMp);
Assert.AreEqual(14, player.Atk);
Assert.AreEqual(6, player.Mat);
Assert.AreEqual(12, player.Speed);
CollectionAssert.AreEqual(new List<int> { 1, 101 }, player.ActionIds);
BattleUnit enemy = runtime.Units[1];
Assert.AreEqual(2, enemy.UnitId);
Assert.AreEqual(BattleFaction.Enemy, enemy.Faction);
Assert.AreEqual(3001, enemy.ConfigId);
Assert.AreEqual(50, enemy.CurrentHp);
Assert.AreEqual(8, enemy.Atk);
CollectionAssert.AreEqual(new List<int> { 201 }, enemy.ActionIds);
Assert.AreEqual(1, runtime.CurrentActorUnitId);
}
[Test]
public void Create_WithNullInputs_ReturnsNull()
{
RunPlayerState player = TestBattle.Player();
BattleEncounter encounter = TestBattle.Encounter();
TestConfigProvider config = TestConfigProvider.Standard1v1();
IRunRandomSource random = new TestRandomSource();
Assert.Null(BattleRuntime.Create(null, new List<RunPlayerState> { player }, config, random));
Assert.Null(BattleRuntime.Create(encounter, null, config, random));
Assert.Null(BattleRuntime.Create(encounter, new List<RunPlayerState>(), config, random));
Assert.Null(BattleRuntime.Create(encounter, new List<RunPlayerState> { player }, null, random));
Assert.Null(BattleRuntime.Create(encounter, new List<RunPlayerState> { player }, config, null));
}
[Test]
public void Create_WithMissingEnemyParty_ReturnsNull()
{
TestConfigProvider config = TestConfigProvider.Standard1v1();
Assert.Null(BattleRuntime.Create(new BattleEncounter(1, 999, false),
new List<RunPlayerState> { TestBattle.Player() }, config, new TestRandomSource()));
}
[Test]
public void Create_WithMissingEnemyConfig_ReturnsNull()
{
TestConfigProvider config = TestConfigProvider.Standard1v1();
config.AddParty(TestConfigs.Party(5001, 9999));
Assert.Null(BattleRuntime.Create(new BattleEncounter(1, 5001, false),
new List<RunPlayerState> { TestBattle.Player() }, config, new TestRandomSource()));
}
}
}