129 lines
4.5 KiB
C#
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);
|
|
}
|
|
}
|
|
} |