ThreatSourceLibaray/ThreatSource.Tests/src/Simulation/SimulationManagerTests.cs

262 lines
8.3 KiB
C#

using System;
using Xunit;
using ThreatSource.Simulation;
using ThreatSource.Tests.Simulation;
namespace ThreatSource.Tests.Simulation
{
public class SimulationManagerTests
{
private readonly SimulationManager _simulationManager;
private readonly TestSimulationAdapter _testAdapter;
public SimulationManagerTests()
{
_simulationManager = new SimulationManager();
_testAdapter = new TestSimulationAdapter(_simulationManager);
_simulationManager.SetSimulationAdapter(_testAdapter);
}
[Fact]
public void TestEventPublishing()
{
// Arrange
_testAdapter.ClearEvents();
var missileEvent = new MissileFireEvent
{
SenderId = "missile1",
TargetId = "target1",
Timestamp = 1.0
};
// Act
_simulationManager.PublishEvent(missileEvent);
// Assert
var publishedEvents = _testAdapter.GetPublishedEvents();
Assert.Single(publishedEvents);
var publishedEvent = Assert.IsType<MissileFireEvent>(publishedEvents[0]);
Assert.Equal("missile1", publishedEvent.SenderId);
Assert.Equal("target1", publishedEvent.TargetId);
}
[Fact]
public void TestEntityManagement()
{
// Arrange
var testEntity = new { Id = "test1", Name = "TestEntity" };
_testAdapter.AddTestEntity("external1", new { Id = "external1", Name = "ExternalEntity" });
// Act
_simulationManager.RegisterEntity("test1", testEntity);
// Assert
// 测试内部实体获取
var internalEntity = _simulationManager.GetEntityById("test1");
Assert.NotNull(internalEntity);
Assert.Equal("TestEntity", (internalEntity as dynamic).Name);
// 测试外部实体获取
var externalEntity = _simulationManager.GetEntityById("external1");
Assert.NotNull(externalEntity);
Assert.Equal("ExternalEntity", (externalEntity as dynamic).Name);
}
[Fact]
public void TestEventSubscriptionAndUnsubscription()
{
// Arrange
int eventCount = 0;
Action<MissileFireEvent> handler = _ => eventCount++;
// Act
_simulationManager.SubscribeToEvent(handler);
_simulationManager.PublishEvent(new MissileFireEvent());
_simulationManager.UnsubscribeFromEvent(handler);
_simulationManager.PublishEvent(new MissileFireEvent());
// Assert
Assert.Equal(1, eventCount);
}
[Fact]
public void TestExternalEventReception()
{
// Arrange
var externalEvent = new LaserIlluminationEvent
{
LaserDesignatorId = "laser1",
TargetId = "target1"
};
bool eventReceived = false;
_simulationManager.SubscribeToEvent<LaserIlluminationEvent>(evt =>
{
eventReceived = true;
Assert.Equal("laser1", evt.LaserDesignatorId);
});
// Act
_testAdapter.ReceiveFromExternalSimulation(externalEvent);
// Assert
Assert.True(eventReceived);
}
[Fact]
public void TestNullEventPublishing()
{
// Arrange
MissileFireEvent? nullEvent = null;
// Act & Assert
Assert.Throws<ArgumentNullException>(() => _simulationManager.PublishEvent(nullEvent));
}
[Fact]
public void TestNullEventExternalPublishing()
{
// Arrange
MissileFireEvent? nullEvent = null;
// Act & Assert
Assert.Throws<ArgumentNullException>(() => _testAdapter.PublishToExternalSimulation(nullEvent));
}
[Fact]
public void TestNullEventExternalReceiving()
{
// Arrange
MissileFireEvent? nullEvent = null;
// Act & Assert
Assert.Throws<ArgumentNullException>(() => _testAdapter.ReceiveFromExternalSimulation(nullEvent));
}
[Fact]
public void TestUnregisterEntity()
{
// Arrange
var testEntity = new { Id = "test1", Name = "TestEntity" };
_simulationManager.RegisterEntity("test1", testEntity);
// Act
bool unregistered = _simulationManager.UnregisterEntity("test1");
bool notFound = _simulationManager.UnregisterEntity("nonexistent");
// Assert
Assert.True(unregistered);
Assert.False(notFound);
Assert.Null(_simulationManager.GetEntityById("test1"));
}
[Fact]
public void TestGetEntitiesByType()
{
// Arrange
var testEntity1 = new TestEntity { Id = "test1" };
var testEntity2 = new TestEntity { Id = "test2" };
var differentEntity = new { Id = "diff1" };
_simulationManager.RegisterEntity("test1", testEntity1);
_simulationManager.RegisterEntity("test2", testEntity2);
_simulationManager.RegisterEntity("diff1", differentEntity);
// Act
var entities = _simulationManager.GetEntitiesByType<TestEntity>();
// Assert
Assert.Equal(2, entities.Count);
Assert.Contains(testEntity1, entities);
Assert.Contains(testEntity2, entities);
}
[Fact]
public void TestGetAllEntities()
{
// Arrange
var entity1 = new { Id = "test1" };
var entity2 = new { Id = "test2" };
_simulationManager.RegisterEntity("test1", entity1);
_simulationManager.RegisterEntity("test2", entity2);
// Act
var allEntities = _simulationManager.GetAllEntities();
// Assert
Assert.Equal(2, allEntities.Count);
Assert.Contains(entity1, allEntities);
Assert.Contains(entity2, allEntities);
}
[Fact]
public void TestGetSimulationAdapter()
{
// Act
var adapter = _simulationManager.GetSimulationAdapter();
// Assert
Assert.NotNull(adapter);
Assert.Same(_testAdapter, adapter);
}
[Fact]
public void TestRegisterEntityWithInvalidInput()
{
// Arrange & Act & Assert
Assert.False(_simulationManager.RegisterEntity("", new object()));
Assert.False(_simulationManager.RegisterEntity("test", null!));
}
[Fact]
public void TestConcurrentEntityOperations()
{
// Arrange
var entity = new { Id = "test1" };
// Act & Assert
Assert.True(_simulationManager.RegisterEntity("test1", entity));
Assert.False(_simulationManager.RegisterEntity("test1", entity)); // 重复注册
Assert.True(_simulationManager.UnregisterEntity("test1"));
Assert.True(_simulationManager.RegisterEntity("test1", entity)); // 重新注册
}
[Fact]
public void TestEventHandlerException_ContinuesExecution()
{
// Arrange
var missileEvent = new MissileFireEvent
{
SenderId = "missile1",
TargetId = "target1"
};
bool firstHandlerCalled = false;
bool secondHandlerCalled = false;
_simulationManager.SubscribeToEvent<MissileFireEvent>(_ =>
{
firstHandlerCalled = true;
throw new Exception("测试异常");
});
_simulationManager.SubscribeToEvent<MissileFireEvent>(_ =>
{
secondHandlerCalled = true;
});
// Act - 不应抛出异常
_simulationManager.PublishEvent(missileEvent);
// Assert - 两个处理器都应该被调用
Assert.True(firstHandlerCalled);
Assert.True(secondHandlerCalled);
}
// 用于测试的辅助类
private class TestEntity
{
public string Id { get; set; } = "";
}
}
}