ThreatSourceLibaray/ThreatSource.Tests/src/Missile/MillimeterWaveTerminalGuidedMissileTests.cs

129 lines
4.5 KiB
C#

using Xunit;
using ThreatSource.Missile;
using ThreatSource.Simulation;
using ThreatSource.Utils;
using ThreatSource.Tests.Simulation;
using ThreatSource.Equipment;
using ThreatSource.Guidance;
namespace ThreatSource.Tests.Missile
{
public class MillimeterWaveTerminalGuidedMissileTests
{
private readonly SimulationManager _simulationManager;
private readonly TestSimulationAdapter _testAdapter;
private readonly MillimeterWaveTerminalGuidedMissile _missile;
private readonly MissileProperties _properties;
public MillimeterWaveTerminalGuidedMissileTests()
{
_simulationManager = new SimulationManager();
_testAdapter = new TestSimulationAdapter(_simulationManager);
_simulationManager.SetSimulationAdapter(_testAdapter);
_properties = new MissileProperties
{
MaxSpeed = 1000,
MaxFlightTime = 100,
MaxFlightDistance = 10000,
MaxAcceleration = 50,
ProportionalNavigationCoefficient = 3,
Mass = 100,
ExplosionRadius = 10,
HitProbability = 0.9,
Type = MissileType.MillimeterWaveTerminalGuidance
};
var missileInitialMotion = new MotionParameters
{
Position = new Vector3D(0, 0, 0),
Orientation = new Orientation(0, 0, 0),
InitialSpeed = 100
};
var guidanceConfig = new MillimeterWaveGuidanceConfig
{
FieldOfViewAngle = 30,
TransmitPower = 0.5,
AntennaGainDB = 25,
WaveFrequency = 94e9
};
_missile = new MillimeterWaveTerminalGuidedMissile(
"missile1",
_properties,
missileInitialMotion,
guidanceConfig,
_simulationManager
);
_simulationManager.RegisterEntity("missile1", _missile);
}
[Fact]
public void Constructor_InitializesPropertiesCorrectly()
{
Assert.Equal("missile1", _missile.Id);
Assert.Equal(new Vector3D(0, 0, 0), _missile.Position);
Assert.Equal(new Orientation(0, 0, 0), _missile.Orientation);
Assert.Equal(100, _missile.Speed);
Assert.False(_missile.IsActive);
Assert.False(_missile.IsGuidance);
}
[Fact]
public void Update_ExceedsMaxFlightTime_SelfDestructs()
{
// Arrange
_missile.Fire();
_missile.Activate();
var maxFlightTime = _properties.MaxFlightTime;
// Act
for (double time = 0; time < maxFlightTime + 1; time += 0.1)
{
_missile.Update(0.1);
}
// Assert
Assert.False(_missile.IsActive, "超出最大飞行时间应该自毁");
}
[Fact]
public void Update_ExceedsMaxFlightDistance_SelfDestructs()
{
// Arrange
_missile.Fire();
_missile.Activate();
var maxDistance = _properties.MaxFlightDistance;
var timeToExceedDistance = maxDistance / 100 + 1; // 使用初始速度100
// Act
for (double time = 0; time < timeToExceedDistance; time += 0.1)
{
_missile.Update(0.1);
}
// Assert
Assert.False(_missile.IsActive, "超出最大飞行距离应该自毁");
}
[Fact]
public void GetStatusInfo_ReturnsCorrectState()
{
// Act
var state = _missile.GetStatusInfo();
// Assert
Assert.Equal(_missile.Id, state.Id);
Assert.Equal(MissileType.MillimeterWaveTerminalGuidance, state.ExtendedProperties["Type"]);
Assert.Equal(_missile.Position, state.Position);
Assert.Equal(_missile.Velocity, state.ExtendedProperties["Velocity"]);
Assert.Equal(_missile.Orientation, state.Orientation);
Assert.Equal(_missile.Speed, state.Speed);
Assert.Equal(_missile.FlightTime, state.ExtendedProperties["FlightTime"]);
Assert.Equal(_missile.FlightDistance, state.ExtendedProperties["FlightDistance"]);
Assert.Equal(_missile.IsGuidance, state.ExtendedProperties["IsGuidance"]);
Assert.Equal(_missile.IsActive, state.IsActive);
}
}
}