CounterDroneBackend/test/unit/CounterDrone.Core.Tests/DamageModelTests.cs
tian a3bf6720c6 feat: 路径积分毁伤判定(DamageAssessment.PathInSphere)
- 替换离散 ContainsPoint 为连续路径积分
- DroneEntity 新增 PrevX/Y/Z + SavePreviousPosition
- DamageAssessment 独立模块
- Piston WindSpeed=0 验证:暴露4.52s,击毁
2026-06-13 19:00:41 +08:00

119 lines
4.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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);
}
}
}