using GFramework.Core.Events; using NUnit.Framework; namespace GFramework.Core.Tests.Events; /// /// EasyEvents功能测试类,用于验证事件系统的注册、触发和参数传递功能 /// [TestFixture] public class EasyEventsTests { /// /// 测试用例初始化方法,在每个测试方法执行前设置EasyEvents实例 /// [SetUp] public void SetUp() { _easyEvents = new EasyEvents(); } private EasyEvents _easyEvents = null!; /// /// 测试单参数事件的功能,验证事件能够正确接收并传递int类型参数 /// [Test] public void Get_EventT_Should_Trigger_With_Parameter() { var receivedValue = 0; var @event = EasyEvents.GetOrAdd>(); @event.Register(value => { receivedValue = value; }); // 触发事件并传递参数42 @event.Trigger(42); Assert.That(receivedValue, Is.EqualTo(42)); } /// /// 测试双参数事件的功能,验证事件能够正确接收并传递int和string类型的参数 /// [Test] public void Get_EventTTK_Should_Trigger_With_Two_Parameters() { var receivedInt = 0; var receivedString = string.Empty; var @event = EasyEvents.GetOrAdd>(); @event.Register((i, s) => { receivedInt = i; receivedString = s; }); // 触发事件并传递两个参数:整数100和字符串"hello" @event.Trigger(100, "hello"); Assert.That(receivedInt, Is.EqualTo(100)); Assert.That(receivedString, Is.EqualTo("hello")); } /// /// 测试并发场景下GetOrAdd的线程安全性 /// [Test] public void GetOrAdd_Should_Be_Thread_Safe() { const int threadCount = 10; const int iterationsPerThread = 100; var tasks = new Task[threadCount]; var exceptions = new List(); for (var i = 0; i < threadCount; i++) { tasks[i] = Task.Run(() => { try { for (var j = 0; j < iterationsPerThread; j++) { var @event = _easyEvents.GetOrAddEvent>(); Assert.That(@event, Is.Not.Null); } } catch (Exception ex) { lock (exceptions) { exceptions.Add(ex); } } }); } Task.WaitAll(tasks); Assert.That(exceptions, Is.Empty, $"并发测试中发生异常: {string.Join(", ", exceptions.Select(e => e.Message))}"); } /// /// 测试并发场景下AddEvent的行为 /// [Test] public void AddEvent_Should_Throw_When_Already_Registered() { _easyEvents.AddEvent>(); Assert.Throws(() => _easyEvents.AddEvent>()); } /// /// 测试并发场景下多个不同事件类型的注册 /// [Test] public void Concurrent_Registration_Of_Different_Event_Types_Should_Work() { const int threadCount = 5; var tasks = new Task[threadCount]; var exceptions = new List(); // 每个线程注册不同类型的事件 for (var i = 0; i < threadCount; i++) { var index = i; tasks[i] = Task.Run(() => { try { switch (index) { case 0: _easyEvents.GetOrAddEvent>(); break; case 1: _easyEvents.GetOrAddEvent>(); break; case 2: _easyEvents.GetOrAddEvent>(); break; case 3: _easyEvents.GetOrAddEvent>(); break; case 4: _easyEvents.GetOrAddEvent>(); break; } } catch (Exception ex) { lock (exceptions) { exceptions.Add(ex); } } }); } Task.WaitAll(tasks); Assert.That(exceptions, Is.Empty); // 验证所有事件都已注册 Assert.That(_easyEvents.GetEvent>(), Is.Not.Null); Assert.That(_easyEvents.GetEvent>(), Is.Not.Null); Assert.That(_easyEvents.GetEvent>(), Is.Not.Null); Assert.That(_easyEvents.GetEvent>(), Is.Not.Null); Assert.That(_easyEvents.GetEvent>(), Is.Not.Null); } }