diff --git a/ThreatSource.Tests/ThreatSource.Tests.csproj b/ThreatSource.Tests/ThreatSource.Tests.csproj
index 14b70b7..3d1a722 100644
--- a/ThreatSource.Tests/ThreatSource.Tests.csproj
+++ b/ThreatSource.Tests/ThreatSource.Tests.csproj
@@ -11,6 +11,8 @@
+
+
diff --git a/ThreatSource.Tests/src/Jamming/JammingTests.cs b/ThreatSource.Tests/src/Jamming/JammingTests.cs
new file mode 100644
index 0000000..b230f74
--- /dev/null
+++ b/ThreatSource.Tests/src/Jamming/JammingTests.cs
@@ -0,0 +1,264 @@
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using ThreatSource.Jamming;
+using ThreatSource.Sensor;
+using ThreatSource.Missile;
+using ThreatSource.Simulation;
+using ThreatSource.Utils;
+
+namespace ThreatSource.Tests.Jamming
+{
+ [TestClass]
+ public class JammingTests
+ {
+ private InfraredDetector infraredDetector = null!;
+ private MillimeterWaveRadiometer radiometer = null!;
+ private LaserRangefinder rangefinder = null!;
+ private MillimeterWaveAltimeter altimeter = null!;
+ private TerminalSensitiveSubmunition submunition = null!;
+ private MockSimulationManager simulationManager = null!;
+
+ [TestInitialize]
+ public void Setup()
+ {
+ simulationManager = new MockSimulationManager();
+ var properties = new MissileProperties
+ {
+ Mass = 10,
+ ExplosionRadius = 5,
+ MaxSpeed = 2000
+ };
+
+ submunition = new TerminalSensitiveSubmunition("target1", properties, simulationManager);
+
+ // 初始化传感器
+ infraredDetector = new InfraredDetector(submunition, 500, InfraredBand.Short, 10);
+ radiometer = new MillimeterWaveRadiometer(submunition, 500, MillimeterWaveBand.Band3, 11);
+ altimeter = new MillimeterWaveAltimeter(submunition, 1000, MillimeterWaveBand.Band8, 0.5, 25);
+ rangefinder = new LaserRangefinder(submunition, 500, 1.06, 100, 0.5);
+
+ // 设置子弹到Detection阶段
+ for (int i = 0; i < 5; i++)
+ {
+ submunition.Update(0.1);
+ }
+ }
+
+ [TestMethod]
+ public void TestInfraredJamming()
+ {
+ // 激活红外探测器
+ infraredDetector.Activate();
+ Assert.IsTrue(infraredDetector.IsActive);
+
+ // 应用红外干扰
+ var jammingParams = new JammingParameters
+ {
+ Type = JammingType.Infrared,
+ Power = 100,
+ AngleRange = 30,
+ Duration = 5,
+ Direction = new Vector3D(1, 0, 0)
+ };
+
+ infraredDetector.ApplyJamming(jammingParams);
+ Assert.IsFalse(infraredDetector.IsActive, "红外探测器应该在干扰下失效");
+
+ // 清除干扰
+ infraredDetector.ClearJamming(JammingType.Infrared);
+ Assert.IsTrue(infraredDetector.IsActive, "红外探测器应该在干扰清除后恢复工作");
+ }
+
+ [TestMethod]
+ public void TestMillimeterWaveJamming()
+ {
+ // 激活毫米波辐射计
+ radiometer.Activate();
+ Assert.IsTrue(radiometer.IsActive);
+
+ // 应用毫米波干扰
+ var jammingParams = new JammingParameters
+ {
+ Type = JammingType.MillimeterWave,
+ Power = 200,
+ AngleRange = 45,
+ Duration = 3,
+ Direction = new Vector3D(1, 0, 0)
+ };
+
+ radiometer.ApplyJamming(jammingParams);
+ Assert.IsFalse(radiometer.IsActive, "毫米波辐射计应该在干扰下失效");
+
+ // 清除干扰
+ radiometer.ClearJamming(JammingType.MillimeterWave);
+ Assert.IsTrue(radiometer.IsActive, "毫米波辐射计应该在干扰清除后恢复工作");
+ }
+
+ [TestMethod]
+ public void TestLaserJamming()
+ {
+ // 激活激光测距仪
+ rangefinder.Activate();
+ Assert.IsTrue(rangefinder.IsActive);
+
+ // 应用激光干扰
+ var jammingParams = new JammingParameters
+ {
+ Type = JammingType.Laser,
+ Power = 150,
+ AngleRange = 15,
+ Duration = 4,
+ Direction = new Vector3D(1, 0, 0)
+ };
+
+ rangefinder.ApplyJamming(jammingParams);
+ Assert.IsFalse(rangefinder.IsActive, "激光测距仪应该在干扰下失效");
+
+ // 清除干扰
+ rangefinder.ClearJamming(JammingType.Laser);
+ Assert.IsTrue(rangefinder.IsActive, "激光测距仪应该在干扰清除后恢复工作");
+ }
+
+ [TestMethod]
+ public void TestSubmunitionJammingResponse()
+ {
+ // 初始化仿真管理器
+ var mockManager = new MockSimulationManager();
+ var mockTarget = new MockTarget("target1") { Position = new Vector3D(100, 0, 100) };
+ mockManager.RegisterEntity("target1", mockTarget);
+
+ // 初始化子弹,设置初始位置在目标正上方120米处(刚好进入探测距离)
+ var properties = new MissileProperties
+ {
+ Mass = 10,
+ ExplosionRadius = 5,
+ MaxSpeed = 2000
+ };
+ var submunition = new TerminalSensitiveSubmunition("target1", properties, mockManager)
+ {
+ Position = new Vector3D(100, 120, 100), // 设置在目标正上方120米处
+ Velocity = new Vector3D(0, -10, 0) // 设置垂直下降速度为10米/秒
+ };
+ submunition.Activate();
+
+ // 获取子弹内部的传感器实例
+ var infraredDetector = submunition.GetType().GetField("infraredDetector", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?.GetValue(submunition) as InfraredDetector;
+ var radiometer = submunition.GetType().GetField("radiometer", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?.GetValue(submunition) as MillimeterWaveRadiometer;
+ var rangefinder = submunition.GetType().GetField("rangefinder", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?.GetValue(submunition) as LaserRangefinder;
+
+ // 激活传感器
+ infraredDetector?.Activate();
+ radiometer?.Activate();
+ rangefinder?.Activate();
+
+ // 更新子弹状态,让它进入Detection阶段
+ for (int i = 0; i < 3; i++)
+ {
+ submunition.Update(0.1);
+ var currentStatus = submunition.GetStatus();
+ Console.WriteLine($"更新 {i + 1} 后的状态:{currentStatus}"); // 添加状态输出,帮助调试
+ }
+
+ // 手动设置子弹阶段为Detection
+ var stageField = submunition.GetType().GetField("currentStage", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
+ var stageEnum = submunition.GetType().GetNestedType("SubmunitionStage", System.Reflection.BindingFlags.NonPublic);
+ var detectionStage = Enum.Parse(stageEnum!, "Detection");
+ stageField?.SetValue(submunition, detectionStage);
+
+ // 创建干扰参数
+ var infraredJamming = new JammingParameters
+ {
+ Type = JammingType.Infrared,
+ Power = 100,
+ Duration = 5,
+ Direction = new Vector3D(1, 0, 0)
+ };
+
+ var millimeterWaveJamming = new JammingParameters
+ {
+ Type = JammingType.MillimeterWave,
+ Power = 200,
+ Duration = 5,
+ Direction = new Vector3D(1, 0, 0)
+ };
+
+ // 应用干扰
+ infraredDetector?.ApplyJamming(infraredJamming);
+ radiometer?.ApplyJamming(millimeterWaveJamming);
+
+ // 更新子弹状态
+ submunition.Update(0.1);
+
+ // 验证子弹响应
+ var status = submunition.GetStatus();
+ Console.WriteLine($"应用干扰后的状态:{status}"); // 添加状态输出,帮助调试
+ Assert.IsTrue(status.Contains("传感器受到干扰"), "子弹状态应该反映传感器受到干扰");
+
+ // 清除干扰
+ infraredDetector?.ClearJamming(JammingType.Infrared);
+ radiometer?.ClearJamming(JammingType.MillimeterWave);
+
+ // 再次更新子弹状态
+ submunition.Update(0.1);
+ status = submunition.GetStatus();
+ Console.WriteLine($"清除干扰后的状态:{status}"); // 添加状态输出,帮助调试
+ Assert.IsFalse(infraredDetector?.IsActive == false || radiometer?.IsActive == false, "传感器应该恢复正常工作状态");
+ Assert.IsFalse(status.Contains("传感器受到干扰"), "子弹状态应该反映传感器恢复正常");
+ }
+ }
+
+ // 模拟仿真管理器
+ public class MockSimulationManager : ISimulationManager
+ {
+ private readonly Dictionary entities = new();
+ private ISimulationAdapter? adapter;
+
+ void ISimulationManager.PublishEvent(T evt) { }
+
+ void ISimulationManager.SubscribeToEvent(Action handler) { }
+
+ void ISimulationManager.UnsubscribeFromEvent(Action handler) { }
+
+ public bool RegisterEntity(string id, object entity)
+ {
+ entities[id] = entity;
+ return true;
+ }
+
+ public bool UnregisterEntity(string id)
+ {
+ return entities.Remove(id);
+ }
+
+ public object GetEntityById(string id)
+ {
+ return entities.TryGetValue(id, out var entity) ? entity : new MockTarget("mock_target") { Position = new Vector3D(100, 50, 100) };
+ }
+
+ public IReadOnlyList GetEntitiesByType() where T : class
+ {
+ return entities.Values.OfType().ToList();
+ }
+
+ public IReadOnlyList