- 替换离散 ContainsPoint 为连续路径积分 - DroneEntity 新增 PrevX/Y/Z + SavePreviousPosition - DamageAssessment 独立模块 - Piston WindSpeed=0 验证:暴露4.52s,击毁
119 lines
4.1 KiB
C#
119 lines
4.1 KiB
C#
using CounterDrone.Core.Algorithms;
|
||
using CounterDrone.Core.Models;
|
||
using Xunit;
|
||
|
||
namespace CounterDrone.Core.Tests
|
||
{
|
||
public class DamageModelTests
|
||
{
|
||
[Fact]
|
||
public void InertGas_PistonEngine_TakesExtraDamage()
|
||
{
|
||
var model = new InertGasDamageModel();
|
||
|
||
// 活塞发动机暴露于惰性气体
|
||
var dmg = model.CalculateDamage(TargetType.Piston, PowerType.Piston,
|
||
AerosolType.InertGas, cloudDensity: 0.1f, exposureTime: 2f, deltaTime: 1f);
|
||
|
||
Assert.True(dmg > 0.1f); // 高于基础速率(0.15 × 1.5 = 0.225)
|
||
}
|
||
|
||
[Fact]
|
||
public void InertGas_WrongAerosolType_NoDamage()
|
||
{
|
||
var model = new InertGasDamageModel();
|
||
|
||
var dmg = model.CalculateDamage(TargetType.Piston, PowerType.Piston,
|
||
AerosolType.ActiveMaterial, cloudDensity: 0.1f, exposureTime: 2f, deltaTime: 1f);
|
||
|
||
Assert.Equal(0f, dmg);
|
||
}
|
||
|
||
[Fact]
|
||
public void ActiveMaterial_TriggersBurst()
|
||
{
|
||
var model = new ActiveMaterialDamageModel();
|
||
|
||
var dmg1 = model.CalculateDamage(TargetType.FixedWing, PowerType.Jet,
|
||
AerosolType.ActiveMaterial, cloudDensity: 0.2f, exposureTime: 1f, deltaTime: 1f);
|
||
|
||
Assert.True(dmg1 >= 0.5f); // 爆发伤害
|
||
|
||
var dmg2 = model.CalculateDamage(TargetType.FixedWing, PowerType.Jet,
|
||
AerosolType.ActiveMaterial, cloudDensity: 0.2f, exposureTime: 2f, deltaTime: 1f);
|
||
|
||
Assert.True(dmg2 < 0.1f); // 后续余伤很小
|
||
}
|
||
|
||
[Fact]
|
||
public void ActiveMaterial_JetEngine_ExtraSensitivity()
|
||
{
|
||
var model = new ActiveMaterialDamageModel();
|
||
|
||
var dmg = model.CalculateDamage(TargetType.FixedWing, PowerType.Jet,
|
||
AerosolType.ActiveMaterial, cloudDensity: 0.2f, exposureTime: 0f, deltaTime: 0.1f);
|
||
|
||
// 喷气发动机:0.6 × 1.3 = 0.78
|
||
Assert.True(dmg > 0.7f);
|
||
}
|
||
|
||
[Fact]
|
||
public void ActiveFuel_ExponentialGrowth()
|
||
{
|
||
var model = new ActiveFuelDamageModel();
|
||
|
||
var dmg1 = model.CalculateDamage(TargetType.HighSpeed, PowerType.Jet,
|
||
AerosolType.ActiveFuel, cloudDensity: 0.1f, exposureTime: 1f, deltaTime: 1f);
|
||
|
||
var dmg2 = model.CalculateDamage(TargetType.HighSpeed, PowerType.Jet,
|
||
AerosolType.ActiveFuel, cloudDensity: 0.1f, exposureTime: 5f, deltaTime: 1f);
|
||
|
||
// 5 秒后的伤害应显著大于 1 秒后
|
||
Assert.True(dmg2 > dmg1 * 2f);
|
||
}
|
||
|
||
[Fact]
|
||
public void ActiveFuel_HighSpeedTarget_ExtraSensitive()
|
||
{
|
||
var model = new ActiveFuelDamageModel();
|
||
|
||
var dmg = model.CalculateDamage(TargetType.HighSpeed, PowerType.Jet,
|
||
AerosolType.ActiveFuel, cloudDensity: 0.1f, exposureTime: 1f, deltaTime: 1f);
|
||
|
||
Assert.True(dmg > 0.02f); // 基础速率 × 灵敏度
|
||
}
|
||
|
||
[Fact]
|
||
public void DamageStage_Progression()
|
||
{
|
||
var model = new InertGasDamageModel();
|
||
|
||
Assert.Equal(DamageStage.Normal, model.GetDamageStage(0.1f));
|
||
Assert.Equal(DamageStage.EngineAnomaly, model.GetDamageStage(0.3f));
|
||
Assert.Equal(DamageStage.AttitudeLoss, model.GetDamageStage(0.7f));
|
||
Assert.Equal(DamageStage.Destroyed, model.GetDamageStage(1.0f));
|
||
}
|
||
|
||
[Fact]
|
||
public void Router_RoutesToCorrectModel()
|
||
{
|
||
var router = new DamageModelRouter();
|
||
|
||
// 惰性气体
|
||
var dmg1 = router.CalculateDamage(TargetType.Piston, PowerType.Piston,
|
||
AerosolType.InertGas, 0.1f, 1f, 1f);
|
||
Assert.True(dmg1 > 0f);
|
||
|
||
// 活性材料
|
||
var dmg2 = router.CalculateDamage(TargetType.FixedWing, PowerType.Jet,
|
||
AerosolType.ActiveMaterial, 0.2f, 0f, 1f);
|
||
Assert.True(dmg2 > 0f);
|
||
|
||
// 活性燃料
|
||
var dmg3 = router.CalculateDamage(TargetType.HighSpeed, PowerType.Jet,
|
||
AerosolType.ActiveFuel, 0.1f, 1f, 1f);
|
||
Assert.True(dmg3 > 0f);
|
||
}
|
||
}
|
||
}
|