ThreatSourceLibaray/ThreatSource.Tests/src/Jamming/InfraredTrackerJammingTests.cs

323 lines
12 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 Microsoft.VisualStudio.TestTools.UnitTesting;
using ThreatSource.Indicator;
using ThreatSource.Jammer;
using ThreatSource.Simulation;
using ThreatSource.Tests.Simulation;
using ThreatSource.Utils;
using System;
using System.Collections.Generic;
namespace ThreatSource.Tests.Jamming
{
[TestClass]
public class InfraredTrackerJammingTests
{
private SimulationManager _simulationManager = null!;
private TestSimulationAdapter _testAdapter = null!;
private InfraredTracker _infraredTracker = null!;
[TestInitialize]
public void Setup()
{
// 初始化模拟管理器和测试适配器
_simulationManager = new SimulationManager();
_testAdapter = new TestSimulationAdapter(_simulationManager);
_simulationManager.SetSimulationAdapter(_testAdapter);
// 创建红外测角仪配置
var config = new InfraredTrackerConfig
{
MaxTrackingRange = 10000,
FieldOfView = Math.PI / 3,
AngleMeasurementAccuracy = 0.001,
UpdateFrequency = 10,
JammingResistanceThreshold = 0.02 // 设置干扰抗性阈值为20mW
};
// 初始化红外测角仪
var motionParameters = new MotionParameters
{
Position = new Vector3D(0, 0, 0),
Orientation = new Orientation(0, 0, 0),
InitialSpeed = 0
};
_infraredTracker = new InfraredTracker(
"tracker1",
"target1",
config,
motionParameters,
_simulationManager
);
// 注册红外测角仪
_simulationManager.RegisterEntity("tracker1", _infraredTracker);
}
[TestMethod]
public void InfraredJamming_TargetsTracker_TrackerIsJammed()
{
// Arrange
_infraredTracker.Activate();
// 创建干扰事件
var jammingEvent = new JammingEvent
{
Parameters = new JammingParameters
{
Power = 1000, // 高于阈值
Wavelength = 4,
SourcePosition = new Vector3D(50, 0, 0),
Direction = new Vector3D(-1, 0, 0), // 指向跟踪器
AngleRange = Math.PI / 4, // 45度角
Mode = JammingMode.Noise,
Duration = null // 持续干扰
}
};
// Act
_simulationManager.PublishEvent(jammingEvent);
_infraredTracker.Update(0.1);
// Assert
Assert.IsTrue(_infraredTracker.IsJammed, "红外测角仪应该处于被干扰状态");
var status = _infraredTracker.GetStatus();
Assert.IsTrue(status.Contains("干扰/遮挡状态: 受红外干扰"), "状态信息应该反映受干扰");
}
[TestMethod]
public void InfraredJamming_OutsideAngleRange_TrackerNotJammed()
{
// Arrange
_infraredTracker.Activate();
// 创建角度范围外的干扰事件
var jammingEvent = new JammingEvent
{
Parameters = new JammingParameters
{
Power = 1000,
Wavelength = 4,
SourcePosition = new Vector3D(0, 50, 0), // 位于上方
Direction = new Vector3D(0, 0, 1), // 指向前方,不是指向跟踪器
AngleRange = 0.1, // 很小的角度范围
Mode = JammingMode.Noise
}
};
// Act
_simulationManager.PublishEvent(jammingEvent);
_infraredTracker.Update(0.1);
// Assert
Assert.IsFalse(_infraredTracker.IsJammed, "测角仪不应该被干扰,因为干扰源不在角度范围内");
var status = _infraredTracker.GetStatus();
Assert.IsTrue(status.Contains("干扰/遮挡状态: 正常"), "状态信息应该反映正常");
}
[TestMethod]
public void InfraredJamming_LowPower_TrackerNotJammed()
{
// Arrange
_infraredTracker.Activate();
// 创建低功率干扰事件
var jammingEvent = new JammingEvent
{
Parameters = new JammingParameters
{
Power = 10, // 低于阈值
Wavelength = 4,
SourcePosition = new Vector3D(50, 0, 0),
Direction = new Vector3D(-1, 0, 0),
AngleRange = Math.PI / 4,
Mode = JammingMode.Noise
}
};
// Act
_simulationManager.PublishEvent(jammingEvent);
_infraredTracker.Update(0.1);
// Assert
Assert.IsFalse(_infraredTracker.IsJammed, "测角仪不应该被干扰,因为干扰功率低于阈值");
}
[TestMethod]
public void InfraredJamming_WrongWavelength_TrackerNotJammed()
{
// Arrange
_infraredTracker.Activate();
// 创建错误波长的干扰事件
var jammingEvent = new JammingEvent
{
Parameters = new JammingParameters
{
Power = 1000,
Wavelength = 6, // 不在3-5μm或8-14μm范围
SourcePosition = new Vector3D(50, 0, 0),
Direction = new Vector3D(-1, 0, 0),
AngleRange = Math.PI / 4,
Mode = JammingMode.Noise
}
};
// Act
_simulationManager.PublishEvent(jammingEvent);
_infraredTracker.Update(0.1);
// Assert
Assert.IsFalse(_infraredTracker.IsJammed, "测角仪不应该被干扰,因为波长不匹配");
}
[TestMethod]
public void InfraredJamming_DifferentTargetId_TrackerNotJammed()
{
// Arrange
_infraredTracker.Activate();
// 创建干扰事件
var jammingEvent = new JammingEvent
{
Parameters = new JammingParameters
{
Power = 1000,
Wavelength = 4,
SourcePosition = new Vector3D(50, 0, 0),
Direction = new Vector3D(-1, 0, 0),
AngleRange = Math.PI / 4,
Mode = JammingMode.Noise
}
};
// Act
_simulationManager.PublishEvent(jammingEvent);
_infraredTracker.Update(0.1);
// Assert
Assert.IsTrue(_infraredTracker.IsJammed, "测角仪应该被干扰,因为在干扰范围内");
}
[TestMethod]
public void InfraredJamming_ClearedAfterDuration_TrackerNotJammed()
{
// Arrange
_infraredTracker.Activate();
// 创建有限时间的干扰事件
var jammingEvent = new JammingEvent
{
Parameters = new JammingParameters
{
Power = 1000,
Wavelength = 4,
SourcePosition = new Vector3D(50, 0, 0),
Direction = new Vector3D(-1, 0, 0),
AngleRange = Math.PI / 4,
Mode = JammingMode.Noise,
Duration = 0.5 // 0.5秒后过期
}
};
// Act - 应用干扰
_simulationManager.PublishEvent(jammingEvent);
_infraredTracker.Update(0.1);
// Assert - 确认已被干扰
Assert.IsTrue(_infraredTracker.IsJammed, "红外测角仪应该处于被干扰状态");
// Act - 等待干扰过期
// 注意:这里我们需要模拟 JammingHandler 的更新,而不只是 InfraredTracker 的更新
// 通常在实际运行中JammingHandler 会在每帧更新时被调用
// 这里我们直接多次更新 InfraredTracker其内部会更新 JammingHandler
for (int i = 0; i < 10; i++)
{
_infraredTracker.Update(0.1); // 总共更新1秒超过干扰持续时间
}
// Assert - 确认干扰已清除
Assert.IsFalse(_infraredTracker.IsJammed, "干扰持续时间结束后,红外测角仪应该恢复正常");
}
[TestMethod]
public void InfraredJamming_ManualClear_TrackerNotJammed()
{
// Arrange
_infraredTracker.Activate();
// 创建持续干扰事件
var jammingEvent = new JammingEvent
{
Parameters = new JammingParameters
{
Power = 1000,
Wavelength = 4,
SourcePosition = new Vector3D(50, 0, 0),
Direction = new Vector3D(-1, 0, 0),
AngleRange = Math.PI / 4,
Mode = JammingMode.Noise,
Duration = null // 持续干扰
}
};
// Act - 应用干扰
_simulationManager.PublishEvent(jammingEvent);
_infraredTracker.Update(0.1);
// Assert - 确认已被干扰
Assert.IsTrue(_infraredTracker.IsJammed, "红外测角仪应该处于被干扰状态");
// Act - 手动清除干扰
_infraredTracker.ClearJamming(JammingType.Infrared);
_infraredTracker.Update(0.1);
// Assert - 确认干扰已清除
Assert.IsFalse(_infraredTracker.IsJammed, "手动清除后,红外测角仪应该恢复正常");
}
[TestMethod]
public void InfraredJamming_TrackingDisabledDuringJamming()
{
// 设置红外测角仪的目标和导弹ID使其进入跟踪状态
typeof(InfraredTracker).GetProperty("MissileId")?.SetValue(_infraredTracker, "missile1");
// Arrange
_infraredTracker.Activate();
// 创建干扰事件
var jammingEvent = new JammingEvent
{
Parameters = new JammingParameters
{
Power = 1000,
Wavelength = 4,
SourcePosition = new Vector3D(50, 0, 0),
Direction = new Vector3D(-1, 0, 0),
AngleRange = Math.PI / 4,
Mode = JammingMode.Noise
}
};
// 捕获发布的事件
List<SimulationEvent> publishedEvents = new List<SimulationEvent>();
_testAdapter.EventPublished += (sender, evt) => publishedEvents.Add(evt);
// Act - 没有干扰的情况下更新
_infraredTracker.Update(0.1);
// 记录发布的事件数量
int eventsBeforeJamming = publishedEvents.Count;
publishedEvents.Clear();
// Act - 应用干扰
_simulationManager.PublishEvent(jammingEvent);
_infraredTracker.Update(0.1);
// Assert
int eventsAfterJamming = publishedEvents.Count;
Assert.IsTrue(_infraredTracker.IsJammed, "红外测角仪应该处于被干扰状态");
Assert.AreEqual(0, eventsAfterJamming, "在干扰状态下不应该发送制导指令事件");
}
}
}