323 lines
12 KiB
C#
323 lines
12 KiB
C#
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, "在干扰状态下不应该发送制导指令事件");
|
||
}
|
||
}
|
||
} |