- 删除中间契约(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 纯逻辑用例全部通过
79 lines
3.2 KiB
C#
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()));
|
|
}
|
|
}
|
|
} |