style(coding-style): 统一代码风格并优化文档格式

- 移除多余using语句和空行,统一代码缩进格式
- 优化注释文档中的缩进和对齐格式
- 简化条件语句和方法实现,提升代码可读性
- 重构协程系统相关类的字段和方法定义格式
- 更新架构服务中容器访问方式的实现
- 调整异步操作类的属性和方法组织结构
- [skip ci]
This commit is contained in:
GeWuYou 2026-01-27 20:30:04 +08:00
parent a71c7f6f1a
commit b49079de3e
212 changed files with 2798 additions and 2835 deletions

View File

@ -1,5 +1,3 @@
using System;
using System.Threading.Tasks;
using GFramework.Core.Abstractions.command;
using GFramework.Core.Abstractions.environment;
using GFramework.Core.Abstractions.events;

View File

@ -1,6 +1,4 @@
using System.Threading.Tasks;
namespace GFramework.Core.Abstractions.architecture;
namespace GFramework.Core.Abstractions.architecture;
/// <summary>
/// 定义异步初始化接口,用于需要异步初始化的组件或服务

View File

@ -1,19 +1,19 @@
namespace GFramework.Core.Abstractions.bases;
/// <summary>
/// 表示键值对的接口,定义了通用的键值对数据结构契约
/// 表示键值对的接口,定义了通用的键值对数据结构契约
/// </summary>
/// <typeparam name="TKey">键的类型</typeparam>
/// <typeparam name="TValue">值的类型</typeparam>
public interface IKeyValue<out TKey, out TValue>
{
/// <summary>
/// 获取键值对中的键
/// 获取键值对中的键
/// </summary>
TKey Key { get; }
/// <summary>
/// 获取键值对中的值
/// 获取键值对中的值
/// </summary>
TValue Value { get; }
}

View File

@ -1,28 +1,27 @@
using System.Threading.Tasks;
using GFramework.Core.Abstractions.rule;
namespace GFramework.Core.Abstractions.command;
/// <summary>
/// 表示一个异步命令接口,该命令不返回结果
/// 表示一个异步命令接口,该命令不返回结果
/// </summary>
public interface IAsyncCommand : IContextAware
{
/// <summary>
/// 异步执行命令
/// 异步执行命令
/// </summary>
/// <returns>表示异步操作的任务</returns>
Task ExecuteAsync();
}
/// <summary>
/// 表示一个异步命令接口,该命令返回指定类型的结果
/// 表示一个异步命令接口,该命令返回指定类型的结果
/// </summary>
/// <typeparam name="TResult">命令执行结果的类型</typeparam>
public interface IAsyncCommand<TResult> : IContextAware
{
/// <summary>
/// 异步执行命令并返回结果
/// 异步执行命令并返回结果
/// </summary>
/// <returns>表示异步操作的任务,任务结果为命令执行的返回值</returns>
Task<TResult> ExecuteAsync();

View File

@ -1,5 +1,3 @@
using System.Threading.Tasks;
namespace GFramework.Core.Abstractions.command;
/// <summary>

View File

@ -1,32 +1,32 @@
namespace GFramework.Core.Abstractions.coroutine;
/// <summary>
/// 表示协程的执行状态枚举
/// 表示协程的执行状态枚举
/// </summary>
public enum CoroutineState
{
/// <summary>
/// 协程正在运行中
/// 协程正在运行中
/// </summary>
Running,
/// <summary>
/// 协程已暂停
/// 协程已暂停
/// </summary>
Paused,
/// <summary>
/// 协程被锁定或等待其他协程完成
/// 协程被锁定或等待其他协程完成
/// </summary>
Held,
/// <summary>
/// 协程已完成执行
/// 协程已完成执行
/// </summary>
Completed,
/// <summary>
/// 协程已被取消
/// 协程已被取消
/// </summary>
Cancelled,
Cancelled
}

View File

@ -1,22 +1,22 @@
namespace GFramework.Core.Abstractions.coroutine;
/// <summary>
/// 时间源接口,提供当前时间、时间增量以及更新功能
/// 时间源接口,提供当前时间、时间增量以及更新功能
/// </summary>
public interface ITimeSource
{
/// <summary>
/// 获取当前时间
/// 获取当前时间
/// </summary>
double CurrentTime { get; }
/// <summary>
/// 获取时间增量(上一帧到当前帧的时间差)
/// 获取时间增量(上一帧到当前帧的时间差)
/// </summary>
double DeltaTime { get; }
/// <summary>
/// 更新时间源的状态
/// 更新时间源的状态
/// </summary>
void Update();
}

View File

@ -1,17 +1,17 @@
namespace GFramework.Core.Abstractions.coroutine;
/// <summary>
/// 定义一个可等待指令的接口,用于协程系统中的异步操作控制
/// 定义一个可等待指令的接口,用于协程系统中的异步操作控制
/// </summary>
public interface IYieldInstruction
{
/// <summary>
/// 获取当前等待指令是否已完成执行
/// 获取当前等待指令是否已完成执行
/// </summary>
bool IsDone { get; }
/// <summary>
/// 每帧由调度器调用,用于更新当前等待指令的状态
/// 每帧由调度器调用,用于更新当前等待指令的状态
/// </summary>
/// <param name="deltaTime">自上一帧以来的时间间隔(以秒为单位)</param>
void Update(double deltaTime);

View File

@ -15,12 +15,12 @@ public enum ArchitecturePhase
None = 0,
/// <summary>
/// 工具类初始化之前阶段
/// 工具类初始化之前阶段
/// </summary>
BeforeUtilityInit,
/// <summary>
/// 工具类初始化之后阶段
/// 工具类初始化之后阶段
/// </summary>
AfterUtilityInit,

View File

@ -1,6 +1,4 @@
using System;
namespace GFramework.Core.Abstractions.events;
namespace GFramework.Core.Abstractions.events;
/// <summary>
/// 事件接口,定义了事件注册的基本功能

View File

@ -1,9 +1,7 @@
using System;
namespace GFramework.Core.Abstractions.events;
namespace GFramework.Core.Abstractions.events;
/// <summary>
/// 事件总线接口,提供事件的发送、注册和注销功能
/// 事件总线接口,提供事件的发送、注册和注销功能
/// </summary>
public interface IEventBus
{

View File

@ -1,6 +1,4 @@
using System.Collections.Generic;
namespace GFramework.Core.Abstractions.events;
namespace GFramework.Core.Abstractions.events;
/// <summary>
/// 提供统一注销功能的接口,用于管理需要注销的对象列表

View File

@ -1,6 +1,4 @@
using System;
using System.Collections.Generic;
using GFramework.Core.Abstractions.rule;
using GFramework.Core.Abstractions.rule;
using GFramework.Core.Abstractions.system;
namespace GFramework.Core.Abstractions.ioc;

View File

@ -1,6 +1,4 @@
using System;
namespace GFramework.Core.Abstractions.logging;
namespace GFramework.Core.Abstractions.logging;
/// <summary>
/// 定义日志记录接口,提供日志记录和级别检查功能

View File

@ -1,7 +1,7 @@
namespace GFramework.Core.Abstractions.pool;
/// <summary>
/// 对象池系统接口,定义了对象池的基本操作
/// 对象池系统接口,定义了对象池的基本操作
/// </summary>
/// <typeparam name="TKey">池键的类型</typeparam>
/// <typeparam name="TObject">池中对象的类型必须实现IPoolableObject接口</typeparam>
@ -10,21 +10,21 @@ public interface IObjectPoolSystem<in TKey, TObject>
where TKey : notnull
{
/// <summary>
/// 从对象池中获取一个对象实例
/// 从对象池中获取一个对象实例
/// </summary>
/// <param name="key">对象池的键</param>
/// <returns>池中的对象实例,如果池中没有可用对象则创建新实例</returns>
TObject Acquire(TKey key);
/// <summary>
/// 将对象释放回对象池
/// 将对象释放回对象池
/// </summary>
/// <param name="key">对象池的键</param>
/// <param name="obj">要释放的对象</param>
void Release(TKey key, TObject obj);
/// <summary>
/// 清空所有对象池
/// 清空所有对象池
/// </summary>
void Clear();
}

View File

@ -1,22 +1,22 @@
namespace GFramework.Core.Abstractions.pool;
/// <summary>
/// 定义可池化对象的接口,提供对象在池中的生命周期管理方法
/// 定义可池化对象的接口,提供对象在池中的生命周期管理方法
/// </summary>
public interface IPoolableObject
{
/// <summary>
/// 当对象从池中被获取时调用,用于初始化或重置对象状态
/// 当对象从池中被获取时调用,用于初始化或重置对象状态
/// </summary>
void OnAcquire();
/// <summary>
/// 当对象被释放回池中时调用,用于清理或重置对象状态以便下次使用
/// 当对象被释放回池中时调用,用于清理或重置对象状态以便下次使用
/// </summary>
void OnRelease();
/// <summary>
/// 当对象池被销毁时调用,用于执行最终的清理工作
/// 当对象池被销毁时调用,用于执行最终的清理工作
/// </summary>
void OnPoolDestroy();
}

View File

@ -1,4 +1,3 @@
using System;
using GFramework.Core.Abstractions.events;
namespace GFramework.Core.Abstractions.property;

View File

@ -1,15 +1,13 @@
using System.Threading.Tasks;
namespace GFramework.Core.Abstractions.query;
namespace GFramework.Core.Abstractions.query;
/// <summary>
/// 异步查询接口,定义了执行异步查询操作的方法
/// 异步查询接口,定义了执行异步查询操作的方法
/// </summary>
/// <typeparam name="TResult">查询结果的类型</typeparam>
public interface IAsyncQuery<TResult>
{
/// <summary>
/// 执行异步查询操作
/// 执行异步查询操作
/// </summary>
/// <returns>返回查询结果的Task结果类型为TResult</returns>
Task<TResult> DoAsync();

View File

@ -1,14 +1,12 @@
using System.Threading.Tasks;
namespace GFramework.Core.Abstractions.query;
namespace GFramework.Core.Abstractions.query;
/// <summary>
/// 异步查询总线接口,用于处理异步查询请求
/// 异步查询总线接口,用于处理异步查询请求
/// </summary>
public interface IAsyncQueryBus
{
/// <summary>
/// 异步发送查询请求并返回结果
/// 异步发送查询请求并返回结果
/// </summary>
/// <typeparam name="TResult">查询结果的类型</typeparam>
/// <param name="query">要执行的异步查询对象</param>

View File

@ -3,34 +3,34 @@
namespace GFramework.Game.Abstractions.registry;
/// <summary>
/// 表示一个通用的注册表接口用于根据键类型T获取值类型TR的对象
/// 表示一个通用的注册表接口用于根据键类型T获取值类型TR的对象
/// </summary>
/// <typeparam name="T">注册表中用作键的类型</typeparam>
/// <typeparam name="Tr">注册表中存储的值的类型</typeparam>
public interface IRegistry<in T, Tr>
{
/// <summary>
/// 根据指定的键获取对应的值
/// 根据指定的键获取对应的值
/// </summary>
/// <param name="key">用于查找值的键</param>
/// <returns>与指定键关联的值</returns>
Tr Get(T key);
/// <summary>
/// 检查注册表是否包含指定的键
/// 检查注册表是否包含指定的键
/// </summary>
/// <param name="key">要检查的键</param>
/// <returns>如果注册表包含具有指定键的元素则为true否则为false</returns>
bool Contains(T key);
/// <summary>
/// 添加一个键值对到注册表中
/// 添加一个键值对到注册表中
/// </summary>
/// <param name="mapping">要添加的键值对映射对象</param>
IRegistry<T, Tr> Registry(IKeyValue<T, Tr> mapping);
/// <summary>
/// 添加一个键值对到注册表中
/// 添加一个键值对到注册表中
/// </summary>
/// <param name="key">要添加的键</param>
/// <param name="value">要添加的值</param>

View File

@ -1,12 +1,11 @@
using System.Collections.Generic;
using GFramework.Core.Abstractions.bases;
using GFramework.Core.Abstractions.bases;
using GFramework.Game.Abstractions.registry;
namespace GFramework.Core.Abstractions.registries;
/// <summary>
/// 基于Dictionary的通用键值注册表基类
/// 提供基于字典的键值对注册、查询和管理功能
/// 基于Dictionary的通用键值注册表基类
/// 提供基于字典的键值对注册、查询和管理功能
/// </summary>
/// <typeparam name="TKey">键的类型</typeparam>
/// <typeparam name="TValue">值的类型</typeparam>
@ -14,12 +13,12 @@ public abstract class KeyValueRegistryBase<TKey, TValue>
: IRegistry<TKey, TValue>
{
/// <summary>
/// 存储键值对映射关系的字典
/// 存储键值对映射关系的字典
/// </summary>
protected readonly IDictionary<TKey, TValue> Map;
/// <summary>
/// 初始化KeyValueRegistryBase的新实例
/// 初始化KeyValueRegistryBase的新实例
/// </summary>
/// <param name="comparer">用于比较键的相等性的比较器如果为null则使用默认比较器</param>
protected KeyValueRegistryBase(IEqualityComparer<TKey>? comparer = null)
@ -29,26 +28,30 @@ public abstract class KeyValueRegistryBase<TKey, TValue>
}
/// <summary>
/// 根据指定的键获取对应的值
/// 根据指定的键获取对应的值
/// </summary>
/// <param name="key">要查找的键</param>
/// <returns>与键关联的值</returns>
/// <exception cref="KeyNotFoundException">当键不存在时抛出异常</exception>
public virtual TValue Get(TKey key)
=> Map.TryGetValue(key, out var value)
{
return Map.TryGetValue(key, out var value)
? value
: throw new KeyNotFoundException($"{GetType().Name}: key not registered: {key}");
}
/// <summary>
/// 判断是否包含指定的键
/// 判断是否包含指定的键
/// </summary>
/// <param name="key">要检查的键</param>
/// <returns>如果包含该键返回true否则返回false</returns>
public virtual bool Contains(TKey key)
=> Map.ContainsKey(key);
{
return Map.ContainsKey(key);
}
/// <summary>
/// 注册键值对到注册表中
/// 注册键值对到注册表中
/// </summary>
/// <param name="key">要注册的键</param>
/// <param name="value">要注册的值</param>
@ -60,10 +63,12 @@ public abstract class KeyValueRegistryBase<TKey, TValue>
}
/// <summary>
/// 注册键值对映射对象到注册表中
/// 注册键值对映射对象到注册表中
/// </summary>
/// <param name="mapping">包含键值对的映射对象</param>
/// <returns>当前注册表实例,支持链式调用</returns>
public virtual IRegistry<TKey, TValue> Registry(IKeyValue<TKey, TValue> mapping)
=> Registry(mapping.Key, mapping.Value);
{
return Registry(mapping.Key, mapping.Value);
}
}

View File

@ -1,24 +1,24 @@
namespace GFramework.Core.Abstractions.state;
/// <summary>
/// 状态机状态接口,定义了状态的基本行为和转换规则
/// 状态机状态接口,定义了状态的基本行为和转换规则
/// </summary>
public interface IState
{
/// <summary>
/// 当状态被激活进入时调用
/// 当状态被激活进入时调用
/// </summary>
/// <param name="from">从哪个状态转换而来可能为null表示初始状态</param>
void OnEnter(IState? from);
/// <summary>
/// 当状态退出时调用
/// 当状态退出时调用
/// </summary>
/// <param name="to">将要转换到的目标状态可能为null表示结束状态</param>
void OnExit(IState? to);
/// <summary>
/// 判断当前状态是否可以转换到目标状态
/// 判断当前状态是否可以转换到目标状态
/// </summary>
/// <param name="target">目标状态</param>
/// <returns>如果可以转换则返回true否则返回false</returns>

View File

@ -1,84 +1,81 @@
using System;
using System.Collections.Generic;
namespace GFramework.Core.Abstractions.state;
/// <summary>
/// 状态机接口,用于管理状态的注册、切换和验证
/// 状态机接口,用于管理状态的注册、切换和验证
/// </summary>
public interface IStateMachine
{
/// <summary>
/// 获取当前激活的状态
/// 获取当前激活的状态
/// </summary>
IState? Current { get; }
/// <summary>
/// 注册一个状态到状态机中
/// 注册一个状态到状态机中
/// </summary>
/// <param name="state">要注册的状态实例</param>
IStateMachine Register(IState state);
/// <summary>
/// 从状态机中注销指定类型的状态
/// 从状态机中注销指定类型的状态
/// </summary>
/// <typeparam name="T">要注销的状态类型必须实现IState接口</typeparam>
IStateMachine Unregister<T>() where T : IState;
/// <summary>
/// 检查是否可以切换到指定类型的状态
/// 检查是否可以切换到指定类型的状态
/// </summary>
/// <typeparam name="T">目标状态类型必须实现IState接口</typeparam>
/// <returns>如果可以切换则返回true否则返回false</returns>
bool CanChangeTo<T>() where T : IState;
/// <summary>
/// 切换到指定类型的状态
/// 切换到指定类型的状态
/// </summary>
/// <typeparam name="T">要切换到的状态类型必须实现IState接口</typeparam>
/// <returns>如果成功切换则返回true否则返回false</returns>
bool ChangeTo<T>() where T : IState;
/// <summary>
/// 检查指定类型的状态是否已注册
/// 检查指定类型的状态是否已注册
/// </summary>
/// <typeparam name="T">要检查的状态类型</typeparam>
/// <returns>如果状态已注册则返回true否则返回false</returns>
bool IsRegistered<T>() where T : IState;
/// <summary>
/// 获取指定类型的已注册状态实例
/// 获取指定类型的已注册状态实例
/// </summary>
/// <typeparam name="T">要获取的状态类型</typeparam>
/// <returns>如果状态存在则返回对应实例否则返回null</returns>
T? GetState<T>() where T : class, IState;
/// <summary>
/// 获取所有已注册状态的类型集合
/// 获取所有已注册状态的类型集合
/// </summary>
/// <returns>包含所有已注册状态类型的枚举器</returns>
IEnumerable<Type> GetRegisteredStateTypes();
/// <summary>
/// 获取上一个状态
/// 获取上一个状态
/// </summary>
/// <returns>如果历史记录存在则返回上一个状态否则返回null</returns>
IState? GetPreviousState();
/// <summary>
/// 获取状态历史记录
/// 获取状态历史记录
/// </summary>
/// <returns>状态历史记录的只读副本</returns>
IReadOnlyList<IState> GetStateHistory();
/// <summary>
/// 回退到上一个状态
/// 回退到上一个状态
/// </summary>
/// <returns>如果成功回退则返回true否则返回false</returns>
bool GoBack();
/// <summary>
/// 清空状态历史记录
/// 清空状态历史记录
/// </summary>
void ClearHistory();
}

View File

@ -3,7 +3,7 @@
namespace GFramework.Core.Abstractions.state;
/// <summary>
/// 状态机系统接口继承自ISystem和IStateMachine接口
/// 提供状态机系统的功能定义,结合了系统管理和状态机管理的能力
/// 状态机系统接口继承自ISystem和IStateMachine接口
/// 提供状态机系统的功能定义,结合了系统管理和状态机管理的能力
/// </summary>
public interface IStateMachineSystem : ISystem, IStateMachine;

View File

@ -1,29 +1,28 @@
using System.Threading.Tasks;
using GFramework.Core.Abstractions.utility;
using GFramework.Core.Abstractions.utility;
namespace GFramework.Core.Abstractions.storage;
/// <summary>
/// 存储接口,提供同步和异步的数据存储操作功能
/// 存储接口,提供同步和异步的数据存储操作功能
/// </summary>
public interface IStorage : IUtility
{
/// <summary>
/// 检查指定键的存储项是否存在
/// 检查指定键的存储项是否存在
/// </summary>
/// <param name="key">要检查的键</param>
/// <returns>如果键存在则返回true否则返回false</returns>
bool Exists(string key);
/// <summary>
/// 异步检查指定键的存储项是否存在
/// 异步检查指定键的存储项是否存在
/// </summary>
/// <param name="key">要检查的键</param>
/// <returns>如果键存在则返回true否则返回false</returns>
Task<bool> ExistsAsync(string key);
/// <summary>
/// 读取指定键的值
/// 读取指定键的值
/// </summary>
/// <typeparam name="T">要读取的值的类型</typeparam>
/// <param name="key">要读取的键</param>
@ -31,7 +30,7 @@ public interface IStorage : IUtility
T Read<T>(string key);
/// <summary>
/// 读取指定键的值,如果键不存在则返回默认值
/// 读取指定键的值,如果键不存在则返回默认值
/// </summary>
/// <typeparam name="T">要读取的值的类型</typeparam>
/// <param name="key">要读取的键</param>
@ -40,7 +39,7 @@ public interface IStorage : IUtility
T Read<T>(string key, T defaultValue);
/// <summary>
/// 异步读取指定键的值
/// 异步读取指定键的值
/// </summary>
/// <typeparam name="T">要读取的值的类型</typeparam>
/// <param name="key">要读取的键</param>
@ -48,7 +47,7 @@ public interface IStorage : IUtility
Task<T> ReadAsync<T>(string key);
/// <summary>
/// 将值写入指定键
/// 将值写入指定键
/// </summary>
/// <typeparam name="T">要写入的值的类型</typeparam>
/// <param name="key">要写入的键</param>
@ -56,7 +55,7 @@ public interface IStorage : IUtility
void Write<T>(string key, T value);
/// <summary>
/// 异步将值写入指定键
/// 异步将值写入指定键
/// </summary>
/// <typeparam name="T">要写入的值的类型</typeparam>
/// <param name="key">要写入的键</param>
@ -65,7 +64,7 @@ public interface IStorage : IUtility
Task WriteAsync<T>(string key, T value);
/// <summary>
/// 删除指定键的存储项
/// 删除指定键的存储项
/// </summary>
/// <param name="key">要删除的键</param>
void Delete(string key);

View File

@ -6,13 +6,13 @@
<TargetFrameworks>net10.0;net8.0</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
<PackageReference Include="NUnit" Version="4.4.0" />
<PackageReference Include="NUnit3TestAdapter" Version="6.1.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.1"/>
<PackageReference Include="NUnit" Version="4.4.0"/>
<PackageReference Include="NUnit3TestAdapter" Version="6.1.0"/>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\GFramework.Core\GFramework.Core.csproj" />
<ProjectReference Include="..\GFramework.Core\GFramework.Core.csproj"/>
</ItemGroup>
</Project>

View File

@ -8,15 +8,15 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.architecture;
/// <summary>
/// ArchitectureConfiguration类的单元测试
/// 测试内容包括:
/// - 构造函数默认值
/// - LoggerProperties默认配置ConsoleLoggerFactoryProvider + Info级别
/// - ArchitectureProperties默认配置AllowLateRegistration=false, StrictPhaseValidation=true
/// - 自定义配置替换
/// - LoggerProperties独立修改
/// - ArchitectureProperties独立修改
/// - IArchitectureConfiguration接口实现验证
/// ArchitectureConfiguration类的单元测试
/// 测试内容包括:
/// - 构造函数默认值
/// - LoggerProperties默认配置ConsoleLoggerFactoryProvider + Info级别
/// - ArchitectureProperties默认配置AllowLateRegistration=false, StrictPhaseValidation=true
/// - 自定义配置替换
/// - LoggerProperties独立修改
/// - ArchitectureProperties独立修改
/// - IArchitectureConfiguration接口实现验证
/// </summary>
[TestFixture]
public class ArchitectureConfigurationTests
@ -30,7 +30,7 @@ public class ArchitectureConfigurationTests
private ArchitectureConfiguration? _configuration;
/// <summary>
/// 测试构造函数是否正确初始化LoggerProperties
/// 测试构造函数是否正确初始化LoggerProperties
/// </summary>
[Test]
public void Constructor_Should_Initialize_LoggerProperties_With_Default_Values()
@ -40,7 +40,7 @@ public class ArchitectureConfigurationTests
}
/// <summary>
/// 测试LoggerProperties默认使用ConsoleLoggerFactoryProvider
/// 测试LoggerProperties默认使用ConsoleLoggerFactoryProvider
/// </summary>
[Test]
public void LoggerProperties_Should_Use_ConsoleLoggerFactoryProvider_By_Default()
@ -50,7 +50,7 @@ public class ArchitectureConfigurationTests
}
/// <summary>
/// 测试LoggerProperties默认使用Info日志级别
/// 测试LoggerProperties默认使用Info日志级别
/// </summary>
[Test]
public void LoggerProperties_Should_Use_Info_LogLevel_By_Default()
@ -63,7 +63,7 @@ public class ArchitectureConfigurationTests
}
/// <summary>
/// 测试ArchitectureProperties的AllowLateRegistration默认为false
/// 测试ArchitectureProperties的AllowLateRegistration默认为false
/// </summary>
[Test]
public void ArchitectureProperties_Should_Have_AllowLateRegistration_Set_To_False_By_Default()
@ -73,7 +73,7 @@ public class ArchitectureConfigurationTests
}
/// <summary>
/// 测试ArchitectureProperties的StrictPhaseValidation默认为true
/// 测试ArchitectureProperties的StrictPhaseValidation默认为true
/// </summary>
[Test]
public void ArchitectureProperties_Should_Have_StrictPhaseValidation_Set_To_True_By_Default()
@ -83,7 +83,7 @@ public class ArchitectureConfigurationTests
}
/// <summary>
/// 测试LoggerProperties可以被自定义配置替换
/// 测试LoggerProperties可以被自定义配置替换
/// </summary>
[Test]
public void LoggerProperties_Should_Be_Replaced_With_Custom_Configuration()
@ -105,7 +105,7 @@ public class ArchitectureConfigurationTests
}
/// <summary>
/// 测试ArchitectureProperties可以被自定义配置替换
/// 测试ArchitectureProperties可以被自定义配置替换
/// </summary>
[Test]
public void ArchitectureProperties_Should_Be_Replaced_With_Custom_Configuration()
@ -126,7 +126,7 @@ public class ArchitectureConfigurationTests
}
/// <summary>
/// 测试LoggerProperties可以独立修改
/// 测试LoggerProperties可以独立修改
/// </summary>
[Test]
public void LoggerProperties_Should_Be_Modifiable_Independently()
@ -142,7 +142,7 @@ public class ArchitectureConfigurationTests
}
/// <summary>
/// 测试ArchitectureProperties可以独立修改
/// 测试ArchitectureProperties可以独立修改
/// </summary>
[Test]
public void ArchitectureProperties_Should_Be_Modifiable_Independently()
@ -157,7 +157,7 @@ public class ArchitectureConfigurationTests
}
/// <summary>
/// 测试ArchitectureConfiguration实现IArchitectureConfiguration接口
/// 测试ArchitectureConfiguration实现IArchitectureConfiguration接口
/// </summary>
[Test]
public void ArchitectureConfiguration_Should_Implement_IArchitectureConfiguration_Interface()
@ -166,7 +166,7 @@ public class ArchitectureConfigurationTests
}
/// <summary>
/// 测试新实例不与其他实例共享LoggerProperties
/// 测试新实例不与其他实例共享LoggerProperties
/// </summary>
[Test]
public void New_Instance_Should_Not_Share_LoggerProperties_With_Other_Instance()
@ -178,7 +178,7 @@ public class ArchitectureConfigurationTests
}
/// <summary>
/// 测试新实例不与其他实例共享ArchitectureProperties
/// 测试新实例不与其他实例共享ArchitectureProperties
/// </summary>
[Test]
public void New_Instance_Should_Not_Share_ArchitectureProperties_With_Other_Instance()

View File

@ -6,19 +6,19 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.architecture;
/// <summary>
/// ArchitectureConstants类的单元测试
/// 测试内容包括:
/// - 常量值的正确性
/// - 常量类型验证
/// - 常量可访问性
/// - 常量命名规范
/// - 架构阶段定义常量
/// ArchitectureConstants类的单元测试
/// 测试内容包括:
/// - 常量值的正确性
/// - 常量类型验证
/// - 常量可访问性
/// - 常量命名规范
/// - 架构阶段定义常量
/// </summary>
[TestFixture]
public class ArchitectureConstantsTests
{
/// <summary>
/// 测试PhaseOrder数组不为空
/// 测试PhaseOrder数组不为空
/// </summary>
[Test]
public void PhaseOrder_Should_Not_Be_Empty()
@ -28,7 +28,7 @@ public class ArchitectureConstantsTests
}
/// <summary>
/// 测试PhaseOrder包含所有预期的架构阶段
/// 测试PhaseOrder包含所有预期的架构阶段
/// </summary>
[Test]
public void PhaseOrder_Should_Contain_All_Expected_Phases()
@ -50,13 +50,11 @@ public class ArchitectureConstantsTests
Assert.That(ArchitectureConstants.PhaseOrder.Length, Is.EqualTo(expectedPhases.Length));
foreach (var expectedPhase in expectedPhases)
{
Assert.That(ArchitectureConstants.PhaseOrder, Does.Contain(expectedPhase));
}
}
/// <summary>
/// 测试PhaseOrder数组是只读的
/// 测试PhaseOrder数组是只读的
/// </summary>
[Test]
public void PhaseOrder_Should_Be_Immutable()
@ -67,7 +65,7 @@ public class ArchitectureConstantsTests
}
/// <summary>
/// 测试PhaseOrder的顺序是正确的
/// 测试PhaseOrder的顺序是正确的
/// </summary>
[Test]
public void PhaseOrder_Should_Be_In_Correct_Sequence()
@ -91,7 +89,7 @@ public class ArchitectureConstantsTests
}
/// <summary>
/// 测试PhaseTransitions字典不为空
/// 测试PhaseTransitions字典不为空
/// </summary>
[Test]
public void PhaseTransitions_Should_Not_Be_Empty()
@ -101,7 +99,7 @@ public class ArchitectureConstantsTests
}
/// <summary>
/// 测试PhaseTransitions是只读的
/// 测试PhaseTransitions是只读的
/// </summary>
[Test]
public void PhaseTransitions_Should_Be_Immutable()
@ -111,7 +109,7 @@ public class ArchitectureConstantsTests
}
/// <summary>
/// 测试PhaseTransitions包含正常线性流程的转换
/// 测试PhaseTransitions包含正常线性流程的转换
/// </summary>
[Test]
public void PhaseTransitions_Should_Contain_Normal_Linear_Transitions()
@ -128,7 +126,7 @@ public class ArchitectureConstantsTests
}
/// <summary>
/// 测试PhaseTransitions中的转换方向是正确的
/// 测试PhaseTransitions中的转换方向是正确的
/// </summary>
[Test]
public void PhaseTransitions_Should_Have_Correct_Directions()
@ -147,7 +145,7 @@ public class ArchitectureConstantsTests
}
/// <summary>
/// 测试PhaseTransitions包含失败初始化的转换路径
/// 测试PhaseTransitions包含失败初始化的转换路径
/// </summary>
[Test]
public void PhaseTransitions_Should_Contain_FailedInitialization_Transition()
@ -158,20 +156,18 @@ public class ArchitectureConstantsTests
}
/// <summary>
/// 测试每个阶段的转换数量不超过1个线性转换
/// 测试每个阶段的转换数量不超过1个线性转换
/// </summary>
[Test]
public void PhaseTransitions_Should_Have_Maximum_One_Transition_Per_Phase()
{
foreach (var transition in ArchitectureConstants.PhaseTransitions)
{
Assert.That(transition.Value, Has.Length.LessThanOrEqualTo(1),
$"Phase {transition.Key} should have at most 1 transition");
}
}
/// <summary>
/// 测试PhaseOrder和PhaseTransitions的一致性
/// 测试PhaseOrder和PhaseTransitions的一致性
/// </summary>
[Test]
public void PhaseOrder_And_PhaseTransitions_Should_Be_Consistent()
@ -179,7 +175,7 @@ public class ArchitectureConstantsTests
var phaseOrder = ArchitectureConstants.PhaseOrder;
var transitions = ArchitectureConstants.PhaseTransitions;
for (int i = 0; i < phaseOrder.Length - 1; i++)
for (var i = 0; i < phaseOrder.Length - 1; i++)
{
var currentPhase = phaseOrder[i];
var nextPhase = phaseOrder[i + 1];

View File

@ -19,26 +19,26 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.architecture;
/// <summary>
/// ArchitectureContext类的单元测试
/// 测试内容包括:
/// - 构造函数参数验证所有5个参数
/// - 构造函数空参数异常
/// - SendQuery方法 - 正常查询发送
/// - SendQuery方法 - 空查询异常
/// - SendCommand方法 - 正常命令发送
/// - SendCommand方法 - 空命令异常
/// - SendCommand_WithResult方法 - 正常命令发送
/// - SendCommand_WithResult方法 - 空命令异常
/// - SendEvent方法 - 正常事件发送
/// - SendEvent_WithInstance方法 - 正常事件发送
/// - SendEvent_WithInstance方法 - 空事件异常
/// - GetSystem方法 - 获取已注册系统
/// - GetSystem方法 - 获取未注册系统
/// - GetModel方法 - 获取已注册模型
/// - GetModel方法 - 获取未注册模型
/// - GetUtility方法 - 获取已注册工具
/// - GetUtility方法 - 获取未注册工具
/// - GetEnvironment方法 - 获取环境对象
/// ArchitectureContext类的单元测试
/// 测试内容包括:
/// - 构造函数参数验证所有5个参数
/// - 构造函数空参数异常
/// - SendQuery方法 - 正常查询发送
/// - SendQuery方法 - 空查询异常
/// - SendCommand方法 - 正常命令发送
/// - SendCommand方法 - 空命令异常
/// - SendCommand_WithResult方法 - 正常命令发送
/// - SendCommand_WithResult方法 - 空命令异常
/// - SendEvent方法 - 正常事件发送
/// - SendEvent_WithInstance方法 - 正常事件发送
/// - SendEvent_WithInstance方法 - 空事件异常
/// - GetSystem方法 - 获取已注册系统
/// - GetSystem方法 - 获取未注册系统
/// - GetModel方法 - 获取已注册模型
/// - GetModel方法 - 获取未注册模型
/// - GetUtility方法 - 获取已注册工具
/// - GetUtility方法 - 获取未注册工具
/// - GetEnvironment方法 - 获取环境对象
/// </summary>
[TestFixture]
public class ArchitectureContextTests
@ -83,7 +83,7 @@ public class ArchitectureContextTests
private DefaultEnvironment? _environment;
/// <summary>
/// 测试构造函数在所有参数都有效时不应抛出异常
/// 测试构造函数在所有参数都有效时不应抛出异常
/// </summary>
[Test]
public void Constructor_Should_NotThrow_When_AllParameters_AreValid()
@ -92,7 +92,7 @@ public class ArchitectureContextTests
}
/// <summary>
/// 测试构造函数在 container 为 null 时应抛出 ArgumentNullException
/// 测试构造函数在 container 为 null 时应抛出 ArgumentNullException
/// </summary>
[Test]
public void Constructor_Should_Throw_When_Container_IsNull()
@ -101,7 +101,7 @@ public class ArchitectureContextTests
}
/// <summary>
/// 测试构造函数在Container为null时应抛出ArgumentNullException
/// 测试构造函数在Container为null时应抛出ArgumentNullException
/// </summary>
[Test]
public void Constructor_Should_ThrowArgumentNullException_When_Container_IsNull()
@ -111,7 +111,7 @@ public class ArchitectureContextTests
}
/// <summary>
/// 测试SendQuery方法在查询有效时返回正确结果
/// 测试SendQuery方法在查询有效时返回正确结果
/// </summary>
[Test]
public void SendQuery_Should_ReturnResult_When_Query_IsValid()
@ -123,7 +123,7 @@ public class ArchitectureContextTests
}
/// <summary>
/// 测试SendQuery方法在查询为null时应抛出ArgumentNullException
/// 测试SendQuery方法在查询为null时应抛出ArgumentNullException
/// </summary>
[Test]
public void SendQuery_Should_ThrowArgumentNullException_When_Query_IsNull()
@ -133,7 +133,7 @@ public class ArchitectureContextTests
}
/// <summary>
/// 测试SendCommand方法在命令有效时正确执行
/// 测试SendCommand方法在命令有效时正确执行
/// </summary>
[Test]
public void SendCommand_Should_ExecuteCommand_When_Command_IsValid()
@ -144,17 +144,17 @@ public class ArchitectureContextTests
}
/// <summary>
/// 测试SendCommand方法在命令为null时应抛出ArgumentNullException
/// 测试SendCommand方法在命令为null时应抛出ArgumentNullException
/// </summary>
[Test]
public void SendCommand_Should_ThrowArgumentNullException_When_Command_IsNull()
{
Assert.That(() => _context!.SendCommand((ICommand)null!),
Assert.That(() => _context!.SendCommand(null!),
Throws.ArgumentNullException.With.Property("ParamName").EqualTo("command"));
}
/// <summary>
/// 测试SendCommand方法带返回值在命令有效时返回正确结果
/// 测试SendCommand方法带返回值在命令有效时返回正确结果
/// </summary>
[Test]
public void SendCommand_WithResult_Should_ReturnResult_When_Command_IsValid()
@ -166,7 +166,7 @@ public class ArchitectureContextTests
}
/// <summary>
/// 测试SendCommand方法带返回值在命令为null时应抛出ArgumentNullException
/// 测试SendCommand方法带返回值在命令为null时应抛出ArgumentNullException
/// </summary>
[Test]
public void SendCommand_WithResult_Should_ThrowArgumentNullException_When_Command_IsNull()
@ -176,12 +176,12 @@ public class ArchitectureContextTests
}
/// <summary>
/// 测试SendEvent方法在事件类型有效时正确发送事件
/// 测试SendEvent方法在事件类型有效时正确发送事件
/// </summary>
[Test]
public void SendEvent_Should_SendEvent_When_EventType_IsValid()
{
bool eventReceived = false;
var eventReceived = false;
_context!.RegisterEvent<TestEventV2>(_ => eventReceived = true);
_context.SendEvent<TestEventV2>();
@ -189,12 +189,12 @@ public class ArchitectureContextTests
}
/// <summary>
/// 测试SendEvent方法带实例在事件实例有效时正确发送事件
/// 测试SendEvent方法带实例在事件实例有效时正确发送事件
/// </summary>
[Test]
public void SendEvent_WithInstance_Should_SendEvent_When_EventInstance_IsValid()
{
bool eventReceived = false;
var eventReceived = false;
var testEvent = new TestEventV2();
_context!.RegisterEvent<TestEventV2>(_ => eventReceived = true);
_context.SendEvent(testEvent);
@ -203,7 +203,7 @@ public class ArchitectureContextTests
}
/// <summary>
/// 测试SendEvent方法带实例在事件实例为null时应抛出ArgumentNullException
/// 测试SendEvent方法带实例在事件实例为null时应抛出ArgumentNullException
/// </summary>
[Test]
public void SendEvent_WithInstance_Should_ThrowArgumentNullException_When_EventInstance_IsNull()
@ -213,7 +213,7 @@ public class ArchitectureContextTests
}
/// <summary>
/// 测试GetSystem方法在系统已注册时返回注册的系统
/// 测试GetSystem方法在系统已注册时返回注册的系统
/// </summary>
[Test]
public void GetSystem_Should_ReturnRegisteredSystem_When_SystemIsRegistered()
@ -228,7 +228,7 @@ public class ArchitectureContextTests
}
/// <summary>
/// 测试GetSystem方法在系统未注册时返回null
/// 测试GetSystem方法在系统未注册时返回null
/// </summary>
[Test]
public void GetSystem_Should_ReturnNull_When_SystemIsNotRegistered()
@ -239,7 +239,7 @@ public class ArchitectureContextTests
}
/// <summary>
/// 测试GetModel方法在模型已注册时返回注册的模型
/// 测试GetModel方法在模型已注册时返回注册的模型
/// </summary>
[Test]
public void GetModel_Should_ReturnRegisteredModel_When_ModelIsRegistered()
@ -254,7 +254,7 @@ public class ArchitectureContextTests
}
/// <summary>
/// 测试GetModel方法在模型未注册时返回null
/// 测试GetModel方法在模型未注册时返回null
/// </summary>
[Test]
public void GetModel_Should_ReturnNull_When_ModelIsNotRegistered()
@ -265,7 +265,7 @@ public class ArchitectureContextTests
}
/// <summary>
/// 测试GetUtility方法在工具已注册时返回注册的工具
/// 测试GetUtility方法在工具已注册时返回注册的工具
/// </summary>
[Test]
public void GetUtility_Should_ReturnRegisteredUtility_When_UtilityIsRegistered()
@ -280,7 +280,7 @@ public class ArchitectureContextTests
}
/// <summary>
/// 测试GetUtility方法在工具未注册时返回null
/// 测试GetUtility方法在工具未注册时返回null
/// </summary>
[Test]
public void GetUtility_Should_ReturnNull_When_UtilityIsNotRegistered()
@ -291,7 +291,7 @@ public class ArchitectureContextTests
}
/// <summary>
/// 测试GetEnvironment方法返回环境实例
/// 测试GetEnvironment方法返回环境实例
/// </summary>
[Test]
public void GetEnvironment_Should_Return_EnvironmentInstance()
@ -310,8 +310,15 @@ public class TestSystemV2 : ISystem
private IArchitectureContext _context = null!;
public int Id { get; init; }
public void SetContext(IArchitectureContext context) => _context = context;
public IArchitectureContext GetContext() => _context;
public void SetContext(IArchitectureContext context)
{
_context = context;
}
public IArchitectureContext GetContext()
{
return _context;
}
public void Init()
{
@ -331,8 +338,15 @@ public class TestModelV2 : IModel
private IArchitectureContext _context = null!;
public int Id { get; init; }
public void SetContext(IArchitectureContext context) => _context = context;
public IArchitectureContext GetContext() => _context;
public void SetContext(IArchitectureContext context)
{
_context = context;
}
public IArchitectureContext GetContext()
{
return _context;
}
public void Init()
{
@ -352,8 +366,15 @@ public class TestUtilityV2 : IUtility
private IArchitectureContext _context = null!;
public int Id { get; init; }
public void SetContext(IArchitectureContext context) => _context = context;
public IArchitectureContext GetContext() => _context;
public void SetContext(IArchitectureContext context)
{
_context = context;
}
public IArchitectureContext GetContext()
{
return _context;
}
}
public class TestQueryV2 : IQuery<int>
@ -361,9 +382,20 @@ public class TestQueryV2 : IQuery<int>
private IArchitectureContext _context = null!;
public int Result { get; init; }
public int Do() => Result;
public void SetContext(IArchitectureContext context) => _context = context;
public IArchitectureContext GetContext() => _context;
public int Do()
{
return Result;
}
public void SetContext(IArchitectureContext context)
{
_context = context;
}
public IArchitectureContext GetContext()
{
return _context;
}
}
public class TestCommandV2 : ICommand
@ -371,9 +403,20 @@ public class TestCommandV2 : ICommand
private IArchitectureContext _context = null!;
public bool Executed { get; private set; }
public void Execute() => Executed = true;
public void SetContext(IArchitectureContext context) => _context = context;
public IArchitectureContext GetContext() => _context;
public void Execute()
{
Executed = true;
}
public void SetContext(IArchitectureContext context)
{
_context = context;
}
public IArchitectureContext GetContext()
{
return _context;
}
}
public class TestCommandWithResultV2 : ICommand<int>
@ -381,9 +424,20 @@ public class TestCommandWithResultV2 : ICommand<int>
private IArchitectureContext _context = null!;
public int Result { get; init; }
public int Execute() => Result;
public void SetContext(IArchitectureContext context) => _context = context;
public IArchitectureContext GetContext() => _context;
public int Execute()
{
return Result;
}
public void SetContext(IArchitectureContext context)
{
_context = context;
}
public IArchitectureContext GetContext()
{
return _context;
}
}
public class TestEventV2

View File

@ -18,17 +18,17 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.architecture;
/// <summary>
/// ArchitectureServices类的单元测试
/// 测试内容包括:
/// - 服务容器初始化
/// - 所有服务实例创建Container, EventBus, CommandBus, QueryBus
/// - SetContext方法 - 设置上下文
/// - SetContext方法 - 重复设置上下文
/// - GetContext方法 - 获取已设置上下文
/// - GetContext方法 - 未设置上下文时返回null
/// - 上下文传播到容器
/// - IArchitectureServices接口实现验证
/// - 服务独立性验证(多个实例)
/// ArchitectureServices类的单元测试
/// 测试内容包括:
/// - 服务容器初始化
/// - 所有服务实例创建Container, EventBus, CommandBus, QueryBus
/// - SetContext方法 - 设置上下文
/// - SetContext方法 - 重复设置上下文
/// - GetContext方法 - 获取已设置上下文
/// - GetContext方法 - 未设置上下文时返回null
/// - 上下文传播到容器
/// - IArchitectureServices接口实现验证
/// - 服务独立性验证(多个实例)
/// </summary>
[TestFixture]
public class ArchitectureServicesTests
@ -44,7 +44,7 @@ public class ArchitectureServicesTests
private TestArchitectureContextV3? _context;
/// <summary>
/// 测试构造函数初始化所有服务
/// 测试构造函数初始化所有服务
/// </summary>
[Test]
public void Constructor_Should_Initialize_AllServices()
@ -63,7 +63,7 @@ public class ArchitectureServicesTests
}
/// <summary>
/// 测试EventBus是EventBus的实例
/// 测试EventBus是EventBus的实例
/// </summary>
[Test]
public void EventBus_Should_Be_Instance_Of_EventBus()
@ -73,7 +73,7 @@ public class ArchitectureServicesTests
}
/// <summary>
/// 测试CommandBus是CommandBus的实例
/// 测试CommandBus是CommandBus的实例
/// </summary>
[Test]
public void CommandBus_Should_Be_Instance_Of_CommandBus()
@ -83,7 +83,7 @@ public class ArchitectureServicesTests
}
/// <summary>
/// 测试QueryBus是QueryBus的实例
/// 测试QueryBus是QueryBus的实例
/// </summary>
[Test]
public void QueryBus_Should_Be_Instance_Of_QueryBus()
@ -93,7 +93,7 @@ public class ArchitectureServicesTests
}
/// <summary>
/// 测试SetContext设置内部Context字段
/// 测试SetContext设置内部Context字段
/// </summary>
[Test]
public void SetContext_Should_Set_Context_Internal_Field()
@ -105,7 +105,7 @@ public class ArchitectureServicesTests
}
/// <summary>
/// 测试SetContext将上下文传播到Container
/// 测试SetContext将上下文传播到Container
/// </summary>
[Test]
public void SetContext_Should_Propagate_Context_To_Container()
@ -117,7 +117,7 @@ public class ArchitectureServicesTests
}
/// <summary>
/// 测试GetContext在SetContext后返回上下文
/// 测试GetContext在SetContext后返回上下文
/// </summary>
[Test]
public void GetContext_Should_Return_Context_After_SetContext()
@ -130,7 +130,7 @@ public class ArchitectureServicesTests
}
/// <summary>
/// 测试GetContext在未设置上下文时返回null
/// 测试GetContext在未设置上下文时返回null
/// </summary>
[Test]
public void GetContext_Should_ReturnNull_When_Context_Not_Set()
@ -141,7 +141,7 @@ public class ArchitectureServicesTests
}
/// <summary>
/// 测试SetContext替换已存在的上下文
/// 测试SetContext替换已存在的上下文
/// </summary>
[Test]
public void SetContext_Should_Replace_Existing_Context()
@ -157,7 +157,7 @@ public class ArchitectureServicesTests
}
/// <summary>
/// 测试ArchitectureServices实现IArchitectureServices接口
/// 测试ArchitectureServices实现IArchitectureServices接口
/// </summary>
[Test]
public void ArchitectureServices_Should_Implement_IArchitectureServices_Interface()
@ -166,7 +166,7 @@ public class ArchitectureServicesTests
}
/// <summary>
/// 测试多个实例有独立的Container
/// 测试多个实例有独立的Container
/// </summary>
[Test]
public void Multiple_Instances_Should_Have_Independent_Container()
@ -178,7 +178,7 @@ public class ArchitectureServicesTests
}
/// <summary>
/// 测试多个实例有独立的EventBus
/// 测试多个实例有独立的EventBus
/// </summary>
[Test]
public void Multiple_Instances_Should_Have_Independent_EventBus()
@ -190,7 +190,7 @@ public class ArchitectureServicesTests
}
/// <summary>
/// 测试多个实例有独立的CommandBus
/// 测试多个实例有独立的CommandBus
/// </summary>
[Test]
public void Multiple_Instances_Should_Have_Independent_CommandBus()
@ -202,7 +202,7 @@ public class ArchitectureServicesTests
}
/// <summary>
/// 测试多个实例有独立的QueryBus
/// 测试多个实例有独立的QueryBus
/// </summary>
[Test]
public void Multiple_Instances_Should_Have_Independent_QueryBus()
@ -227,10 +227,25 @@ public class TestArchitectureContextV3 : IArchitectureContext
public ICommandBus CommandBus => new CommandBus();
public IQueryBus QueryBus => new QueryBus();
public TService? GetService<TService>() where TService : class => _container.Get<TService>();
public TModel? GetModel<TModel>() where TModel : class, IModel => _container.Get<TModel>();
public TSystem? GetSystem<TSystem>() where TSystem : class, ISystem => _container.Get<TSystem>();
public TUtility? GetUtility<TUtility>() where TUtility : class, IUtility => _container.Get<TUtility>();
public TService? GetService<TService>() where TService : class
{
return _container.Get<TService>();
}
public TModel? GetModel<TModel>() where TModel : class, IModel
{
return _container.Get<TModel>();
}
public TSystem? GetSystem<TSystem>() where TSystem : class, ISystem
{
return _container.Get<TSystem>();
}
public TUtility? GetUtility<TUtility>() where TUtility : class, IUtility
{
return _container.Get<TUtility>();
}
public void SendEvent<TEvent>() where TEvent : new()
{
@ -240,7 +255,10 @@ public class TestArchitectureContextV3 : IArchitectureContext
{
}
public IUnRegister RegisterEvent<TEvent>(Action<TEvent> handler) => new DefaultUnRegister(() => { });
public IUnRegister RegisterEvent<TEvent>(Action<TEvent> handler)
{
return new DefaultUnRegister(() => { });
}
public void UnRegisterEvent<TEvent>(Action<TEvent> onEvent)
{
@ -250,7 +268,10 @@ public class TestArchitectureContextV3 : IArchitectureContext
{
}
public TResult SendCommand<TResult>(ICommand<TResult> command) => default!;
public TResult SendCommand<TResult>(ICommand<TResult> command)
{
return default!;
}
public Task SendCommandAsync(IAsyncCommand command)
{
@ -262,11 +283,20 @@ public class TestArchitectureContextV3 : IArchitectureContext
return (Task<TResult>)Task.CompletedTask;
}
public TResult SendQuery<TResult>(IQuery<TResult> query) => default!;
public TResult SendQuery<TResult>(IQuery<TResult> query)
{
return default!;
}
public Task<TResult> SendQueryAsync<TResult>(IAsyncQuery<TResult> query) => (Task<TResult>)Task.CompletedTask;
public Task<TResult> SendQueryAsync<TResult>(IAsyncQuery<TResult> query)
{
return (Task<TResult>)Task.CompletedTask;
}
public IEnvironment GetEnvironment() => _environment;
public IEnvironment GetEnvironment()
{
return _environment;
}
}
#endregion

View File

@ -18,26 +18,26 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.architecture;
/// <summary>
/// GameContext类的单元测试
/// 测试内容包括:
/// - ArchitectureReadOnlyDictionary在启动时为空
/// - Bind方法添加上下文到字典
/// - Bind重复类型时抛出异常
/// - GetByType返回正确的上下文
/// - GetByType未找到时抛出异常
/// - Get泛型方法返回正确的上下文
/// - TryGet方法在找到时返回true
/// - TryGet方法在未找到时返回false
/// - GetFirstArchitectureContext在存在时返回
/// - GetFirstArchitectureContext为空时抛出异常
/// - Unbind移除上下文
/// - Clear移除所有上下文
/// GameContext类的单元测试
/// 测试内容包括:
/// - ArchitectureReadOnlyDictionary在启动时为空
/// - Bind方法添加上下文到字典
/// - Bind重复类型时抛出异常
/// - GetByType返回正确的上下文
/// - GetByType未找到时抛出异常
/// - Get泛型方法返回正确的上下文
/// - TryGet方法在找到时返回true
/// - TryGet方法在未找到时返回false
/// - GetFirstArchitectureContext在存在时返回
/// - GetFirstArchitectureContext为空时抛出异常
/// - Unbind移除上下文
/// - Clear移除所有上下文
/// </summary>
[TestFixture]
public class GameContextTests
{
/// <summary>
/// 测试初始化方法在每个测试方法执行前清空GameContext
/// 测试初始化方法在每个测试方法执行前清空GameContext
/// </summary>
[SetUp]
public void SetUp()
@ -46,7 +46,7 @@ public class GameContextTests
}
/// <summary>
/// 测试清理方法在每个测试方法执行后清空GameContext
/// 测试清理方法在每个测试方法执行后清空GameContext
/// </summary>
[TearDown]
public void TearDown()
@ -55,7 +55,7 @@ public class GameContextTests
}
/// <summary>
/// 测试ArchitectureReadOnlyDictionary在启动时返回空字典
/// 测试ArchitectureReadOnlyDictionary在启动时返回空字典
/// </summary>
[Test]
public void ArchitectureReadOnlyDictionary_Should_Return_Empty_At_Start()
@ -66,7 +66,7 @@ public class GameContextTests
}
/// <summary>
/// 测试Bind方法是否正确将上下文添加到字典中
/// 测试Bind方法是否正确将上下文添加到字典中
/// </summary>
[Test]
public void Bind_Should_Add_Context_To_Dictionary()
@ -79,7 +79,7 @@ public class GameContextTests
}
/// <summary>
/// 测试Bind方法在绑定重复类型时是否抛出InvalidOperationException异常
/// 测试Bind方法在绑定重复类型时是否抛出InvalidOperationException异常
/// </summary>
[Test]
public void Bind_WithDuplicateType_Should_ThrowInvalidOperationException()
@ -94,7 +94,7 @@ public class GameContextTests
}
/// <summary>
/// 测试GetByType方法是否返回正确的上下文
/// 测试GetByType方法是否返回正确的上下文
/// </summary>
[Test]
public void GetByType_Should_Return_Correct_Context()
@ -108,7 +108,7 @@ public class GameContextTests
}
/// <summary>
/// 测试GetByType方法在未找到对应类型时是否抛出InvalidOperationException异常
/// 测试GetByType方法在未找到对应类型时是否抛出InvalidOperationException异常
/// </summary>
[Test]
public void GetByType_Should_Throw_When_Not_Found()
@ -118,7 +118,7 @@ public class GameContextTests
}
/// <summary>
/// 测试Get泛型方法是否返回正确的上下文
/// 测试Get泛型方法是否返回正确的上下文
/// </summary>
[Test]
public void GetGeneric_Should_Return_Correct_Context()
@ -132,7 +132,7 @@ public class GameContextTests
}
/// <summary>
/// 测试TryGet方法在找到上下文时是否返回true并正确设置输出参数
/// 测试TryGet方法在找到上下文时是否返回true并正确设置输出参数
/// </summary>
[Test]
public void TryGet_Should_ReturnTrue_When_Found()
@ -147,7 +147,7 @@ public class GameContextTests
}
/// <summary>
/// 测试TryGet方法在未找到上下文时是否返回false且输出参数为null
/// 测试TryGet方法在未找到上下文时是否返回false且输出参数为null
/// </summary>
[Test]
public void TryGet_Should_ReturnFalse_When_Not_Found()
@ -159,7 +159,7 @@ public class GameContextTests
}
/// <summary>
/// 测试GetFirstArchitectureContext方法在存在上下文时是否返回正确的上下文
/// 测试GetFirstArchitectureContext方法在存在上下文时是否返回正确的上下文
/// </summary>
[Test]
public void GetFirstArchitectureContext_Should_Return_When_Exists()
@ -173,7 +173,7 @@ public class GameContextTests
}
/// <summary>
/// 测试GetFirstArchitectureContext方法在没有上下文时是否抛出InvalidOperationException异常
/// 测试GetFirstArchitectureContext方法在没有上下文时是否抛出InvalidOperationException异常
/// </summary>
[Test]
public void GetFirstArchitectureContext_Should_Throw_When_Empty()
@ -183,7 +183,7 @@ public class GameContextTests
}
/// <summary>
/// 测试Unbind方法是否正确移除指定类型的上下文
/// 测试Unbind方法是否正确移除指定类型的上下文
/// </summary>
[Test]
public void Unbind_Should_Remove_Context()
@ -197,7 +197,7 @@ public class GameContextTests
}
/// <summary>
/// 测试Clear方法是否正确移除所有上下文
/// 测试Clear方法是否正确移除所有上下文
/// </summary>
[Test]
public void Clear_Should_Remove_All_Contexts()
@ -212,12 +212,12 @@ public class GameContextTests
}
/// <summary>
/// 测试用的架构类继承自Architecture
/// 测试用的架构类继承自Architecture
/// </summary>
public class TestArchitecture : Architecture
{
/// <summary>
/// 初始化方法,当前为空实现
/// 初始化方法,当前为空实现
/// </summary>
protected override void Init()
{
@ -225,67 +225,79 @@ public class TestArchitecture : Architecture
}
/// <summary>
/// 测试用的架构上下文类实现了IArchitectureContext接口
/// 测试用的架构上下文类实现了IArchitectureContext接口
/// </summary>
public class TestArchitectureContext : IArchitectureContext
{
private readonly IocContainer _container = new();
/// <summary>
/// 获取依赖注入容器
/// 获取依赖注入容器
/// </summary>
public IIocContainer Container => _container;
/// <summary>
/// 获取事件总线
/// 获取事件总线
/// </summary>
public IEventBus EventBus => new EventBus();
/// <summary>
/// 获取命令总线
/// 获取命令总线
/// </summary>
public ICommandBus CommandBus => new CommandBus();
/// <summary>
/// 获取查询总线
/// 获取查询总线
/// </summary>
public IQueryBus QueryBus => new QueryBus();
/// <summary>
/// 获取环境对象
/// 获取环境对象
/// </summary>
public IEnvironment Environment => new DefaultEnvironment();
/// <summary>
/// 获取指定类型的服务
/// 获取指定类型的服务
/// </summary>
/// <typeparam name="TService">服务类型</typeparam>
/// <returns>服务实例或null</returns>
public TService? GetService<TService>() where TService : class => _container.Get<TService>();
public TService? GetService<TService>() where TService : class
{
return _container.Get<TService>();
}
/// <summary>
/// 获取指定类型的模型
/// 获取指定类型的模型
/// </summary>
/// <typeparam name="TModel">模型类型</typeparam>
/// <returns>模型实例或null</returns>
public TModel? GetModel<TModel>() where TModel : class, IModel => _container.Get<TModel>();
public TModel? GetModel<TModel>() where TModel : class, IModel
{
return _container.Get<TModel>();
}
/// <summary>
/// 获取指定类型的系统
/// 获取指定类型的系统
/// </summary>
/// <typeparam name="TSystem">系统类型</typeparam>
/// <returns>系统实例或null</returns>
public TSystem? GetSystem<TSystem>() where TSystem : class, ISystem => _container.Get<TSystem>();
public TSystem? GetSystem<TSystem>() where TSystem : class, ISystem
{
return _container.Get<TSystem>();
}
/// <summary>
/// 获取指定类型的工具
/// 获取指定类型的工具
/// </summary>
/// <typeparam name="TUtility">工具类型</typeparam>
/// <returns>工具实例或null</returns>
public TUtility? GetUtility<TUtility>() where TUtility : class, IUtility => _container.Get<TUtility>();
public TUtility? GetUtility<TUtility>() where TUtility : class, IUtility
{
return _container.Get<TUtility>();
}
/// <summary>
/// 发送事件
/// 发送事件
/// </summary>
/// <typeparam name="TEvent">事件类型</typeparam>
public void SendEvent<TEvent>() where TEvent : new()
@ -293,7 +305,7 @@ public class TestArchitectureContext : IArchitectureContext
}
/// <summary>
/// 发送事件
/// 发送事件
/// </summary>
/// <typeparam name="TEvent">事件类型</typeparam>
/// <param name="e">事件实例</param>
@ -302,15 +314,18 @@ public class TestArchitectureContext : IArchitectureContext
}
/// <summary>
/// 注册事件处理器
/// 注册事件处理器
/// </summary>
/// <typeparam name="TEvent">事件类型</typeparam>
/// <param name="handler">事件处理委托</param>
/// <returns>取消注册接口</returns>
public IUnRegister RegisterEvent<TEvent>(Action<TEvent> handler) => new DefaultUnRegister(() => { });
public IUnRegister RegisterEvent<TEvent>(Action<TEvent> handler)
{
return new DefaultUnRegister(() => { });
}
/// <summary>
/// 取消注册事件处理器
/// 取消注册事件处理器
/// </summary>
/// <typeparam name="TEvent">事件类型</typeparam>
/// <param name="onEvent">事件处理委托</param>
@ -319,7 +334,7 @@ public class TestArchitectureContext : IArchitectureContext
}
/// <summary>
/// 发送命令
/// 发送命令
/// </summary>
/// <param name="command">命令对象</param>
public void SendCommand(ICommand command)
@ -327,12 +342,15 @@ public class TestArchitectureContext : IArchitectureContext
}
/// <summary>
/// 发送带返回值的命令
/// 发送带返回值的命令
/// </summary>
/// <typeparam name="TResult">返回值类型</typeparam>
/// <param name="command">命令对象</param>
/// <returns>命令执行结果</returns>
public TResult SendCommand<TResult>(ICommand<TResult> command) => default!;
public TResult SendCommand<TResult>(ICommand<TResult> command)
{
return default!;
}
public Task SendCommandAsync(IAsyncCommand command)
{
@ -345,24 +363,33 @@ public class TestArchitectureContext : IArchitectureContext
}
/// <summary>
/// 发送查询请求
/// 发送查询请求
/// </summary>
/// <typeparam name="TResult">查询结果类型</typeparam>
/// <param name="query">查询对象</param>
/// <returns>查询结果</returns>
public TResult SendQuery<TResult>(IQuery<TResult> query) => default!;
public TResult SendQuery<TResult>(IQuery<TResult> query)
{
return default!;
}
/// <summary>
/// 异步发送查询请求
/// 异步发送查询请求
/// </summary>
/// <typeparam name="TResult">查询结果类型</typeparam>
/// <param name="query">异步查询对象</param>
/// <returns>查询结果</returns>
public Task<TResult> SendQueryAsync<TResult>(IAsyncQuery<TResult> query) => (Task<TResult>)Task.CompletedTask;
public Task<TResult> SendQueryAsync<TResult>(IAsyncQuery<TResult> query)
{
return (Task<TResult>)Task.CompletedTask;
}
/// <summary>
/// 获取环境对象
/// 获取环境对象
/// </summary>
/// <returns>环境对象</returns>
public IEnvironment GetEnvironment() => Environment;
public IEnvironment GetEnvironment()
{
return Environment;
}
}

View File

@ -11,20 +11,20 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.command;
/// <summary>
/// AbstractAsyncCommand类的单元测试
/// 测试内容包括:
/// - 异步命令无返回值版本的基础实现
/// - 异步命令有返回值版本的基础实现
/// - ExecuteAsync方法调用
/// - ExecuteAsync方法的异常处理
/// - 上下文感知功能SetContext, GetContext
/// - 日志功能Logger属性
/// - 子类继承行为验证(两个版本)
/// - 命令执行前日志记录
/// - 命令执行后日志记录
/// - 错误情况下的日志记录
/// - 无返回值版本的行为
/// - 有返回值版本的行为
/// AbstractAsyncCommand类的单元测试
/// 测试内容包括:
/// - 异步命令无返回值版本的基础实现
/// - 异步命令有返回值版本的基础实现
/// - ExecuteAsync方法调用
/// - ExecuteAsync方法的异常处理
/// - 上下文感知功能SetContext, GetContext
/// - 日志功能Logger属性
/// - 子类继承行为验证(两个版本)
/// - 命令执行前日志记录
/// - 命令执行后日志记录
/// - 错误情况下的日志记录
/// - 无返回值版本的行为
/// - 有返回值版本的行为
/// </summary>
[TestFixture]
public class AbstractAsyncCommandTests
@ -45,7 +45,7 @@ public class AbstractAsyncCommandTests
private IocContainer _container = null!;
/// <summary>
/// 测试异步命令无返回值版本的基础实现
/// 测试异步命令无返回值版本的基础实现
/// </summary>
[Test]
public async Task AbstractAsyncCommand_Should_Implement_IAsyncCommand_Interface()
@ -57,7 +57,7 @@ public class AbstractAsyncCommandTests
}
/// <summary>
/// 测试异步命令有返回值版本的基础实现
/// 测试异步命令有返回值版本的基础实现
/// </summary>
[Test]
public async Task AbstractAsyncCommand_WithResult_Should_Implement_IAsyncCommand_Interface()
@ -69,7 +69,7 @@ public class AbstractAsyncCommandTests
}
/// <summary>
/// 测试ExecuteAsync方法调用
/// 测试ExecuteAsync方法调用
/// </summary>
[Test]
public async Task ExecuteAsync_Should_Invoke_OnExecuteAsync_Method()
@ -85,7 +85,7 @@ public class AbstractAsyncCommandTests
}
/// <summary>
/// 测试ExecuteAsync方法带返回值调用
/// 测试ExecuteAsync方法带返回值调用
/// </summary>
[Test]
public async Task ExecuteAsync_WithResult_Should_Invoke_OnExecuteAsync_Method_And_Return_Result()
@ -101,7 +101,7 @@ public class AbstractAsyncCommandTests
}
/// <summary>
/// 测试ExecuteAsync方法的异常处理
/// 测试ExecuteAsync方法的异常处理
/// </summary>
[Test]
public void ExecuteAsync_Should_Propagate_Exception_From_OnExecuteAsync()
@ -114,7 +114,7 @@ public class AbstractAsyncCommandTests
}
/// <summary>
/// 测试上下文感知功能 - SetContext方法
/// 测试上下文感知功能 - SetContext方法
/// </summary>
[Test]
public void SetContext_Should_Set_Context_Property()
@ -130,7 +130,7 @@ public class AbstractAsyncCommandTests
}
/// <summary>
/// 测试上下文感知功能 - GetContext方法
/// 测试上下文感知功能 - GetContext方法
/// </summary>
[Test]
public void GetContext_Should_Return_Context_Property()
@ -147,7 +147,7 @@ public class AbstractAsyncCommandTests
}
/// <summary>
/// 测试子类继承行为验证 - 无返回值版本
/// 测试子类继承行为验证 - 无返回值版本
/// </summary>
[Test]
public async Task Child_Class_Should_Inherit_And_Override_OnExecuteAsync_Method()
@ -163,7 +163,7 @@ public class AbstractAsyncCommandTests
}
/// <summary>
/// 测试子类继承行为验证 - 有返回值版本
/// 测试子类继承行为验证 - 有返回值版本
/// </summary>
[Test]
public async Task Child_Class_WithResult_Should_Inherit_And_Override_OnExecuteAsync_Method()
@ -179,7 +179,7 @@ public class AbstractAsyncCommandTests
}
/// <summary>
/// 测试异步命令执行生命周期完整性
/// 测试异步命令执行生命周期完整性
/// </summary>
[Test]
public async Task AsyncCommand_Should_Complete_Execution_Lifecycle()
@ -197,7 +197,7 @@ public class AbstractAsyncCommandTests
}
/// <summary>
/// 测试异步命令多次执行
/// 测试异步命令多次执行
/// </summary>
[Test]
public async Task AsyncCommand_Should_Be_Executable_Multiple_Times()
@ -214,7 +214,7 @@ public class AbstractAsyncCommandTests
}
/// <summary>
/// 测试异步命令(带返回值)的返回值类型
/// 测试异步命令(带返回值)的返回值类型
/// </summary>
[Test]
public async Task AsyncCommand_WithResult_Should_Return_Correct_Type()
@ -231,23 +231,23 @@ public class AbstractAsyncCommandTests
}
/// <summary>
/// 测试用命令输入类V2
/// 测试用命令输入类V2
/// </summary>
public sealed class TestCommandInputV2 : ICommandInput
{
/// <summary>
/// 获取或设置值
/// 获取或设置值
/// </summary>
public int Value { get; init; }
}
/// <summary>
/// 测试用异步命令类V3无返回值
/// 测试用异步命令类V3无返回值
/// </summary>
public sealed class TestAsyncCommandV3 : AbstractAsyncCommand<TestCommandInputV2>
{
/// <summary>
/// 构造函数
/// 构造函数
/// </summary>
/// <param name="input">命令输入</param>
public TestAsyncCommandV3(TestCommandInputV2 input) : base(input)
@ -255,17 +255,17 @@ public sealed class TestAsyncCommandV3 : AbstractAsyncCommand<TestCommandInputV2
}
/// <summary>
/// 获取命令是否已执行
/// 获取命令是否已执行
/// </summary>
public bool Executed { get; private set; }
/// <summary>
/// 获取执行的值
/// 获取执行的值
/// </summary>
public int ExecutedValue { get; private set; }
/// <summary>
/// 执行异步命令的重写方法
/// 执行异步命令的重写方法
/// </summary>
/// <param name="input">命令输入</param>
/// <returns>表示异步操作的任务</returns>
@ -278,12 +278,12 @@ public sealed class TestAsyncCommandV3 : AbstractAsyncCommand<TestCommandInputV2
}
/// <summary>
/// 测试用异步命令类V3有返回值
/// 测试用异步命令类V3有返回值
/// </summary>
public sealed class TestAsyncCommandWithResultV3 : AbstractAsyncCommand<TestCommandInputV2, int>
{
/// <summary>
/// 构造函数
/// 构造函数
/// </summary>
/// <param name="input">命令输入</param>
public TestAsyncCommandWithResultV3(TestCommandInputV2 input) : base(input)
@ -291,12 +291,12 @@ public sealed class TestAsyncCommandWithResultV3 : AbstractAsyncCommand<TestComm
}
/// <summary>
/// 获取命令是否已执行
/// 获取命令是否已执行
/// </summary>
public bool Executed { get; private set; }
/// <summary>
/// 执行异步命令并返回结果的重写方法
/// 执行异步命令并返回结果的重写方法
/// </summary>
/// <param name="input">命令输入</param>
/// <returns>执行结果的异步任务</returns>
@ -308,12 +308,12 @@ public sealed class TestAsyncCommandWithResultV3 : AbstractAsyncCommand<TestComm
}
/// <summary>
/// 测试用异步命令类(抛出异常)
/// 测试用异步命令类(抛出异常)
/// </summary>
public sealed class TestAsyncCommandWithExceptionV3 : AbstractAsyncCommand<TestCommandInputV2>
{
/// <summary>
/// 构造函数
/// 构造函数
/// </summary>
/// <param name="input">命令输入</param>
public TestAsyncCommandWithExceptionV3(TestCommandInputV2 input) : base(input)
@ -321,7 +321,7 @@ public sealed class TestAsyncCommandWithExceptionV3 : AbstractAsyncCommand<TestC
}
/// <summary>
/// 执行异步命令并抛出异常的重写方法
/// 执行异步命令并抛出异常的重写方法
/// </summary>
/// <param name="input">命令输入</param>
/// <returns>表示异步操作的任务</returns>
@ -333,12 +333,12 @@ public sealed class TestAsyncCommandWithExceptionV3 : AbstractAsyncCommand<TestC
}
/// <summary>
/// 测试用异步命令子类(无返回值)
/// 测试用异步命令子类(无返回值)
/// </summary>
public sealed class TestAsyncCommandChildV3 : AbstractAsyncCommand<TestCommandInputV2>
{
/// <summary>
/// 构造函数
/// 构造函数
/// </summary>
/// <param name="input">命令输入</param>
public TestAsyncCommandChildV3(TestCommandInputV2 input) : base(input)
@ -346,17 +346,17 @@ public sealed class TestAsyncCommandChildV3 : AbstractAsyncCommand<TestCommandIn
}
/// <summary>
/// 获取命令是否已执行
/// 获取命令是否已执行
/// </summary>
public bool Executed { get; private set; }
/// <summary>
/// 获取执行的值
/// 获取执行的值
/// </summary>
public int ExecutedValue { get; private set; }
/// <summary>
/// 执行异步命令的重写方法(子类实现)
/// 执行异步命令的重写方法(子类实现)
/// </summary>
/// <param name="input">命令输入</param>
/// <returns>表示异步操作的任务</returns>
@ -369,12 +369,12 @@ public sealed class TestAsyncCommandChildV3 : AbstractAsyncCommand<TestCommandIn
}
/// <summary>
/// 测试用异步命令子类(有返回值)
/// 测试用异步命令子类(有返回值)
/// </summary>
public sealed class TestAsyncCommandWithResultChildV3 : AbstractAsyncCommand<TestCommandInputV2, int>
{
/// <summary>
/// 构造函数
/// 构造函数
/// </summary>
/// <param name="input">命令输入</param>
public TestAsyncCommandWithResultChildV3(TestCommandInputV2 input) : base(input)
@ -382,12 +382,12 @@ public sealed class TestAsyncCommandWithResultChildV3 : AbstractAsyncCommand<Tes
}
/// <summary>
/// 获取命令是否已执行
/// 获取命令是否已执行
/// </summary>
public bool Executed { get; private set; }
/// <summary>
/// 执行异步命令并返回结果的重写方法(子类实现)
/// 执行异步命令并返回结果的重写方法(子类实现)
/// </summary>
/// <param name="input">命令输入</param>
/// <returns>执行结果的异步任务</returns>

View File

@ -5,16 +5,16 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.command;
/// <summary>
/// CommandBus类的单元测试
/// 测试内容包括:
/// - Send方法执行命令
/// - Send方法处理null命令
/// - Send方法带返回值返回值
/// - Send方法带返回值处理null命令
/// - SendAsync方法执行异步命令
/// - SendAsync方法处理null异步命令
/// - SendAsync方法带返回值返回值
/// - SendAsync方法带返回值处理null异步命令
/// CommandBus类的单元测试
/// 测试内容包括:
/// - Send方法执行命令
/// - Send方法处理null命令
/// - Send方法带返回值返回值
/// - Send方法带返回值处理null命令
/// - SendAsync方法执行异步命令
/// - SendAsync方法处理null异步命令
/// - SendAsync方法带返回值返回值
/// - SendAsync方法带返回值处理null异步命令
/// </summary>
[TestFixture]
public class CommandBusTests
@ -28,7 +28,7 @@ public class CommandBusTests
private CommandBus _commandBus = null!;
/// <summary>
/// 测试Send方法执行命令
/// 测试Send方法执行命令
/// </summary>
[Test]
public void Send_Should_Execute_Command()
@ -42,7 +42,7 @@ public class CommandBusTests
}
/// <summary>
/// 测试Send方法处理null命令时抛出ArgumentNullException异常
/// 测试Send方法处理null命令时抛出ArgumentNullException异常
/// </summary>
[Test]
public void Send_WithNullCommand_Should_ThrowArgumentNullException()
@ -51,7 +51,7 @@ public class CommandBusTests
}
/// <summary>
/// 测试Send方法带返回值正确返回值
/// 测试Send方法带返回值正确返回值
/// </summary>
[Test]
public void Send_WithResult_Should_Return_Value()
@ -66,7 +66,7 @@ public class CommandBusTests
}
/// <summary>
/// 测试Send方法带返回值处理null命令时抛出ArgumentNullException异常
/// 测试Send方法带返回值处理null命令时抛出ArgumentNullException异常
/// </summary>
[Test]
public void Send_WithResult_AndNullCommand_Should_ThrowArgumentNullException()
@ -75,7 +75,7 @@ public class CommandBusTests
}
/// <summary>
/// 测试SendAsync方法执行异步命令
/// 测试SendAsync方法执行异步命令
/// </summary>
[Test]
public async Task SendAsync_Should_Execute_AsyncCommand()
@ -90,7 +90,7 @@ public class CommandBusTests
}
/// <summary>
/// 测试SendAsync方法处理null异步命令时抛出ArgumentNullException异常
/// 测试SendAsync方法处理null异步命令时抛出ArgumentNullException异常
/// </summary>
[Test]
public void SendAsync_WithNullCommand_Should_ThrowArgumentNullException()
@ -99,7 +99,7 @@ public class CommandBusTests
}
/// <summary>
/// 测试SendAsync方法带返回值正确返回值
/// 测试SendAsync方法带返回值正确返回值
/// </summary>
[Test]
public async Task SendAsync_WithResult_Should_Return_Value()
@ -114,7 +114,7 @@ public class CommandBusTests
}
/// <summary>
/// 测试SendAsync方法带返回值处理null异步命令时抛出ArgumentNullException异常
/// 测试SendAsync方法带返回值处理null异步命令时抛出ArgumentNullException异常
/// </summary>
[Test]
public void SendAsync_WithResult_AndNullCommand_Should_ThrowArgumentNullException()
@ -124,23 +124,23 @@ public class CommandBusTests
}
/// <summary>
/// 测试用命令输入类实现ICommandInput接口
/// 测试用命令输入类实现ICommandInput接口
/// </summary>
public sealed class TestCommandInput : ICommandInput
{
/// <summary>
/// 获取或设置值
/// 获取或设置值
/// </summary>
public int Value { get; init; }
}
/// <summary>
/// 测试用命令类继承AbstractCommand
/// 测试用命令类继承AbstractCommand
/// </summary>
public sealed class TestCommand : AbstractCommand<TestCommandInput>
{
/// <summary>
/// 构造函数
/// 构造函数
/// </summary>
/// <param name="input">命令输入</param>
public TestCommand(TestCommandInput input) : base(input)
@ -148,17 +148,17 @@ public sealed class TestCommand : AbstractCommand<TestCommandInput>
}
/// <summary>
/// 获取命令是否已执行
/// 获取命令是否已执行
/// </summary>
public bool Executed { get; private set; }
/// <summary>
/// 获取执行的值
/// 获取执行的值
/// </summary>
public int ExecutedValue { get; private set; }
/// <summary>
/// 执行命令的重写方法
/// 执行命令的重写方法
/// </summary>
/// <param name="input">命令输入</param>
protected override void OnExecute(TestCommandInput input)
@ -169,12 +169,12 @@ public sealed class TestCommand : AbstractCommand<TestCommandInput>
}
/// <summary>
/// 测试用带返回值的命令类继承AbstractCommand
/// 测试用带返回值的命令类继承AbstractCommand
/// </summary>
public sealed class TestCommandWithResult : AbstractCommand<TestCommandInput, int>
{
/// <summary>
/// 构造函数
/// 构造函数
/// </summary>
/// <param name="input">命令输入</param>
public TestCommandWithResult(TestCommandInput input) : base(input)
@ -182,12 +182,12 @@ public sealed class TestCommandWithResult : AbstractCommand<TestCommandInput, in
}
/// <summary>
/// 获取命令是否已执行
/// 获取命令是否已执行
/// </summary>
public bool Executed { get; private set; }
/// <summary>
/// 执行命令并返回结果的重写方法
/// 执行命令并返回结果的重写方法
/// </summary>
/// <param name="input">命令输入</param>
/// <returns>执行结果</returns>
@ -199,12 +199,12 @@ public sealed class TestCommandWithResult : AbstractCommand<TestCommandInput, in
}
/// <summary>
/// 测试用异步命令类继承AbstractAsyncCommand
/// 测试用异步命令类继承AbstractAsyncCommand
/// </summary>
public sealed class TestAsyncCommand : AbstractAsyncCommand<TestCommandInput>
{
/// <summary>
/// 构造函数
/// 构造函数
/// </summary>
/// <param name="input">命令输入</param>
public TestAsyncCommand(TestCommandInput input) : base(input)
@ -212,17 +212,17 @@ public sealed class TestAsyncCommand : AbstractAsyncCommand<TestCommandInput>
}
/// <summary>
/// 获取命令是否已执行
/// 获取命令是否已执行
/// </summary>
public bool Executed { get; private set; }
/// <summary>
/// 获取执行的值
/// 获取执行的值
/// </summary>
public int ExecutedValue { get; private set; }
/// <summary>
/// 执行异步命令的重写方法
/// 执行异步命令的重写方法
/// </summary>
/// <param name="input">命令输入</param>
/// <returns>表示异步操作的任务</returns>
@ -235,12 +235,12 @@ public sealed class TestAsyncCommand : AbstractAsyncCommand<TestCommandInput>
}
/// <summary>
/// 测试用带返回值的异步命令类继承AbstractAsyncCommand
/// 测试用带返回值的异步命令类继承AbstractAsyncCommand
/// </summary>
public sealed class TestAsyncCommandWithResult : AbstractAsyncCommand<TestCommandInput, int>
{
/// <summary>
/// 构造函数
/// 构造函数
/// </summary>
/// <param name="input">命令输入</param>
public TestAsyncCommandWithResult(TestCommandInput input) : base(input)
@ -248,12 +248,12 @@ public sealed class TestAsyncCommandWithResult : AbstractAsyncCommand<TestComman
}
/// <summary>
/// 获取命令是否已执行
/// 获取命令是否已执行
/// </summary>
public bool Executed { get; private set; }
/// <summary>
/// 执行异步命令并返回结果的重写方法
/// 执行异步命令并返回结果的重写方法
/// </summary>
/// <param name="input">命令输入</param>
/// <returns>执行结果的异步任务</returns>

View File

@ -4,19 +4,19 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.constants;
/// <summary>
/// GFrameworkConstants类的单元测试
/// 测试内容包括:
/// - 版本号常量格式正确性
/// - 其他框架常量
/// - 常量值正确性
/// - 常量类型验证
/// - 常量可访问性
/// GFrameworkConstants类的单元测试
/// 测试内容包括:
/// - 版本号常量格式正确性
/// - 其他框架常量
/// - 常量值正确性
/// - 常量类型验证
/// - 常量可访问性
/// </summary>
[TestFixture]
public class GFrameworkConstantsTests
{
/// <summary>
/// 测试FrameworkName常量的值正确性
/// 测试FrameworkName常量的值正确性
/// </summary>
[Test]
public void FrameworkName_Should_Have_Correct_Value()
@ -25,7 +25,7 @@ public class GFrameworkConstantsTests
}
/// <summary>
/// 测试FrameworkName常量的类型
/// 测试FrameworkName常量的类型
/// </summary>
[Test]
public void FrameworkName_Should_Be_String_Type()
@ -34,7 +34,7 @@ public class GFrameworkConstantsTests
}
/// <summary>
/// 测试FrameworkName常量不为空
/// 测试FrameworkName常量不为空
/// </summary>
[Test]
public void FrameworkName_Should_Not_Be_Null_Or_Empty()
@ -44,7 +44,7 @@ public class GFrameworkConstantsTests
}
/// <summary>
/// 测试FrameworkName常量是公共可访问的
/// 测试FrameworkName常量是公共可访问的
/// </summary>
[Test]
public void FrameworkName_Should_Be_Publicly_Accessible()
@ -58,7 +58,7 @@ public class GFrameworkConstantsTests
}
/// <summary>
/// 测试FrameworkName常量是只读的const
/// 测试FrameworkName常量是只读的const
/// </summary>
[Test]
public void FrameworkName_Should_Be_Constant()

View File

@ -5,20 +5,20 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.coroutine;
/// <summary>
/// AsyncOperation的单元测试类
/// 测试内容包括:
/// - 初始化状态
/// - 完成和状态检查
/// - 异常处理
/// - 延续操作
/// - GetAwaiter
/// - IsCompleted属性
/// AsyncOperation的单元测试类
/// 测试内容包括:
/// - 初始化状态
/// - 完成和状态检查
/// - 异常处理
/// - 延续操作
/// - GetAwaiter
/// - IsCompleted属性
/// </summary>
[TestFixture]
public class AsyncOperationTests
{
/// <summary>
/// 验证AsyncOperation初始状态为未完成
/// 验证AsyncOperation初始状态为未完成
/// </summary>
[Test]
public void AsyncOperation_Should_Not_Be_Done_Initially()
@ -29,7 +29,7 @@ public class AsyncOperationTests
}
/// <summary>
/// 验证AsyncOperation初始状态IsCompleted为false
/// 验证AsyncOperation初始状态IsCompleted为false
/// </summary>
[Test]
public void AsyncOperation_Should_Not_Be_Completed_Initially()
@ -40,7 +40,7 @@ public class AsyncOperationTests
}
/// <summary>
/// 验证SetCompleted后IsDone应该为true
/// 验证SetCompleted后IsDone应该为true
/// </summary>
[Test]
public void SetCompleted_Should_Set_IsDone_To_True()
@ -53,7 +53,7 @@ public class AsyncOperationTests
}
/// <summary>
/// 验证SetCompleted后IsCompleted应该为true
/// 验证SetCompleted后IsCompleted应该为true
/// </summary>
[Test]
public void SetCompleted_Should_Set_IsCompleted_To_True()
@ -66,7 +66,7 @@ public class AsyncOperationTests
}
/// <summary>
/// 验证SetCompleted只能被调用一次
/// 验证SetCompleted只能被调用一次
/// </summary>
[Test]
public void SetCompleted_Should_Be_Idempotent()
@ -81,7 +81,7 @@ public class AsyncOperationTests
}
/// <summary>
/// 验证SetException后IsDone应该为true
/// 验证SetException后IsDone应该为true
/// </summary>
[Test]
public void SetException_Should_Set_IsDone_To_True()
@ -94,7 +94,7 @@ public class AsyncOperationTests
}
/// <summary>
/// 验证SetException后Task应该包含异常
/// 验证SetException后Task应该包含异常
/// </summary>
[Test]
public void SetException_Should_Set_Exception_On_Task()
@ -108,7 +108,7 @@ public class AsyncOperationTests
}
/// <summary>
/// 验证OnCompleted应该在已完成时立即执行延续
/// 验证OnCompleted应该在已完成时立即执行延续
/// </summary>
[Test]
public void OnCompleted_Should_Execute_Immediately_When_Already_Completed()
@ -123,7 +123,7 @@ public class AsyncOperationTests
}
/// <summary>
/// 验证OnCompleted应该在未完成时不立即执行延续
/// 验证OnCompleted应该在未完成时不立即执行延续
/// </summary>
[Test]
public void OnCompleted_Should_Not_Execute_Immediately_When_Not_Completed()
@ -137,7 +137,7 @@ public class AsyncOperationTests
}
/// <summary>
/// 验证延续应该在SetCompleted后被调用
/// 验证延续应该在SetCompleted后被调用
/// </summary>
[Test]
public void Continuation_Should_Be_Called_After_SetCompleted()
@ -152,7 +152,7 @@ public class AsyncOperationTests
}
/// <summary>
/// 验证多个延续应该都能被调用
/// 验证多个延续应该都能被调用
/// </summary>
[Test]
public void Multiple_Continuations_Should_All_Be_Called()
@ -169,7 +169,7 @@ public class AsyncOperationTests
}
/// <summary>
/// 验证延续应该在SetException后被调用
/// 验证延续应该在SetException后被调用
/// </summary>
[Test]
public void Continuation_Should_Be_Called_After_SetException()
@ -184,7 +184,7 @@ public class AsyncOperationTests
}
/// <summary>
/// 验证SetCompleted后设置的延续也应该被调用
/// 验证SetCompleted后设置的延续也应该被调用
/// </summary>
[Test]
public void Continuation_Registered_After_Completed_Should_Be_Called()
@ -202,7 +202,7 @@ public class AsyncOperationTests
}
/// <summary>
/// 验证GetAwaiter应该返回自身
/// 验证GetAwaiter应该返回自身
/// </summary>
[Test]
public void GetAwaiter_Should_Return_Self()
@ -215,7 +215,7 @@ public class AsyncOperationTests
}
/// <summary>
/// 验证Update方法不应该改变状态
/// 验证Update方法不应该改变状态
/// </summary>
[Test]
public void Update_Should_Not_Change_State()
@ -228,7 +228,7 @@ public class AsyncOperationTests
}
/// <summary>
/// 验证AsyncOperation实现IYieldInstruction接口
/// 验证AsyncOperation实现IYieldInstruction接口
/// </summary>
[Test]
public void AsyncOperation_Should_Implement_IYieldInstruction()
@ -239,7 +239,7 @@ public class AsyncOperationTests
}
/// <summary>
/// 验证Task属性应该返回有效的Task
/// 验证Task属性应该返回有效的Task
/// </summary>
[Test]
public void Task_Property_Should_Return_Valid_Task()
@ -250,7 +250,7 @@ public class AsyncOperationTests
}
/// <summary>
/// 验证SetCompleted后Task应该完成
/// 验证SetCompleted后Task应该完成
/// </summary>
[Test]
public async Task Task_Should_Complete_After_SetCompleted()
@ -265,7 +265,7 @@ public class AsyncOperationTests
}
/// <summary>
/// 验证SetException后Task应该失败
/// 验证SetException后Task应该失败
/// </summary>
[Test]
public void Task_Should_Fault_After_SetException()
@ -278,7 +278,7 @@ public class AsyncOperationTests
}
/// <summary>
/// 验证SetCompleted只能设置一次
/// 验证SetCompleted只能设置一次
/// </summary>
[Test]
public void SetCompleted_Should_Only_Set_Once()
@ -298,7 +298,7 @@ public class AsyncOperationTests
}
/// <summary>
/// 验证SetException只能在未完成时设置
/// 验证SetException只能在未完成时设置
/// </summary>
[Test]
public void SetException_Should_Not_Work_After_SetCompleted()
@ -313,7 +313,7 @@ public class AsyncOperationTests
}
/// <summary>
/// 验证SetCompleted不能在SetException后设置
/// 验证SetCompleted不能在SetException后设置
/// </summary>
[Test]
public void SetCompleted_Should_Not_Work_After_SetException()
@ -328,7 +328,7 @@ public class AsyncOperationTests
}
/// <summary>
/// 验证延续抛出的异常应该被捕获
/// 验证延续抛出的异常应该被捕获
/// </summary>
[Test]
public void Continuation_Exception_Should_Be_Caught()
@ -339,4 +339,4 @@ public class AsyncOperationTests
Assert.DoesNotThrow(() => op.SetCompleted());
}
}
}

View File

@ -7,19 +7,19 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.coroutine;
/// <summary>
/// 协程扩展方法的单元测试类
/// 测试内容包括:
/// - RepeatEvery方法
/// - ExecuteAfter方法
/// - Sequence方法
/// - ParallelCoroutines方法
/// - WaitForSecondsWithProgress方法
/// 协程扩展方法的单元测试类
/// 测试内容包括:
/// - RepeatEvery方法
/// - ExecuteAfter方法
/// - Sequence方法
/// - ParallelCoroutines方法
/// - WaitForSecondsWithProgress方法
/// </summary>
[TestFixture]
public class CoroutineExtensionsTests
{
/// <summary>
/// 验证RepeatEvery应该返回有效的协程
/// 验证RepeatEvery应该返回有效的协程
/// </summary>
[Test]
public void RepeatEvery_Should_Return_Valid_Coroutine()
@ -31,7 +31,7 @@ public class CoroutineExtensionsTests
}
/// <summary>
/// 验证RepeatEvery应该执行指定次数
/// 验证RepeatEvery应该执行指定次数
/// </summary>
[Test]
public void RepeatEvery_Should_Execute_Specified_Times()
@ -39,16 +39,13 @@ public class CoroutineExtensionsTests
var callCount = 0;
var coroutine = CoroutineExtensions.RepeatEvery(0.1, () => callCount++, 3);
while (coroutine.MoveNext())
{
coroutine.Current.Update(0.1);
}
while (coroutine.MoveNext()) coroutine.Current.Update(0.1);
Assert.That(callCount, Is.EqualTo(3));
}
/// <summary>
/// 验证RepeatEvery应该无限执行当count为null
/// 验证RepeatEvery应该无限执行当count为null
/// </summary>
[Test]
public void RepeatEvery_Should_Execute_Forever_When_Count_Is_Null()
@ -67,7 +64,7 @@ public class CoroutineExtensionsTests
}
/// <summary>
/// 验证RepeatEvery应该处理负数count
/// 验证RepeatEvery应该处理负数count
/// </summary>
[Test]
public void RepeatEvery_Should_Handle_Negative_Count()
@ -80,7 +77,7 @@ public class CoroutineExtensionsTests
}
/// <summary>
/// 验证RepeatEvery应该处理零count
/// 验证RepeatEvery应该处理零count
/// </summary>
[Test]
public void RepeatEvery_Should_Handle_Zero_Count()
@ -93,24 +90,21 @@ public class CoroutineExtensionsTests
}
/// <summary>
/// 验证RepeatEvery应该处理null action
/// 验证RepeatEvery应该处理null action
/// </summary>
[Test]
public void RepeatEvery_Should_Handle_Null_Action()
{
var coroutine = CoroutineExtensions.RepeatEvery(0.1, null, 3);
Assert.DoesNotThrow(() =>
Assert.DoesNotThrow(() =>
{
while (coroutine.MoveNext())
{
coroutine.Current.Update(0.1);
}
while (coroutine.MoveNext()) coroutine.Current.Update(0.1);
});
}
/// <summary>
/// 验证ExecuteAfter应该返回有效的协程
/// 验证ExecuteAfter应该返回有效的协程
/// </summary>
[Test]
public void ExecuteAfter_Should_Return_Valid_Coroutine()
@ -122,7 +116,7 @@ public class CoroutineExtensionsTests
}
/// <summary>
/// 验证ExecuteAfter应该在延迟后执行action
/// 验证ExecuteAfter应该在延迟后执行action
/// </summary>
[Test]
public void ExecuteAfter_Should_Execute_Action_After_Delay()
@ -144,7 +138,7 @@ public class CoroutineExtensionsTests
}
/// <summary>
/// 验证ExecuteAfter应该处理零延迟
/// 验证ExecuteAfter应该处理零延迟
/// </summary>
[Test]
public void ExecuteAfter_Should_Handle_Zero_Delay()
@ -159,7 +153,7 @@ public class CoroutineExtensionsTests
}
/// <summary>
/// 验证ExecuteAfter应该处理负数延迟
/// 验证ExecuteAfter应该处理负数延迟
/// </summary>
[Test]
public void ExecuteAfter_Should_Handle_Negative_Delay()
@ -172,14 +166,14 @@ public class CoroutineExtensionsTests
}
/// <summary>
/// 验证ExecuteAfter应该处理null action
/// 验证ExecuteAfter应该处理null action
/// </summary>
[Test]
public void ExecuteAfter_Should_Handle_Null_Action()
{
var coroutine = CoroutineExtensions.ExecuteAfter(1.0, null);
Assert.DoesNotThrow(() =>
Assert.DoesNotThrow(() =>
{
coroutine.MoveNext();
coroutine.Current.Update(1.0);
@ -187,7 +181,7 @@ public class CoroutineExtensionsTests
}
/// <summary>
/// 验证Sequence应该返回有效的协程
/// 验证Sequence应该返回有效的协程
/// </summary>
[Test]
public void Sequence_Should_Return_Valid_Coroutine()
@ -200,7 +194,7 @@ public class CoroutineExtensionsTests
}
/// <summary>
/// 验证Sequence应该按顺序执行多个协程
/// 验证Sequence应该按顺序执行多个协程
/// </summary>
[Test]
public void Sequence_Should_Execute_Coroutines_In_Order()
@ -212,16 +206,13 @@ public class CoroutineExtensionsTests
var sequence = CoroutineExtensions.Sequence(coroutine1, coroutine2, coroutine3);
while (sequence.MoveNext())
{
sequence.Current.Update(0.1);
}
while (sequence.MoveNext()) sequence.Current.Update(0.1);
Assert.That(executionOrder, Is.EqualTo(new List<int> { 1, 2, 3 }));
}
/// <summary>
/// 验证Sequence应该处理空协程数组
/// 验证Sequence应该处理空协程数组
/// </summary>
[Test]
public void Sequence_Should_Handle_Empty_Coroutines()
@ -232,7 +223,7 @@ public class CoroutineExtensionsTests
}
/// <summary>
/// 验证Sequence应该处理单个协程
/// 验证Sequence应该处理单个协程
/// </summary>
[Test]
public void Sequence_Should_Handle_Single_Coroutine()
@ -244,7 +235,7 @@ public class CoroutineExtensionsTests
}
/// <summary>
/// 验证Sequence应该处理null协程
/// 验证Sequence应该处理null协程
/// </summary>
[Test]
public void Sequence_Should_Handle_Null_Coroutine()
@ -252,23 +243,20 @@ public class CoroutineExtensionsTests
var coroutine1 = CreateSimpleCoroutine();
var sequence = CoroutineExtensions.Sequence(coroutine1, null!);
Assert.Throws<NullReferenceException>(() =>
Assert.Throws<NullReferenceException>(() =>
{
while (sequence.MoveNext())
{
sequence.Current.Update(0.1);
}
while (sequence.MoveNext()) sequence.Current.Update(0.1);
});
}
/// <summary>
/// 验证ParallelCoroutines应该返回有效的协程
/// 验证ParallelCoroutines应该返回有效的协程
/// </summary>
[Test]
public void ParallelCoroutines_Should_Return_Valid_Coroutine()
{
var timeSource = new TestTimeSource();
var scheduler = new CoroutineScheduler(timeSource, instanceId: 1);
var scheduler = new CoroutineScheduler(timeSource, 1);
var coroutine1 = CreateSimpleCoroutine();
var coroutine2 = CreateSimpleCoroutine();
@ -278,13 +266,13 @@ public class CoroutineExtensionsTests
}
/// <summary>
/// 验证ParallelCoroutines应该并行执行多个协程
/// 验证ParallelCoroutines应该并行执行多个协程
/// </summary>
[Test]
public void ParallelCoroutines_Should_Execute_Coroutines_In_Parallel()
{
var timeSource = new TestTimeSource();
var scheduler = new CoroutineScheduler(timeSource, instanceId: 1);
var scheduler = new CoroutineScheduler(timeSource, 1);
var executionCounts = new Dictionary<int, int> { { 1, 0 }, { 2, 0 }, { 3, 0 } };
var coroutine1 = CreateDelayedCoroutine(() => executionCounts[1]++, 0.5);
@ -297,10 +285,7 @@ public class CoroutineExtensionsTests
Assert.That(scheduler.ActiveCoroutineCount, Is.GreaterThan(0));
while (scheduler.ActiveCoroutineCount > 0)
{
scheduler.Update();
}
while (scheduler.ActiveCoroutineCount > 0) scheduler.Update();
Assert.That(executionCounts[1], Is.EqualTo(1));
Assert.That(executionCounts[2], Is.EqualTo(1));
@ -308,13 +293,13 @@ public class CoroutineExtensionsTests
}
/// <summary>
/// 验证ParallelCoroutines应该处理空数组
/// 验证ParallelCoroutines应该处理空数组
/// </summary>
[Test]
public void ParallelCoroutines_Should_Handle_Empty_Array()
{
var timeSource = new TestTimeSource();
var scheduler = new CoroutineScheduler(timeSource, instanceId: 1);
var scheduler = new CoroutineScheduler(timeSource, 1);
var parallel = scheduler.ParallelCoroutines();
@ -322,13 +307,13 @@ public class CoroutineExtensionsTests
}
/// <summary>
/// 验证ParallelCoroutines应该处理null数组
/// 验证ParallelCoroutines应该处理null数组
/// </summary>
[Test]
public void ParallelCoroutines_Should_Handle_Null_Array()
{
var timeSource = new TestTimeSource();
var scheduler = new CoroutineScheduler(timeSource, instanceId: 1);
var scheduler = new CoroutineScheduler(timeSource, 1);
var parallel = scheduler.ParallelCoroutines(null);
@ -336,7 +321,7 @@ public class CoroutineExtensionsTests
}
/// <summary>
/// 验证WaitForSecondsWithProgress应该返回有效的协程
/// 验证WaitForSecondsWithProgress应该返回有效的协程
/// </summary>
[Test]
public void WaitForSecondsWithProgress_Should_Return_Valid_Coroutine()
@ -348,7 +333,7 @@ public class CoroutineExtensionsTests
}
/// <summary>
/// 验证WaitForSecondsWithProgress应该在指定时间后完成
/// 验证WaitForSecondsWithProgress应该在指定时间后完成
/// </summary>
[Test]
public void WaitForSecondsWithProgress_Should_Complete_After_Duration()
@ -364,7 +349,7 @@ public class CoroutineExtensionsTests
}
/// <summary>
/// 验证WaitForSecondsWithProgress应该调用进度回调
/// 验证WaitForSecondsWithProgress应该调用进度回调
/// </summary>
[Test]
public void WaitForSecondsWithProgress_Should_Call_Progress_Callback()
@ -374,10 +359,7 @@ public class CoroutineExtensionsTests
coroutine.MoveNext();
while (!coroutine.Current.IsDone)
{
coroutine.Current.Update(0.1);
}
while (!coroutine.Current.IsDone) coroutine.Current.Update(0.1);
Assert.That(progressValues.Count, Is.GreaterThan(0));
Assert.That(progressValues[0], Is.EqualTo(0.0f).Within(0.01f));
@ -385,7 +367,7 @@ public class CoroutineExtensionsTests
}
/// <summary>
/// 验证WaitForSecondsWithProgress应该处理零时间
/// 验证WaitForSecondsWithProgress应该处理零时间
/// </summary>
[Test]
public void WaitForSecondsWithProgress_Should_Handle_Zero_Duration()
@ -398,7 +380,7 @@ public class CoroutineExtensionsTests
}
/// <summary>
/// 验证WaitForSecondsWithProgress应该处理负数时间
/// 验证WaitForSecondsWithProgress应该处理负数时间
/// </summary>
[Test]
public void WaitForSecondsWithProgress_Should_Handle_Negative_Duration()
@ -411,7 +393,7 @@ public class CoroutineExtensionsTests
}
/// <summary>
/// 验证WaitForSecondsWithProgress应该处理null回调
/// 验证WaitForSecondsWithProgress应该处理null回调
/// </summary>
[Test]
public void WaitForSecondsWithProgress_Should_Handle_Null_Callback()
@ -427,7 +409,7 @@ public class CoroutineExtensionsTests
}
/// <summary>
/// 验证RepeatEvery应该使用Delay指令
/// 验证RepeatEvery应该使用Delay指令
/// </summary>
[Test]
public void RepeatEvery_Should_Use_Delay_Instruction()
@ -439,7 +421,7 @@ public class CoroutineExtensionsTests
}
/// <summary>
/// 验证ExecuteAfter应该使用Delay指令
/// 验证ExecuteAfter应该使用Delay指令
/// </summary>
[Test]
public void ExecuteAfter_Should_Use_Delay_Instruction()
@ -451,7 +433,7 @@ public class CoroutineExtensionsTests
}
/// <summary>
/// 验证Sequence应该清理已完成的协程
/// 验证Sequence应该清理已完成的协程
/// </summary>
[Test]
public void Sequence_Should_Dispose_Completed_Coroutines()
@ -461,16 +443,13 @@ public class CoroutineExtensionsTests
var sequence = CoroutineExtensions.Sequence(coroutine1, coroutine2);
while (sequence.MoveNext())
{
sequence.Current.Update(0.1);
}
while (sequence.MoveNext()) sequence.Current.Update(0.1);
Assert.That(sequence.MoveNext(), Is.False);
}
/// <summary>
/// 验证RepeatEvery的间隔时间
/// 验证RepeatEvery的间隔时间
/// </summary>
[Test]
public void RepeatEvery_Should_Respect_Interval()
@ -489,7 +468,7 @@ public class CoroutineExtensionsTests
}
/// <summary>
/// 验证ExecuteAfter的延迟时间
/// 验证ExecuteAfter的延迟时间
/// </summary>
[Test]
public void ExecuteAfter_Should_Respect_Delay()
@ -513,7 +492,7 @@ public class CoroutineExtensionsTests
}
/// <summary>
/// 创建简单的立即完成协程
/// 创建简单的立即完成协程
/// </summary>
private IEnumerator<IYieldInstruction> CreateSimpleCoroutine()
{
@ -521,7 +500,7 @@ public class CoroutineExtensionsTests
}
/// <summary>
/// 创建带回调的协程
/// 创建带回调的协程
/// </summary>
private IEnumerator<IYieldInstruction> CreateCoroutineWithCallback(int id, Action callback)
{
@ -530,7 +509,7 @@ public class CoroutineExtensionsTests
}
/// <summary>
/// 创建计数协程
/// 创建计数协程
/// </summary>
private IEnumerator<IYieldInstruction> CreateCountingCoroutine(int id, Action callback)
{
@ -539,7 +518,7 @@ public class CoroutineExtensionsTests
}
/// <summary>
/// 创建延迟协程
/// 创建延迟协程
/// </summary>
private IEnumerator<IYieldInstruction> CreateDelayedCoroutine(Action callback, double delay)
{
@ -548,7 +527,7 @@ public class CoroutineExtensionsTests
}
/// <summary>
/// 测试用时间源类
/// 测试用时间源类
/// </summary>
private class TestTimeSource : ITimeSource
{
@ -561,4 +540,4 @@ public class CoroutineExtensionsTests
CurrentTime += DeltaTime;
}
}
}
}

View File

@ -4,19 +4,19 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.coroutine;
/// <summary>
/// 协程句柄的单元测试类
/// 测试内容包括:
/// - 协程句柄创建和有效性验证
/// - 相等性比较
/// - 哈希码生成
/// - 操作符重载
/// - 多实例独立性
/// 协程句柄的单元测试类
/// 测试内容包括:
/// - 协程句柄创建和有效性验证
/// - 相等性比较
/// - 哈希码生成
/// - 操作符重载
/// - 多实例独立性
/// </summary>
[TestFixture]
public class CoroutineHandleTests
{
/// <summary>
/// 验证协程句柄创建时应有有效的Key
/// 验证协程句柄创建时应有有效的Key
/// </summary>
[Test]
public void CoroutineHandle_Should_Have_Valid_Key_When_Created()
@ -28,7 +28,7 @@ public class CoroutineHandleTests
}
/// <summary>
/// 验证默认协程句柄应该无效
/// 验证默认协程句柄应该无效
/// </summary>
[Test]
public void Default_CoroutineHandle_Should_Be_Invalid()
@ -40,7 +40,7 @@ public class CoroutineHandleTests
}
/// <summary>
/// 验证相同实例ID创建的句柄应该具有不同的Key
/// 验证相同实例ID创建的句柄应该具有不同的Key
/// </summary>
[Test]
public void CoroutineHandles_With_Same_InstanceId_Should_Have_Different_Keys()
@ -52,7 +52,7 @@ public class CoroutineHandleTests
}
/// <summary>
/// 验证不同实例ID创建的句柄应该不同
/// 验证不同实例ID创建的句柄应该不同
/// </summary>
[Test]
public void CoroutineHandles_With_Different_InstanceIds_Should_Be_Different()
@ -64,7 +64,7 @@ public class CoroutineHandleTests
}
/// <summary>
/// 验证协程句柄的相等性比较
/// 验证协程句柄的相等性比较
/// </summary>
[Test]
public void Equals_Should_Return_True_For_Identical_Handles()
@ -76,7 +76,7 @@ public class CoroutineHandleTests
}
/// <summary>
/// 验证协程句柄的不相等性比较
/// 验证协程句柄的不相等性比较
/// </summary>
[Test]
public void Equals_Should_Return_False_For_Different_Handles()
@ -93,7 +93,7 @@ public class CoroutineHandleTests
/// <summary>
/// 验证Equals方法与null对象的比较
/// 验证Equals方法与null对象的比较
/// </summary>
[Test]
public void Equals_Should_Return_False_When_Comparing_To_Null()
@ -104,7 +104,7 @@ public class CoroutineHandleTests
}
/// <summary>
/// 验证Equals方法与其他类型对象的比较
/// 验证Equals方法与其他类型对象的比较
/// </summary>
[Test]
public void Equals_Should_Return_False_When_Comparing_To_Other_Type()
@ -115,7 +115,7 @@ public class CoroutineHandleTests
}
/// <summary>
/// 验证哈希码的一致性
/// 验证哈希码的一致性
/// </summary>
[Test]
public void GetHashCode_Should_Be_Consistent()
@ -128,7 +128,7 @@ public class CoroutineHandleTests
}
/// <summary>
/// 验证不同句柄应该有不同的哈希码
/// 验证不同句柄应该有不同的哈希码
/// </summary>
[Test]
public void GetHashCode_Should_Be_Different_For_Different_Handles()
@ -140,7 +140,7 @@ public class CoroutineHandleTests
}
/// <summary>
/// 验证相等操作符的正确性
/// 验证相等操作符的正确性
/// </summary>
[Test]
public void EqualityOperator_Should_Work_Correctly()
@ -154,7 +154,7 @@ public class CoroutineHandleTests
}
/// <summary>
/// 验证不等操作符的正确性
/// 验证不等操作符的正确性
/// </summary>
[Test]
public void InequalityOperator_Should_Work_Correctly()
@ -168,7 +168,7 @@ public class CoroutineHandleTests
}
/// <summary>
/// 验证协程句柄实现了IEquatable接口
/// 验证协程句柄实现了IEquatable接口
/// </summary>
[Test]
public void CoroutineHandle_Should_Implement_IEquatable_Interface()
@ -179,7 +179,7 @@ public class CoroutineHandleTests
}
/// <summary>
/// 验证协程句柄是只读结构体
/// 验证协程句柄是只读结构体
/// </summary>
[Test]
public void CoroutineHandle_Should_Be_Immutable_Struct()
@ -189,7 +189,7 @@ public class CoroutineHandleTests
}
/// <summary>
/// 验证实例ID超过预留空间时的处理
/// 验证实例ID超过预留空间时的处理
/// </summary>
[Test]
public void CoroutineHandle_Should_Handle_Large_InstanceId()
@ -201,25 +201,19 @@ public class CoroutineHandleTests
}
/// <summary>
/// 验证多个连续创建的句柄Key递增
/// 验证多个连续创建的句柄Key递增
/// </summary>
[Test]
public void Multiple_Creates_Should_Increment_Keys()
{
var handles = new List<CoroutineHandle>();
for (var i = 0; i < 5; i++)
{
handles.Add(new CoroutineHandle(1));
}
for (var i = 0; i < 5; i++) handles.Add(new CoroutineHandle(1));
for (var i = 0; i < handles.Count - 1; i++)
{
Assert.That(handles[i].Equals(handles[i + 1]), Is.False);
}
for (var i = 0; i < handles.Count - 1; i++) Assert.That(handles[i].Equals(handles[i + 1]), Is.False);
}
/// <summary>
/// 验证协程句柄的内部ID属性可以通过Key访问
/// 验证协程句柄的内部ID属性可以通过Key访问
/// </summary>
[Test]
public void CoroutineHandle_Key_Should_Return_Low_4_Bits_Of_Id()

View File

@ -6,22 +6,22 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.coroutine;
/// <summary>
/// 协程辅助方法的单元测试类
/// 测试内容包括:
/// - WaitForSeconds方法
/// - WaitForOneFrame方法
/// - WaitForFrames方法
/// - WaitUntil方法
/// - WaitWhile方法
/// - DelayedCall方法
/// - RepeatCall方法
/// - RepeatCallForever方法
/// 协程辅助方法的单元测试类
/// 测试内容包括:
/// - WaitForSeconds方法
/// - WaitForOneFrame方法
/// - WaitForFrames方法
/// - WaitUntil方法
/// - WaitWhile方法
/// - DelayedCall方法
/// - RepeatCall方法
/// - RepeatCallForever方法
/// </summary>
[TestFixture]
public class CoroutineHelperTests
{
/// <summary>
/// 验证WaitForSeconds应该返回Delay实例
/// 验证WaitForSeconds应该返回Delay实例
/// </summary>
[Test]
public void WaitForSeconds_Should_Return_Delay_Instance()
@ -32,7 +32,7 @@ public class CoroutineHelperTests
}
/// <summary>
/// 验证WaitForSeconds可以处理正数秒数
/// 验证WaitForSeconds可以处理正数秒数
/// </summary>
[Test]
public void WaitForSeconds_Should_Handle_Positive_Seconds()
@ -44,7 +44,7 @@ public class CoroutineHelperTests
}
/// <summary>
/// 验证WaitForSeconds可以处理零秒数
/// 验证WaitForSeconds可以处理零秒数
/// </summary>
[Test]
public void WaitForSeconds_Should_Handle_Zero_Seconds()
@ -55,7 +55,7 @@ public class CoroutineHelperTests
}
/// <summary>
/// 验证WaitForOneFrame应该返回WaitOneFrame实例
/// 验证WaitForOneFrame应该返回WaitOneFrame实例
/// </summary>
[Test]
public void WaitForOneFrame_Should_Return_WaitOneFrame_Instance()
@ -66,7 +66,7 @@ public class CoroutineHelperTests
}
/// <summary>
/// 验证WaitForFrames应该返回WaitForFrames实例
/// 验证WaitForFrames应该返回WaitForFrames实例
/// </summary>
[Test]
public void WaitForFrames_Should_Return_WaitForFrames_Instance()
@ -77,7 +77,7 @@ public class CoroutineHelperTests
}
/// <summary>
/// 验证WaitForFrames可以处理正数帧数
/// 验证WaitForFrames可以处理正数帧数
/// </summary>
[Test]
public void WaitForFrames_Should_Handle_Positive_Frames()
@ -89,7 +89,7 @@ public class CoroutineHelperTests
}
/// <summary>
/// 验证WaitForFrames可以处理最小帧数1
/// 验证WaitForFrames可以处理最小帧数1
/// </summary>
[Test]
public void WaitForFrames_Should_Handle_Minimum_Frame_Count_Of_1()
@ -101,7 +101,7 @@ public class CoroutineHelperTests
}
/// <summary>
/// 验证WaitUntil应该返回WaitUntil实例
/// 验证WaitUntil应该返回WaitUntil实例
/// </summary>
[Test]
public void WaitUntil_Should_Return_WaitUntil_Instance()
@ -113,7 +113,7 @@ public class CoroutineHelperTests
}
/// <summary>
/// 验证WaitUntil应该使用提供的谓词函数
/// 验证WaitUntil应该使用提供的谓词函数
/// </summary>
[Test]
public void WaitUntil_Should_Use_Provided_Predicate()
@ -129,7 +129,7 @@ public class CoroutineHelperTests
}
/// <summary>
/// 验证WaitWhile应该返回WaitWhile实例
/// 验证WaitWhile应该返回WaitWhile实例
/// </summary>
[Test]
public void WaitWhile_Should_Return_WaitWhile_Instance()
@ -141,7 +141,7 @@ public class CoroutineHelperTests
}
/// <summary>
/// 验证WaitWhile应该在条件为假时完成
/// 验证WaitWhile应该在条件为假时完成
/// </summary>
[Test]
public void WaitWhile_Should_Complete_When_Condition_Is_False()
@ -157,7 +157,7 @@ public class CoroutineHelperTests
}
/// <summary>
/// 验证DelayedCall应该返回IEnumerator实例
/// 验证DelayedCall应该返回IEnumerator实例
/// </summary>
[Test]
public void DelayedCall_Should_Return_IEnumerator()
@ -169,7 +169,7 @@ public class CoroutineHelperTests
}
/// <summary>
/// 验证DelayedCall的action可以在延迟后执行
/// 验证DelayedCall的action可以在延迟后执行
/// </summary>
[Test]
public void DelayedCall_Should_Execute_Action_After_Delay()
@ -187,7 +187,7 @@ public class CoroutineHelperTests
}
/// <summary>
/// 验证DelayedCall可以处理null action
/// 验证DelayedCall可以处理null action
/// </summary>
[Test]
public void DelayedCall_Should_Handle_Null_Action()
@ -199,7 +199,7 @@ public class CoroutineHelperTests
}
/// <summary>
/// 验证RepeatCall应该返回IEnumerator实例
/// 验证RepeatCall应该返回IEnumerator实例
/// </summary>
[Test]
public void RepeatCall_Should_Return_IEnumerator()
@ -211,7 +211,7 @@ public class CoroutineHelperTests
}
/// <summary>
/// 验证RepeatCall应该执行指定次数
/// 验证RepeatCall应该执行指定次数
/// </summary>
[Test]
public void RepeatCall_Should_Execute_Specified_Times()
@ -219,16 +219,13 @@ public class CoroutineHelperTests
var callCount = 0;
var coroutine = CoroutineHelper.RepeatCall(0.1, 3, () => callCount++);
while (coroutine.MoveNext())
{
coroutine.Current.Update(0.1);
}
while (coroutine.MoveNext()) coroutine.Current.Update(0.1);
Assert.That(callCount, Is.EqualTo(3));
}
/// <summary>
/// 验证RepeatCall可以处理0次调用
/// 验证RepeatCall可以处理0次调用
/// </summary>
[Test]
public void RepeatCall_Should_Handle_Zero_Count()
@ -241,7 +238,7 @@ public class CoroutineHelperTests
}
/// <summary>
/// 验证RepeatCallForever应该返回IEnumerator实例
/// 验证RepeatCallForever应该返回IEnumerator实例
/// </summary>
[Test]
public void RepeatCallForever_Should_Return_IEnumerator()
@ -253,7 +250,7 @@ public class CoroutineHelperTests
}
/// <summary>
/// 验证RepeatCallForever应该无限执行
/// 验证RepeatCallForever应该无限执行
/// </summary>
[Test]
public void RepeatCallForever_Should_Execute_Forever()
@ -273,7 +270,7 @@ public class CoroutineHelperTests
}
/// <summary>
/// 验证RepeatCallForever可以处理null action
/// 验证RepeatCallForever可以处理null action
/// </summary>
[Test]
public void RepeatCallForever_Should_Handle_Null_Action()
@ -285,7 +282,7 @@ public class CoroutineHelperTests
}
/// <summary>
/// 验证RepeatCallForever可以处理负数间隔
/// 验证RepeatCallForever可以处理负数间隔
/// </summary>
[Test]
public void RepeatCallForever_Should_Handle_Negative_Interval()
@ -298,7 +295,7 @@ public class CoroutineHelperTests
}
/// <summary>
/// 验证DelayedCall可以处理负数延迟
/// 验证DelayedCall可以处理负数延迟
/// </summary>
[Test]
public void DelayedCall_Should_Handle_Negative_Delay()
@ -311,7 +308,7 @@ public class CoroutineHelperTests
}
/// <summary>
/// 验证RepeatCall可以处理负数间隔
/// 验证RepeatCall可以处理负数间隔
/// </summary>
[Test]
public void RepeatCall_Should_Handle_Negative_Interval()
@ -324,7 +321,7 @@ public class CoroutineHelperTests
}
/// <summary>
/// 验证WaitUntil应该抛出ArgumentNullException当predicate为null
/// 验证WaitUntil应该抛出ArgumentNullException当predicate为null
/// </summary>
[Test]
public void WaitUntil_Should_Throw_ArgumentNullException_When_Predicate_Is_Null()
@ -333,7 +330,7 @@ public class CoroutineHelperTests
}
/// <summary>
/// 验证WaitWhile应该抛出ArgumentNullException当predicate为null
/// 验证WaitWhile应该抛出ArgumentNullException当predicate为null
/// </summary>
[Test]
public void WaitWhile_Should_Throw_ArgumentNullException_When_Predicate_Is_Null()

View File

@ -6,46 +6,46 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.coroutine;
/// <summary>
/// 协程调度器的单元测试类
/// 测试内容包括:
/// - 协程调度器的创建和初始化
/// - 运行协程
/// - 更新协程状态
/// - 暂停和恢复协程
/// - 终止协程
/// - 协程等待机制
/// - 标签管理
/// - 清空所有协程
/// - 异常处理
/// - 扩展容量
/// - 主动协程计数
/// - 时间差值属性
/// 协程调度器的单元测试类
/// 测试内容包括:
/// - 协程调度器的创建和初始化
/// - 运行协程
/// - 更新协程状态
/// - 暂停和恢复协程
/// - 终止协程
/// - 协程等待机制
/// - 标签管理
/// - 清空所有协程
/// - 异常处理
/// - 扩展容量
/// - 主动协程计数
/// - 时间差值属性
/// </summary>
[TestFixture]
public class CoroutineSchedulerTests
{
/// <summary>
/// 测试初始化方法,在每个测试方法执行前设置测试环境
/// 测试初始化方法,在每个测试方法执行前设置测试环境
/// </summary>
[SetUp]
public void SetUp()
{
_timeSource = new TestTimeSource();
_scheduler = new CoroutineScheduler(_timeSource, instanceId: 1, initialCapacity: 4);
_scheduler = new CoroutineScheduler(_timeSource, 1, 4);
}
/// <summary>
/// 测试用的时间源实例
/// 测试用的时间源实例
/// </summary>
private TestTimeSource _timeSource = null!;
/// <summary>
/// 测试用的协程调度器实例
/// 测试用的协程调度器实例
/// </summary>
private CoroutineScheduler _scheduler = null!;
/// <summary>
/// 验证协程调度器创建时应该有正确的初始状态
/// 验证协程调度器创建时应该有正确的初始状态
/// </summary>
[Test]
public void CoroutineScheduler_Should_Initialize_With_Correct_State()
@ -54,7 +54,7 @@ public class CoroutineSchedulerTests
}
/// <summary>
/// 验证协程调度器应该在创建时接受有效的时间源
/// 验证协程调度器应该在创建时接受有效的时间源
/// </summary>
[Test]
public void CoroutineScheduler_Should_Accept_Valid_TimeSource()
@ -63,7 +63,7 @@ public class CoroutineSchedulerTests
}
/// <summary>
/// 验证协程调度器应该抛出ArgumentNullException当timeSource为null
/// 验证协程调度器应该抛出ArgumentNullException当timeSource为null
/// </summary>
[Test]
public void CoroutineScheduler_Should_Throw_ArgumentNullException_When_TimeSource_Is_Null()
@ -72,7 +72,7 @@ public class CoroutineSchedulerTests
}
/// <summary>
/// 验证运行协程应该返回有效的句柄
/// 验证运行协程应该返回有效的句柄
/// </summary>
[Test]
public void Run_Should_Return_Valid_Handle()
@ -85,7 +85,7 @@ public class CoroutineSchedulerTests
}
/// <summary>
/// 验证运行null协程应该返回无效的句柄
/// 验证运行null协程应该返回无效的句柄
/// </summary>
[Test]
public void Run_Should_Return_Invalid_Handle_For_Null_Coroutine()
@ -97,7 +97,7 @@ public class CoroutineSchedulerTests
}
/// <summary>
/// 验证Update方法应该推进时间并更新协程状态
/// 验证Update方法应该推进时间并更新协程状态
/// </summary>
[Test]
public void Update_Should_Advance_Time_And_Update_Coroutines()
@ -111,7 +111,7 @@ public class CoroutineSchedulerTests
}
/// <summary>
/// 验证暂停协程应该成功
/// 验证暂停协程应该成功
/// </summary>
[Test]
public void Pause_Should_Succeed_For_Valid_Handle()
@ -125,7 +125,7 @@ public class CoroutineSchedulerTests
}
/// <summary>
/// 验证暂停无效的句柄应该失败
/// 验证暂停无效的句柄应该失败
/// </summary>
[Test]
public void Pause_Should_Fail_For_Invalid_Handle()
@ -136,7 +136,7 @@ public class CoroutineSchedulerTests
}
/// <summary>
/// 验证恢复协程应该成功
/// 验证恢复协程应该成功
/// </summary>
[Test]
public void Resume_Should_Succeed_For_Valid_Handle()
@ -151,7 +151,7 @@ public class CoroutineSchedulerTests
}
/// <summary>
/// 验证恢复无效的句柄应该失败
/// 验证恢复无效的句柄应该失败
/// </summary>
[Test]
public void Resume_Should_Fail_For_Invalid_Handle()
@ -162,7 +162,7 @@ public class CoroutineSchedulerTests
}
/// <summary>
/// 验证终止协程应该成功
/// 验证终止协程应该成功
/// </summary>
[Test]
public void Kill_Should_Succeed_For_Valid_Handle()
@ -177,7 +177,7 @@ public class CoroutineSchedulerTests
}
/// <summary>
/// 验证终止无效的句柄应该失败
/// 验证终止无效的句柄应该失败
/// </summary>
[Test]
public void Kill_Should_Fail_For_Invalid_Handle()
@ -188,7 +188,7 @@ public class CoroutineSchedulerTests
}
/// <summary>
/// 验证WaitForCoroutine方法应该正确设置等待状态
/// 验证WaitForCoroutine方法应该正确设置等待状态
/// </summary>
[Test]
public void WaitForCoroutine_Should_Set_Waiting_State()
@ -205,7 +205,7 @@ public class CoroutineSchedulerTests
}
/// <summary>
/// 验证WaitForCoroutine方法应该抛出异常当等待自己
/// 验证WaitForCoroutine方法应该抛出异常当等待自己
/// </summary>
[Test]
public void WaitForCoroutine_Should_Throw_When_Waiting_For_Self()
@ -217,7 +217,7 @@ public class CoroutineSchedulerTests
}
/// <summary>
/// 验证WaitForCoroutine方法应该处理无效的目标句柄
/// 验证WaitForCoroutine方法应该处理无效的目标句柄
/// </summary>
[Test]
public void WaitForCoroutine_Should_Handle_Invalid_Target_Handle()
@ -229,7 +229,7 @@ public class CoroutineSchedulerTests
}
/// <summary>
/// 验证根据标签终止协程应该正确工作
/// 验证根据标签终止协程应该正确工作
/// </summary>
[Test]
public void KillByTag_Should_Kill_All_Coroutines_With_Tag()
@ -249,7 +249,7 @@ public class CoroutineSchedulerTests
}
/// <summary>
/// 验证根据不存在的标签终止协程应该返回0
/// 验证根据不存在的标签终止协程应该返回0
/// </summary>
[Test]
public void KillByTag_Should_Return_Zero_For_Nonexistent_Tag()
@ -264,7 +264,7 @@ public class CoroutineSchedulerTests
}
/// <summary>
/// 验证清空所有协程应该正确工作
/// 验证清空所有协程应该正确工作
/// </summary>
[Test]
public void Clear_Should_Remove_All_Coroutines()
@ -282,7 +282,7 @@ public class CoroutineSchedulerTests
}
/// <summary>
/// 验证清空空的调度器应该返回0
/// 验证清空空的调度器应该返回0
/// </summary>
[Test]
public void Clear_Should_Return_Zero_For_Empty_Scheduler()
@ -293,7 +293,7 @@ public class CoroutineSchedulerTests
}
/// <summary>
/// 验证协程调度器应该正确处理协程异常
/// 验证协程调度器应该正确处理协程异常
/// </summary>
[Test]
public void Scheduler_Should_Handle_Coroutine_Exceptions()
@ -305,7 +305,7 @@ public class CoroutineSchedulerTests
}
/// <summary>
/// 验证协程调度器应该在协程抛出异常后减少活跃协程计数
/// 验证协程调度器应该在协程抛出异常后减少活跃协程计数
/// </summary>
[Test]
public void Scheduler_Should_Decrement_ActiveCount_After_Exception()
@ -321,27 +321,21 @@ public class CoroutineSchedulerTests
}
/// <summary>
/// 验证协程调度器应该扩展容量当槽位已满
/// 验证协程调度器应该扩展容量当槽位已满
/// </summary>
[Test]
public void Scheduler_Should_Expand_Capacity_When_Slots_Full()
{
var coroutines = new List<IEnumerator<IYieldInstruction>>();
for (var i = 0; i < 10; i++)
{
coroutines.Add(CreateYieldingCoroutine(new Delay(1.0)));
}
for (var i = 0; i < 10; i++) coroutines.Add(CreateYieldingCoroutine(new Delay(1.0)));
foreach (var coroutine in coroutines)
{
_scheduler.Run(coroutine);
}
foreach (var coroutine in coroutines) _scheduler.Run(coroutine);
Assert.That(_scheduler.ActiveCoroutineCount, Is.EqualTo(10));
}
/// <summary>
/// 验证协程调度器应该使用提供的时间源
/// 验证协程调度器应该使用提供的时间源
/// </summary>
[Test]
public void Scheduler_Should_Use_Provided_TimeSource()
@ -355,7 +349,7 @@ public class CoroutineSchedulerTests
}
/// <summary>
/// 验证协程调度器应该正确计算活跃协程计数
/// 验证协程调度器应该正确计算活跃协程计数
/// </summary>
[Test]
public void ActiveCoroutineCount_Should_Reflect_Active_Coroutines()
@ -377,7 +371,7 @@ public class CoroutineSchedulerTests
}
/// <summary>
/// 验证暂停的协程不应该被更新
/// 验证暂停的协程不应该被更新
/// </summary>
[Test]
public void Paused_Coroutine_Should_Not_Be_Updated()
@ -393,7 +387,7 @@ public class CoroutineSchedulerTests
}
/// <summary>
/// 验证恢复的协程应该继续执行
/// 验证恢复的协程应该继续执行
/// </summary>
[Test]
public void Resumed_Coroutine_Should_Continue_Execution()
@ -412,7 +406,7 @@ public class CoroutineSchedulerTests
}
/// <summary>
/// 创建简单的立即完成协程
/// 创建简单的立即完成协程
/// </summary>
private IEnumerator<IYieldInstruction> CreateSimpleCoroutine()
{
@ -420,7 +414,7 @@ public class CoroutineSchedulerTests
}
/// <summary>
/// 创建带等待指令的协程
/// 创建带等待指令的协程
/// </summary>
private IEnumerator<IYieldInstruction> CreateYieldingCoroutine(IYieldInstruction yieldInstruction)
{
@ -428,7 +422,7 @@ public class CoroutineSchedulerTests
}
/// <summary>
/// 创建带等待指令和回调的协程
/// 创建带等待指令和回调的协程
/// </summary>
private IEnumerator<IYieldInstruction> CreateYieldingCoroutine(IYieldInstruction yieldInstruction,
Action? onComplete = null)
@ -438,7 +432,7 @@ public class CoroutineSchedulerTests
}
/// <summary>
/// 创建立即完成并执行回调的协程
/// 创建立即完成并执行回调的协程
/// </summary>
private IEnumerator<IYieldInstruction> CreateImmediateCoroutine(Action? onComplete = null)
{
@ -447,7 +441,7 @@ public class CoroutineSchedulerTests
}
/// <summary>
/// 创建计数协程
/// 创建计数协程
/// </summary>
private IEnumerator<IYieldInstruction> CreateCountingCoroutine(Action? onExecute = null)
{
@ -458,7 +452,7 @@ public class CoroutineSchedulerTests
}
/// <summary>
/// 创建抛出异常的协程
/// 创建抛出异常的协程
/// </summary>
private IEnumerator<IYieldInstruction> CreateExceptionCoroutine()
{
@ -468,22 +462,22 @@ public class CoroutineSchedulerTests
}
/// <summary>
/// 测试用时间源类实现ITimeSource接口
/// 测试用时间源类实现ITimeSource接口
/// </summary>
public class TestTimeSource : ITimeSource
{
/// <summary>
/// 获取当前时间
/// 获取当前时间
/// </summary>
public double CurrentTime { get; private set; }
/// <summary>
/// 获取时间增量
/// 获取时间增量
/// </summary>
public double DeltaTime { get; private set; }
/// <summary>
/// 更新时间源状态
/// 更新时间源状态
/// </summary>
public void Update()
{

View File

@ -4,16 +4,16 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.coroutine;
/// <summary>
/// 协程状态枚举的单元测试类
/// 测试内容包括:
/// - 枚举值存在性验证
/// - 枚举值正确性
/// 协程状态枚举的单元测试类
/// 测试内容包括:
/// - 枚举值存在性验证
/// - 枚举值正确性
/// </summary>
[TestFixture]
public class CoroutineStateTests
{
/// <summary>
/// 验证协程状态枚举包含所有预期值
/// 验证协程状态枚举包含所有预期值
/// </summary>
[Test]
public void CoroutineState_Should_Have_All_Expected_Values()
@ -29,7 +29,7 @@ public class CoroutineStateTests
}
/// <summary>
/// 验证枚举基础值为整数类型
/// 验证枚举基础值为整数类型
/// </summary>
[Test]
public void CoroutineState_Should_Be_Integer_Based_Enum()

View File

@ -7,16 +7,16 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.coroutine;
/// <summary>
/// TaskCoroutineExtensions的单元测试类
/// 测试内容包括:
/// - AsCoroutineInstruction方法
/// - StartTaskAsCoroutine方法
/// TaskCoroutineExtensions的单元测试类
/// 测试内容包括:
/// - AsCoroutineInstruction方法
/// - StartTaskAsCoroutine方法
/// </summary>
[TestFixture]
public class TaskCoroutineExtensionsTests
{
/// <summary>
/// 验证AsCoroutineInstruction应该返回WaitForTask
/// 验证AsCoroutineInstruction应该返回WaitForTask
/// </summary>
[Test]
public void AsCoroutineInstruction_Should_Return_WaitForTask()
@ -28,19 +28,19 @@ public class TaskCoroutineExtensionsTests
}
/// <summary>
/// 验证AsCoroutineInstruction<T>应该返回WaitForTask<T>
/// 验证AsCoroutineInstruction<T>应该返回WaitForTask<T>
/// </summary>
[Test]
public void AsCoroutineInstructionOfT_Should_Return_WaitForTaskOfT()
{
var task = Task.FromResult(42);
var instruction = task.AsCoroutineInstruction<int>();
var instruction = task.AsCoroutineInstruction();
Assert.That(instruction, Is.InstanceOf<WaitForTask<int>>());
}
/// <summary>
/// 验证AsCoroutineInstruction可以处理已完成的Task并验证其状态
/// 验证AsCoroutineInstruction可以处理已完成的Task并验证其状态
/// </summary>
[Test]
public void AsCoroutineInstruction_Should_Handle_Completed_Task()
@ -50,21 +50,21 @@ public class TaskCoroutineExtensionsTests
// 验证指令类型
Assert.That(instruction, Is.InstanceOf<WaitForTask>());
// 验证已完成的任务是否立即可用
Assert.That(task.IsCompleted, Is.True);
Assert.That(task.Status, Is.EqualTo(TaskStatus.RanToCompletion));
}
/// <summary>
/// 验证AsCoroutineInstruction<T>应该能够访问Task结果
/// 验证AsCoroutineInstruction<T>应该能够访问Task结果
/// </summary>
[Test]
public void AsCoroutineInstructionOfT_Should_Access_Task_Result()
{
var task = Task.FromResult(42);
var instruction = task.AsCoroutineInstruction<int>();
var instruction = task.AsCoroutineInstruction();
task.Wait();
@ -72,7 +72,7 @@ public class TaskCoroutineExtensionsTests
}
/// <summary>
/// 验证AsCoroutineInstruction应该处理null Task抛出异常
/// 验证AsCoroutineInstruction应该处理null Task抛出异常
/// </summary>
[Test]
public void AsCoroutineInstruction_Should_Handle_Null_Task()
@ -83,18 +83,18 @@ public class TaskCoroutineExtensionsTests
}
/// <summary>
/// 验证AsCoroutineInstruction<T>应该处理null Task抛出异常
/// 验证AsCoroutineInstruction<T>应该处理null Task抛出异常
/// </summary>
[Test]
public void AsCoroutineInstructionOfT_Should_Handle_Null_Task()
{
Task<int> task = null!;
Assert.Throws<ArgumentNullException>(() => task.AsCoroutineInstruction<int>());
Assert.Throws<ArgumentNullException>(() => task.AsCoroutineInstruction());
}
/// <summary>
/// 验证AsCoroutineInstruction应该处理失败的Task
/// 验证AsCoroutineInstruction应该处理失败的Task
/// </summary>
[Test]
public void AsCoroutineInstruction_Should_Handle_Faulted_Task()
@ -106,25 +106,25 @@ public class TaskCoroutineExtensionsTests
}
/// <summary>
/// 验证AsCoroutineInstruction<T>应该处理失败的Task
/// 验证AsCoroutineInstruction<T>应该处理失败的Task
/// </summary>
[Test]
public void AsCoroutineInstructionOfT_Should_Handle_Faulted_Task()
{
var task = Task.FromException<int>(new InvalidOperationException("Test exception"));
var instruction = task.AsCoroutineInstruction<int>();
var instruction = task.AsCoroutineInstruction();
Assert.That(instruction, Is.InstanceOf<WaitForTask<int>>());
}
/// <summary>
/// 验证StartTaskAsCoroutine应该返回有效的协程句柄
/// 验证StartTaskAsCoroutine应该返回有效的协程句柄
/// </summary>
[Test]
public void StartTaskAsCoroutine_Should_Return_Valid_Handle()
{
var timeSource = new TestTimeSource();
var scheduler = new CoroutineScheduler(timeSource, instanceId: 1);
var scheduler = new CoroutineScheduler(timeSource);
var task = Task.CompletedTask;
var handle = scheduler.StartTaskAsCoroutine(task);
@ -133,13 +133,13 @@ public class TaskCoroutineExtensionsTests
}
/// <summary>
/// 验证StartTaskAsCoroutine<T>应该返回有效的协程句柄
/// 验证StartTaskAsCoroutine<T>应该返回有效的协程句柄
/// </summary>
[Test]
public void StartTaskAsCoroutineOfT_Should_Return_Valid_Handle()
{
var timeSource = new TestTimeSource();
var scheduler = new CoroutineScheduler(timeSource, instanceId: 1);
var scheduler = new CoroutineScheduler(timeSource);
var task = Task.FromResult(42);
var handle = scheduler.StartTaskAsCoroutine(task);
@ -148,13 +148,13 @@ public class TaskCoroutineExtensionsTests
}
/// <summary>
/// 验证StartTaskAsCoroutine应该等待Task完成
/// 验证StartTaskAsCoroutine应该等待Task完成
/// </summary>
[Test]
public void StartTaskAsCoroutine_Should_Wait_For_Task_Completion()
{
var timeSource = new TestTimeSource();
var scheduler = new CoroutineScheduler(timeSource, instanceId: 1);
var scheduler = new CoroutineScheduler(timeSource);
var completed = false;
var tcs = new TaskCompletionSource<object?>();
@ -174,13 +174,13 @@ public class TaskCoroutineExtensionsTests
}
/// <summary>
/// 验证StartTaskAsCoroutine<T>应该等待Task完成
/// 验证StartTaskAsCoroutine<T>应该等待Task完成
/// </summary>
[Test]
public void StartTaskAsCoroutineOfT_Should_Wait_For_Task_Completion()
{
var timeSource = new TestTimeSource();
var scheduler = new CoroutineScheduler(timeSource, instanceId: 1);
var scheduler = new CoroutineScheduler(timeSource);
var tcs = new TaskCompletionSource<int>();
@ -198,13 +198,13 @@ public class TaskCoroutineExtensionsTests
}
/// <summary>
/// 验证StartTaskAsCoroutine应该处理已完成的Task
/// 验证StartTaskAsCoroutine应该处理已完成的Task
/// </summary>
[Test]
public void StartTaskAsCoroutine_Should_Handle_Completed_Task()
{
var timeSource = new TestTimeSource();
var scheduler = new CoroutineScheduler(timeSource, instanceId: 1);
var scheduler = new CoroutineScheduler(timeSource);
var task = Task.CompletedTask;
scheduler.StartTaskAsCoroutine(task);
@ -215,13 +215,13 @@ public class TaskCoroutineExtensionsTests
}
/// <summary>
/// 验证StartTaskAsCoroutine应该处理失败的Task
/// 验证StartTaskAsCoroutine应该处理失败的Task
/// </summary>
[Test]
public void StartTaskAsCoroutine_Should_Handle_Faulted_Task()
{
var timeSource = new TestTimeSource();
var scheduler = new CoroutineScheduler(timeSource, instanceId: 1);
var scheduler = new CoroutineScheduler(timeSource);
var task = Task.FromException(new InvalidOperationException("Test"));
scheduler.StartTaskAsCoroutine(task);
@ -230,29 +230,29 @@ public class TaskCoroutineExtensionsTests
}
/// <summary>
/// 验证StartTaskAsCoroutine<T>应该处理失败的Task
/// 验证StartTaskAsCoroutine<T>应该处理失败的Task
/// </summary>
[Test]
public void StartTaskAsCoroutineOfT_Should_Handle_Faulted_Task()
{
var timeSource = new TestTimeSource();
var scheduler = new CoroutineScheduler(timeSource, instanceId: 1);
var scheduler = new CoroutineScheduler(timeSource);
var task = Task.FromException<int>(new InvalidOperationException("Test"));
scheduler.StartTaskAsCoroutine(task);
Assert.DoesNotThrow(() => scheduler.Update());
}
/// <summary>
/// 验证StartTaskAsCoroutine应该与调度器正常协作
/// 验证StartTaskAsCoroutine应该与调度器正常协作
/// </summary>
[Test]
public void StartTaskAsCoroutine_Should_Work_With_Scheduler()
{
var timeSource = new TestTimeSource();
var scheduler = new CoroutineScheduler(timeSource, instanceId: 1);
var scheduler = new CoroutineScheduler(timeSource);
var tcs = new TaskCompletionSource<object?>();
scheduler.StartTaskAsCoroutine(tcs.Task);
@ -273,7 +273,7 @@ public class TaskCoroutineExtensionsTests
}
/// <summary>
/// 测试用时间源类
/// 测试用时间源类
/// </summary>
private class TestTimeSource : ITimeSource
{
@ -286,4 +286,4 @@ public class TaskCoroutineExtensionsTests
CurrentTime += DeltaTime;
}
}
}
}

View File

@ -7,26 +7,26 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.coroutine;
/// <summary>
/// WaitForAllCoroutines的单元测试类
/// 测试内容包括:
/// - 初始化和基本功能
/// - IsDone属性行为
/// - 空句柄集合处理
/// - 单个协程处理
/// - 多个协程处理
/// - 与CoroutineScheduler集成
/// WaitForAllCoroutines的单元测试类
/// 测试内容包括:
/// - 初始化和基本功能
/// - IsDone属性行为
/// - 空句柄集合处理
/// - 单个协程处理
/// - 多个协程处理
/// - 与CoroutineScheduler集成
/// </summary>
[TestFixture]
public class WaitForAllCoroutinesTests
{
/// <summary>
/// 验证WaitForAllCoroutines初始状态为未完成
/// 验证WaitForAllCoroutines初始状态为未完成
/// </summary>
[Test]
public void WaitForAllCoroutines_Should_Not_Be_Done_Initially_With_Running_Coroutines()
{
var timeSource = new TestTimeSource();
var scheduler = new CoroutineScheduler(timeSource, instanceId: 1);
var scheduler = new CoroutineScheduler(timeSource, 1);
var coroutine1 = CreateDelayedCoroutine(() => { }, 1.0);
var coroutine2 = CreateDelayedCoroutine(() => { }, 1.0);
@ -42,13 +42,13 @@ public class WaitForAllCoroutinesTests
}
/// <summary>
/// 验证WaitForAllCoroutines应该在所有协程完成后完成
/// 验证WaitForAllCoroutines应该在所有协程完成后完成
/// </summary>
[Test]
public void WaitForAllCoroutines_Should_Be_Done_When_All_Coroutines_Complete()
{
var timeSource = new TestTimeSource();
var scheduler = new CoroutineScheduler(timeSource, instanceId: 1);
var scheduler = new CoroutineScheduler(timeSource, 1);
var coroutine1 = CreateSimpleCoroutine();
var coroutine2 = CreateSimpleCoroutine();
@ -67,13 +67,13 @@ public class WaitForAllCoroutinesTests
}
/// <summary>
/// 验证WaitForAllCoroutines应该在所有协程完成后完成使用Delay
/// 验证WaitForAllCoroutines应该在所有协程完成后完成使用Delay
/// </summary>
[Test]
public void WaitForAllCoroutines_Should_Wait_For_All_Delayed_Coroutines()
{
var timeSource = new TestTimeSource();
var scheduler = new CoroutineScheduler(timeSource, instanceId: 1);
var scheduler = new CoroutineScheduler(timeSource, 1);
var executionCount = 0;
var coroutine1 = CreateDelayedCoroutine(() => executionCount++, 1.0);
@ -92,23 +92,20 @@ public class WaitForAllCoroutinesTests
Assert.That(wait.IsDone, Is.False);
Assert.That(executionCount, Is.EqualTo(0));
for (var i = 0; i < 12; i++)
{
scheduler.Update();
}
for (var i = 0; i < 12; i++) scheduler.Update();
Assert.That(wait.IsDone, Is.True);
Assert.That(executionCount, Is.EqualTo(3));
}
/// <summary>
/// 验证WaitForAllCoroutines应该处理空句柄列表
/// 验证WaitForAllCoroutines应该处理空句柄列表
/// </summary>
[Test]
public void WaitForAllCoroutines_Should_Handle_Empty_Handles_List()
{
var timeSource = new TestTimeSource();
var scheduler = new CoroutineScheduler(timeSource, instanceId: 1);
var scheduler = new CoroutineScheduler(timeSource, 1);
var handles = Array.Empty<CoroutineHandle>();
var wait = new WaitForAllCoroutines(scheduler, handles);
@ -117,19 +114,19 @@ public class WaitForAllCoroutinesTests
}
/// <summary>
/// 验证WaitForAllCoroutines应该抛出ArgumentNullException当handles为null
/// 验证WaitForAllCoroutines应该抛出ArgumentNullException当handles为null
/// </summary>
[Test]
public void WaitForAllCoroutines_Should_Throw_ArgumentNullException_When_Handles_Is_Null()
{
var timeSource = new TestTimeSource();
var scheduler = new CoroutineScheduler(timeSource, instanceId: 1);
var scheduler = new CoroutineScheduler(timeSource, 1);
Assert.Throws<ArgumentNullException>(() => new WaitForAllCoroutines(scheduler, null!));
}
/// <summary>
/// 验证WaitForAllCoroutines应该抛出ArgumentNullException当scheduler为null
/// 验证WaitForAllCoroutines应该抛出ArgumentNullException当scheduler为null
/// </summary>
[Test]
public void WaitForAllCoroutines_Should_Throw_ArgumentNullException_When_Scheduler_Is_Null()
@ -140,13 +137,13 @@ public class WaitForAllCoroutinesTests
}
/// <summary>
/// 验证WaitForAllCoroutines应该处理单个协程
/// 验证WaitForAllCoroutines应该处理单个协程
/// </summary>
[Test]
public void WaitForAllCoroutines_Should_Handle_Single_Coroutine()
{
var timeSource = new TestTimeSource();
var scheduler = new CoroutineScheduler(timeSource, instanceId: 1);
var scheduler = new CoroutineScheduler(timeSource, 1);
var coroutine = CreateSimpleCoroutine();
var handles = new List<CoroutineHandle> { scheduler.Run(coroutine) };
@ -159,13 +156,13 @@ public class WaitForAllCoroutinesTests
}
/// <summary>
/// 验证WaitForAllCoroutines应该在部分协程完成时未完成
/// 验证WaitForAllCoroutines应该在部分协程完成时未完成
/// </summary>
[Test]
public void WaitForAllCoroutines_Should_Not_Be_Done_When_Some_Coroutines_Complete()
{
var timeSource = new TestTimeSource();
var scheduler = new CoroutineScheduler(timeSource, instanceId: 1);
var scheduler = new CoroutineScheduler(timeSource, 1);
var executionCount = 0;
var coroutine1 = CreateSimpleCoroutine();
@ -188,13 +185,13 @@ public class WaitForAllCoroutinesTests
}
/// <summary>
/// 验证WaitForAllCoroutines应该处理被终止的协程
/// 验证WaitForAllCoroutines应该处理被终止的协程
/// </summary>
[Test]
public void WaitForAllCoroutines_Should_Handle_Killed_Coroutines()
{
var timeSource = new TestTimeSource();
var scheduler = new CoroutineScheduler(timeSource, instanceId: 1);
var scheduler = new CoroutineScheduler(timeSource, 1);
var coroutine1 = CreateDelayedCoroutine(() => { }, 1.0);
var coroutine2 = CreateDelayedCoroutine(() => { }, 1.0);
@ -219,13 +216,13 @@ public class WaitForAllCoroutinesTests
}
/// <summary>
/// 验证WaitForAllCoroutines应该处理被暂停和恢复的协程
/// 验证WaitForAllCoroutines应该处理被暂停和恢复的协程
/// </summary>
[Test]
public void WaitForAllCoroutines_Should_Handle_Paused_And_Resumed_Coroutines()
{
var timeSource = new TestTimeSource();
var scheduler = new CoroutineScheduler(timeSource, instanceId: 1);
var scheduler = new CoroutineScheduler(timeSource, 1);
var executionCount = 0;
var coroutine1 = CreateDelayedCoroutine(() => executionCount++, 1.0);
@ -241,33 +238,27 @@ public class WaitForAllCoroutinesTests
scheduler.Pause(handles[0]);
for (var i = 0; i < 12; i++)
{
scheduler.Update();
}
for (var i = 0; i < 12; i++) scheduler.Update();
Assert.That(wait.IsDone, Is.False);
Assert.That(executionCount, Is.EqualTo(1));
scheduler.Resume(handles[0]);
for (var i = 0; i < 12; i++)
{
scheduler.Update();
}
for (var i = 0; i < 12; i++) scheduler.Update();
Assert.That(wait.IsDone, Is.True);
Assert.That(executionCount, Is.EqualTo(2));
}
/// <summary>
/// 验证WaitForAllCoroutines的Update方法不影响状态
/// 验证WaitForAllCoroutines的Update方法不影响状态
/// </summary>
[Test]
public void WaitForAllCoroutines_Update_Should_Not_Affect_State()
{
var timeSource = new TestTimeSource();
var scheduler = new CoroutineScheduler(timeSource, instanceId: 1);
var scheduler = new CoroutineScheduler(timeSource, 1);
var coroutine = CreateDelayedCoroutine(() => { }, 1.0);
var handles = new List<CoroutineHandle> { scheduler.Run(coroutine) };
@ -281,13 +272,13 @@ public class WaitForAllCoroutinesTests
}
/// <summary>
/// 验证WaitForAllCoroutines应该处理无效句柄
/// 验证WaitForAllCoroutines应该处理无效句柄
/// </summary>
[Test]
public void WaitForAllCoroutines_Should_Handle_Invalid_Handles()
{
var timeSource = new TestTimeSource();
var scheduler = new CoroutineScheduler(timeSource, instanceId: 1);
var scheduler = new CoroutineScheduler(timeSource, 1);
var handles = new List<CoroutineHandle> { default };
@ -297,13 +288,13 @@ public class WaitForAllCoroutinesTests
}
/// <summary>
/// 验证WaitForAllCoroutines应该处理混合的有效和无效句柄
/// 验证WaitForAllCoroutines应该处理混合的有效和无效句柄
/// </summary>
[Test]
public void WaitForAllCoroutines_Should_Handle_Mixed_Valid_And_Invalid_Handles()
{
var timeSource = new TestTimeSource();
var scheduler = new CoroutineScheduler(timeSource, instanceId: 1);
var scheduler = new CoroutineScheduler(timeSource, 1);
var coroutine = CreateSimpleCoroutine();
var handles = new List<CoroutineHandle>
@ -320,42 +311,36 @@ public class WaitForAllCoroutinesTests
}
/// <summary>
/// 验证WaitForAllCoroutines应该处理大量协程
/// 验证WaitForAllCoroutines应该处理大量协程
/// </summary>
[Test]
public void WaitForAllCoroutines_Should_Handle_Many_Coroutines()
{
var timeSource = new TestTimeSource();
var scheduler = new CoroutineScheduler(timeSource, instanceId: 1);
var scheduler = new CoroutineScheduler(timeSource, 1);
var executionCount = 0;
var handles = new List<CoroutineHandle>();
for (var i = 0; i < 20; i++)
{
handles.Add(scheduler.Run(CreateDelayedCoroutine(() => executionCount++, 1.0)));
}
for (var i = 0; i < 20; i++) handles.Add(scheduler.Run(CreateDelayedCoroutine(() => executionCount++, 1.0)));
var wait = new WaitForAllCoroutines(scheduler, handles);
Assert.That(wait.IsDone, Is.False);
for (var i = 0; i < 120; i++)
{
scheduler.Update();
}
for (var i = 0; i < 120; i++) scheduler.Update();
Assert.That(wait.IsDone, Is.True);
Assert.That(executionCount, Is.EqualTo(20));
}
/// <summary>
/// 验证WaitForAllCoroutines应该处理抛出异常的协程
/// 验证WaitForAllCoroutines应该处理抛出异常的协程
/// </summary>
[Test]
public void WaitForAllCoroutines_Should_Handle_Coroutines_With_Exceptions()
{
var timeSource = new TestTimeSource();
var scheduler = new CoroutineScheduler(timeSource, instanceId: 1);
var scheduler = new CoroutineScheduler(timeSource, 1);
var coroutine1 = CreateSimpleCoroutine();
var coroutine2 = CreateExceptionCoroutine();
@ -376,13 +361,13 @@ public class WaitForAllCoroutinesTests
}
/// <summary>
/// 验证WaitForAllCoroutines应该与ParallelCoroutines扩展方法一起工作
/// 验证WaitForAllCoroutines应该与ParallelCoroutines扩展方法一起工作
/// </summary>
[Test]
public void WaitForAllCoroutines_Should_Work_With_ParallelCoroutines()
{
var timeSource = new TestTimeSource();
var scheduler = new CoroutineScheduler(timeSource, instanceId: 1);
var scheduler = new CoroutineScheduler(timeSource, 1);
var executionOrder = new List<int>();
var coroutine1 = CreateDelayedCoroutine(() => executionOrder.Add(1), 0.5);
@ -406,13 +391,13 @@ public class WaitForAllCoroutinesTests
}
/// <summary>
/// 验证WaitForAllCoroutines应该实现IYieldInstruction接口
/// 验证WaitForAllCoroutines应该实现IYieldInstruction接口
/// </summary>
[Test]
public void WaitForAllCoroutines_Should_Implement_IYieldInstruction()
{
var timeSource = new TestTimeSource();
var scheduler = new CoroutineScheduler(timeSource, instanceId: 1);
var scheduler = new CoroutineScheduler(timeSource, 1);
var handles = Array.Empty<CoroutineHandle>();
var wait = new WaitForAllCoroutines(scheduler, handles);
@ -421,13 +406,13 @@ public class WaitForAllCoroutinesTests
}
/// <summary>
/// 验证WaitForAllCoroutines应该在所有协程立即完成时立即完成
/// 验证WaitForAllCoroutines应该在所有协程立即完成时立即完成
/// </summary>
[Test]
public void WaitForAllCoroutines_Should_Be_Done_Immediately_When_All_Coroutines_Complete_Immediately()
{
var timeSource = new TestTimeSource();
var scheduler = new CoroutineScheduler(timeSource, instanceId: 1);
var scheduler = new CoroutineScheduler(timeSource, 1);
var coroutine1 = CreateSimpleCoroutine();
var coroutine2 = CreateSimpleCoroutine();
@ -447,13 +432,13 @@ public class WaitForAllCoroutinesTests
}
/// <summary>
/// 验证WaitForAllCoroutines应该处理重复的句柄
/// 验证WaitForAllCoroutines应该处理重复的句柄
/// </summary>
[Test]
public void WaitForAllCoroutines_Should_Handle_Duplicate_Handles()
{
var timeSource = new TestTimeSource();
var scheduler = new CoroutineScheduler(timeSource, instanceId: 1);
var scheduler = new CoroutineScheduler(timeSource, 1);
var coroutine = CreateDelayedCoroutine(() => { }, 1.0);
var handle = scheduler.Run(coroutine);
@ -461,16 +446,13 @@ public class WaitForAllCoroutinesTests
var wait = new WaitForAllCoroutines(scheduler, handles);
for (var i = 0; i < 12; i++)
{
scheduler.Update();
}
for (var i = 0; i < 12; i++) scheduler.Update();
Assert.That(wait.IsDone, Is.True);
}
/// <summary>
/// 创建简单的立即完成协程
/// 创建简单的立即完成协程
/// </summary>
private IEnumerator<IYieldInstruction> CreateSimpleCoroutine()
{
@ -478,7 +460,7 @@ public class WaitForAllCoroutinesTests
}
/// <summary>
/// 创建带回调的协程
/// 创建带回调的协程
/// </summary>
private IEnumerator<IYieldInstruction> CreateCoroutineWithCallback(int id, Action callback)
{
@ -487,7 +469,7 @@ public class WaitForAllCoroutinesTests
}
/// <summary>
/// 创建延迟协程
/// 创建延迟协程
/// </summary>
private IEnumerator<IYieldInstruction> CreateDelayedCoroutine(Action callback, double delay)
{
@ -496,7 +478,7 @@ public class WaitForAllCoroutinesTests
}
/// <summary>
/// 创建抛出异常的协程
/// 创建抛出异常的协程
/// </summary>
private IEnumerator<IYieldInstruction> CreateExceptionCoroutine()
{
@ -505,7 +487,7 @@ public class WaitForAllCoroutinesTests
}
/// <summary>
/// 测试用时间源类
/// 测试用时间源类
/// </summary>
private class TestTimeSource : ITimeSource
{
@ -518,4 +500,4 @@ public class WaitForAllCoroutinesTests
CurrentTime += DeltaTime;
}
}
}
}

View File

@ -5,18 +5,18 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.coroutine;
/// <summary>
/// WaitForProgress的单元测试类
/// 测试内容包括:
/// - 初始化和基本功能
/// - 进度回调
/// - 边界条件
/// - 异常处理
/// WaitForProgress的单元测试类
/// 测试内容包括:
/// - 初始化和基本功能
/// - 进度回调
/// - 边界条件
/// - 异常处理
/// </summary>
[TestFixture]
public class WaitForProgressTests
{
/// <summary>
/// 验证WaitForProgress初始状态为未完成
/// 验证WaitForProgress初始状态为未完成
/// </summary>
[Test]
public void WaitForProgress_Should_Not_Be_Done_Initially()
@ -28,7 +28,7 @@ public class WaitForProgressTests
}
/// <summary>
/// 验证WaitForProgress应该在指定时间后完成
/// 验证WaitForProgress应该在指定时间后完成
/// </summary>
[Test]
public void WaitForProgress_Should_Be_Done_After_Duration()
@ -44,7 +44,7 @@ public class WaitForProgressTests
}
/// <summary>
/// 验证WaitForProgress应该在Update时调用进度回调
/// 验证WaitForProgress应该在Update时调用进度回调
/// </summary>
[Test]
public void WaitForProgress_Should_Call_Progress_Callback_On_Update()
@ -58,7 +58,7 @@ public class WaitForProgressTests
}
/// <summary>
/// 验证进度值应该在0到1之间
/// 验证进度值应该在0到1之间
/// </summary>
[Test]
public void WaitForProgress_Should_Have_Progress_Between_0_And_1()
@ -66,10 +66,7 @@ public class WaitForProgressTests
var progressValues = new List<float>();
var wait = new WaitForProgress(1.0, progressValues.Add);
while (!wait.IsDone)
{
wait.Update(0.1);
}
while (!wait.IsDone) wait.Update(0.1);
foreach (var progress in progressValues)
{
@ -79,7 +76,7 @@ public class WaitForProgressTests
}
/// <summary>
/// 验证进度值应该随着时间增加
/// 验证进度值应该随着时间增加
/// </summary>
[Test]
public void WaitForProgress_Should_Increase_Progress_Over_Time()
@ -101,7 +98,7 @@ public class WaitForProgressTests
}
/// <summary>
/// 验证WaitForProgress应该抛出ArgumentNullException当回调为null
/// 验证WaitForProgress应该抛出ArgumentNullException当回调为null
/// </summary>
[Test]
public void WaitForProgress_Should_Throw_ArgumentNullException_When_Callback_Is_Null()
@ -110,7 +107,7 @@ public class WaitForProgressTests
}
/// <summary>
/// 验证WaitForProgress应该抛出ArgumentException当duration为0
/// 验证WaitForProgress应该抛出ArgumentException当duration为0
/// </summary>
[Test]
public void WaitForProgress_Should_Throw_ArgumentException_When_Duration_Is_Zero()
@ -119,7 +116,7 @@ public class WaitForProgressTests
}
/// <summary>
/// 验证WaitForProgress应该抛出ArgumentException当duration为负数
/// 验证WaitForProgress应该抛出ArgumentException当duration为负数
/// </summary>
[Test]
public void WaitForProgress_Should_Throw_ArgumentException_When_Duration_Is_Negative()
@ -128,7 +125,7 @@ public class WaitForProgressTests
}
/// <summary>
/// 验证WaitForProgress应该处理超过duration的更新
/// 验证WaitForProgress应该处理超过duration的更新
/// </summary>
[Test]
public void WaitForProgress_Should_Clamp_Progress_To_1_When_Exceeding_Duration()
@ -144,7 +141,7 @@ public class WaitForProgressTests
}
/// <summary>
/// 验证WaitForProgress可以处理精确的duration
/// 验证WaitForProgress可以处理精确的duration
/// </summary>
[Test]
public void WaitForProgress_Should_Handle_Exact_Duration()
@ -160,7 +157,7 @@ public class WaitForProgressTests
}
/// <summary>
/// 验证WaitForProgress可以处理不同的delta time
/// 验证WaitForProgress可以处理不同的delta time
/// </summary>
[Test]
public void WaitForProgress_Should_Handle_Variable_Delta_Time()
@ -179,7 +176,7 @@ public class WaitForProgressTests
}
/// <summary>
/// 验证WaitForProgress可以处理多次Update
/// 验证WaitForProgress可以处理多次Update
/// </summary>
[Test]
public void WaitForProgress_Should_Handle_Multiple_Updates()
@ -199,7 +196,7 @@ public class WaitForProgressTests
}
/// <summary>
/// 验证WaitForProgress应该确保最后一个进度为1.0
/// 验证WaitForProgress应该确保最后一个进度为1.0
/// </summary>
[Test]
public void WaitForProgress_Should_Ensure_Final_Progress_Is_1()
@ -207,16 +204,13 @@ public class WaitForProgressTests
var progressValues = new List<float>();
var wait = new WaitForProgress(1.0, progressValues.Add);
while (!wait.IsDone)
{
wait.Update(0.1);
}
while (!wait.IsDone) wait.Update(0.1);
Assert.That(progressValues[^1], Is.EqualTo(1.0f).Within(0.01f));
}
/// <summary>
/// 验证WaitForProgress实现IYieldInstruction接口
/// 验证WaitForProgress实现IYieldInstruction接口
/// </summary>
[Test]
public void WaitForProgress_Should_Implement_IYieldInstruction()
@ -228,7 +222,7 @@ public class WaitForProgressTests
}
/// <summary>
/// 验证WaitForProgress可以处理很短的duration
/// 验证WaitForProgress可以处理很短的duration
/// </summary>
[Test]
public void WaitForProgress_Should_Handle_Short_Duration()
@ -242,7 +236,7 @@ public class WaitForProgressTests
}
/// <summary>
/// 验证WaitForProgress可以处理很长的duration
/// 验证WaitForProgress可以处理很长的duration
/// </summary>
[Test]
public void WaitForProgress_Should_Handle_Long_Duration()
@ -258,7 +252,7 @@ public class WaitForProgressTests
}
/// <summary>
/// 验证WaitForProgress在完成前不会超过1.0
/// 验证WaitForProgress在完成前不会超过1.0
/// </summary>
[Test]
public void WaitForProgress_Should_Not_Exceed_1_Before_Completion()
@ -277,7 +271,7 @@ public class WaitForProgressTests
}
/// <summary>
/// 验证WaitForProgress的Update方法不影响未完成状态
/// 验证WaitForProgress的Update方法不影响未完成状态
/// </summary>
[Test]
public void WaitForProgress_Update_Should_Not_Affect_Before_Completion()
@ -291,4 +285,4 @@ public class WaitForProgressTests
wait.Update(0.1);
Assert.That(wait.IsDone, Is.False);
}
}
}

View File

@ -5,18 +5,20 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.coroutine;
/// <summary>
/// WaitForTask的单元测试类
/// 测试内容包括:
/// - WaitForTask初始化和等待
/// - WaitForTask<T>初始化、等待和结果获取
/// - 异常处理
/// - 边界条件
/// WaitForTask的单元测试类
/// 测试内容包括:
/// - WaitForTask初始化和等待
/// - WaitForTask
/// <T>
/// 初始化、等待和结果获取
/// - 异常处理
/// - 边界条件
/// </summary>
[TestFixture]
public class WaitForTaskTests
{
/// <summary>
/// 验证WaitForTask初始状态为未完成
/// 验证WaitForTask初始状态为未完成
/// </summary>
[Test]
public void WaitForTask_Should_Not_Be_Done_Initially()
@ -26,9 +28,9 @@ public class WaitForTaskTests
Assert.That(wait.IsDone, Is.False);
}
/// <summary>
/// 验证WaitForTask应该在Task完成后完成
/// 验证WaitForTask应该在Task完成后完成
/// </summary>
[Test]
public void WaitForTask_Should_Be_Done_After_Task_Completes()
@ -46,7 +48,7 @@ public class WaitForTaskTests
}
/// <summary>
/// 验证WaitForTask应该处理已完成的Task
/// 验证WaitForTask应该处理已完成的Task
/// </summary>
[Test]
public void WaitForTask_Should_Handle_Already_Completed_Task()
@ -63,7 +65,7 @@ public class WaitForTaskTests
}
/// <summary>
/// 验证WaitForTask应该处理失败的Task
/// 验证WaitForTask应该处理失败的Task
/// </summary>
[Test]
public void WaitForTask_Should_Handle_Faulted_Task()
@ -79,7 +81,7 @@ public class WaitForTaskTests
}
/// <summary>
/// 验证WaitForTask应该处理取消的Task
/// 验证WaitForTask应该处理取消的Task
/// </summary>
[Test]
public void WaitForTask_Should_Handle_Cancelled_Task()
@ -98,7 +100,7 @@ public class WaitForTaskTests
}
/// <summary>
/// 验证WaitForTask应该抛出ArgumentNullException当task为null
/// 验证WaitForTask应该抛出ArgumentNullException当task为null
/// </summary>
[Test]
public void WaitForTask_Should_Throw_ArgumentNullException_When_Task_Is_Null()
@ -107,7 +109,7 @@ public class WaitForTaskTests
}
/// <summary>
/// 验证WaitForTask<T>初始状态为未完成
/// 验证WaitForTask<T>初始状态为未完成
/// </summary>
[Test]
public void WaitForTaskOfT_Should_Not_Be_Done_Initially()
@ -119,7 +121,7 @@ public class WaitForTaskTests
}
/// <summary>
/// 验证WaitForTask<T>应该在Task完成后完成
/// 验证WaitForTask<T>应该在Task完成后完成
/// </summary>
[Test]
public void WaitForTaskOfT_Should_Be_Done_After_Task_Completes()
@ -137,7 +139,7 @@ public class WaitForTaskTests
}
/// <summary>
/// 验证WaitForTask<T>应该返回Task的结果
/// 验证WaitForTask<T>应该返回Task的结果
/// </summary>
[Test]
public void WaitForTaskOfT_Should_Return_Task_Result()
@ -153,7 +155,7 @@ public class WaitForTaskTests
}
/// <summary>
/// 验证WaitForTask<T>应该处理已完成的Task
/// 验证WaitForTask<T>应该处理已完成的Task
/// </summary>
[Test]
public void WaitForTaskOfT_Should_Handle_Already_Completed_Task()
@ -171,7 +173,7 @@ public class WaitForTaskTests
}
/// <summary>
/// 验证WaitForTask<T>应该处理失败的Task
/// 验证WaitForTask<T>应该处理失败的Task
/// </summary>
[Test]
public void WaitForTaskOfT_Should_Handle_Faulted_Task()
@ -185,11 +187,14 @@ public class WaitForTaskTests
Assert.That(wait.IsDone, Is.True);
Assert.Throws<InvalidOperationException>(() => { var _ = wait.Result; });
Assert.Throws<InvalidOperationException>(() =>
{
var _ = wait.Result;
});
}
/// <summary>
/// 验证WaitForTask<T>应该抛出ArgumentNullException当task为null
/// 验证WaitForTask<T>应该抛出ArgumentNullException当task为null
/// </summary>
[Test]
public void WaitForTaskOfT_Should_Throw_ArgumentNullException_When_Task_Is_Null()
@ -198,7 +203,7 @@ public class WaitForTaskTests
}
/// <summary>
/// 验证WaitForTask实现IYieldInstruction接口
/// 验证WaitForTask实现IYieldInstruction接口
/// </summary>
[Test]
public void WaitForTask_Should_Implement_IYieldInstruction()
@ -210,7 +215,7 @@ public class WaitForTaskTests
}
/// <summary>
/// 验证WaitForTask<T>实现IYieldInstruction接口
/// 验证WaitForTask<T>实现IYieldInstruction接口
/// </summary>
[Test]
public void WaitForTaskOfT_Should_Implement_IYieldInstruction()
@ -222,7 +227,7 @@ public class WaitForTaskTests
}
/// <summary>
/// 验证WaitForTask的Update方法不影响状态
/// 验证WaitForTask的Update方法不影响状态
/// </summary>
[Test]
public void WaitForTask_Update_Should_Not_Affect_State()
@ -238,7 +243,7 @@ public class WaitForTaskTests
}
/// <summary>
/// 验证WaitForTask<T>的Update方法不影响状态
/// 验证WaitForTask<T>的Update方法不影响状态
/// </summary>
[Test]
public void WaitForTaskOfT_Update_Should_Not_Affect_State()
@ -254,7 +259,7 @@ public class WaitForTaskTests
}
/// <summary>
/// 验证WaitForTask在延迟完成后能够正确等待
/// 验证WaitForTask在延迟完成后能够正确等待
/// </summary>
[Test]
public void WaitForTask_Should_Wait_For_Delayed_Task()
@ -271,7 +276,7 @@ public class WaitForTaskTests
}
/// <summary>
/// 验证WaitForTask<T>在异步操作完成后能够正确获取结果
/// 验证WaitForTask<T>在异步操作完成后能够正确获取结果
/// </summary>
[Test]
public async Task WaitForTaskOfT_Should_Get_Result_From_Async_Operation()
@ -294,7 +299,7 @@ public class WaitForTaskTests
}
/// <summary>
/// 验证WaitForTask应该处理长时间运行的Task
/// 验证WaitForTask应该处理长时间运行的Task
/// </summary>
[Test]
public void WaitForTask_Should_Handle_Long_Running_Task()
@ -308,4 +313,4 @@ public class WaitForTaskTests
Assert.That(wait.IsDone, Is.True);
}
}
}

View File

@ -5,20 +5,20 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.coroutine;
/// <summary>
/// 等待指令的单元测试类
/// 测试内容包括:
/// - Delay指令
/// - WaitOneFrame指令
/// - WaitForFrames指令
/// - WaitUntil指令
/// - WaitWhile指令
/// - WaitForCoroutine指令
/// 等待指令的单元测试类
/// 测试内容包括:
/// - Delay指令
/// - WaitOneFrame指令
/// - WaitForFrames指令
/// - WaitUntil指令
/// - WaitWhile指令
/// - WaitForCoroutine指令
/// </summary>
[TestFixture]
public class YieldInstructionTests
{
/// <summary>
/// 验证Delay指令初始状态为未完成
/// 验证Delay指令初始状态为未完成
/// </summary>
[Test]
public void Delay_Should_Not_Be_Done_Initially()
@ -29,7 +29,7 @@ public class YieldInstructionTests
}
/// <summary>
/// 验证Delay指令应该在指定时间后完成
/// 验证Delay指令应该在指定时间后完成
/// </summary>
[Test]
public void Delay_Should_Be_Done_After_Specified_Time()
@ -44,7 +44,7 @@ public class YieldInstructionTests
}
/// <summary>
/// 验证Delay指令可以处理零秒延迟
/// 验证Delay指令可以处理零秒延迟
/// </summary>
[Test]
public void Delay_Should_Handle_Zero_Seconds()
@ -55,7 +55,7 @@ public class YieldInstructionTests
}
/// <summary>
/// 验证Delay指令可以处理负数秒数
/// 验证Delay指令可以处理负数秒数
/// </summary>
[Test]
public void Delay_Should_Handle_Negative_Seconds()
@ -66,7 +66,7 @@ public class YieldInstructionTests
}
/// <summary>
/// 验证WaitOneFrame指令初始状态为未完成
/// 验证WaitOneFrame指令初始状态为未完成
/// </summary>
[Test]
public void WaitOneFrame_Should_Not_Be_Done_Initially()
@ -77,7 +77,7 @@ public class YieldInstructionTests
}
/// <summary>
/// 验证WaitOneFrame指令应该在第一次Update后完成
/// 验证WaitOneFrame指令应该在第一次Update后完成
/// </summary>
[Test]
public void WaitOneFrame_Should_Be_Done_After_First_Update()
@ -89,7 +89,7 @@ public class YieldInstructionTests
}
/// <summary>
/// 验证WaitForFrames指令初始状态为未完成
/// 验证WaitForFrames指令初始状态为未完成
/// </summary>
[Test]
public void WaitForFrames_Should_Not_Be_Done_Initially()
@ -100,7 +100,7 @@ public class YieldInstructionTests
}
/// <summary>
/// 验证WaitForFrames指令应该在指定帧数后完成
/// 验证WaitForFrames指令应该在指定帧数后完成
/// </summary>
[Test]
public void WaitForFrames_Should_Be_Done_After_Specified_Frames()
@ -118,7 +118,7 @@ public class YieldInstructionTests
}
/// <summary>
/// 验证WaitForFrames指令可以处理最小帧数1
/// 验证WaitForFrames指令可以处理最小帧数1
/// </summary>
[Test]
public void WaitForFrames_Should_Handle_Minimum_Frames_Of_1()
@ -130,7 +130,7 @@ public class YieldInstructionTests
}
/// <summary>
/// 验证WaitForFrames指令可以处理0帧数会被修正为1
/// 验证WaitForFrames指令可以处理0帧数会被修正为1
/// </summary>
[Test]
public void WaitForFrames_Should_Handle_Zero_Frames_As_1()
@ -142,7 +142,7 @@ public class YieldInstructionTests
}
/// <summary>
/// 验证WaitForFrames指令可以处理负数帧数会被修正为1
/// 验证WaitForFrames指令可以处理负数帧数会被修正为1
/// </summary>
[Test]
public void WaitForFrames_Should_Handle_Negative_Frames_As_1()
@ -154,7 +154,7 @@ public class YieldInstructionTests
}
/// <summary>
/// 验证WaitForFrames指令每次Update减少剩余帧数
/// 验证WaitForFrames指令每次Update减少剩余帧数
/// </summary>
[Test]
public void WaitForFrames_Should_Decrement_On_Each_Update()
@ -171,7 +171,7 @@ public class YieldInstructionTests
}
/// <summary>
/// 验证WaitUntil指令使用谓词函数
/// 验证WaitUntil指令使用谓词函数
/// </summary>
[Test]
public void WaitUntil_Should_Use_Predicate_Function()
@ -186,7 +186,7 @@ public class YieldInstructionTests
}
/// <summary>
/// 验证WaitUntil指令应该在条件满足时完成
/// 验证WaitUntil指令应该在条件满足时完成
/// </summary>
[Test]
public void WaitUntil_Should_Be_Done_When_Condition_Is_True()
@ -207,7 +207,7 @@ public class YieldInstructionTests
}
/// <summary>
/// 验证WaitUntil指令抛出ArgumentNullException当predicate为null
/// 验证WaitUntil指令抛出ArgumentNullException当predicate为null
/// </summary>
[Test]
public void WaitUntil_Should_Throw_ArgumentNullException_When_Predicate_Is_Null()
@ -216,7 +216,7 @@ public class YieldInstructionTests
}
/// <summary>
/// 验证WaitWhile指令使用谓词函数
/// 验证WaitWhile指令使用谓词函数
/// </summary>
[Test]
public void WaitWhile_Should_Use_Predicate_Function()
@ -246,7 +246,7 @@ public class YieldInstructionTests
}
/// <summary>
/// 验证WaitWhile指令应该在条件为假时完成
/// 验证WaitWhile指令应该在条件为假时完成
/// </summary>
[Test]
public void WaitWhile_Should_Be_Done_When_Condition_Is_False()
@ -261,7 +261,7 @@ public class YieldInstructionTests
}
/// <summary>
/// 验证WaitWhile指令应该在条件为真时持续等待
/// 验证WaitWhile指令应该在条件为真时持续等待
/// </summary>
[Test]
public void WaitWhile_Should_Continue_Waiting_While_Condition_Is_True()
@ -271,17 +271,14 @@ public class YieldInstructionTests
Assert.That(wait.IsDone, Is.False);
for (var i = 0; i < 10; i++)
{
Assert.That(wait.IsDone, Is.False);
}
for (var i = 0; i < 10; i++) Assert.That(wait.IsDone, Is.False);
continueWaiting = false;
Assert.That(wait.IsDone, Is.True);
}
/// <summary>
/// 验证WaitWhile指令抛出ArgumentNullException当predicate为null
/// 验证WaitWhile指令抛出ArgumentNullException当predicate为null
/// </summary>
[Test]
public void WaitWhile_Should_Throw_ArgumentNullException_When_Predicate_Is_Null()
@ -290,7 +287,7 @@ public class YieldInstructionTests
}
/// <summary>
/// 验证WaitForCoroutine指令初始状态为未完成
/// 验证WaitForCoroutine指令初始状态为未完成
/// </summary>
[Test]
public void WaitForCoroutine_Should_Not_Be_Done_Initially()
@ -301,7 +298,7 @@ public class YieldInstructionTests
}
/// <summary>
/// 验证WaitForCoroutine指令的Update方法不影响状态
/// 验证WaitForCoroutine指令的Update方法不影响状态
/// </summary>
[Test]
public void WaitForCoroutine_Update_Should_Not_Affect_State()
@ -316,7 +313,7 @@ public class YieldInstructionTests
}
/// <summary>
/// 验证Delay指令实现IYieldInstruction接口
/// 验证Delay指令实现IYieldInstruction接口
/// </summary>
[Test]
public void Delay_Should_Implement_IYieldInstruction_Interface()
@ -327,7 +324,7 @@ public class YieldInstructionTests
}
/// <summary>
/// 验证WaitOneFrame指令实现IYieldInstruction接口
/// 验证WaitOneFrame指令实现IYieldInstruction接口
/// </summary>
[Test]
public void WaitOneFrame_Should_Implement_IYieldInstruction_Interface()
@ -338,7 +335,7 @@ public class YieldInstructionTests
}
/// <summary>
/// 验证WaitForFrames指令实现IYieldInstruction接口
/// 验证WaitForFrames指令实现IYieldInstruction接口
/// </summary>
[Test]
public void WaitForFrames_Should_Implement_IYieldInstruction_Interface()
@ -349,7 +346,7 @@ public class YieldInstructionTests
}
/// <summary>
/// 验证WaitUntil指令实现IYieldInstruction接口
/// 验证WaitUntil指令实现IYieldInstruction接口
/// </summary>
[Test]
public void WaitUntil_Should_Implement_IYieldInstruction_Interface()
@ -360,7 +357,7 @@ public class YieldInstructionTests
}
/// <summary>
/// 验证WaitWhile指令实现IYieldInstruction接口
/// 验证WaitWhile指令实现IYieldInstruction接口
/// </summary>
[Test]
public void WaitWhile_Should_Implement_IYieldInstruction_Interface()
@ -371,7 +368,7 @@ public class YieldInstructionTests
}
/// <summary>
/// 验证WaitForCoroutine指令实现IYieldInstruction接口
/// 验证WaitForCoroutine指令实现IYieldInstruction接口
/// </summary>
[Test]
public void WaitForCoroutine_Should_Implement_IYieldInstruction_Interface()
@ -382,7 +379,7 @@ public class YieldInstructionTests
}
/// <summary>
/// 验证WaitUntil指令在Update后立即检查条件
/// 验证WaitUntil指令在Update后立即检查条件
/// </summary>
[Test]
public void WaitUntil_Should_Evaluate_Condition_Immediately()
@ -397,7 +394,7 @@ public class YieldInstructionTests
}
/// <summary>
/// 验证WaitWhile指令在Update后立即检查条件
/// 验证WaitWhile指令在Update后立即检查条件
/// </summary>
[Test]
public void WaitWhile_Should_Evaluate_Condition_Immediately()

View File

@ -5,13 +5,13 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.environment;
/// <summary>
/// 测试环境相关的单元测试类,用于验证环境管理功能的正确性
/// 测试环境相关的单元测试类,用于验证环境管理功能的正确性
/// </summary>
[TestFixture]
public class EnvironmentTests
{
/// <summary>
/// 在每个测试方法执行前进行初始化设置
/// 在每个测试方法执行前进行初始化设置
/// </summary>
[SetUp]
public void SetUp()
@ -23,7 +23,7 @@ public class EnvironmentTests
private TestEnvironment _environment = null!;
/// <summary>
/// 验证默认环境的名称是否正确返回"Default"
/// 验证默认环境的名称是否正确返回"Default"
/// </summary>
[Test]
public void DefaultEnvironment_Name_Should_ReturnDefault()
@ -34,7 +34,7 @@ public class EnvironmentTests
}
/// <summary>
/// 验证默认环境的初始化方法不会抛出异常
/// 验证默认环境的初始化方法不会抛出异常
/// </summary>
[Test]
public void DefaultEnvironment_Initialize_Should_NotThrow()
@ -45,7 +45,7 @@ public class EnvironmentTests
}
/// <summary>
/// 验证当键存在时Get方法应该返回正确的值
/// 验证当键存在时Get方法应该返回正确的值
/// </summary>
[Test]
public void Get_Should_Return_Value_When_Key_Exists()
@ -58,7 +58,7 @@ public class EnvironmentTests
}
/// <summary>
/// 验证当键不存在时Get方法应该返回null
/// 验证当键不存在时Get方法应该返回null
/// </summary>
[Test]
public void Get_Should_ReturnNull_When_Key_Not_Exists()
@ -69,7 +69,7 @@ public class EnvironmentTests
}
/// <summary>
/// 验证当类型不匹配时Get方法应该返回null
/// 验证当类型不匹配时Get方法应该返回null
/// </summary>
[Test]
public void Get_Should_ReturnNull_When_Type_Does_Not_Match()
@ -82,7 +82,7 @@ public class EnvironmentTests
}
/// <summary>
/// 验证当键存在时TryGet方法应该返回true并输出正确的值
/// 验证当键存在时TryGet方法应该返回true并输出正确的值
/// </summary>
[Test]
public void TryGet_Should_ReturnTrue_And_Value_When_Key_Exists()
@ -96,7 +96,7 @@ public class EnvironmentTests
}
/// <summary>
/// 验证当键不存在时TryGet方法应该返回false且输出值为null
/// 验证当键不存在时TryGet方法应该返回false且输出值为null
/// </summary>
[Test]
public void TryGet_Should_ReturnFalse_When_Key_Not_Exists()
@ -108,7 +108,7 @@ public class EnvironmentTests
}
/// <summary>
/// 验证当类型不匹配时TryGet方法应该返回false且输出值为null
/// 验证当类型不匹配时TryGet方法应该返回false且输出值为null
/// </summary>
[Test]
public void TryGet_Should_ReturnFalse_When_Type_Does_Not_Match()
@ -122,7 +122,7 @@ public class EnvironmentTests
}
/// <summary>
/// 验证当键存在时GetRequired方法应该返回正确的值
/// 验证当键存在时GetRequired方法应该返回正确的值
/// </summary>
[Test]
public void GetRequired_Should_Return_Value_When_Key_Exists()
@ -135,7 +135,7 @@ public class EnvironmentTests
}
/// <summary>
/// 验证当键不存在时GetRequired方法应该抛出InvalidOperationException异常
/// 验证当键不存在时GetRequired方法应该抛出InvalidOperationException异常
/// </summary>
[Test]
public void GetRequired_Should_ThrowInvalidOperationException_When_Key_Not_Exists()
@ -145,7 +145,7 @@ public class EnvironmentTests
}
/// <summary>
/// 验证Register方法应该将值添加到字典中
/// 验证Register方法应该将值添加到字典中
/// </summary>
[Test]
public void Register_Should_Add_Value_To_Dictionary()
@ -158,7 +158,7 @@ public class EnvironmentTests
}
/// <summary>
/// 验证Register方法应该覆盖已存在的值
/// 验证Register方法应该覆盖已存在的值
/// </summary>
[Test]
public void Register_Should_Overwrite_Existing_Value()
@ -172,7 +172,7 @@ public class EnvironmentTests
}
/// <summary>
/// 验证通过IEnvironment接口的Register方法应该能够添加值
/// 验证通过IEnvironment接口的Register方法应该能够添加值
/// </summary>
[Test]
public void IEnvironment_Register_Should_Add_Value()
@ -187,17 +187,17 @@ public class EnvironmentTests
}
/// <summary>
/// 测试环境实现类继承自EnvironmentBase
/// 测试环境实现类继承自EnvironmentBase
/// </summary>
public class TestEnvironment : EnvironmentBase
{
/// <summary>
/// 获取环境名称
/// 获取环境名称
/// </summary>
public override string Name { get; } = "TestEnvironment";
/// <summary>
/// 注册键值对到环境中
/// 注册键值对到环境中
/// </summary>
/// <param name="key">要注册的键</param>
/// <param name="value">要注册的值</param>
@ -207,7 +207,7 @@ public class TestEnvironment : EnvironmentBase
}
/// <summary>
/// 初始化环境
/// 初始化环境
/// </summary>
public override void Initialize()
{

View File

@ -4,13 +4,13 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.events;
/// <summary>
/// EasyEvents功能测试类用于验证事件系统的注册、触发和参数传递功能
/// EasyEvents功能测试类用于验证事件系统的注册、触发和参数传递功能
/// </summary>
[TestFixture]
public class EasyEventsTests
{
/// <summary>
/// 测试用例初始化方法在每个测试方法执行前设置EasyEvents实例
/// 测试用例初始化方法在每个测试方法执行前设置EasyEvents实例
/// </summary>
[SetUp]
public void SetUp()
@ -21,7 +21,7 @@ public class EasyEventsTests
private EasyEvents _easyEvents = null!;
/// <summary>
/// 测试单参数事件的功能验证事件能够正确接收并传递int类型参数
/// 测试单参数事件的功能验证事件能够正确接收并传递int类型参数
/// </summary>
[Test]
public void Get_EventT_Should_Trigger_With_Parameter()
@ -38,7 +38,7 @@ public class EasyEventsTests
}
/// <summary>
/// 测试双参数事件的功能验证事件能够正确接收并传递int和string类型的参数
/// 测试双参数事件的功能验证事件能够正确接收并传递int和string类型的参数
/// </summary>
[Test]
public void Get_EventTTK_Should_Trigger_With_Two_Parameters()

View File

@ -4,13 +4,13 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.events;
/// <summary>
/// EventBus测试类用于验证事件总线的各种功能
/// EventBus测试类用于验证事件总线的各种功能
/// </summary>
[TestFixture]
public class EventBusTests
{
/// <summary>
/// 测试设置方法在每个测试方法执行前初始化EventBus实例
/// 测试设置方法在每个测试方法执行前初始化EventBus实例
/// </summary>
[SetUp]
public void SetUp()
@ -21,8 +21,8 @@ public class EventBusTests
private EventBus _eventBus = null!;
/// <summary>
/// 测试注册事件处理器的功能
/// 验证注册的处理器能够在发送对应事件时被正确调用
/// 测试注册事件处理器的功能
/// 验证注册的处理器能够在发送对应事件时被正确调用
/// </summary>
[Test]
public void Register_Should_Add_Handler()
@ -36,8 +36,8 @@ public class EventBusTests
}
/// <summary>
/// 测试注销事件处理器的功能
/// 验证已注册的处理器在注销后不会再被调用
/// 测试注销事件处理器的功能
/// 验证已注册的处理器在注销后不会再被调用
/// </summary>
[Test]
public void UnRegister_Should_Remove_Handler()
@ -57,8 +57,8 @@ public class EventBusTests
}
/// <summary>
/// 测试发送事件时调用所有处理器的功能
/// 验证同一事件类型的多个处理器都能被正确调用
/// 测试发送事件时调用所有处理器的功能
/// 验证同一事件类型的多个处理器都能被正确调用
/// </summary>
[Test]
public void SendEvent_Should_Invoke_All_Handlers()
@ -78,7 +78,7 @@ public class EventBusTests
}
/// <summary>
/// EventBus测试专用事件类
/// EventBus测试专用事件类
/// </summary>
public class EventBusTestsEvent
{

View File

@ -4,13 +4,13 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.events;
/// <summary>
/// 测试事件系统功能的测试类
/// 测试事件系统功能的测试类
/// </summary>
[TestFixture]
public class EventTests
{
/// <summary>
/// 在每个测试方法执行前进行初始化设置
/// 在每个测试方法执行前进行初始化设置
/// </summary>
[SetUp]
public void SetUp()
@ -25,7 +25,7 @@ public class EventTests
private Event<int, string> _eventIntString = null!;
/// <summary>
/// 测试EasyEvent注册功能是否正确添加处理器
/// 测试EasyEvent注册功能是否正确添加处理器
/// </summary>
[Test]
public void EasyEvent_Register_Should_Add_Handler()
@ -39,7 +39,7 @@ public class EventTests
}
/// <summary>
/// 测试EasyEvent取消注册功能是否正确移除处理器
/// 测试EasyEvent取消注册功能是否正确移除处理器
/// </summary>
[Test]
public void EasyEvent_UnRegister_Should_Remove_Handler()
@ -57,7 +57,7 @@ public class EventTests
}
/// <summary>
/// 测试EasyEvent多个处理器是否都能被调用
/// 测试EasyEvent多个处理器是否都能被调用
/// </summary>
[Test]
public void EasyEvent_Multiple_Handlers_Should_All_Be_Called()
@ -75,7 +75,7 @@ public class EventTests
}
/// <summary>
/// 测试带泛型参数的事件注册功能是否正确添加处理器
/// 测试带泛型参数的事件注册功能是否正确添加处理器
/// </summary>
[Test]
public void EventT_Register_Should_Add_Handler()
@ -89,7 +89,7 @@ public class EventTests
}
/// <summary>
/// 测试带泛型参数的事件取消注册功能是否正确移除处理器
/// 测试带泛型参数的事件取消注册功能是否正确移除处理器
/// </summary>
[Test]
public void EventT_UnRegister_Should_Remove_Handler()
@ -107,7 +107,7 @@ public class EventTests
}
/// <summary>
/// 测试带泛型参数的事件多个处理器是否都能被调用
/// 测试带泛型参数的事件多个处理器是否都能被调用
/// </summary>
[Test]
public void EventT_Multiple_Handlers_Should_All_Be_Called()
@ -125,7 +125,7 @@ public class EventTests
}
/// <summary>
/// 测试带两个泛型参数的事件注册功能是否正确添加处理器
/// 测试带两个泛型参数的事件注册功能是否正确添加处理器
/// </summary>
[Test]
public void EventTTK_Register_Should_Add_Handler()
@ -145,7 +145,7 @@ public class EventTests
}
/// <summary>
/// 测试带两个泛型参数的事件取消注册功能是否正确移除处理器
/// 测试带两个泛型参数的事件取消注册功能是否正确移除处理器
/// </summary>
[Test]
public void EventTTK_UnRegister_Should_Remove_Handler()

View File

@ -4,14 +4,14 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.events;
/// <summary>
/// 测试OrEvent类的功能验证其在多个事件中的逻辑或操作行为
/// 测试OrEvent类的功能验证其在多个事件中的逻辑或操作行为
/// </summary>
[TestFixture]
public class OrEventTests
{
/// <summary>
/// 测试当任意一个事件触发时OrEvent应该被触发
/// 验证基本的OR逻辑功能
/// 测试当任意一个事件触发时OrEvent应该被触发
/// 验证基本的OR逻辑功能
/// </summary>
[Test]
public void OrEvent_Should_Trigger_When_Any_Event_Fires()
@ -32,8 +32,8 @@ public class OrEventTests
}
/// <summary>
/// 测试当第二个事件触发时OrEvent应该被触发
/// 验证OR逻辑对所有注册事件都有效
/// 测试当第二个事件触发时OrEvent应该被触发
/// 验证OR逻辑对所有注册事件都有效
/// </summary>
[Test]
public void OrEvent_Should_Trigger_When_Second_Event_Fires()
@ -54,8 +54,8 @@ public class OrEventTests
}
/// <summary>
/// 测试OrEvent支持多个处理程序
/// 验证单个OrEvent可以注册多个回调函数
/// 测试OrEvent支持多个处理程序
/// 验证单个OrEvent可以注册多个回调函数
/// </summary>
[Test]
public void OrEvent_Should_Support_Multiple_Handlers()
@ -78,8 +78,8 @@ public class OrEventTests
}
/// <summary>
/// 测试UnRegister方法应该移除处理程序
/// 验证注销功能能够正确移除已注册的回调函数
/// 测试UnRegister方法应该移除处理程序
/// 验证注销功能能够正确移除已注册的回调函数
/// </summary>
[Test]
public void OrEvent_UnRegister_Should_Remove_Handler()

View File

@ -5,13 +5,13 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.events;
/// <summary>
/// 注销功能测试类,用于测试不同类型的注销行为
/// 注销功能测试类,用于测试不同类型的注销行为
/// </summary>
[TestFixture]
public class UnRegisterTests
{
/// <summary>
/// 测试DefaultUnRegister在调用注销时是否正确触发回调函数
/// 测试DefaultUnRegister在调用注销时是否正确触发回调函数
/// </summary>
[Test]
public void DefaultUnRegister_Should_InvokeCallback_When_UnRegisterCalled()
@ -25,7 +25,7 @@ public class UnRegisterTests
}
/// <summary>
/// 测试DefaultUnRegister在注销后是否清除回调函数防止重复执行
/// 测试DefaultUnRegister在注销后是否清除回调函数防止重复执行
/// </summary>
[Test]
public void DefaultUnRegister_Should_ClearCallback_After_UnRegister()
@ -40,7 +40,7 @@ public class UnRegisterTests
}
/// <summary>
/// 测试DefaultUnRegister在传入空回调函数时不会抛出异常
/// 测试DefaultUnRegister在传入空回调函数时不会抛出异常
/// </summary>
[Test]
public void DefaultUnRegister_WithNullCallback_Should_NotThrow()
@ -51,12 +51,12 @@ public class UnRegisterTests
}
/// <summary>
/// 测试BindablePropertyUnRegister是否能正确从属性中注销事件处理器
/// 测试BindablePropertyUnRegister是否能正确从属性中注销事件处理器
/// </summary>
[Test]
public void BindablePropertyUnRegister_Should_UnRegister_From_Property()
{
var property = new BindableProperty<int>(0);
var property = new BindableProperty<int>();
var callCount = 0;
Action<int> handler = _ => { callCount++; };
@ -71,12 +71,12 @@ public class UnRegisterTests
}
/// <summary>
/// 测试BindablePropertyUnRegister在注销后是否清除内部引用
/// 测试BindablePropertyUnRegister在注销后是否清除内部引用
/// </summary>
[Test]
public void BindablePropertyUnRegister_Should_Clear_References()
{
var property = new BindableProperty<int>(0);
var property = new BindableProperty<int>();
Action<int> handler = _ => { };
var unRegister = new BindablePropertyUnRegister<int>(property, handler);
@ -89,7 +89,7 @@ public class UnRegisterTests
}
/// <summary>
/// 测试BindablePropertyUnRegister在传入空属性时不会抛出异常
/// 测试BindablePropertyUnRegister在传入空属性时不会抛出异常
/// </summary>
[Test]
public void BindablePropertyUnRegister_WithNull_Property_Should_NotThrow()
@ -101,12 +101,12 @@ public class UnRegisterTests
}
/// <summary>
/// 测试BindablePropertyUnRegister在传入空处理器时不会抛出异常
/// 测试BindablePropertyUnRegister在传入空处理器时不会抛出异常
/// </summary>
[Test]
public void BindablePropertyUnRegister_WithNull_Handler_Should_NotThrow()
{
var property = new BindableProperty<int>(0);
var property = new BindableProperty<int>();
var unRegister = new BindablePropertyUnRegister<int>(property, null!);
Assert.DoesNotThrow(() => unRegister.UnRegister());

View File

@ -4,13 +4,13 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.extensions;
/// <summary>
/// 测试ObjectExtensions扩展方法的功能
/// 测试ObjectExtensions扩展方法的功能
/// </summary>
[TestFixture]
public class ObjectExtensionsTests
{
/// <summary>
/// 验证IfType方法在类型匹配时执行指定操作
/// 验证IfType方法在类型匹配时执行指定操作
/// </summary>
[Test]
public void IfType_Should_Execute_Action_When_Type_Matches()
@ -24,7 +24,7 @@ public class ObjectExtensionsTests
}
/// <summary>
/// 验证IfType方法在类型不匹配时不执行指定操作
/// 验证IfType方法在类型不匹配时不执行指定操作
/// </summary>
[Test]
public void IfType_Should_Not_Execute_Action_When_Type_Does_Not_Match()
@ -38,7 +38,7 @@ public class ObjectExtensionsTests
}
/// <summary>
/// 验证IfType方法在类型匹配且谓词条件为真时执行指定操作
/// 验证IfType方法在类型匹配且谓词条件为真时执行指定操作
/// </summary>
[Test]
public void IfType_WithPredicate_Should_Execute_When_Type_Matches_And_Predicate_True()
@ -52,7 +52,7 @@ public class ObjectExtensionsTests
}
/// <summary>
/// 验证IfType方法在谓词条件为假时不执行指定操作
/// 验证IfType方法在谓词条件为假时不执行指定操作
/// </summary>
[Test]
public void IfType_WithPredicate_Should_Not_Execute_When_Predicate_False()
@ -66,7 +66,7 @@ public class ObjectExtensionsTests
}
/// <summary>
/// 验证IfType方法在类型匹配时执行匹配操作在类型不匹配时执行不匹配操作
/// 验证IfType方法在类型匹配时执行匹配操作在类型不匹配时执行不匹配操作
/// </summary>
[Test]
public void IfType_WithBoth_Actions_Should_Execute_Correct_Action()
@ -85,7 +85,7 @@ public class ObjectExtensionsTests
}
/// <summary>
/// 验证IfType方法在类型匹配时返回转换结果
/// 验证IfType方法在类型匹配时返回转换结果
/// </summary>
[Test]
public void IfType_WithResult_Should_Return_Value_When_Type_Matches()
@ -98,7 +98,7 @@ public class ObjectExtensionsTests
}
/// <summary>
/// 验证IfType方法在类型不匹配时返回默认值
/// 验证IfType方法在类型不匹配时返回默认值
/// </summary>
[Test]
public void IfType_WithResult_Should_Return_Default_When_Type_Does_Not_Match()
@ -111,7 +111,7 @@ public class ObjectExtensionsTests
}
/// <summary>
/// 验证As方法在类型匹配时返回实例
/// 验证As方法在类型匹配时返回实例
/// </summary>
[Test]
public void As_Should_Return_Instance_When_Type_Matches()
@ -125,7 +125,7 @@ public class ObjectExtensionsTests
}
/// <summary>
/// 验证As方法在类型不匹配时返回null
/// 验证As方法在类型不匹配时返回null
/// </summary>
[Test]
public void As_Should_Return_Null_When_Type_Does_Not_Match()
@ -138,7 +138,7 @@ public class ObjectExtensionsTests
}
/// <summary>
/// 验证Do方法执行操作并返回对象本身
/// 验证Do方法执行操作并返回对象本身
/// </summary>
[Test]
public void Do_Should_Execute_Action_And_Return_Object()
@ -152,7 +152,7 @@ public class ObjectExtensionsTests
}
/// <summary>
/// 验证Do方法支持链式调用
/// 验证Do方法支持链式调用
/// </summary>
[Test]
public void Do_Should_Support_Chaining()
@ -167,7 +167,7 @@ public class ObjectExtensionsTests
}
/// <summary>
/// 验证SwitchType方法执行匹配的处理器
/// 验证SwitchType方法执行匹配的处理器
/// </summary>
[Test]
public void SwitchType_Should_Execute_Matching_Handler()
@ -184,7 +184,7 @@ public class ObjectExtensionsTests
}
/// <summary>
/// 验证SwitchType方法只执行第一个匹配的处理器
/// 验证SwitchType方法只执行第一个匹配的处理器
/// </summary>
[Test]
public void SwitchType_Should_Execute_First_Matching_Handler()
@ -201,7 +201,7 @@ public class ObjectExtensionsTests
}
/// <summary>
/// 验证SwitchType方法在没有匹配项时不执行任何处理器
/// 验证SwitchType方法在没有匹配项时不执行任何处理器
/// </summary>
[Test]
public void SwitchType_Should_Not_Execute_When_No_Match()
@ -219,17 +219,17 @@ public class ObjectExtensionsTests
}
/// <summary>
/// 测试用的简单类
/// 测试用的简单类
/// </summary>
public class TestClass
{
/// <summary>
/// 获取或设置整数值
/// 获取或设置整数值
/// </summary>
public int Value { get; set; }
/// <summary>
/// 获取或设置名称字符串
/// 获取或设置名称字符串
/// </summary>
public string Name { get; set; } = string.Empty;
}

View File

@ -6,13 +6,13 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.extensions;
/// <summary>
/// 测试UnRegisterList扩展方法的功能
/// 测试UnRegisterList扩展方法的功能
/// </summary>
[TestFixture]
public class UnRegisterListExtensionTests
{
/// <summary>
/// 在每个测试方法执行前初始化测试环境
/// 在每个测试方法执行前初始化测试环境
/// </summary>
[SetUp]
public void SetUp()
@ -23,7 +23,7 @@ public class UnRegisterListExtensionTests
private TestUnRegisterList _unRegisterList = null!;
/// <summary>
/// 验证AddToUnregisterList方法能够正确将元素添加到列表中
/// 验证AddToUnregisterList方法能够正确将元素添加到列表中
/// </summary>
[Test]
public void AddToUnregisterList_Should_Add_To_List()
@ -36,7 +36,7 @@ public class UnRegisterListExtensionTests
}
/// <summary>
/// 验证AddToUnregisterList方法能够正确添加多个元素到列表中
/// 验证AddToUnregisterList方法能够正确添加多个元素到列表中
/// </summary>
[Test]
public void AddToUnregisterList_Should_Add_Multiple_Elements()
@ -53,7 +53,7 @@ public class UnRegisterListExtensionTests
}
/// <summary>
/// 验证UnRegisterAll方法能够正确注销所有元素
/// 验证UnRegisterAll方法能够正确注销所有元素
/// </summary>
[Test]
public void UnRegisterAll_Should_UnRegister_All_Elements()
@ -79,7 +79,7 @@ public class UnRegisterListExtensionTests
}
/// <summary>
/// 验证UnRegisterAll方法在执行后会清空列表
/// 验证UnRegisterAll方法在执行后会清空列表
/// </summary>
[Test]
public void UnRegisterAll_Should_Clear_List()
@ -94,7 +94,7 @@ public class UnRegisterListExtensionTests
}
/// <summary>
/// 验证UnRegisterAll方法在空列表情况下不会抛出异常
/// 验证UnRegisterAll方法在空列表情况下不会抛出异常
/// </summary>
[Test]
public void UnRegisterAll_Should_Not_Throw_When_Empty()
@ -103,7 +103,7 @@ public class UnRegisterListExtensionTests
}
/// <summary>
/// 验证UnRegisterAll方法对每个元素只调用一次注销操作
/// 验证UnRegisterAll方法对每个元素只调用一次注销操作
/// </summary>
[Test]
public void UnRegisterAll_Should_Invoke_Once_Per_Element()
@ -121,12 +121,12 @@ public class UnRegisterListExtensionTests
}
/// <summary>
/// 测试用的UnRegisterList实现类用于验证扩展方法功能
/// 测试用的UnRegisterList实现类用于验证扩展方法功能
/// </summary>
public class TestUnRegisterList : IUnRegisterList
{
/// <summary>
/// 获取或设置注销列表
/// 获取或设置注销列表
/// </summary>
public IList<IUnRegister> UnregisterList { get; } = new List<IUnRegister>();
}

View File

@ -7,13 +7,13 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.ioc;
/// <summary>
/// 测试 IoC 容器功能的单元测试类
/// 测试 IoC 容器功能的单元测试类
/// </summary>
[TestFixture]
public class IocContainerTests
{
/// <summary>
/// 在每个测试方法执行前进行设置
/// 在每个测试方法执行前进行设置
/// </summary>
[SetUp]
public void SetUp()
@ -33,7 +33,7 @@ public class IocContainerTests
private readonly Dictionary<Type, object> _mockContextServices = new();
/// <summary>
/// 测试注册单例实例的功能
/// 测试注册单例实例的功能
/// </summary>
[Test]
public void RegisterSingleton_Should_Register_Instance()
@ -44,7 +44,7 @@ public class IocContainerTests
}
/// <summary>
/// 测试重复注册单例时应抛出 InvalidOperationException 异常
/// 测试重复注册单例时应抛出 InvalidOperationException 异常
/// </summary>
[Test]
public void RegisterSingleton_WithDuplicate_Should_ThrowInvalidOperationException()
@ -58,7 +58,7 @@ public class IocContainerTests
}
/// <summary>
/// 测试在容器冻结后注册单例时应抛出 InvalidOperationException 异常
/// 测试在容器冻结后注册单例时应抛出 InvalidOperationException 异常
/// </summary>
[Test]
public void RegisterSingleton_AfterFreeze_Should_ThrowInvalidOperationException()
@ -70,7 +70,7 @@ public class IocContainerTests
}
/// <summary>
/// 测试注册多样性实例到所有类型的功能
/// 测试注册多样性实例到所有类型的功能
/// </summary>
[Test]
public void RegisterPlurality_Should_Register_Instance_To_All_Types()
@ -84,7 +84,7 @@ public class IocContainerTests
}
/// <summary>
/// 测试在容器冻结后注册多样性实例时应抛出 InvalidOperationException 异常
/// 测试在容器冻结后注册多样性实例时应抛出 InvalidOperationException 异常
/// </summary>
[Test]
public void RegisterPlurality_AfterFreeze_Should_ThrowInvalidOperationException()
@ -96,7 +96,7 @@ public class IocContainerTests
}
/// <summary>
/// 测试泛型注册实例的功能
/// 测试泛型注册实例的功能
/// </summary>
[Test]
public void Register_Generic_Should_Register_Instance()
@ -109,7 +109,7 @@ public class IocContainerTests
}
/// <summary>
/// 测试在容器冻结后使用泛型注册时应抛出 InvalidOperationException 异常
/// 测试在容器冻结后使用泛型注册时应抛出 InvalidOperationException 异常
/// </summary>
[Test]
public void Register_Generic_AfterFreeze_Should_ThrowInvalidOperationException()
@ -121,7 +121,7 @@ public class IocContainerTests
}
/// <summary>
/// 测试按类型注册实例的功能
/// 测试按类型注册实例的功能
/// </summary>
[Test]
public void Register_Type_Should_Register_Instance()
@ -134,7 +134,7 @@ public class IocContainerTests
}
/// <summary>
/// 测试获取第一个实例的功能
/// 测试获取第一个实例的功能
/// </summary>
[Test]
public void Get_Should_Return_First_Instance()
@ -149,7 +149,7 @@ public class IocContainerTests
}
/// <summary>
/// 测试当没有实例时获取应返回 null 的功能
/// 测试当没有实例时获取应返回 null 的功能
/// </summary>
[Test]
public void Get_WithNoInstances_Should_ReturnNull()
@ -160,7 +160,7 @@ public class IocContainerTests
}
/// <summary>
/// 测试获取必需的单个实例的功能
/// 测试获取必需的单个实例的功能
/// </summary>
[Test]
public void GetRequired_Should_Return_Single_Instance()
@ -175,7 +175,7 @@ public class IocContainerTests
}
/// <summary>
/// 测试当没有实例时获取必需实例应抛出 InvalidOperationException 异常
/// 测试当没有实例时获取必需实例应抛出 InvalidOperationException 异常
/// </summary>
[Test]
public void GetRequired_WithNoInstances_Should_ThrowInvalidOperationException()
@ -184,7 +184,7 @@ public class IocContainerTests
}
/// <summary>
/// 测试当有多个实例时获取必需实例应抛出 InvalidOperationException 异常
/// 测试当有多个实例时获取必需实例应抛出 InvalidOperationException 异常
/// </summary>
[Test]
public void GetRequired_WithMultipleInstances_Should_ThrowInvalidOperationException()
@ -196,7 +196,7 @@ public class IocContainerTests
}
/// <summary>
/// 测试获取所有实例的功能
/// 测试获取所有实例的功能
/// </summary>
[Test]
public void GetAll_Should_Return_All_Instances()
@ -215,7 +215,7 @@ public class IocContainerTests
}
/// <summary>
/// 测试当没有实例时获取所有实例应返回空数组的功能
/// 测试当没有实例时获取所有实例应返回空数组的功能
/// </summary>
[Test]
public void GetAll_WithNoInstances_Should_Return_Empty_Array()
@ -226,7 +226,7 @@ public class IocContainerTests
}
/// <summary>
/// 测试获取排序后的所有实例的功能
/// 测试获取排序后的所有实例的功能
/// </summary>
[Test]
public void GetAllSorted_Should_Return_Sorted_Instances()
@ -244,7 +244,7 @@ public class IocContainerTests
}
/// <summary>
/// 测试当存在实例时检查包含关系应返回 true 的功能
/// 测试当存在实例时检查包含关系应返回 true 的功能
/// </summary>
[Test]
public void Contains_WithExistingInstance_Should_ReturnTrue()
@ -256,7 +256,7 @@ public class IocContainerTests
}
/// <summary>
/// 测试当不存在实例时检查包含关系应返回 false 的功能
/// 测试当不存在实例时检查包含关系应返回 false 的功能
/// </summary>
[Test]
public void Contains_WithNoInstances_Should_ReturnFalse()
@ -265,7 +265,7 @@ public class IocContainerTests
}
/// <summary>
/// 测试当实例存在时检查实例包含关系应返回 true 的功能
/// 测试当实例存在时检查实例包含关系应返回 true 的功能
/// </summary>
[Test]
public void ContainsInstance_WithExistingInstance_Should_ReturnTrue()
@ -277,7 +277,7 @@ public class IocContainerTests
}
/// <summary>
/// 测试当实例不存在时检查实例包含关系应返回 false 的功能
/// 测试当实例不存在时检查实例包含关系应返回 false 的功能
/// </summary>
[Test]
public void ContainsInstance_WithNonExistingInstance_Should_ReturnFalse()
@ -288,7 +288,7 @@ public class IocContainerTests
}
/// <summary>
/// 测试清除所有实例的功能
/// 测试清除所有实例的功能
/// </summary>
[Test]
public void Clear_Should_Remove_All_Instances()
@ -302,7 +302,7 @@ public class IocContainerTests
}
/// <summary>
/// 测试冻结容器以防止进一步注册的功能
/// 测试冻结容器以防止进一步注册的功能
/// </summary>
[Test]
public void Freeze_Should_Prevent_Further_Registrations()
@ -316,7 +316,7 @@ public class IocContainerTests
}
/// <summary>
/// 测试注册系统实例的功能
/// 测试注册系统实例的功能
/// </summary>
[Test]
public void RegisterSystem_Should_Register_Instance()
@ -330,17 +330,17 @@ public class IocContainerTests
}
/// <summary>
/// 服务接口定义
/// 服务接口定义
/// </summary>
public interface IService;
/// <summary>
/// 测试服务类,实现 IService 接口
/// 测试服务类,实现 IService 接口
/// </summary>
public sealed class TestService : IService
{
/// <summary>
/// 获取或设置优先级
/// 获取或设置优先级
/// </summary>
public int Priority { get; set; }
}

View File

@ -6,14 +6,14 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.logging;
/// <summary>
/// 测试ConsoleLogger类的功能和行为的单元测试类
/// 测试ConsoleLogger类的功能和行为的单元测试类
/// </summary>
[TestFixture]
public class ConsoleLoggerTests
{
/// <summary>
/// 在每个测试方法执行前设置测试环境
/// 创建StringWriter和ConsoleLogger实例用于测试
/// 在每个测试方法执行前设置测试环境
/// 创建StringWriter和ConsoleLogger实例用于测试
/// </summary>
[SetUp]
public void SetUp()
@ -23,8 +23,8 @@ public class ConsoleLoggerTests
}
/// <summary>
/// 在每个测试方法执行后清理测试资源
/// 释放StringWriter资源
/// 在每个测试方法执行后清理测试资源
/// 释放StringWriter资源
/// </summary>
[TearDown]
public void TearDown()
@ -36,8 +36,8 @@ public class ConsoleLoggerTests
private ConsoleLogger _logger = null!;
/// <summary>
/// 测试使用默认名称构造函数时是否正确使用根日志器名称
/// 验证当未指定名称时,日志器使用"ROOT"作为默认名称
/// 测试使用默认名称构造函数时是否正确使用根日志器名称
/// 验证当未指定名称时,日志器使用"ROOT"作为默认名称
/// </summary>
[Test]
public void Constructor_WithDefaultName_ShouldUseRootLoggerName()
@ -48,8 +48,8 @@ public class ConsoleLoggerTests
}
/// <summary>
/// 测试使用自定义名称构造函数时是否正确使用自定义名称
/// 验证构造函数能够正确设置并返回指定的日志器名称
/// 测试使用自定义名称构造函数时是否正确使用自定义名称
/// 验证构造函数能够正确设置并返回指定的日志器名称
/// </summary>
[Test]
public void Constructor_WithCustomName_ShouldUseCustomName()
@ -60,8 +60,8 @@ public class ConsoleLoggerTests
}
/// <summary>
/// 测试使用自定义最小级别构造函数时是否正确遵循最小日志级别
/// 验证只有达到或超过最小级别的日志消息才会被记录
/// 测试使用自定义最小级别构造函数时是否正确遵循最小日志级别
/// 验证只有达到或超过最小级别的日志消息才会被记录
/// </summary>
[Test]
public void Constructor_WithCustomMinLevel_ShouldRespectMinLevel()
@ -77,8 +77,8 @@ public class ConsoleLoggerTests
}
/// <summary>
/// 测试使用自定义写入器构造函数时是否将日志写入到自定义写入器
/// 验证日志消息能够正确写入到指定的StringWriter中
/// 测试使用自定义写入器构造函数时是否将日志写入到自定义写入器
/// 验证日志消息能够正确写入到指定的StringWriter中
/// </summary>
[Test]
public void Constructor_WithCustomWriter_ShouldWriteToCustomWriter()
@ -90,8 +90,8 @@ public class ConsoleLoggerTests
}
/// <summary>
/// 测试写入操作是否包含时间戳信息
/// 验证每条日志消息都包含格式化的日期时间信息
/// 测试写入操作是否包含时间戳信息
/// 验证每条日志消息都包含格式化的日期时间信息
/// </summary>
[Test]
public void Write_ShouldIncludeTimestamp()
@ -103,8 +103,8 @@ public class ConsoleLoggerTests
}
/// <summary>
/// 测试写入操作是否包含日志级别信息
/// 验证不同级别的日志消息都能正确显示对应的级别标识
/// 测试写入操作是否包含日志级别信息
/// 验证不同级别的日志消息都能正确显示对应的级别标识
/// </summary>
[Test]
public void Write_ShouldIncludeLevel()
@ -121,8 +121,8 @@ public class ConsoleLoggerTests
}
/// <summary>
/// 测试写入操作是否包含日志器名称
/// 验证日志输出中包含创建时指定的日志器名称
/// 测试写入操作是否包含日志器名称
/// 验证日志输出中包含创建时指定的日志器名称
/// </summary>
[Test]
public void Write_ShouldIncludeLoggerName()
@ -134,8 +134,8 @@ public class ConsoleLoggerTests
}
/// <summary>
/// 测试写入操作在包含异常时是否正确包含异常信息
/// 验证异常的详细信息能够正确记录在日志中
/// 测试写入操作在包含异常时是否正确包含异常信息
/// 验证异常的详细信息能够正确记录在日志中
/// </summary>
[Test]
public void Write_WithException_ShouldIncludeException()
@ -149,8 +149,8 @@ public class ConsoleLoggerTests
}
/// <summary>
/// 测试写入多行日志时是否正确格式化
/// 验证多条日志消息能够正确分行显示且包含正确的级别信息
/// 测试写入多行日志时是否正确格式化
/// 验证多条日志消息能够正确分行显示且包含正确的级别信息
/// </summary>
[Test]
public void Write_WithMultipleLines_ShouldFormatCorrectly()
@ -169,8 +169,8 @@ public class ConsoleLoggerTests
}
/// <summary>
/// 测试写入格式化消息时是否正确格式化
/// 验证带参数的消息格式化功能正常工作
/// 测试写入格式化消息时是否正确格式化
/// 验证带参数的消息格式化功能正常工作
/// </summary>
[Test]
public void Write_WithFormattedMessage_ShouldFormatCorrectly()
@ -182,8 +182,8 @@ public class ConsoleLoggerTests
}
/// <summary>
/// 测试写入操作是否遵循最小日志级别限制
/// 验证低于最小级别的日志消息不会被记录
/// 测试写入操作是否遵循最小日志级别限制
/// 验证低于最小级别的日志消息不会被记录
/// </summary>
[Test]
public void Write_ShouldRespectMinLevel()
@ -199,8 +199,8 @@ public class ConsoleLoggerTests
}
/// <summary>
/// 测试启用颜色功能时是否不影响输出内容
/// 验证即使颜色功能被禁用,日志内容仍然正确记录
/// 测试启用颜色功能时是否不影响输出内容
/// 验证即使颜色功能被禁用,日志内容仍然正确记录
/// </summary>
[Test]
public void Write_WithColorsEnabled_ShouldNotAffectOutputContent()
@ -214,8 +214,8 @@ public class ConsoleLoggerTests
}
/// <summary>
/// 测试所有日志级别是否都能正确格式化
/// 验证从Trace到Fatal的所有日志级别都能正确显示
/// 测试所有日志级别是否都能正确格式化
/// 验证从Trace到Fatal的所有日志级别都能正确显示
/// </summary>
[Test]
public void Write_AllLogLevels_ShouldFormatCorrectly()
@ -235,8 +235,8 @@ public class ConsoleLoggerTests
}
/// <summary>
/// 测试写入嵌套异常时是否包含完整的异常信息
/// 验证嵌套异常的所有层级信息都能被正确记录
/// 测试写入嵌套异常时是否包含完整的异常信息
/// 验证嵌套异常的所有层级信息都能被正确记录
/// </summary>
[Test]
public void Write_WithNestedException_ShouldIncludeFullException()
@ -253,8 +253,8 @@ public class ConsoleLoggerTests
}
/// <summary>
/// 测试使用空写入器时是否不会抛出异常
/// 验证当传入null写入器时日志器能够安全处理而不崩溃
/// 测试使用空写入器时是否不会抛出异常
/// 验证当传入null写入器时日志器能够安全处理而不崩溃
/// </summary>
[Test]
public void Write_WithNullWriter_ShouldNotThrow()
@ -265,8 +265,8 @@ public class ConsoleLoggerTests
}
/// <summary>
/// 测试写入空消息时是否仍能正常写入
/// 验证即使消息为空字符串,日志框架仍能生成包含其他信息的完整日志条目
/// 测试写入空消息时是否仍能正常写入
/// 验证即使消息为空字符串,日志框架仍能生成包含其他信息的完整日志条目
/// </summary>
[Test]
public void Write_WithEmptyMessage_ShouldStillWrite()

View File

@ -6,19 +6,19 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.logging;
/// <summary>
/// 测试LoggerFactory相关功能的测试类
/// 测试LoggerFactory相关功能的测试类
/// </summary>
[TestFixture]
public class LoggerFactoryTests
{
/// <summary>
/// 测试ConsoleLoggerFactory的GetLogger方法是否返回ConsoleLogger实例
/// 测试ConsoleLoggerFactory的GetLogger方法是否返回ConsoleLogger实例
/// </summary>
[Test]
public void ConsoleLoggerFactory_GetLogger_ShouldReturnConsoleLogger()
{
var factory = new ConsoleLoggerFactory();
var logger = factory.GetLogger("TestLogger", LogLevel.Info);
var logger = factory.GetLogger("TestLogger");
Assert.That(logger, Is.Not.Null);
Assert.That(logger, Is.InstanceOf<ConsoleLogger>());
@ -26,7 +26,7 @@ public class LoggerFactoryTests
}
/// <summary>
/// 测试ConsoleLoggerFactory使用不同名称获取不同的logger实例
/// 测试ConsoleLoggerFactory使用不同名称获取不同的logger实例
/// </summary>
[Test]
public void ConsoleLoggerFactory_GetLogger_WithDifferentNames_ShouldReturnDifferentLoggers()
@ -40,7 +40,7 @@ public class LoggerFactoryTests
}
/// <summary>
/// 测试ConsoleLoggerFactory使用默认最小级别时的行为默认为Info级别
/// 测试ConsoleLoggerFactory使用默认最小级别时的行为默认为Info级别
/// </summary>
[Test]
public void ConsoleLoggerFactory_GetLogger_WithDefaultMinLevel_ShouldUseInfo()
@ -61,7 +61,7 @@ public class LoggerFactoryTests
}
/// <summary>
/// 测试ConsoleLoggerFactoryProvider创建logger时使用提供者的最小级别设置
/// 测试ConsoleLoggerFactoryProvider创建logger时使用提供者的最小级别设置
/// </summary>
[Test]
public void ConsoleLoggerFactoryProvider_CreateLogger_ShouldReturnLoggerWithProviderMinLevel()
@ -82,7 +82,7 @@ public class LoggerFactoryTests
}
/// <summary>
/// 测试ConsoleLoggerFactoryProvider创建logger时使用提供的名称
/// 测试ConsoleLoggerFactoryProvider创建logger时使用提供的名称
/// </summary>
[Test]
public void ConsoleLoggerFactoryProvider_CreateLogger_ShouldUseProvidedName()
@ -94,7 +94,7 @@ public class LoggerFactoryTests
}
/// <summary>
/// 测试LoggerFactoryResolver的Provider属性是否有默认值
/// 测试LoggerFactoryResolver的Provider属性是否有默认值
/// </summary>
[Test]
public void LoggerFactoryResolver_Provider_ShouldHaveDefaultValue()
@ -104,7 +104,7 @@ public class LoggerFactoryTests
}
/// <summary>
/// 测试LoggerFactoryResolver的Provider属性可以被更改
/// 测试LoggerFactoryResolver的Provider属性可以被更改
/// </summary>
[Test]
public void LoggerFactoryResolver_Provider_CanBeChanged()
@ -120,7 +120,7 @@ public class LoggerFactoryTests
}
/// <summary>
/// 测试LoggerFactoryResolver的MinLevel属性是否有默认值
/// 测试LoggerFactoryResolver的MinLevel属性是否有默认值
/// </summary>
[Test]
public void LoggerFactoryResolver_MinLevel_ShouldHaveDefaultValue()
@ -129,7 +129,7 @@ public class LoggerFactoryTests
}
/// <summary>
/// 测试LoggerFactoryResolver的MinLevel属性可以被更改
/// 测试LoggerFactoryResolver的MinLevel属性可以被更改
/// </summary>
[Test]
public void LoggerFactoryResolver_MinLevel_CanBeChanged()
@ -144,7 +144,7 @@ public class LoggerFactoryTests
}
/// <summary>
/// 测试ConsoleLoggerFactoryProvider的MinLevel属性是否有默认值
/// 测试ConsoleLoggerFactoryProvider的MinLevel属性是否有默认值
/// </summary>
[Test]
public void ConsoleLoggerFactoryProvider_MinLevel_ShouldHaveDefaultValue()
@ -155,7 +155,7 @@ public class LoggerFactoryTests
}
/// <summary>
/// 测试ConsoleLoggerFactoryProvider的MinLevel属性可以被更改
/// 测试ConsoleLoggerFactoryProvider的MinLevel属性可以被更改
/// </summary>
[Test]
public void ConsoleLoggerFactoryProvider_MinLevel_CanBeChanged()
@ -168,7 +168,7 @@ public class LoggerFactoryTests
}
/// <summary>
/// 测试LoggerFactoryResolver的Provider创建logger时使用提供者设置
/// 测试LoggerFactoryResolver的Provider创建logger时使用提供者设置
/// </summary>
[Test]
public void LoggerFactoryResolver_Provider_CreateLogger_ShouldUseProviderSettings()
@ -195,7 +195,7 @@ public class LoggerFactoryTests
}
/// <summary>
/// 测试LoggerFactoryResolver的MinLevel属性影响新创建的logger
/// 测试LoggerFactoryResolver的MinLevel属性影响新创建的logger
/// </summary>
[Test]
public void LoggerFactoryResolver_MinLevel_AffectsNewLoggers()
@ -222,13 +222,13 @@ public class LoggerFactoryTests
}
/// <summary>
/// 测试ConsoleLoggerFactory创建的多个logger实例是独立的
/// 测试ConsoleLoggerFactory创建的多个logger实例是独立的
/// </summary>
[Test]
public void ConsoleLoggerFactory_MultipleLoggers_ShouldBeIndependent()
{
var factory = new ConsoleLoggerFactory();
var logger1 = factory.GetLogger("Logger1", LogLevel.Info);
var logger1 = factory.GetLogger("Logger1");
var logger2 = factory.GetLogger("Logger2", LogLevel.Debug);
Assert.That(logger1.Name(), Is.EqualTo("Logger1"));
@ -236,7 +236,7 @@ public class LoggerFactoryTests
}
/// <summary>
/// 测试ConsoleLoggerFactoryProvider的MinLevel不会影响已创建的logger
/// 测试ConsoleLoggerFactoryProvider的MinLevel不会影响已创建的logger
/// </summary>
[Test]
public void ConsoleLoggerFactoryProvider_MinLevel_DoesNotAffectCreatedLogger()

View File

@ -5,25 +5,25 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.logging;
/// <summary>
/// 测试Logger功能的单元测试类
/// 测试Logger功能的单元测试类
/// </summary>
[TestFixture]
public class LoggerTests
{
/// <summary>
/// 在每个测试方法执行前设置测试环境
/// 创建一个新的TestLogger实例名称为"TestLogger"最小日志级别为Info
/// 在每个测试方法执行前设置测试环境
/// 创建一个新的TestLogger实例名称为"TestLogger"最小日志级别为Info
/// </summary>
[SetUp]
public void SetUp()
{
_logger = new TestLogger("TestLogger", LogLevel.Info);
_logger = new TestLogger("TestLogger");
}
private TestLogger _logger = null!;
/// <summary>
/// 验证Name方法是否正确返回Logger的名称
/// 验证Name方法是否正确返回Logger的名称
/// </summary>
[Test]
public void Name_Should_ReturnLoggerName()
@ -34,7 +34,7 @@ public class LoggerTests
}
/// <summary>
/// 验证当使用默认名称时Name方法是否返回根Logger名称"ROOT"
/// 验证当使用默认名称时Name方法是否返回根Logger名称"ROOT"
/// </summary>
[Test]
public void Name_WithDefaultName_Should_ReturnRootLoggerName()
@ -45,7 +45,7 @@ public class LoggerTests
}
/// <summary>
/// 验证当最小日志级别为Info时IsTraceEnabled方法是否返回false
/// 验证当最小日志级别为Info时IsTraceEnabled方法是否返回false
/// </summary>
[Test]
public void IsTraceEnabled_WithInfoMinLevel_Should_ReturnFalse()
@ -54,7 +54,7 @@ public class LoggerTests
}
/// <summary>
/// 验证当最小日志级别为Info时IsDebugEnabled方法是否返回false
/// 验证当最小日志级别为Info时IsDebugEnabled方法是否返回false
/// </summary>
[Test]
public void IsDebugEnabled_WithInfoMinLevel_Should_ReturnFalse()
@ -63,7 +63,7 @@ public class LoggerTests
}
/// <summary>
/// 验证当最小日志级别为Info时IsInfoEnabled方法是否返回true
/// 验证当最小日志级别为Info时IsInfoEnabled方法是否返回true
/// </summary>
[Test]
public void IsInfoEnabled_WithInfoMinLevel_Should_ReturnTrue()
@ -72,7 +72,7 @@ public class LoggerTests
}
/// <summary>
/// 验证当最小日志级别为Info时IsWarnEnabled方法是否返回true
/// 验证当最小日志级别为Info时IsWarnEnabled方法是否返回true
/// </summary>
[Test]
public void IsWarnEnabled_WithInfoMinLevel_Should_ReturnTrue()
@ -81,7 +81,7 @@ public class LoggerTests
}
/// <summary>
/// 验证当最小日志级别为Info时IsErrorEnabled方法是否返回true
/// 验证当最小日志级别为Info时IsErrorEnabled方法是否返回true
/// </summary>
[Test]
public void IsErrorEnabled_WithInfoMinLevel_Should_ReturnTrue()
@ -90,7 +90,7 @@ public class LoggerTests
}
/// <summary>
/// 验证当最小日志级别为Info时IsFatalEnabled方法是否返回true
/// 验证当最小日志级别为Info时IsFatalEnabled方法是否返回true
/// </summary>
[Test]
public void IsFatalEnabled_WithInfoMinLevel_Should_ReturnTrue()
@ -99,7 +99,7 @@ public class LoggerTests
}
/// <summary>
/// 验证IsEnabledForLevel方法对于不同日志级别的返回值是否正确
/// 验证IsEnabledForLevel方法对于不同日志级别的返回值是否正确
/// </summary>
[Test]
public void IsEnabledForLevel_WithValidLevel_Should_ReturnCorrectResult()
@ -113,7 +113,7 @@ public class LoggerTests
}
/// <summary>
/// 验证当传入无效的日志级别时IsEnabledForLevel方法是否会抛出ArgumentException异常
/// 验证当传入无效的日志级别时IsEnabledForLevel方法是否会抛出ArgumentException异常
/// </summary>
[Test]
public void IsEnabledForLevel_WithInvalidLevel_Should_ThrowArgumentException()
@ -122,7 +122,7 @@ public class LoggerTests
}
/// <summary>
/// 验证当Trace级别被禁用时Trace方法不会写入日志
/// 验证当Trace级别被禁用时Trace方法不会写入日志
/// </summary>
[Test]
public void Trace_ShouldNotWrite_WhenTraceDisabled()
@ -133,7 +133,7 @@ public class LoggerTests
}
/// <summary>
/// 验证当Trace级别被禁用时带格式化参数的Trace方法不会写入日志
/// 验证当Trace级别被禁用时带格式化参数的Trace方法不会写入日志
/// </summary>
[Test]
public void Trace_WithFormat_ShouldNotWrite_WhenTraceDisabled()
@ -144,7 +144,7 @@ public class LoggerTests
}
/// <summary>
/// 验证当Trace级别被禁用时带两个参数的Trace方法不会写入日志
/// 验证当Trace级别被禁用时带两个参数的Trace方法不会写入日志
/// </summary>
[Test]
public void Trace_WithTwoArgs_ShouldNotWrite_WhenTraceDisabled()
@ -155,7 +155,7 @@ public class LoggerTests
}
/// <summary>
/// 验证当Trace级别被禁用时带异常参数的Trace方法不会写入日志
/// 验证当Trace级别被禁用时带异常参数的Trace方法不会写入日志
/// </summary>
[Test]
public void Trace_WithException_ShouldNotWrite_WhenTraceDisabled()
@ -167,7 +167,7 @@ public class LoggerTests
}
/// <summary>
/// 验证当Debug级别被禁用时Debug方法不会写入日志
/// 验证当Debug级别被禁用时Debug方法不会写入日志
/// </summary>
[Test]
public void Debug_ShouldNotWrite_WhenDebugDisabled()
@ -178,7 +178,7 @@ public class LoggerTests
}
/// <summary>
/// 验证当Debug级别被禁用时带格式化参数的Debug方法不会写入日志
/// 验证当Debug级别被禁用时带格式化参数的Debug方法不会写入日志
/// </summary>
[Test]
public void Debug_WithFormat_ShouldNotWrite_WhenDebugDisabled()
@ -189,7 +189,7 @@ public class LoggerTests
}
/// <summary>
/// 验证当Info级别启用时Info方法会正确写入日志
/// 验证当Info级别启用时Info方法会正确写入日志
/// </summary>
[Test]
public void Info_ShouldWrite_WhenInfoEnabled()
@ -203,7 +203,7 @@ public class LoggerTests
}
/// <summary>
/// 验证带格式化参数的Info方法会正确写入格式化后的消息
/// 验证带格式化参数的Info方法会正确写入格式化后的消息
/// </summary>
[Test]
public void Info_WithFormat_ShouldWriteFormattedMessage()
@ -215,7 +215,7 @@ public class LoggerTests
}
/// <summary>
/// 验证带两个参数的Info方法会正确写入格式化后的消息
/// 验证带两个参数的Info方法会正确写入格式化后的消息
/// </summary>
[Test]
public void Info_WithTwoArgs_ShouldWriteFormattedMessage()
@ -227,7 +227,7 @@ public class LoggerTests
}
/// <summary>
/// 验证带多个参数的Info方法会正确写入格式化后的消息
/// 验证带多个参数的Info方法会正确写入格式化后的消息
/// </summary>
[Test]
public void Info_WithMultipleArgs_ShouldWriteFormattedMessage()
@ -239,7 +239,7 @@ public class LoggerTests
}
/// <summary>
/// 验证带异常参数的Info方法会正确写入消息和异常
/// 验证带异常参数的Info方法会正确写入消息和异常
/// </summary>
[Test]
public void Info_WithException_ShouldWriteMessageAndException()
@ -253,7 +253,7 @@ public class LoggerTests
}
/// <summary>
/// 验证当Warn级别启用时Warn方法会正确写入日志
/// 验证当Warn级别启用时Warn方法会正确写入日志
/// </summary>
[Test]
public void Warn_ShouldWrite_WhenWarnEnabled()
@ -266,7 +266,7 @@ public class LoggerTests
}
/// <summary>
/// 验证带格式化参数的Warn方法会正确写入格式化后的消息
/// 验证带格式化参数的Warn方法会正确写入格式化后的消息
/// </summary>
[Test]
public void Warn_WithFormat_ShouldWriteFormattedMessage()
@ -278,7 +278,7 @@ public class LoggerTests
}
/// <summary>
/// 验证带异常参数的Warn方法会正确写入消息和异常
/// 验证带异常参数的Warn方法会正确写入消息和异常
/// </summary>
[Test]
public void Warn_WithException_ShouldWriteMessageAndException()
@ -291,7 +291,7 @@ public class LoggerTests
}
/// <summary>
/// 验证当Error级别启用时Error方法会正确写入日志
/// 验证当Error级别启用时Error方法会正确写入日志
/// </summary>
[Test]
public void Error_ShouldWrite_WhenErrorEnabled()
@ -304,7 +304,7 @@ public class LoggerTests
}
/// <summary>
/// 验证带格式化参数的Error方法会正确写入格式化后的消息
/// 验证带格式化参数的Error方法会正确写入格式化后的消息
/// </summary>
[Test]
public void Error_WithFormat_ShouldWriteFormattedMessage()
@ -316,7 +316,7 @@ public class LoggerTests
}
/// <summary>
/// 验证带异常参数的Error方法会正确写入消息和异常
/// 验证带异常参数的Error方法会正确写入消息和异常
/// </summary>
[Test]
public void Error_WithException_ShouldWriteMessageAndException()
@ -329,7 +329,7 @@ public class LoggerTests
}
/// <summary>
/// 验证当Fatal级别启用时Fatal方法会正确写入日志
/// 验证当Fatal级别启用时Fatal方法会正确写入日志
/// </summary>
[Test]
public void Fatal_ShouldWrite_WhenFatalEnabled()
@ -342,7 +342,7 @@ public class LoggerTests
}
/// <summary>
/// 验证带格式化参数的Fatal方法会正确写入格式化后的消息
/// 验证带格式化参数的Fatal方法会正确写入格式化后的消息
/// </summary>
[Test]
public void Fatal_WithFormat_ShouldWriteFormattedMessage()
@ -354,7 +354,7 @@ public class LoggerTests
}
/// <summary>
/// 验证带异常参数的Fatal方法会正确写入消息和异常
/// 验证带异常参数的Fatal方法会正确写入消息和异常
/// </summary>
[Test]
public void Fatal_WithException_ShouldWriteMessageAndException()
@ -367,7 +367,7 @@ public class LoggerTests
}
/// <summary>
/// 验证多次调用日志方法会累积日志条目
/// 验证多次调用日志方法会累积日志条目
/// </summary>
[Test]
public void MultipleLogCalls_ShouldAccumulateLogs()
@ -383,7 +383,7 @@ public class LoggerTests
}
/// <summary>
/// 验证当最小日志级别设置为Trace时所有级别的日志都会被启用
/// 验证当最小日志级别设置为Trace时所有级别的日志都会被启用
/// </summary>
[Test]
public void Logger_WithTraceMinLevel_ShouldEnableAllLevels()
@ -401,7 +401,7 @@ public class LoggerTests
}
/// <summary>
/// 验证当最小日志级别设置为Fatal时只有Fatal级别的日志会被启用
/// 验证当最小日志级别设置为Fatal时只有Fatal级别的日志会被启用
/// </summary>
[Test]
public void Logger_WithFatalMinLevel_ShouldDisableAllButFatal()
@ -421,12 +421,12 @@ public class LoggerTests
}
/// <summary>
/// 测试用的日志记录器实现类继承自AbstractLogger
/// 测试用的日志记录器实现类继承自AbstractLogger
/// </summary>
public sealed class TestLogger : AbstractLogger
{
/// <summary>
/// 初始化TestLogger的新实例
/// 初始化TestLogger的新实例
/// </summary>
/// <param name="name">日志记录器的名称默认为null</param>
/// <param name="minLevel">最小日志级别默认为LogLevel.Info</param>
@ -435,12 +435,12 @@ public sealed class TestLogger : AbstractLogger
}
/// <summary>
/// 获取记录的日志条目列表
/// 获取记录的日志条目列表
/// </summary>
public List<LogEntry> Logs { get; } = new();
/// <summary>
/// 将日志信息写入内部存储
/// 将日志信息写入内部存储
/// </summary>
/// <param name="level">日志级别</param>
/// <param name="message">日志消息</param>
@ -451,7 +451,7 @@ public sealed class TestLogger : AbstractLogger
}
/// <summary>
/// 表示单个日志条目的记录类型
/// 表示单个日志条目的记录类型
/// </summary>
/// <param name="Level">日志级别</param>
/// <param name="Message">日志消息</param>

View File

@ -5,13 +5,13 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.pool;
/// <summary>
/// 对象池功能测试类,用于验证对象池的基本操作和行为
/// 对象池功能测试类,用于验证对象池的基本操作和行为
/// </summary>
[TestFixture]
public class ObjectPoolTests
{
/// <summary>
/// 测试初始化方法,在每个测试方法执行前设置测试环境
/// 测试初始化方法,在每个测试方法执行前设置测试环境
/// </summary>
[SetUp]
public void SetUp()
@ -20,12 +20,12 @@ public class ObjectPoolTests
}
/// <summary>
/// 测试用的对象池实例
/// 测试用的对象池实例
/// </summary>
private TestObjectPool _pool = null!;
/// <summary>
/// 验证当对象池为空时Acquire方法应该创建新对象
/// 验证当对象池为空时Acquire方法应该创建新对象
/// </summary>
[Test]
public void Acquire_Should_Create_New_Object_When_Pool_Empty()
@ -38,7 +38,7 @@ public class ObjectPoolTests
}
/// <summary>
/// 验证Acquire方法应该返回池中的可用对象
/// 验证Acquire方法应该返回池中的可用对象
/// </summary>
[Test]
public void Acquire_Should_Return_Pooled_Object()
@ -56,7 +56,7 @@ public class ObjectPoolTests
}
/// <summary>
/// 验证Release方法应该调用对象的OnRelease回调
/// 验证Release方法应该调用对象的OnRelease回调
/// </summary>
[Test]
public void Release_Should_Call_OnRelease()
@ -69,7 +69,7 @@ public class ObjectPoolTests
}
/// <summary>
/// 验证Clear方法应该销毁所有对象
/// 验证Clear方法应该销毁所有对象
/// </summary>
[Test]
public void Clear_Should_Destroy_All_Objects()
@ -87,7 +87,7 @@ public class ObjectPoolTests
}
/// <summary>
/// 验证多个池键应该相互独立
/// 验证多个池键应该相互独立
/// </summary>
[Test]
public void Multiple_Pools_Should_Be_Independent()
@ -105,7 +105,7 @@ public class ObjectPoolTests
}
/// <summary>
/// 验证OnAcquire回调应该在新对象和池中对象上都被调用
/// 验证OnAcquire回调应该在新对象和池中对象上都被调用
/// </summary>
[Test]
public void OnAcquire_Should_Be_Called_On_New_And_Pooled_Objects()
@ -122,12 +122,12 @@ public class ObjectPoolTests
}
/// <summary>
/// 测试用对象池实现类继承自AbstractObjectPoolSystem
/// 测试用对象池实现类继承自AbstractObjectPoolSystem
/// </summary>
public class TestObjectPool : AbstractObjectPoolSystem<string, TestPoolableObject>
{
/// <summary>
/// 创建新的池化对象
/// 创建新的池化对象
/// </summary>
/// <param name="key">用于标识对象的键</param>
/// <returns>新创建的TestPoolableObject实例</returns>
@ -137,7 +137,7 @@ public class TestObjectPool : AbstractObjectPoolSystem<string, TestPoolableObjec
}
/// <summary>
/// 初始化方法,用于对象池初始化时的操作
/// 初始化方法,用于对象池初始化时的操作
/// </summary>
protected override void OnInit()
{
@ -145,37 +145,37 @@ public class TestObjectPool : AbstractObjectPoolSystem<string, TestPoolableObjec
}
/// <summary>
/// 测试用池化对象类实现了IPoolableObject接口
/// 测试用池化对象类实现了IPoolableObject接口
/// </summary>
public class TestPoolableObject : IPoolableObject
{
/// <summary>
/// 获取或设置对象的池键
/// 获取或设置对象的池键
/// </summary>
public string PoolKey { get; set; } = string.Empty;
/// <summary>
/// 获取或设置测试用的整数值
/// 获取或设置测试用的整数值
/// </summary>
public int TestValue { get; set; }
/// <summary>
/// 获取或设置OnAcquire方法是否被调用的标志
/// 获取或设置OnAcquire方法是否被调用的标志
/// </summary>
public bool OnAcquireCalled { get; set; }
/// <summary>
/// 获取或设置OnRelease方法是否被调用的标志
/// 获取或设置OnRelease方法是否被调用的标志
/// </summary>
public bool OnReleaseCalled { get; set; }
/// <summary>
/// 获取或设置OnPoolDestroy方法是否被调用的标志
/// 获取或设置OnPoolDestroy方法是否被调用的标志
/// </summary>
public bool OnPoolDestroyCalled { get; set; }
/// <summary>
/// 对象被获取时的回调方法
/// 对象被获取时的回调方法
/// </summary>
public void OnAcquire()
{
@ -183,7 +183,7 @@ public class TestPoolableObject : IPoolableObject
}
/// <summary>
/// 对象被释放时的回调方法
/// 对象被释放时的回调方法
/// </summary>
public void OnRelease()
{
@ -191,7 +191,7 @@ public class TestPoolableObject : IPoolableObject
}
/// <summary>
/// 对象被销毁时的回调方法
/// 对象被销毁时的回调方法
/// </summary>
public void OnPoolDestroy()
{

View File

@ -4,13 +4,13 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.property;
/// <summary>
/// BindableProperty类的单元测试
/// BindableProperty类的单元测试
/// </summary>
[TestFixture]
public class BindablePropertyTests
{
/// <summary>
/// 测试清理方法,在每个测试方法执行后重置比较器
/// 测试清理方法,在每个测试方法执行后重置比较器
/// </summary>
[TearDown]
public void TearDown()
@ -19,7 +19,7 @@ public class BindablePropertyTests
}
/// <summary>
/// 测试获取值时应返回默认值
/// 测试获取值时应返回默认值
/// </summary>
[Test]
public void Value_Get_Should_Return_Default_Value()
@ -30,7 +30,7 @@ public class BindablePropertyTests
}
/// <summary>
/// 测试设置值时应触发事件
/// 测试设置值时应触发事件
/// </summary>
[Test]
public void Value_Set_Should_Trigger_Event()
@ -46,7 +46,7 @@ public class BindablePropertyTests
}
/// <summary>
/// 测试设置相同值时不触发事件
/// 测试设置相同值时不触发事件
/// </summary>
[Test]
public void Value_Set_To_Same_Value_Should_Not_Trigger_Event()
@ -62,7 +62,7 @@ public class BindablePropertyTests
}
/// <summary>
/// 测试取消注册应移除处理器
/// 测试取消注册应移除处理器
/// </summary>
[Test]
public void UnRegister_Should_Remove_Handler()
@ -82,7 +82,7 @@ public class BindablePropertyTests
}
/// <summary>
/// 测试带初始值注册应立即调用处理器
/// 测试带初始值注册应立即调用处理器
/// </summary>
[Test]
public void RegisterWithInitValue_Should_Call_Handler_Immediately()
@ -96,7 +96,7 @@ public class BindablePropertyTests
}
/// <summary>
/// 测试无事件设置值不应触发事件
/// 测试无事件设置值不应触发事件
/// </summary>
[Test]
public void SetValueWithoutEvent_Should_Not_Trigger_Event()
@ -113,7 +113,7 @@ public class BindablePropertyTests
}
/// <summary>
/// 测试使用自定义比较器
/// 测试使用自定义比较器
/// </summary>
[Test]
public void WithComparer_Should_Use_Custom_Comparer()
@ -141,7 +141,7 @@ public class BindablePropertyTests
}
/// <summary>
/// 测试多个处理器都应被调用
/// 测试多个处理器都应被调用
/// </summary>
[Test]
public void Multiple_Handlers_Should_All_Be_Called()
@ -160,7 +160,7 @@ public class BindablePropertyTests
}
/// <summary>
/// 测试注册应返回IUnRegister接口
/// 测试注册应返回IUnRegister接口
/// </summary>
[Test]
public void Register_Should_Return_IUnRegister()
@ -172,7 +172,7 @@ public class BindablePropertyTests
}
/// <summary>
/// 测试ToString应返回值的字符串表示
/// 测试ToString应返回值的字符串表示
/// </summary>
[Test]
public void ToString_Should_Return_Value_As_String()

View File

@ -11,18 +11,18 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.query;
/// <summary>
/// AbstractAsyncQuery类的单元测试
/// 测试内容包括:
/// - 异步查询的基础实现
/// - DoAsync方法调用
/// - DoAsync方法的异常处理
/// - 上下文感知功能SetContext, GetContext
/// - 日志功能Logger属性
/// - 子类继承行为验证
/// - 查询执行前日志记录
/// - 查询执行后日志记录
/// - 返回值类型验证
/// - 错误情况下的日志记录
/// AbstractAsyncQuery类的单元测试
/// 测试内容包括:
/// - 异步查询的基础实现
/// - DoAsync方法调用
/// - DoAsync方法的异常处理
/// - 上下文感知功能SetContext, GetContext
/// - 日志功能Logger属性
/// - 子类继承行为验证
/// - 查询执行前日志记录
/// - 查询执行后日志记录
/// - 返回值类型验证
/// - 错误情况下的日志记录
/// </summary>
[TestFixture]
public class AbstractAsyncQueryTests
@ -43,7 +43,7 @@ public class AbstractAsyncQueryTests
private IocContainer _container = null!;
/// <summary>
/// 测试异步查询的基础实现
/// 测试异步查询的基础实现
/// </summary>
[Test]
public async Task AbstractAsyncQuery_Should_Implement_IAsyncQuery_Interface()
@ -55,7 +55,7 @@ public class AbstractAsyncQueryTests
}
/// <summary>
/// 测试DoAsync方法调用
/// 测试DoAsync方法调用
/// </summary>
[Test]
public async Task DoAsync_Should_Invoke_OnDoAsync_Method()
@ -71,7 +71,7 @@ public class AbstractAsyncQueryTests
}
/// <summary>
/// 测试DoAsync方法的异常处理
/// 测试DoAsync方法的异常处理
/// </summary>
[Test]
public void DoAsync_Should_Propagate_Exception_From_OnDoAsync()
@ -84,7 +84,7 @@ public class AbstractAsyncQueryTests
}
/// <summary>
/// 测试上下文感知功能 - SetContext方法
/// 测试上下文感知功能 - SetContext方法
/// </summary>
[Test]
public void SetContext_Should_Set_Context_Property()
@ -100,7 +100,7 @@ public class AbstractAsyncQueryTests
}
/// <summary>
/// 测试上下文感知功能 - GetContext方法
/// 测试上下文感知功能 - GetContext方法
/// </summary>
[Test]
public void GetContext_Should_Return_Context_Property()
@ -117,7 +117,7 @@ public class AbstractAsyncQueryTests
}
/// <summary>
/// 测试子类继承行为验证
/// 测试子类继承行为验证
/// </summary>
[Test]
public async Task Child_Class_Should_Inherit_And_Override_OnDoAsync_Method()
@ -133,7 +133,7 @@ public class AbstractAsyncQueryTests
}
/// <summary>
/// 测试异步查询执行生命周期完整性
/// 测试异步查询执行生命周期完整性
/// </summary>
[Test]
public async Task AsyncQuery_Should_Complete_Execution_Lifecycle()
@ -151,7 +151,7 @@ public class AbstractAsyncQueryTests
}
/// <summary>
/// 测试异步查询多次执行
/// 测试异步查询多次执行
/// </summary>
[Test]
public async Task AsyncQuery_Should_Be_Executable_Multiple_Times()
@ -168,7 +168,7 @@ public class AbstractAsyncQueryTests
}
/// <summary>
/// 测试异步查询的返回值类型
/// 测试异步查询的返回值类型
/// </summary>
[Test]
public async Task AsyncQuery_Should_Return_Correct_Type()
@ -184,7 +184,7 @@ public class AbstractAsyncQueryTests
}
/// <summary>
/// 测试异步查询的字符串返回值
/// 测试异步查询的字符串返回值
/// </summary>
[Test]
public async Task AsyncQuery_WithStringResult_Should_Return_String()
@ -200,7 +200,7 @@ public class AbstractAsyncQueryTests
}
/// <summary>
/// 测试异步查询的复杂对象返回值
/// 测试异步查询的复杂对象返回值
/// </summary>
[Test]
public async Task AsyncQuery_WithComplexResult_Should_Return_ComplexObject()
@ -217,7 +217,7 @@ public class AbstractAsyncQueryTests
}
/// <summary>
/// 测试异步查询在不同实例之间的独立性
/// 测试异步查询在不同实例之间的独立性
/// </summary>
[Test]
public async Task AsyncQuery_Should_Maintain_Independence_Between_Different_Instances()
@ -238,23 +238,23 @@ public class AbstractAsyncQueryTests
}
/// <summary>
/// 测试用异步查询输入类V2
/// 测试用异步查询输入类V2
/// </summary>
public sealed class TestAsyncQueryInputV2 : IQueryInput
{
/// <summary>
/// 获取或设置值
/// 获取或设置值
/// </summary>
public int Value { get; init; }
}
/// <summary>
/// 整数类型测试异步查询类V4继承AbstractAsyncQuery
/// 整数类型测试异步查询类V4继承AbstractAsyncQuery
/// </summary>
public sealed class TestAsyncQueryV4 : AbstractAsyncQuery<TestAsyncQueryInputV2, int>
{
/// <summary>
/// 初始化TestAsyncQueryV4的新实例
/// 初始化TestAsyncQueryV4的新实例
/// </summary>
/// <param name="input">查询输入参数</param>
public TestAsyncQueryV4(TestAsyncQueryInputV2 input) : base(input)
@ -262,12 +262,12 @@ public sealed class TestAsyncQueryV4 : AbstractAsyncQuery<TestAsyncQueryInputV2,
}
/// <summary>
/// 获取查询是否已执行
/// 获取查询是否已执行
/// </summary>
public bool Executed { get; private set; }
/// <summary>
/// 执行异步查询操作的具体实现
/// 执行异步查询操作的具体实现
/// </summary>
/// <param name="input">查询输入参数</param>
/// <returns>查询结果将输入值乘以2</returns>
@ -279,12 +279,12 @@ public sealed class TestAsyncQueryV4 : AbstractAsyncQuery<TestAsyncQueryInputV2,
}
/// <summary>
/// 字符串类型测试异步查询类V4继承AbstractAsyncQuery
/// 字符串类型测试异步查询类V4继承AbstractAsyncQuery
/// </summary>
public sealed class TestAsyncStringQueryV4 : AbstractAsyncQuery<TestAsyncQueryInputV2, string>
{
/// <summary>
/// 初始化TestAsyncStringQueryV4的新实例
/// 初始化TestAsyncStringQueryV4的新实例
/// </summary>
/// <param name="input">查询输入参数</param>
public TestAsyncStringQueryV4(TestAsyncQueryInputV2 input) : base(input)
@ -292,12 +292,12 @@ public sealed class TestAsyncStringQueryV4 : AbstractAsyncQuery<TestAsyncQueryIn
}
/// <summary>
/// 获取查询是否已执行
/// 获取查询是否已执行
/// </summary>
public bool Executed { get; private set; }
/// <summary>
/// 执行异步查询操作的具体实现
/// 执行异步查询操作的具体实现
/// </summary>
/// <param name="input">查询输入参数</param>
/// <returns>格式化的字符串结果</returns>
@ -309,12 +309,12 @@ public sealed class TestAsyncStringQueryV4 : AbstractAsyncQuery<TestAsyncQueryIn
}
/// <summary>
/// 复杂对象类型测试异步查询类V4继承AbstractAsyncQuery
/// 复杂对象类型测试异步查询类V4继承AbstractAsyncQuery
/// </summary>
public sealed class TestAsyncComplexQueryV4 : AbstractAsyncQuery<TestAsyncQueryInputV2, TestAsyncQueryResultV2>
{
/// <summary>
/// 初始化TestAsyncComplexQueryV4的新实例
/// 初始化TestAsyncComplexQueryV4的新实例
/// </summary>
/// <param name="input">查询输入参数</param>
public TestAsyncComplexQueryV4(TestAsyncQueryInputV2 input) : base(input)
@ -322,12 +322,12 @@ public sealed class TestAsyncComplexQueryV4 : AbstractAsyncQuery<TestAsyncQueryI
}
/// <summary>
/// 获取查询是否已执行
/// 获取查询是否已执行
/// </summary>
public bool Executed { get; private set; }
/// <summary>
/// 执行异步查询操作的具体实现
/// 执行异步查询操作的具体实现
/// </summary>
/// <param name="input">查询输入参数</param>
/// <returns>复杂对象查询结果</returns>
@ -344,12 +344,12 @@ public sealed class TestAsyncComplexQueryV4 : AbstractAsyncQuery<TestAsyncQueryI
}
/// <summary>
/// 测试用异步查询类(抛出异常)
/// 测试用异步查询类(抛出异常)
/// </summary>
public sealed class TestAsyncQueryWithExceptionV4 : AbstractAsyncQuery<TestAsyncQueryInputV2, int>
{
/// <summary>
/// 初始化TestAsyncQueryWithExceptionV4的新实例
/// 初始化TestAsyncQueryWithExceptionV4的新实例
/// </summary>
/// <param name="input">查询输入参数</param>
public TestAsyncQueryWithExceptionV4(TestAsyncQueryInputV2 input) : base(input)
@ -357,7 +357,7 @@ public sealed class TestAsyncQueryWithExceptionV4 : AbstractAsyncQuery<TestAsync
}
/// <summary>
/// 执行异步查询操作并抛出异常
/// 执行异步查询操作并抛出异常
/// </summary>
/// <param name="input">查询输入参数</param>
/// <exception cref="InvalidOperationException">总是抛出异常</exception>
@ -368,12 +368,12 @@ public sealed class TestAsyncQueryWithExceptionV4 : AbstractAsyncQuery<TestAsync
}
/// <summary>
/// 测试用异步查询子类V4继承AbstractAsyncQuery
/// 测试用异步查询子类V4继承AbstractAsyncQuery
/// </summary>
public sealed class TestAsyncQueryChildV4 : AbstractAsyncQuery<TestAsyncQueryInputV2, int>
{
/// <summary>
/// 初始化TestAsyncQueryChildV4的新实例
/// 初始化TestAsyncQueryChildV4的新实例
/// </summary>
/// <param name="input">查询输入参数</param>
public TestAsyncQueryChildV4(TestAsyncQueryInputV2 input) : base(input)
@ -381,12 +381,12 @@ public sealed class TestAsyncQueryChildV4 : AbstractAsyncQuery<TestAsyncQueryInp
}
/// <summary>
/// 获取查询是否已执行
/// 获取查询是否已执行
/// </summary>
public bool Executed { get; private set; }
/// <summary>
/// 执行异步查询操作的具体实现子类实现乘以3
/// 执行异步查询操作的具体实现子类实现乘以3
/// </summary>
/// <param name="input">查询输入参数</param>
/// <returns>查询结果将输入值乘以3</returns>
@ -398,17 +398,17 @@ public sealed class TestAsyncQueryChildV4 : AbstractAsyncQuery<TestAsyncQueryInp
}
/// <summary>
/// 测试用复杂查询结果类V2
/// 测试用复杂查询结果类V2
/// </summary>
public sealed class TestAsyncQueryResultV2
{
/// <summary>
/// 获取或设置值
/// 获取或设置值
/// </summary>
public int Value { get; init; }
/// <summary>
/// 获取或设置双倍值
/// 获取或设置双倍值
/// </summary>
public int DoubleValue { get; init; }
}

View File

@ -5,14 +5,14 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.query;
/// <summary>
/// AsyncQueryBus类的单元测试
/// 测试内容包括:
/// - SendAsync方法 - 正常查询发送
/// - SendAsync方法 - 空查询异常
/// - 异步查询结果正确性
/// - 不同返回类型的异步查询支持
/// - 异步查询的异常处理
/// - 异步查询的上下文传递
/// AsyncQueryBus类的单元测试
/// 测试内容包括:
/// - SendAsync方法 - 正常查询发送
/// - SendAsync方法 - 空查询异常
/// - 异步查询结果正确性
/// - 不同返回类型的异步查询支持
/// - 异步查询的异常处理
/// - 异步查询的上下文传递
/// </summary>
[TestFixture]
public class AsyncQueryBusTests
@ -26,7 +26,7 @@ public class AsyncQueryBusTests
private AsyncQueryBus _asyncQueryBus = null!;
/// <summary>
/// 测试SendAsync方法正确返回查询结果
/// 测试SendAsync方法正确返回查询结果
/// </summary>
[Test]
public async Task SendAsync_Should_Return_Query_Result()
@ -40,7 +40,7 @@ public class AsyncQueryBusTests
}
/// <summary>
/// 测试SendAsync方法在传入空查询对象时是否会抛出ArgumentNullException异常
/// 测试SendAsync方法在传入空查询对象时是否会抛出ArgumentNullException异常
/// </summary>
[Test]
public void SendAsync_WithNullQuery_Should_ThrowArgumentNullException()
@ -49,7 +49,7 @@ public class AsyncQueryBusTests
}
/// <summary>
/// 测试SendAsync方法是否能正确返回字符串类型的查询结果
/// 测试SendAsync方法是否能正确返回字符串类型的查询结果
/// </summary>
[Test]
public async Task SendAsync_WithStringResult_Should_Return_String()
@ -63,7 +63,7 @@ public class AsyncQueryBusTests
}
/// <summary>
/// 测试SendAsync方法是否能正确返回布尔类型的查询结果
/// 测试SendAsync方法是否能正确返回布尔类型的查询结果
/// </summary>
[Test]
public async Task SendAsync_WithBooleanResult_Should_Return_Boolean()
@ -77,7 +77,7 @@ public class AsyncQueryBusTests
}
/// <summary>
/// 测试SendAsync方法是否能正确处理复杂对象的查询结果
/// 测试SendAsync方法是否能正确处理复杂对象的查询结果
/// </summary>
[Test]
public async Task SendAsync_WithComplexObjectResult_Should_Return_ComplexObject()
@ -93,7 +93,7 @@ public class AsyncQueryBusTests
}
/// <summary>
/// 测试SendAsync方法是否能正确处理抛出异常的查询
/// 测试SendAsync方法是否能正确处理抛出异常的查询
/// </summary>
[Test]
public void SendAsync_Should_Propagate_Exception_From_Query()
@ -105,7 +105,7 @@ public class AsyncQueryBusTests
}
/// <summary>
/// 测试SendAsync方法多次调用
/// 测试SendAsync方法多次调用
/// </summary>
[Test]
public async Task SendAsync_Should_Be_Callable_Multiple_Times()
@ -121,7 +121,7 @@ public class AsyncQueryBusTests
}
/// <summary>
/// 测试SendAsync方法在不同查询之间保持独立性
/// 测试SendAsync方法在不同查询之间保持独立性
/// </summary>
[Test]
public async Task SendAsync_Should_Maintain_Independence_Between_Different_Queries()
@ -140,24 +140,24 @@ public class AsyncQueryBusTests
}
/// <summary>
/// 测试用异步查询输入类实现IQueryInput接口
/// 测试用异步查询输入类实现IQueryInput接口
/// </summary>
public sealed class TestAsyncQueryInput : IQueryInput
{
/// <summary>
/// 获取或设置查询值
/// 获取或设置查询值
/// </summary>
public int Value { get; init; }
}
/// <summary>
/// 整数类型测试异步查询类继承AbstractAsyncQuery
/// 实现具体的异步查询逻辑并返回整数结果
/// 整数类型测试异步查询类继承AbstractAsyncQuery
/// 实现具体的异步查询逻辑并返回整数结果
/// </summary>
public sealed class TestAsyncQuery : AbstractAsyncQuery<TestAsyncQueryInput, int>
{
/// <summary>
/// 初始化TestAsyncQuery的新实例
/// 初始化TestAsyncQuery的新实例
/// </summary>
/// <param name="input">查询输入参数</param>
public TestAsyncQuery(TestAsyncQueryInput input) : base(input)
@ -165,7 +165,7 @@ public sealed class TestAsyncQuery : AbstractAsyncQuery<TestAsyncQueryInput, int
}
/// <summary>
/// 执行异步查询操作的具体实现
/// 执行异步查询操作的具体实现
/// </summary>
/// <param name="input">查询输入参数</param>
/// <returns>查询结果将输入值乘以2</returns>
@ -176,13 +176,13 @@ public sealed class TestAsyncQuery : AbstractAsyncQuery<TestAsyncQueryInput, int
}
/// <summary>
/// 字符串类型测试异步查询类继承AbstractAsyncQuery
/// 实现具体的异步查询逻辑并返回字符串结果
/// 字符串类型测试异步查询类继承AbstractAsyncQuery
/// 实现具体的异步查询逻辑并返回字符串结果
/// </summary>
public sealed class TestAsyncStringQuery : AbstractAsyncQuery<TestAsyncQueryInput, string>
{
/// <summary>
/// 初始化TestAsyncStringQuery的新实例
/// 初始化TestAsyncStringQuery的新实例
/// </summary>
/// <param name="input">查询输入参数</param>
public TestAsyncStringQuery(TestAsyncQueryInput input) : base(input)
@ -190,7 +190,7 @@ public sealed class TestAsyncStringQuery : AbstractAsyncQuery<TestAsyncQueryInpu
}
/// <summary>
/// 执行异步查询操作的具体实现
/// 执行异步查询操作的具体实现
/// </summary>
/// <param name="input">查询输入参数</param>
/// <returns>格式化的字符串结果</returns>
@ -201,13 +201,13 @@ public sealed class TestAsyncStringQuery : AbstractAsyncQuery<TestAsyncQueryInpu
}
/// <summary>
/// 布尔类型测试异步查询类继承AbstractAsyncQuery
/// 实现具体的异步查询逻辑并返回布尔结果
/// 布尔类型测试异步查询类继承AbstractAsyncQuery
/// 实现具体的异步查询逻辑并返回布尔结果
/// </summary>
public sealed class TestAsyncBooleanQuery : AbstractAsyncQuery<TestAsyncQueryInput, bool>
{
/// <summary>
/// 初始化TestAsyncBooleanQuery的新实例
/// 初始化TestAsyncBooleanQuery的新实例
/// </summary>
/// <param name="input">查询输入参数</param>
public TestAsyncBooleanQuery(TestAsyncQueryInput input) : base(input)
@ -215,7 +215,7 @@ public sealed class TestAsyncBooleanQuery : AbstractAsyncQuery<TestAsyncQueryInp
}
/// <summary>
/// 执行异步查询操作的具体实现
/// 执行异步查询操作的具体实现
/// </summary>
/// <param name="input">查询输入参数</param>
/// <returns>如果值大于0返回true否则返回false</returns>
@ -226,13 +226,13 @@ public sealed class TestAsyncBooleanQuery : AbstractAsyncQuery<TestAsyncQueryInp
}
/// <summary>
/// 复杂对象类型测试异步查询类继承AbstractAsyncQuery
/// 实现具体的异步查询逻辑并返回复杂对象结果
/// 复杂对象类型测试异步查询类继承AbstractAsyncQuery
/// 实现具体的异步查询逻辑并返回复杂对象结果
/// </summary>
public sealed class TestAsyncComplexQuery : AbstractAsyncQuery<TestAsyncQueryInput, TestAsyncQueryResult>
{
/// <summary>
/// 初始化TestAsyncComplexQuery的新实例
/// 初始化TestAsyncComplexQuery的新实例
/// </summary>
/// <param name="input">查询输入参数</param>
public TestAsyncComplexQuery(TestAsyncQueryInput input) : base(input)
@ -240,7 +240,7 @@ public sealed class TestAsyncComplexQuery : AbstractAsyncQuery<TestAsyncQueryInp
}
/// <summary>
/// 执行异步查询操作的具体实现
/// 执行异步查询操作的具体实现
/// </summary>
/// <param name="input">查询输入参数</param>
/// <returns>复杂对象查询结果</returns>
@ -256,12 +256,12 @@ public sealed class TestAsyncComplexQuery : AbstractAsyncQuery<TestAsyncQueryInp
}
/// <summary>
/// 测试用异步查询类(抛出异常)
/// 测试用异步查询类(抛出异常)
/// </summary>
public sealed class TestAsyncQueryWithException : AbstractAsyncQuery<TestAsyncQueryInput, int>
{
/// <summary>
/// 初始化TestAsyncQueryWithException的新实例
/// 初始化TestAsyncQueryWithException的新实例
/// </summary>
/// <param name="input">查询输入参数</param>
public TestAsyncQueryWithException(TestAsyncQueryInput input) : base(input)
@ -269,7 +269,7 @@ public sealed class TestAsyncQueryWithException : AbstractAsyncQuery<TestAsyncQu
}
/// <summary>
/// 执行异步查询操作并抛出异常
/// 执行异步查询操作并抛出异常
/// </summary>
/// <param name="input">查询输入参数</param>
/// <exception cref="InvalidOperationException">总是抛出异常</exception>
@ -280,17 +280,17 @@ public sealed class TestAsyncQueryWithException : AbstractAsyncQuery<TestAsyncQu
}
/// <summary>
/// 测试用复杂查询结果类
/// 测试用复杂查询结果类
/// </summary>
public sealed class TestAsyncQueryResult
{
/// <summary>
/// 获取或设置值
/// 获取或设置值
/// </summary>
public int Value { get; init; }
/// <summary>
/// 获取或设置双倍值
/// 获取或设置双倍值
/// </summary>
public int DoubleValue { get; init; }
}

View File

@ -5,13 +5,13 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.query;
/// <summary>
/// 查询总线测试类用于测试QueryBus的功能和异常处理
/// 查询总线测试类用于测试QueryBus的功能和异常处理
/// </summary>
[TestFixture]
public class QueryBusTests
{
/// <summary>
/// 测试设置方法,在每个测试方法执行前初始化查询总线实例
/// 测试设置方法,在每个测试方法执行前初始化查询总线实例
/// </summary>
[SetUp]
public void SetUp()
@ -22,8 +22,8 @@ public class QueryBusTests
private QueryBus _queryBus = null!;
/// <summary>
/// 测试Send方法是否能正确返回查询结果
/// 验证当传入有效查询对象时,能够得到预期的计算结果
/// 测试Send方法是否能正确返回查询结果
/// 验证当传入有效查询对象时,能够得到预期的计算结果
/// </summary>
[Test]
public void Send_Should_Return_Query_Result()
@ -37,8 +37,8 @@ public class QueryBusTests
}
/// <summary>
/// 测试Send方法在传入空查询对象时是否会抛出ArgumentNullException异常
/// 验证参数验证功能的正确性
/// 测试Send方法在传入空查询对象时是否会抛出ArgumentNullException异常
/// 验证参数验证功能的正确性
/// </summary>
[Test]
public void Send_WithNullQuery_Should_ThrowArgumentNullException()
@ -47,8 +47,8 @@ public class QueryBusTests
}
/// <summary>
/// 测试Send方法是否能正确返回字符串类型的查询结果
/// 验证不同返回类型的支持情况
/// 测试Send方法是否能正确返回字符串类型的查询结果
/// 验证不同返回类型的支持情况
/// </summary>
[Test]
public void Send_WithStringResult_Should_Return_String()
@ -63,25 +63,25 @@ public class QueryBusTests
}
/// <summary>
/// 测试用查询输入类实现IQueryInput接口
/// 用于传递查询所需的参数信息
/// 测试用查询输入类实现IQueryInput接口
/// 用于传递查询所需的参数信息
/// </summary>
public sealed class TestQueryInput : IQueryInput
{
/// <summary>
/// 获取或设置查询值
/// 获取或设置查询值
/// </summary>
public int Value { get; init; }
}
/// <summary>
/// 整数类型测试查询类继承自AbstractQuery
/// 实现具体的查询逻辑并返回整数结果
/// 整数类型测试查询类继承自AbstractQuery
/// 实现具体的查询逻辑并返回整数结果
/// </summary>
public sealed class TestQuery : AbstractQuery<TestQueryInput, int>
{
/// <summary>
/// 初始化TestQuery的新实例
/// 初始化TestQuery的新实例
/// </summary>
/// <param name="input">查询输入参数</param>
public TestQuery(TestQueryInput input) : base(input)
@ -89,7 +89,7 @@ public sealed class TestQuery : AbstractQuery<TestQueryInput, int>
}
/// <summary>
/// 执行查询操作的具体实现
/// 执行查询操作的具体实现
/// </summary>
/// <param name="input">查询输入参数</param>
/// <returns>查询结果将输入值乘以2</returns>
@ -100,13 +100,13 @@ public sealed class TestQuery : AbstractQuery<TestQueryInput, int>
}
/// <summary>
/// 字符串类型测试查询类继承自AbstractQuery
/// 实现具体的查询逻辑并返回字符串结果
/// 字符串类型测试查询类继承自AbstractQuery
/// 实现具体的查询逻辑并返回字符串结果
/// </summary>
public sealed class TestStringQuery : AbstractQuery<TestQueryInput, string>
{
/// <summary>
/// 初始化TestStringQuery的新实例
/// 初始化TestStringQuery的新实例
/// </summary>
/// <param name="input">查询输入参数</param>
public TestStringQuery(TestQueryInput input) : base(input)
@ -114,7 +114,7 @@ public sealed class TestStringQuery : AbstractQuery<TestQueryInput, string>
}
/// <summary>
/// 执行查询操作的具体实现
/// 执行查询操作的具体实现
/// </summary>
/// <param name="input">查询输入参数</param>
/// <returns>格式化的字符串结果</returns>

View File

@ -8,15 +8,15 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.rule;
/// <summary>
/// 测试 ContextAware 功能的单元测试类
/// 验证上下文感知对象的设置、获取和回调功能
/// 测试 ContextAware 功能的单元测试类
/// 验证上下文感知对象的设置、获取和回调功能
/// </summary>
[TestFixture]
public class ContextAwareTests
{
/// <summary>
/// 在每个测试方法执行前进行初始化设置
/// 创建测试用的 ContextAware 对象和模拟上下文,并绑定到游戏上下文中
/// 在每个测试方法执行前进行初始化设置
/// 创建测试用的 ContextAware 对象和模拟上下文,并绑定到游戏上下文中
/// </summary>
[SetUp]
public void SetUp()
@ -27,8 +27,8 @@ public class ContextAwareTests
}
/// <summary>
/// 在每个测试方法执行后进行清理工作
/// 从游戏上下文中解绑测试用的架构上下文类型
/// 在每个测试方法执行后进行清理工作
/// 从游戏上下文中解绑测试用的架构上下文类型
/// </summary>
[TearDown]
public void TearDown()
@ -40,8 +40,8 @@ public class ContextAwareTests
private TestArchitectureContext _mockContext = null!;
/// <summary>
/// 测试 SetContext 方法是否正确设置上下文属性
/// 验证通过 IContextAware 接口设置上下文后,内部的 PublicContext 属性能够正确返回设置的上下文
/// 测试 SetContext 方法是否正确设置上下文属性
/// 验证通过 IContextAware 接口设置上下文后,内部的 PublicContext 属性能够正确返回设置的上下文
/// </summary>
[Test]
public void SetContext_Should_Set_Context_Property()
@ -53,8 +53,8 @@ public class ContextAwareTests
}
/// <summary>
/// 测试 SetContext 方法是否正确调用 OnContextReady 回调方法
/// 验证设置上下文后OnContextReady 方法被正确触发
/// 测试 SetContext 方法是否正确调用 OnContextReady 回调方法
/// 验证设置上下文后OnContextReady 方法被正确触发
/// </summary>
[Test]
public void SetContext_Should_Call_OnContextReady()
@ -66,8 +66,8 @@ public class ContextAwareTests
}
/// <summary>
/// 测试 GetContext 方法是否返回已设置的上下文
/// 验证通过 IContextAware 接口设置上下文后GetContext 方法能正确返回相同的上下文实例
/// 测试 GetContext 方法是否返回已设置的上下文
/// 验证通过 IContextAware 接口设置上下文后GetContext 方法能正确返回相同的上下文实例
/// </summary>
[Test]
public void GetContext_Should_Return_Set_Context()
@ -81,9 +81,9 @@ public class ContextAwareTests
}
/// <summary>
/// 测试 GetContext 方法在未设置上下文时的行为
/// 验证当内部 Context 为 null 时GetContext 方法不会抛出异常
/// 此时应返回第一个架构上下文(在测试环境中验证不抛出异常即可)
/// 测试 GetContext 方法在未设置上下文时的行为
/// 验证当内部 Context 为 null 时GetContext 方法不会抛出异常
/// 此时应返回第一个架构上下文(在测试环境中验证不抛出异常即可)
/// </summary>
[Test]
public void GetContext_Should_Return_FirstArchitectureContext_When_Not_Set()
@ -102,24 +102,24 @@ public class ContextAwareTests
}
/// <summary>
/// 用于测试的 ContextAware 实现类
/// 继承自 ContextAwareBase提供公共访问的上下文属性和回调状态跟踪
/// 用于测试的 ContextAware 实现类
/// 继承自 ContextAwareBase提供公共访问的上下文属性和回调状态跟踪
/// </summary>
public class TestContextAware : ContextAwareBase
{
/// <summary>
/// 获取内部上下文的公共访问属性
/// 获取内部上下文的公共访问属性
/// </summary>
public IArchitectureContext? PublicContext => Context;
/// <summary>
/// 跟踪 OnContextReady 方法是否被调用的状态
/// 跟踪 OnContextReady 方法是否被调用的状态
/// </summary>
public bool OnContextReadyCalled { get; private set; }
/// <summary>
/// 重写上下文就绪回调方法
/// 设置 OnContextReadyCalled 标志为 true用于测试验证
/// 重写上下文就绪回调方法
/// 设置 OnContextReadyCalled 标志为 true用于测试验证
/// </summary>
protected override void OnContextReady()
{

View File

@ -15,21 +15,21 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.state;
/// <summary>
/// ContextAwareStateMachine类的单元测试
/// 测试内容包括:
/// - 作为ISystem的集成测试
/// - Init方法 - 初始化上下文感知状态
/// - Init方法 - 设置Context属性
/// - Destroy方法 - 清理状态
/// - OnArchitecturePhase方法 - 接收架构阶段
/// - 上下文感知状态初始化
/// - 状态变更事件发送
/// - SetContext方法
/// - GetContext方法
/// - ISystem接口实现验证
/// - 与EventBus的集成测试
/// - 多状态注册和切换
/// - 状态机生命周期完整性
/// ContextAwareStateMachine类的单元测试
/// 测试内容包括:
/// - 作为ISystem的集成测试
/// - Init方法 - 初始化上下文感知状态
/// - Init方法 - 设置Context属性
/// - Destroy方法 - 清理状态
/// - OnArchitecturePhase方法 - 接收架构阶段
/// - 上下文感知状态初始化
/// - 状态变更事件发送
/// - SetContext方法
/// - GetContext方法
/// - ISystem接口实现验证
/// - 与EventBus的集成测试
/// - 多状态注册和切换
/// - 状态机生命周期完整性
/// </summary>
[TestFixture]
public class StateMachineSystemTests
@ -66,7 +66,7 @@ public class StateMachineSystemTests
private EventBus? _eventBus;
/// <summary>
/// 测试ContextAwareStateMachine实现ISystem接口
/// 测试ContextAwareStateMachine实现ISystem接口
/// </summary>
[Test]
public void ContextAwareStateMachine_Should_Implement_ISystem_Interface()
@ -75,7 +75,7 @@ public class StateMachineSystemTests
}
/// <summary>
/// 测试SetContext设置Context属性
/// 测试SetContext设置Context属性
/// </summary>
[Test]
public void SetContext_Should_Set_Context_Property()
@ -87,7 +87,7 @@ public class StateMachineSystemTests
}
/// <summary>
/// 测试GetContext返回Context属性
/// 测试GetContext返回Context属性
/// </summary>
[Test]
public void GetContext_Should_Return_Context_Property()
@ -100,7 +100,7 @@ public class StateMachineSystemTests
}
/// <summary>
/// 测试Init方法为所有ContextAware状态设置Context
/// 测试Init方法为所有ContextAware状态设置Context
/// </summary>
[Test]
public void Init_Should_SetContext_On_All_ContextAware_States()
@ -121,7 +121,7 @@ public class StateMachineSystemTests
}
/// <summary>
/// 测试Init方法不为非ContextAware状态设置Context
/// 测试Init方法不为非ContextAware状态设置Context
/// </summary>
[Test]
public void Init_Should_Not_SetContext_On_NonContextAware_States()
@ -133,7 +133,7 @@ public class StateMachineSystemTests
}
/// <summary>
/// 测试Destroy方法不抛出异常
/// 测试Destroy方法不抛出异常
/// </summary>
[Test]
public void Destroy_Should_Not_Throw_Exception()
@ -142,7 +142,7 @@ public class StateMachineSystemTests
}
/// <summary>
/// 测试OnArchitecturePhase方法不抛出异常
/// 测试OnArchitecturePhase方法不抛出异常
/// </summary>
[Test]
public void OnArchitecturePhase_Should_Not_Throw_Exception()
@ -152,14 +152,14 @@ public class StateMachineSystemTests
}
/// <summary>
/// 测试ChangeTo发送StateChangedEvent事件
/// 验证当状态机切换到新状态时会正确触发StateChangedEvent事件并且事件中的旧状态为null首次切换
/// 测试ChangeTo发送StateChangedEvent事件
/// 验证当状态机切换到新状态时会正确触发StateChangedEvent事件并且事件中的旧状态为null首次切换
/// </summary>
[Test]
public void ChangeTo_Should_Send_StateChangedEvent()
{
// 订阅StateChangedEvent事件以验证事件是否被正确发送
bool eventReceived = false;
var eventReceived = false;
StateChangedEvent? receivedEvent = null;
_eventBus!.Register<StateChangedEvent>(e =>
@ -183,15 +183,15 @@ public class StateMachineSystemTests
}
/// <summary>
/// 测试ChangeTo发送StateChangedEvent事件包含旧状态
/// 验证当状态机从一个状态切换到另一个状态时会正确触发StateChangedEvent事件
/// 并且事件中包含正确的旧状态和新状态信息
/// 测试ChangeTo发送StateChangedEvent事件包含旧状态
/// 验证当状态机从一个状态切换到另一个状态时会正确触发StateChangedEvent事件
/// 并且事件中包含正确的旧状态和新状态信息
/// </summary>
[Test]
public void ChangeTo_Should_Send_StateChangedEvent_With_OldState()
{
// 订阅StateChangedEvent事件以验证事件是否被正确发送
bool eventReceived = false;
var eventReceived = false;
StateChangedEvent? receivedEvent = null;
_eventBus!.Register<StateChangedEvent>(e =>
@ -216,8 +216,8 @@ public class StateMachineSystemTests
}
/// <summary>
/// 测试CanChangeTo方法对于已注册状态的工作情况
/// 验证当状态已注册到状态机中时CanChangeTo方法应返回true
/// 测试CanChangeTo方法对于已注册状态的工作情况
/// 验证当状态已注册到状态机中时CanChangeTo方法应返回true
/// </summary>
[Test]
public void CanChangeTo_Should_Work_With_Registered_States()
@ -231,8 +231,8 @@ public class StateMachineSystemTests
}
/// <summary>
/// 测试可以注册多个状态
/// 验证状态机能够成功注册多个不同的状态实例,并且能够切换到这些已注册的状态
/// 测试可以注册多个状态
/// 验证状态机能够成功注册多个不同的状态实例,并且能够切换到这些已注册的状态
/// </summary>
[Test]
public void Multiple_States_Should_Be_Registered()
@ -251,7 +251,7 @@ public class StateMachineSystemTests
/// <summary>
/// 测试状态机生命周期完整
/// 测试状态机生命周期完整
/// </summary>
[Test]
public void StateMachine_Lifecycle_Should_Be_Complete()
@ -275,24 +275,27 @@ public class StateMachineSystemTests
#region Test Classes
/// <summary>
/// 测试用的ContextAwareStateMachine派生类用于访问内部状态字典
/// 测试用的ContextAwareStateMachine派生类用于访问内部状态字典
/// </summary>
public class TestStateMachineSystemV5 : StateMachineSystem
{
/// <summary>
/// 获取状态机内部的状态字典
/// 获取状态机内部的状态字典
/// </summary>
/// <returns>类型到状态实例的映射字典</returns>
public Dictionary<Type, IState> GetStates() => States;
public Dictionary<Type, IState> GetStates()
{
return States;
}
}
/// <summary>
/// 测试用的上下文感知状态基类实现
/// 测试用的上下文感知状态基类实现
/// </summary>
public class TestContextAwareStateV5 : ContextAwareStateBase
{
/// <summary>
/// 进入状态时调用
/// 进入状态时调用
/// </summary>
/// <param name="previous">前一个状态</param>
public override void OnEnter(IState? previous)
@ -300,7 +303,7 @@ public class TestContextAwareStateV5 : ContextAwareStateBase
}
/// <summary>
/// 退出状态时调用
/// 退出状态时调用
/// </summary>
/// <param name="next">下一个状态</param>
public override void OnExit(IState? next)
@ -309,12 +312,12 @@ public class TestContextAwareStateV5 : ContextAwareStateBase
}
/// <summary>
/// 第二个测试用的上下文感知状态基类实现
/// 第二个测试用的上下文感知状态基类实现
/// </summary>
public class TestContextAwareStateV5_2 : ContextAwareStateBase
{
/// <summary>
/// 进入状态时调用
/// 进入状态时调用
/// </summary>
/// <param name="previous">前一个状态</param>
public override void OnEnter(IState? previous)
@ -322,7 +325,7 @@ public class TestContextAwareStateV5_2 : ContextAwareStateBase
}
/// <summary>
/// 退出状态时调用
/// 退出状态时调用
/// </summary>
/// <param name="next">下一个状态</param>
public override void OnExit(IState? next)
@ -331,24 +334,27 @@ public class TestContextAwareStateV5_2 : ContextAwareStateBase
}
/// <summary>
/// 测试用的普通状态实现
/// 测试用的普通状态实现
/// </summary>
public class TestStateV5 : IState
{
/// <summary>
/// 状态标识符
/// 状态标识符
/// </summary>
public int Id { get; set; }
/// <summary>
/// 检查是否可以转换到指定状态
/// 检查是否可以转换到指定状态
/// </summary>
/// <param name="next">目标状态</param>
/// <returns>始终返回true表示允许转换</returns>
public bool CanTransitionTo(IState next) => true;
public bool CanTransitionTo(IState next)
{
return true;
}
/// <summary>
/// 进入状态时调用
/// 进入状态时调用
/// </summary>
/// <param name="previous">前一个状态</param>
public void OnEnter(IState? previous)
@ -356,7 +362,7 @@ public class TestStateV5 : IState
}
/// <summary>
/// 退出状态时调用
/// 退出状态时调用
/// </summary>
/// <param name="next">下一个状态</param>
public void OnExit(IState? next)

View File

@ -6,13 +6,13 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.state;
/// <summary>
/// 测试状态机功能的单元测试类
/// 测试状态机功能的单元测试类
/// </summary>
[TestFixture]
public class StateMachineTests
{
/// <summary>
/// 在每个测试方法执行前初始化状态机实例
/// 在每个测试方法执行前初始化状态机实例
/// </summary>
[SetUp]
public void SetUp()
@ -23,7 +23,7 @@ public class StateMachineTests
private StateMachine _stateMachine = null!;
/// <summary>
/// 验证当没有活动状态时当前状态应为null
/// 验证当没有活动状态时当前状态应为null
/// </summary>
[Test]
public void Current_Should_BeNull_When_NoState_Active()
@ -32,7 +32,7 @@ public class StateMachineTests
}
/// <summary>
/// 验证注册状态后,状态会被添加到状态字典中
/// 验证注册状态后,状态会被添加到状态字典中
/// </summary>
[Test]
public void Register_Should_AddState_To_StatesDictionary()
@ -44,7 +44,7 @@ public class StateMachineTests
}
/// <summary>
/// 验证ChangeTo方法能够正确设置当前状态
/// 验证ChangeTo方法能够正确设置当前状态
/// </summary>
[Test]
public void ChangeTo_Should_SetCurrentState()
@ -57,7 +57,7 @@ public class StateMachineTests
}
/// <summary>
/// 验证ChangeTo方法会调用OnEnter回调
/// 验证ChangeTo方法会调用OnEnter回调
/// </summary>
[Test]
public void ChangeTo_Should_Invoke_OnEnter()
@ -71,7 +71,7 @@ public class StateMachineTests
}
/// <summary>
/// 验证当存在当前状态时切换到新状态会调用原状态的OnExit回调
/// 验证当存在当前状态时切换到新状态会调用原状态的OnExit回调
/// </summary>
[Test]
public void ChangeTo_When_CurrentStateExists_Should_Invoke_OnExit()
@ -89,7 +89,7 @@ public class StateMachineTests
}
/// <summary>
/// 验证当存在当前状态时切换到新状态会调用新状态的OnEnter回调
/// 验证当存在当前状态时切换到新状态会调用新状态的OnEnter回调
/// </summary>
[Test]
public void ChangeTo_When_CurrentStateExists_Should_Invoke_OnEnter()
@ -107,7 +107,7 @@ public class StateMachineTests
}
/// <summary>
/// 验证切换到相同状态时不应调用回调方法
/// 验证切换到相同状态时不应调用回调方法
/// </summary>
[Test]
public void ChangeTo_ToSameState_Should_NotInvoke_Callbacks()
@ -126,7 +126,7 @@ public class StateMachineTests
}
/// <summary>
/// 验证切换到未注册状态时应抛出InvalidOperationException异常
/// 验证切换到未注册状态时应抛出InvalidOperationException异常
/// </summary>
[Test]
public void ChangeTo_ToUnregisteredState_Should_ThrowInvalidOperationException()
@ -135,7 +135,7 @@ public class StateMachineTests
}
/// <summary>
/// 验证当状态未注册时CanChangeTo方法应返回false
/// 验证当状态未注册时CanChangeTo方法应返回false
/// </summary>
[Test]
public void CanChangeTo_WhenStateNotRegistered_Should_ReturnFalse()
@ -145,7 +145,7 @@ public class StateMachineTests
}
/// <summary>
/// 验证当状态已注册时CanChangeTo方法应返回true
/// 验证当状态已注册时CanChangeTo方法应返回true
/// </summary>
[Test]
public void CanChangeTo_WhenStateRegistered_Should_ReturnTrue()
@ -158,7 +158,7 @@ public class StateMachineTests
}
/// <summary>
/// 验证当当前状态拒绝转换时CanChangeTo方法应返回false
/// 验证当当前状态拒绝转换时CanChangeTo方法应返回false
/// </summary>
[Test]
public void CanChangeTo_WhenCurrentStateDeniesTransition_Should_ReturnFalse()
@ -195,7 +195,7 @@ public class StateMachineTests
}
/// <summary>
/// 验证注销状态后应从字典中移除该状态
/// 验证注销状态后应从字典中移除该状态
/// </summary>
[Test]
public void Unregister_Should_RemoveState_FromDictionary()
@ -208,7 +208,7 @@ public class StateMachineTests
}
/// <summary>
/// 验证当活动状态被注销时应调用OnExit并清除当前状态
/// 验证当活动状态被注销时应调用OnExit并清除当前状态
/// </summary>
[Test]
public void Unregister_WhenStateIsActive_Should_Invoke_OnExit_AndClearCurrent()
@ -224,7 +224,7 @@ public class StateMachineTests
}
/// <summary>
/// 验证当非活动状态被注销时不应调用OnExit
/// 验证当非活动状态被注销时不应调用OnExit
/// </summary>
[Test]
public void Unregister_WhenStateNotActive_Should_Not_Invoke_OnExit()
@ -242,7 +242,7 @@ public class StateMachineTests
}
/// <summary>
/// 验证多次状态转换应正确调用回调方法
/// 验证多次状态转换应正确调用回调方法
/// </summary>
[Test]
public void MultipleStateChanges_Should_Invoke_Callbacks_Correctly()
@ -267,7 +267,7 @@ public class StateMachineTests
}
/// <summary>
/// 验证ChangeTo方法应遵循CanTransitionTo逻辑
/// 验证ChangeTo方法应遵循CanTransitionTo逻辑
/// </summary>
[Test]
public void ChangeTo_Should_Respect_CanTransitionTo_Logic()
@ -289,7 +289,7 @@ public class StateMachineTests
}
/// <summary>
/// 测试状态类V2版本实现IState接口用于测试
/// 测试状态类V2版本实现IState接口用于测试
/// </summary>
public sealed class TestStateV2 : IState
{
@ -302,7 +302,7 @@ public sealed class TestStateV2 : IState
public IState? ExitTo { get; private set; }
/// <summary>
/// 进入状态时的回调方法
/// 进入状态时的回调方法
/// </summary>
/// <param name="from">从哪个状态进入</param>
public void OnEnter(IState? from)
@ -313,7 +313,7 @@ public sealed class TestStateV2 : IState
}
/// <summary>
/// 离开状态时的回调方法
/// 离开状态时的回调方法
/// </summary>
/// <param name="to">离开到哪个状态</param>
public void OnExit(IState? to)
@ -324,7 +324,7 @@ public sealed class TestStateV2 : IState
}
/// <summary>
/// 判断是否可以转换到目标状态
/// 判断是否可以转换到目标状态
/// </summary>
/// <param name="target">目标状态</param>
/// <returns>是否允许转换</returns>
@ -335,7 +335,7 @@ public sealed class TestStateV2 : IState
}
/// <summary>
/// 测试状态类V3版本实现IState接口用于测试
/// 测试状态类V3版本实现IState接口用于测试
/// </summary>
public sealed class TestStateV3 : IState
{
@ -347,7 +347,7 @@ public sealed class TestStateV3 : IState
public IState? ExitTo { get; private set; }
/// <summary>
/// 进入状态时的回调方法
/// 进入状态时的回调方法
/// </summary>
/// <param name="from">从哪个状态进入</param>
public void OnEnter(IState? from)
@ -358,7 +358,7 @@ public sealed class TestStateV3 : IState
}
/// <summary>
/// 离开状态时的回调方法
/// 离开状态时的回调方法
/// </summary>
/// <param name="to">离开到哪个状态</param>
public void OnExit(IState? to)
@ -369,7 +369,7 @@ public sealed class TestStateV3 : IState
}
/// <summary>
/// 判断是否可以转换到目标状态
/// 判断是否可以转换到目标状态
/// </summary>
/// <param name="target">目标状态</param>
/// <returns>是否允许转换</returns>
@ -380,7 +380,7 @@ public sealed class TestStateV3 : IState
}
/// <summary>
/// 测试状态类V4版本实现IState接口用于测试
/// 测试状态类V4版本实现IState接口用于测试
/// </summary>
public sealed class TestStateV4 : IState
{
@ -392,7 +392,7 @@ public sealed class TestStateV4 : IState
public IState? ExitTo { get; private set; }
/// <summary>
/// 进入状态时的回调方法
/// 进入状态时的回调方法
/// </summary>
/// <param name="from">从哪个状态进入</param>
public void OnEnter(IState? from)
@ -403,7 +403,7 @@ public sealed class TestStateV4 : IState
}
/// <summary>
/// 离开状态时的回调方法
/// 离开状态时的回调方法
/// </summary>
/// <param name="to">离开到哪个状态</param>
public void OnExit(IState? to)
@ -414,7 +414,7 @@ public sealed class TestStateV4 : IState
}
/// <summary>
/// 判断是否可以转换到目标状态
/// 判断是否可以转换到目标状态
/// </summary>
/// <param name="target">目标状态</param>
/// <returns>是否允许转换</returns>
@ -425,12 +425,12 @@ public sealed class TestStateV4 : IState
}
/// <summary>
/// 状态机扩展方法类
/// 状态机扩展方法类
/// </summary>
public static class StateMachineExtensions
{
/// <summary>
/// 检查状态机是否包含指定类型的状态
/// 检查状态机是否包含指定类型的状态
/// </summary>
/// <typeparam name="T">要检查的状态类型</typeparam>
/// <param name="stateMachine">状态机实例</param>

View File

@ -4,13 +4,13 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.state;
/// <summary>
/// 测试状态模式实现的功能和行为
/// 测试状态模式实现的功能和行为
/// </summary>
[TestFixture]
public class StateTests
{
/// <summary>
/// 验证状态类是否正确实现了IState接口
/// 验证状态类是否正确实现了IState接口
/// </summary>
[Test]
public void State_Should_Implement_IState_Interface()
@ -21,7 +21,7 @@ public class StateTests
}
/// <summary>
/// 验证进入状态时OnEnter方法被正确调用并记录来源状态
/// 验证进入状态时OnEnter方法被正确调用并记录来源状态
/// </summary>
[Test]
public void OnEnter_Should_BeCalled_When_State_Enters()
@ -36,7 +36,7 @@ public class StateTests
}
/// <summary>
/// 验证当传入null作为来源状态时的处理情况
/// 验证当传入null作为来源状态时的处理情况
/// </summary>
[Test]
public void OnEnter_WithNull_Should_Set_EnterFrom_ToNull()
@ -50,7 +50,7 @@ public class StateTests
}
/// <summary>
/// 验证退出状态时OnExit方法被正确调用并记录目标状态
/// 验证退出状态时OnExit方法被正确调用并记录目标状态
/// </summary>
[Test]
public void OnExit_Should_BeCalled_When_State_Exits()
@ -65,7 +65,7 @@ public class StateTests
}
/// <summary>
/// 验证当传入null作为目标状态时的处理情况
/// 验证当传入null作为目标状态时的处理情况
/// </summary>
[Test]
public void OnExit_WithNull_Should_Set_ExitTo_ToNull()
@ -79,7 +79,7 @@ public class StateTests
}
/// <summary>
/// 验证允许转换时CanTransitionTo方法返回true
/// 验证允许转换时CanTransitionTo方法返回true
/// </summary>
[Test]
public void CanTransitionTo_WithAllowTrue_Should_ReturnTrue()
@ -93,7 +93,7 @@ public class StateTests
}
/// <summary>
/// 验证不允许转换时CanTransitionTo方法返回false
/// 验证不允许转换时CanTransitionTo方法返回false
/// </summary>
[Test]
public void CanTransitionTo_WithAllowFalse_Should_ReturnFalse()
@ -107,7 +107,7 @@ public class StateTests
}
/// <summary>
/// 验证CanTransitionTo方法正确接收目标状态参数
/// 验证CanTransitionTo方法正确接收目标状态参数
/// </summary>
[Test]
public void CanTransitionTo_Should_Receive_TargetState()
@ -123,7 +123,7 @@ public class StateTests
}
/// <summary>
/// 验证具有复杂转换规则的状态类功能
/// 验证具有复杂转换规则的状态类功能
/// </summary>
[Test]
public void State_WithComplexTransitionRules_Should_Work()
@ -137,7 +137,7 @@ public class StateTests
}
/// <summary>
/// 验证多个状态之间的协作功能
/// 验证多个状态之间的协作功能
/// </summary>
[Test]
public void MultipleStates_Should_WorkTogether()
@ -159,7 +159,7 @@ public class StateTests
}
/// <summary>
/// 验证状态对多次转换的跟踪能力
/// 验证状态对多次转换的跟踪能力
/// </summary>
[Test]
public void State_Should_Track_MultipleTransitions()
@ -177,7 +177,7 @@ public class StateTests
}
/// <summary>
/// 验证相同类型状态间的转换处理
/// 验证相同类型状态间的转换处理
/// </summary>
[Test]
public void State_Should_Handle_SameState_Transition()
@ -197,42 +197,42 @@ public class StateTests
}
/// <summary>
/// 具体状态实现类V2版本用于测试状态的基本功能
/// 具体状态实现类V2版本用于测试状态的基本功能
/// </summary>
public sealed class ConcreteStateV2 : IState
{
/// <summary>
/// 获取或设置是否允许转换
/// 获取或设置是否允许转换
/// </summary>
public bool AllowTransitions { get; set; } = true;
/// <summary>
/// 获取进入状态是否被调用的标志
/// 获取进入状态是否被调用的标志
/// </summary>
public bool EnterCalled { get; private set; }
/// <summary>
/// 获取退出状态是否被调用的标志
/// 获取退出状态是否被调用的标志
/// </summary>
public bool ExitCalled { get; private set; }
/// <summary>
/// 获取进入此状态的来源状态
/// 获取进入此状态的来源状态
/// </summary>
public IState? EnterFrom { get; private set; }
/// <summary>
/// 获取从此状态退出的目标状态
/// 获取从此状态退出的目标状态
/// </summary>
public IState? ExitTo { get; private set; }
/// <summary>
/// 获取或设置转换到目标状态时执行的动作
/// 获取或设置转换到目标状态时执行的动作
/// </summary>
public Action<IState>? CanTransitionToAction { get; set; }
/// <summary>
/// 进入当前状态时调用的方法
/// 进入当前状态时调用的方法
/// </summary>
/// <param name="from">从哪个状态进入</param>
public void OnEnter(IState? from)
@ -242,7 +242,7 @@ public sealed class ConcreteStateV2 : IState
}
/// <summary>
/// 退出当前状态时调用的方法
/// 退出当前状态时调用的方法
/// </summary>
/// <param name="to">退出到哪个状态</param>
public void OnExit(IState? to)
@ -252,7 +252,7 @@ public sealed class ConcreteStateV2 : IState
}
/// <summary>
/// 判断是否可以转换到目标状态
/// 判断是否可以转换到目标状态
/// </summary>
/// <param name="target">目标状态</param>
/// <returns>如果可以转换则返回true否则返回false</returns>
@ -264,32 +264,32 @@ public sealed class ConcreteStateV2 : IState
}
/// <summary>
/// 具体状态实现类V3版本用于测试状态的基本功能
/// 具体状态实现类V3版本用于测试状态的基本功能
/// </summary>
public sealed class ConcreteStateV3 : IState
{
/// <summary>
/// 获取进入状态是否被调用的标志
/// 获取进入状态是否被调用的标志
/// </summary>
public bool EnterCalled { get; private set; }
/// <summary>
/// 获取退出状态是否被调用的标志
/// 获取退出状态是否被调用的标志
/// </summary>
public bool ExitCalled { get; private set; }
/// <summary>
/// 获取进入此状态的来源状态
/// 获取进入此状态的来源状态
/// </summary>
public IState? EnterFrom { get; private set; }
/// <summary>
/// 获取从此状态退出的目标状态
/// 获取从此状态退出的目标状态
/// </summary>
public IState? ExitTo { get; private set; }
/// <summary>
/// 进入当前状态时调用的方法
/// 进入当前状态时调用的方法
/// </summary>
/// <param name="from">从哪个状态进入</param>
public void OnEnter(IState? from)
@ -299,7 +299,7 @@ public sealed class ConcreteStateV3 : IState
}
/// <summary>
/// 退出当前状态时调用的方法
/// 退出当前状态时调用的方法
/// </summary>
/// <param name="to">退出到哪个状态</param>
public void OnExit(IState? to)
@ -309,7 +309,7 @@ public sealed class ConcreteStateV3 : IState
}
/// <summary>
/// 判断是否可以转换到目标状态
/// 判断是否可以转换到目标状态
/// </summary>
/// <param name="target">目标状态</param>
/// <returns>如果可以转换则返回true否则返回false</returns>
@ -320,32 +320,32 @@ public sealed class ConcreteStateV3 : IState
}
/// <summary>
/// 具体状态实现类V4版本用于测试状态的基本功能
/// 具体状态实现类V4版本用于测试状态的基本功能
/// </summary>
public sealed class ConcreteStateV4 : IState
{
/// <summary>
/// 获取进入状态是否被调用的标志
/// 获取进入状态是否被调用的标志
/// </summary>
public bool EnterCalled { get; private set; }
/// <summary>
/// 获取退出状态是否被调用的标志
/// 获取退出状态是否被调用的标志
/// </summary>
public bool ExitCalled { get; private set; }
/// <summary>
/// 获取进入此状态的来源状态
/// 获取进入此状态的来源状态
/// </summary>
public IState? EnterFrom { get; private set; }
/// <summary>
/// 获取从此状态退出的目标状态
/// 获取从此状态退出的目标状态
/// </summary>
public IState? ExitTo { get; private set; }
/// <summary>
/// 进入当前状态时调用的方法
/// 进入当前状态时调用的方法
/// </summary>
/// <param name="from">从哪个状态进入</param>
public void OnEnter(IState? from)
@ -355,7 +355,7 @@ public sealed class ConcreteStateV4 : IState
}
/// <summary>
/// 退出当前状态时调用的方法
/// 退出当前状态时调用的方法
/// </summary>
/// <param name="to">退出到哪个状态</param>
public void OnExit(IState? to)
@ -365,7 +365,7 @@ public sealed class ConcreteStateV4 : IState
}
/// <summary>
/// 判断是否可以转换到目标状态
/// 判断是否可以转换到目标状态
/// </summary>
/// <param name="target">目标状态</param>
/// <returns>如果可以转换则返回true否则返回false</returns>
@ -376,37 +376,37 @@ public sealed class ConcreteStateV4 : IState
}
/// <summary>
/// 条件状态实现类V2版本支持基于类型的条件转换规则
/// 条件状态实现类V2版本支持基于类型的条件转换规则
/// </summary>
public sealed class ConditionalStateV2 : IState
{
/// <summary>
/// 获取或设置允许转换到的状态类型数组
/// 获取或设置允许转换到的状态类型数组
/// </summary>
public Type[] AllowedTransitions { get; set; } = Array.Empty<Type>();
/// <summary>
/// 获取进入状态是否被调用的标志
/// 获取进入状态是否被调用的标志
/// </summary>
public bool EnterCalled { get; private set; }
/// <summary>
/// 获取退出状态是否被调用的标志
/// 获取退出状态是否被调用的标志
/// </summary>
public bool ExitCalled { get; private set; }
/// <summary>
/// 获取进入此状态的来源状态
/// 获取进入此状态的来源状态
/// </summary>
public IState? EnterFrom { get; private set; }
/// <summary>
/// 获取从此状态退出的目标状态
/// 获取从此状态退出的目标状态
/// </summary>
public IState? ExitTo { get; private set; }
/// <summary>
/// 进入当前状态时调用的方法
/// 进入当前状态时调用的方法
/// </summary>
/// <param name="from">从哪个状态进入</param>
public void OnEnter(IState? from)
@ -416,7 +416,7 @@ public sealed class ConditionalStateV2 : IState
}
/// <summary>
/// 退出当前状态时调用的方法
/// 退出当前状态时调用的方法
/// </summary>
/// <param name="to">退出到哪个状态</param>
public void OnExit(IState? to)
@ -426,7 +426,7 @@ public sealed class ConditionalStateV2 : IState
}
/// <summary>
/// 判断是否可以转换到目标状态
/// 判断是否可以转换到目标状态
/// </summary>
/// <param name="target">目标状态</param>
/// <returns>如果目标状态类型在允许列表中则返回true否则返回false</returns>
@ -437,32 +437,32 @@ public sealed class ConditionalStateV2 : IState
}
/// <summary>
/// 跟踪状态实现类V2版本用于跟踪状态转换次数
/// 跟踪状态实现类V2版本用于跟踪状态转换次数
/// </summary>
public sealed class TrackingStateV2 : IState
{
/// <summary>
/// 获取进入状态被调用的次数
/// 获取进入状态被调用的次数
/// </summary>
public int EnterCallCount { get; private set; }
/// <summary>
/// 获取退出状态被调用的次数
/// 获取退出状态被调用的次数
/// </summary>
public int ExitCallCount { get; private set; }
/// <summary>
/// 获取进入此状态的来源状态
/// 获取进入此状态的来源状态
/// </summary>
public IState? EnterFrom { get; private set; }
/// <summary>
/// 获取从此状态退出的目标状态
/// 获取从此状态退出的目标状态
/// </summary>
public IState? ExitTo { get; private set; }
/// <summary>
/// 进入当前状态时调用的方法
/// 进入当前状态时调用的方法
/// </summary>
/// <param name="from">从哪个状态进入</param>
public void OnEnter(IState? from)
@ -472,7 +472,7 @@ public sealed class TrackingStateV2 : IState
}
/// <summary>
/// 退出当前状态时调用的方法
/// 退出当前状态时调用的方法
/// </summary>
/// <param name="to">退出到哪个状态</param>
public void OnExit(IState? to)
@ -482,7 +482,7 @@ public sealed class TrackingStateV2 : IState
}
/// <summary>
/// 判断是否可以转换到目标状态
/// 判断是否可以转换到目标状态
/// </summary>
/// <param name="target">目标状态</param>
/// <returns>总是返回true</returns>

View File

@ -13,16 +13,16 @@ using NUnit.Framework;
namespace GFramework.Core.Tests.utility;
/// <summary>
/// AbstractContextUtility类的单元测试
/// 测试内容包括:
/// - 抽象工具类实现
/// - IContextUtility接口实现
/// - Init方法调用
/// - 日志初始化
/// - 上下文感知功能SetContext, GetContext
/// - 子类继承行为
/// - 工具初始化日志记录
/// - 工具生命周期完整性
/// AbstractContextUtility类的单元测试
/// 测试内容包括:
/// - 抽象工具类实现
/// - IContextUtility接口实现
/// - Init方法调用
/// - 日志初始化
/// - 上下文感知功能SetContext, GetContext
/// - 子类继承行为
/// - 工具初始化日志记录
/// - 工具生命周期完整性
/// </summary>
[TestFixture]
public class AbstractContextUtilityTests
@ -43,7 +43,7 @@ public class AbstractContextUtilityTests
private IocContainer _container = null!;
/// <summary>
/// 测试AbstractContextUtility实现IContextUtility接口
/// 测试AbstractContextUtility实现IContextUtility接口
/// </summary>
[Test]
public void AbstractContextUtility_Should_Implement_IContextUtility_Interface()
@ -54,7 +54,7 @@ public class AbstractContextUtilityTests
}
/// <summary>
/// 测试Init方法调用
/// 测试Init方法调用
/// </summary>
[Test]
public void Init_Should_Call_OnInit_Method()
@ -69,7 +69,7 @@ public class AbstractContextUtilityTests
}
/// <summary>
/// 测试Init方法设置Logger属性
/// 测试Init方法设置Logger属性
/// </summary>
[Test]
public void Init_Should_Set_Logger_Property()
@ -84,7 +84,7 @@ public class AbstractContextUtilityTests
}
/// <summary>
/// 测试Init方法记录初始化日志
/// 测试Init方法记录初始化日志
/// </summary>
[Test]
public void Init_Should_Log_Initialization()
@ -99,7 +99,7 @@ public class AbstractContextUtilityTests
}
/// <summary>
/// 测试Destroy方法调用
/// 测试Destroy方法调用
/// </summary>
[Test]
public void Destroy_Should_Call_OnDestroy_Method()
@ -115,7 +115,7 @@ public class AbstractContextUtilityTests
}
/// <summary>
/// 测试上下文感知功能 - SetContext方法
/// 测试上下文感知功能 - SetContext方法
/// </summary>
[Test]
public void SetContext_Should_Set_Context_Property()
@ -130,7 +130,7 @@ public class AbstractContextUtilityTests
}
/// <summary>
/// 测试上下文感知功能 - GetContext方法
/// 测试上下文感知功能 - GetContext方法
/// </summary>
[Test]
public void GetContext_Should_Return_Context_Property()
@ -146,7 +146,7 @@ public class AbstractContextUtilityTests
}
/// <summary>
/// 测试子类继承行为
/// 测试子类继承行为
/// </summary>
[Test]
public void Child_Class_Should_Override_OnInit_Method()
@ -163,7 +163,7 @@ public class AbstractContextUtilityTests
}
/// <summary>
/// 测试工具生命周期完整性
/// 测试工具生命周期完整性
/// </summary>
[Test]
public void ContextUtility_Should_Complete_Full_Lifecycle()
@ -186,7 +186,7 @@ public class AbstractContextUtilityTests
}
/// <summary>
/// 测试工具类可以多次初始化和销毁
/// 测试工具类可以多次初始化和销毁
/// </summary>
[Test]
public void ContextUtility_Should_Be_Initializable_And_Destroyable_Multiple_Times()
@ -211,27 +211,27 @@ public class AbstractContextUtilityTests
}
/// <summary>
/// 测试用上下文工具类V1
/// 测试用上下文工具类V1
/// </summary>
public sealed class TestContextUtilityV1 : AbstractContextUtility
{
/// <summary>
/// 获取工具是否已初始化
/// 获取工具是否已初始化
/// </summary>
public bool Initialized { get; private set; }
/// <summary>
/// 获取工具是否已销毁
/// 获取工具是否已销毁
/// </summary>
public bool Destroyed { get; set; }
/// <summary>
/// 获取Init方法是否被调用
/// 获取Init方法是否被调用
/// </summary>
public bool InitCalled { get; private set; }
/// <summary>
/// 获取Logger对象用于测试
/// 获取Logger对象用于测试
/// </summary>
public ILogger? GetLogger()
{
@ -239,7 +239,7 @@ public sealed class TestContextUtilityV1 : AbstractContextUtility
}
/// <summary>
/// 初始化方法
/// 初始化方法
/// </summary>
protected override void OnInit()
{
@ -248,7 +248,7 @@ public sealed class TestContextUtilityV1 : AbstractContextUtility
}
/// <summary>
/// 销毁方法
/// 销毁方法
/// </summary>
protected override void OnDestroy()
{
@ -257,27 +257,27 @@ public sealed class TestContextUtilityV1 : AbstractContextUtility
}
/// <summary>
/// 测试用上下文工具类V2自定义初始化逻辑
/// 测试用上下文工具类V2自定义初始化逻辑
/// </summary>
public sealed class TestContextUtilityV2 : AbstractContextUtility
{
/// <summary>
/// 获取工具是否已初始化
/// 获取工具是否已初始化
/// </summary>
public bool Initialized { get; private set; }
/// <summary>
/// 获取工具是否已销毁
/// 获取工具是否已销毁
/// </summary>
public bool Destroyed { get; set; }
/// <summary>
/// 获取自定义初始化是否完成
/// 获取自定义初始化是否完成
/// </summary>
public bool CustomInitializationDone { get; private set; }
/// <summary>
/// 初始化方法(自定义逻辑)
/// 初始化方法(自定义逻辑)
/// </summary>
protected override void OnInit()
{
@ -286,7 +286,7 @@ public sealed class TestContextUtilityV2 : AbstractContextUtility
}
/// <summary>
/// 销毁方法
/// 销毁方法
/// </summary>
protected override void OnDestroy()
{

View File

@ -7,6 +7,6 @@
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\$(AssemblyName).Abstractions\$(AssemblyName).Abstractions.csproj" />
<ProjectReference Include="..\$(AssemblyName).Abstractions\$(AssemblyName).Abstractions.csproj"/>
</ItemGroup>
</Project>

View File

@ -1,7 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using GFramework.Core.Abstractions.architecture;
using GFramework.Core.Abstractions.enums;
using GFramework.Core.Abstractions.environment;
@ -86,9 +82,11 @@ public abstract class Architecture(
#endregion
#region Fields
private readonly TaskCompletionSource _readyTcs = new(TaskCreationOptions.RunContinuationsAsynchronously);
public bool IsReady => CurrentPhase == ArchitecturePhase.Ready;
/// <summary>
/// 待初始化组件的去重集合
/// </summary>
@ -336,13 +334,9 @@ public abstract class Architecture(
private static async Task InitializeComponentAsync(IInitializable component, bool asyncMode)
{
if (asyncMode && component is IAsyncInitializable asyncInit)
{
await asyncInit.InitializeAsync();
}
else
{
component.Init();
}
}
/// <summary>
@ -557,16 +551,17 @@ public abstract class Architecture(
EnterPhase(ArchitecturePhase.Ready);
// 🔥 释放 Ready await
_readyTcs.TrySetResult();
_logger.Info($"Architecture {GetType().Name} is ready - all components initialized");
}
/// <summary>
/// 等待架构初始化完成Ready 阶段)
/// 等待架构初始化完成Ready 阶段)
/// </summary>
public Task WaitUntilReadyAsync()
{
return IsReady ? Task.CompletedTask : _readyTcs.Task;
}
#endregion
}

View File

@ -26,8 +26,6 @@ public class ArchitectureServices : IArchitectureServices
/// </summary>
private readonly ICommandBus _commandBus;
private readonly IIocContainer _container;
/// <summary>
/// 事件总线实例
/// </summary>
@ -45,7 +43,7 @@ public class ArchitectureServices : IArchitectureServices
/// </summary>
public ArchitectureServices()
{
_container = new IocContainer();
Container = new IocContainer();
// 创建服务实例
_eventBus = new EventBus();
@ -54,16 +52,16 @@ public class ArchitectureServices : IArchitectureServices
_asyncQueryBus = new AsyncQueryBus();
// 将服务注册到容器
_container.RegisterPlurality(_eventBus);
_container.RegisterPlurality(_commandBus);
_container.RegisterPlurality(_queryBus);
_container.RegisterPlurality(_asyncQueryBus);
Container.RegisterPlurality(_eventBus);
Container.RegisterPlurality(_commandBus);
Container.RegisterPlurality(_queryBus);
Container.RegisterPlurality(_asyncQueryBus);
}
/// <summary>
/// 获取依赖注入容器
/// </summary>
public IIocContainer Container => _container;
public IIocContainer Container { get; }
/// <summary>
/// 获取类型事件系统

View File

@ -1,7 +1,4 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Collections.Concurrent;
using GFramework.Core.Abstractions.architecture;
namespace GFramework.Core.architecture;

View File

@ -147,12 +147,12 @@ public enum ArchitecturePhase
// 1. 定义你的架构(继承 Architecture 基类)
public class GameArchitecture : Architecture
{
protected override void Init()
{
// 注册 Model
RegisterModel(new PlayerModel());
RegisterModel(new InventoryModel());
protected override void Init()
{
// 注册 Model
RegisterModel(new PlayerModel());
RegisterModel(new InventoryModel());
// 注册 System
RegisterSystem(new GameplaySystem());
RegisterSystem(new SaveSystem());
@ -161,6 +161,7 @@ public class GameArchitecture : Architecture
RegisterUtility(new StorageUtility());
RegisterUtility(new TimeUtility());
}
}
// 2. 创建并初始化架构
@ -175,8 +176,8 @@ architecture.Initialize();
// 在 Controller 或其他组件中注入架构实例
public class GameController : IController
{
private readonly IArchitecture _architecture;
private readonly IArchitecture _architecture;
// 通过构造函数注入架构
public GameController(IArchitecture architecture)
{
@ -202,7 +203,9 @@ public class GameController : IController
{
// 处理玩家死亡事件
}
}
```
**核心方法与属性:**
@ -244,6 +247,7 @@ await architecture.InitializeAsync(); // 异步等待初始化完成
```
**优势:**
- 支持异步初始化 Model 和 System
- 可以利用异步 I/O 操作(如异步加载数据)
- 提高初始化性能
@ -259,6 +263,7 @@ public void InstallModule(IArchitectureModule module)
```
**参数:**
- `module`:要安装的模块实例
**使用示例:**
@ -291,6 +296,7 @@ public void RegisterLifecycleHook(IArchitectureLifecycle hook)
```
**参数:**
- `hook`:生命周期钩子实例
**使用示例:**
@ -389,28 +395,29 @@ architecture.InstallModule(module);
// 3. 监听架构阶段变化
public class GamePhaseListener : IArchitecturePhaseAware
{
public void OnArchitecturePhase(ArchitecturePhase phase)
{
switch (phase)
{
case ArchitecturePhase.Ready:
GD.Print("架构已就绪,可以开始游戏了");
break;
case ArchitecturePhase.Destroying:
GD.Print("架构正在销毁");
break;
}
}
public void OnArchitecturePhase(ArchitecturePhase phase)
{
switch (phase)
{
case ArchitecturePhase.Ready:
GD.Print("架构已就绪,可以开始游戏了");
break;
case ArchitecturePhase.Destroying:
GD.Print("架构正在销毁");
break;
}
}
}
// 4. 生命周期钩子
public class LifecycleHook : IArchitectureLifecycle
{
public void OnPhase(ArchitecturePhase phase, IArchitecture architecture)
{
GD.Print($"架构阶段变化: {phase}");
}
public void OnPhase(ArchitecturePhase phase, IArchitecture architecture)
{
GD.Print($"架构阶段变化: {phase}");
}
}
```
### [`ArchitectureConfiguration`](ArchitectureConfiguration.cs)
@ -477,9 +484,9 @@ var architecture = new GameArchitecture(configuration: config);
1. **保持架构类简洁**:只在 `Init()` 中注册组件,不要包含业务逻辑
2. **合理划分职责**
- Model数据和状态
- System业务逻辑和规则
- Utility无状态的工具方法
- Model数据和状态
- System业务逻辑和规则
- Utility无状态的工具方法
3. **使用依赖注入**:通过构造函数注入架构实例,便于测试
4. **事件命名规范**:使用过去式命名事件类,如 `PlayerDiedEvent`
5. **避免循环依赖**System 不应直接引用 System应通过事件通信

View File

@ -4,14 +4,14 @@ using GFramework.Core.rule;
namespace GFramework.Core.command;
/// <summary>
/// 异步命令的抽象基类实现了IAsyncCommand接口
/// 提供异步命令执行的基础框架和上下文感知功能
/// 异步命令的抽象基类实现了IAsyncCommand接口
/// 提供异步命令执行的基础框架和上下文感知功能
/// </summary>
public abstract class AbstractAsyncCommand : ContextAwareBase, IAsyncCommand
{
/// <summary>
/// 执行异步命令的实现方法
/// 该方法通过调用受保护的抽象方法OnExecuteAsync来执行具体的命令逻辑
/// 执行异步命令的实现方法
/// 该方法通过调用受保护的抽象方法OnExecuteAsync来执行具体的命令逻辑
/// </summary>
/// <returns>表示异步操作的任务</returns>
async Task IAsyncCommand.ExecuteAsync()
@ -20,9 +20,9 @@ public abstract class AbstractAsyncCommand : ContextAwareBase, IAsyncCommand
}
/// <summary>
/// 子类必须实现的异步执行方法
/// 包含具体的命令执行逻辑
/// 子类必须实现的异步执行方法
/// 包含具体的命令执行逻辑
/// </summary>
/// <returns>表示异步操作的任务</returns>
protected abstract Task OnExecuteAsync();
}
}

View File

@ -4,14 +4,14 @@ using GFramework.Core.rule;
namespace GFramework.Core.command;
/// <summary>
/// 抽象异步命令基类,用于处理无返回值的异步命令操作
/// 抽象异步命令基类,用于处理无返回值的异步命令操作
/// </summary>
/// <typeparam name="TInput">命令输入类型必须实现ICommandInput接口</typeparam>
public abstract class AbstractAsyncCommand<TInput>(TInput input) : ContextAwareBase, IAsyncCommand
where TInput : ICommandInput
{
/// <summary>
/// 执行异步命令的实现方法
/// 执行异步命令的实现方法
/// </summary>
/// <returns>表示异步操作的任务</returns>
async Task IAsyncCommand.ExecuteAsync()
@ -20,7 +20,7 @@ public abstract class AbstractAsyncCommand<TInput>(TInput input) : ContextAwareB
}
/// <summary>
/// 定义异步执行逻辑的抽象方法,由派生类实现具体业务逻辑
/// 定义异步执行逻辑的抽象方法,由派生类实现具体业务逻辑
/// </summary>
/// <param name="input">命令输入参数</param>
/// <returns>表示异步操作的任务</returns>

View File

@ -4,7 +4,7 @@ using GFramework.Core.rule;
namespace GFramework.Core.command;
/// <summary>
/// 抽象异步命令基类,用于处理有返回值的异步命令操作
/// 抽象异步命令基类,用于处理有返回值的异步命令操作
/// </summary>
/// <typeparam name="TInput">命令输入类型必须实现ICommandInput接口</typeparam>
/// <typeparam name="TResult">命令执行结果类型</typeparam>
@ -12,7 +12,7 @@ public abstract class AbstractAsyncCommand<TInput, TResult>(TInput input) : Cont
where TInput : ICommandInput
{
/// <summary>
/// 执行异步命令并返回结果的实现方法
/// 执行异步命令并返回结果的实现方法
/// </summary>
/// <returns>表示异步操作且包含结果的任务</returns>
async Task<TResult> IAsyncCommand<TResult>.ExecuteAsync()
@ -21,7 +21,7 @@ public abstract class AbstractAsyncCommand<TInput, TResult>(TInput input) : Cont
}
/// <summary>
/// 定义异步执行逻辑的抽象方法,由派生类实现具体业务逻辑并返回结果
/// 定义异步执行逻辑的抽象方法,由派生类实现具体业务逻辑并返回结果
/// </summary>
/// <param name="input">命令输入参数</param>
/// <returns>表示异步操作且包含结果的任务</returns>

View File

@ -3,10 +3,10 @@ using GFramework.Core.Abstractions.command;
namespace GFramework.Core.command;
/// <summary>
/// 空命令输入类,用于表示一个不包含任何输入参数的命令
/// 空命令输入类,用于表示一个不包含任何输入参数的命令
/// </summary>
/// <remarks>
/// 该类实现了ICommandInput接口作为命令模式中的输入参数载体
/// 通常用于不需要额外输入参数的简单命令操作
/// 该类实现了ICommandInput接口作为命令模式中的输入参数载体
/// 通常用于不需要额外输入参数的简单命令操作
/// </remarks>
public sealed class EmptyCommandInput : ICommandInput;
public sealed class EmptyCommandInput : ICommandInput;

View File

@ -1,30 +1,30 @@
namespace GFramework.Core.coroutine;
/// <summary>
/// 协程句柄
/// 用于唯一标识和管理协程实例的结构体通过ID系统实现协程的跟踪和比较功能
/// 协程句柄
/// 用于唯一标识和管理协程实例的结构体通过ID系统实现协程的跟踪和比较功能
/// </summary>
public readonly struct CoroutineHandle : IEquatable<CoroutineHandle>
{
/// <summary>
/// 预留空间常量用于ID分配的基数
/// 预留空间常量用于ID分配的基数
/// </summary>
private const byte ReservedSpace = 0x0F;
/// <summary>
/// 下一个索引数组用于跟踪每个实例ID的下一个可用索引位置
/// 索引范围0-15对应16个不同的实例槽位
/// 下一个索引数组用于跟踪每个实例ID的下一个可用索引位置
/// 索引范围0-15对应16个不同的实例槽位
/// </summary>
private static readonly int[] NextIndex = new int[16];
/// <summary>
/// 协程句柄的内部ID用于唯一标识协程实例
/// 协程句柄的内部ID用于唯一标识协程实例
/// </summary>
private readonly int _id;
/// <summary>
/// 静态构造函数初始化NextIndex数组的默认值
/// 将索引0的下一个可用位置设置为ReservedSpace + 1
/// 静态构造函数初始化NextIndex数组的默认值
/// 将索引0的下一个可用位置设置为ReservedSpace + 1
/// </summary>
static CoroutineHandle()
{
@ -33,18 +33,18 @@ public readonly struct CoroutineHandle : IEquatable<CoroutineHandle>
/// <summary>
/// 获取当前协程句柄的键值低4位
/// 获取当前协程句柄的键值低4位
/// </summary>
public byte Key => (byte)(_id & ReservedSpace);
/// <summary>
/// 判断当前协程句柄是否有效
/// 有效性通过Key是否为0来判断
/// 判断当前协程句柄是否有效
/// 有效性通过Key是否为0来判断
/// </summary>
public bool IsValid => Key != 0;
/// <summary>
/// 构造函数,创建一个新的协程句柄
/// 构造函数,创建一个新的协程句柄
/// </summary>
/// <param name="instanceId">实例ID用于区分不同的协程实例槽位</param>
public CoroutineHandle(byte instanceId)
@ -57,38 +57,53 @@ public readonly struct CoroutineHandle : IEquatable<CoroutineHandle>
}
/// <summary>
/// 比较当前协程句柄与另一个协程句柄是否相等
/// 比较当前协程句柄与另一个协程句柄是否相等
/// </summary>
/// <param name="other">要比较的协程句柄</param>
/// <returns>如果两个句柄的ID相同则返回true否则返回false</returns>
public bool Equals(CoroutineHandle other) => _id == other._id;
public bool Equals(CoroutineHandle other)
{
return _id == other._id;
}
/// <summary>
/// 比较当前对象与指定对象是否相等
/// 比较当前对象与指定对象是否相等
/// </summary>
/// <param name="obj">要比较的对象</param>
/// <returns>如果对象是协程句柄且ID相同则返回true否则返回false</returns>
public override bool Equals(object? obj) => obj is CoroutineHandle handle && Equals(handle);
public override bool Equals(object? obj)
{
return obj is CoroutineHandle handle && Equals(handle);
}
/// <summary>
/// 获取当前协程句柄的哈希码
/// 获取当前协程句柄的哈希码
/// </summary>
/// <returns>基于内部ID计算的哈希码</returns>
public override int GetHashCode() => _id;
public override int GetHashCode()
{
return _id;
}
/// <summary>
/// 比较两个协程句柄是否相等
/// 比较两个协程句柄是否相等
/// </summary>
/// <param name="a">第一个协程句柄</param>
/// <param name="b">第二个协程句柄</param>
/// <returns>如果两个句柄的ID相同则返回true否则返回false</returns>
public static bool operator ==(CoroutineHandle a, CoroutineHandle b) => a._id == b._id;
public static bool operator ==(CoroutineHandle a, CoroutineHandle b)
{
return a._id == b._id;
}
/// <summary>
/// 比较两个协程句柄是否不相等
/// 比较两个协程句柄是否不相等
/// </summary>
/// <param name="a">第一个协程句柄</param>
/// <param name="b">第二个协程句柄</param>
/// <returns>如果两个句柄的ID不同则返回true否则返回false</returns>
public static bool operator !=(CoroutineHandle a, CoroutineHandle b) => a._id != b._id;
public static bool operator !=(CoroutineHandle a, CoroutineHandle b)
{
return a._id != b._id;
}
}

View File

@ -1,16 +1,15 @@
using System.Threading;
using GFramework.Core.Abstractions.coroutine;
using GFramework.Core.coroutine.instructions;
namespace GFramework.Core.coroutine;
/// <summary>
/// 协程辅助方法
/// 协程辅助方法
/// </summary>
public static class CoroutineHelper
{
/// <summary>
/// 等待指定秒数
/// 等待指定秒数
/// </summary>
/// <param name="seconds">要等待的秒数</param>
/// <returns>延迟等待指令</returns>
@ -20,7 +19,7 @@ public static class CoroutineHelper
}
/// <summary>
/// 等待一帧
/// 等待一帧
/// </summary>
/// <returns>等待一帧的指令</returns>
public static WaitOneFrame WaitForOneFrame()
@ -29,7 +28,7 @@ public static class CoroutineHelper
}
/// <summary>
/// 等待指定帧数
/// 等待指定帧数
/// </summary>
/// <param name="frames">要等待的帧数</param>
/// <returns>等待帧数指令</returns>
@ -39,7 +38,7 @@ public static class CoroutineHelper
}
/// <summary>
/// 等待直到条件满足
/// 等待直到条件满足
/// </summary>
/// <param name="predicate">条件判断函数</param>
/// <returns>等待条件指令</returns>
@ -49,7 +48,7 @@ public static class CoroutineHelper
}
/// <summary>
/// 等待当条件为真时持续等待
/// 等待当条件为真时持续等待
/// </summary>
/// <param name="predicate">条件判断函数</param>
/// <returns>等待条件指令</returns>
@ -59,7 +58,7 @@ public static class CoroutineHelper
}
/// <summary>
/// 等待指定时间并提供进度回调
/// 等待指定时间并提供进度回调
/// </summary>
/// <param name="duration">等待的持续时间(秒)</param>
/// <param name="onProgress">进度回调函数接收0-1之间的进度值</param>
@ -70,7 +69,7 @@ public static class CoroutineHelper
}
/// <summary>
/// 延迟调用指定的委托
/// 延迟调用指定的委托
/// </summary>
/// <param name="delay">延迟时间(秒)</param>
/// <param name="action">要执行的动作委托</param>
@ -82,7 +81,7 @@ public static class CoroutineHelper
}
/// <summary>
/// 重复调用指定的委托指定次数
/// 重复调用指定的委托指定次数
/// </summary>
/// <param name="interval">每次调用之间的间隔时间(秒)</param>
/// <param name="count">调用次数</param>
@ -96,17 +95,17 @@ public static class CoroutineHelper
yield return new Delay(interval);
}
}
/// <summary>
/// 无限重复调用指定的委托,直到条件不满足
/// 无限重复调用指定的委托,直到条件不满足
/// </summary>
/// <param name="interval">每次调用之间的间隔时间(秒)</param>
/// <param name="action">要执行的动作委托</param>
/// <param name="shouldContinue">继续执行的条件返回false时停止</param>
/// <returns>返回一个枚举器,用于协程执行</returns>
public static IEnumerator<IYieldInstruction> RepeatCallForever(
double interval,
Action? action,
double interval,
Action? action,
Func<bool>? shouldContinue = null)
{
// 循环执行动作直到条件不再满足
@ -116,9 +115,9 @@ public static class CoroutineHelper
yield return new Delay(interval);
}
}
/// <summary>
/// 无限重复调用指定的委托,直到取消令牌被触发
/// 无限重复调用指定的委托,直到取消令牌被触发
/// </summary>
/// <param name="interval">每次调用之间的间隔时间(秒)</param>
/// <param name="action">要执行的动作委托</param>

View File

@ -3,27 +3,27 @@
namespace GFramework.Core.coroutine;
/// <summary>
/// 存储协程元数据信息的内部类,包含协程的状态、枚举器、标签等信息
/// 存储协程元数据信息的内部类,包含协程的状态、枚举器、标签等信息
/// </summary>
internal class CoroutineMetadata
{
/// <summary>
/// 协程在调度器中的槽位索引
/// 协程在调度器中的槽位索引
/// </summary>
public int SlotIndex;
/// <summary>
/// 协程当前的执行状态
/// 协程当前的执行状态
/// </summary>
public CoroutineState State;
/// <summary>
/// 协程的标签标识符,用于协程的分类和查找
/// 协程的标签标识符,用于协程的分类和查找
/// </summary>
public string? Tag;
/// <summary>
/// 判断协程是否处于活跃状态(运行中、暂停或挂起)
/// 判断协程是否处于活跃状态(运行中、暂停或挂起)
/// </summary>
public bool IsActive =>
State is CoroutineState.Running

View File

@ -3,7 +3,7 @@
namespace GFramework.Core.coroutine;
/// <summary>
/// 协程调度器,用于管理和执行协程
/// 协程调度器,用于管理和执行协程
/// </summary>
/// <param name="timeSource">时间源接口,提供时间相关数据</param>
/// <param name="instanceId">实例ID默认为1</param>
@ -17,25 +17,29 @@ public sealed class CoroutineScheduler(
private readonly Dictionary<string, HashSet<CoroutineHandle>> _tagged = new();
private readonly ITimeSource _timeSource = timeSource ?? throw new ArgumentNullException(nameof(timeSource));
private readonly Dictionary<CoroutineHandle, HashSet<CoroutineHandle>> _waiting = new();
private int _activeCount;
private int _nextSlot;
private CoroutineSlot?[] _slots = new CoroutineSlot?[initialCapacity];
/// <summary>
/// 获取时间差值
/// 获取时间差值
/// </summary>
public double DeltaTime => _timeSource.DeltaTime;
/// <summary>
/// 获取活跃协程数量
/// 获取活跃协程数量
/// </summary>
public int ActiveCoroutineCount => _activeCount;
public int ActiveCoroutineCount { get; private set; }
public bool IsCoroutineAlive(CoroutineHandle handle)
{
return _metadata.ContainsKey(handle);
}
#region Run / Update
/// <summary>
/// 运行协程
/// 运行协程
/// </summary>
/// <param name="coroutine">要运行的协程枚举器</param>
/// <param name="tag">协程标签,可选</param>
@ -72,13 +76,13 @@ public sealed class CoroutineScheduler(
AddTag(tag, handle);
Prewarm(slotIndex);
_activeCount++;
ActiveCoroutineCount++;
return handle;
}
/// <summary>
/// 更新所有协程状态
/// 更新所有协程状态
/// </summary>
public void Update()
{
@ -106,13 +110,9 @@ public sealed class CoroutineScheduler(
// 2⃣ 推进协程
if (!slot.Enumerator.MoveNext())
{
Complete(i);
}
else
{
slot.Waiting = slot.Enumerator.Current;
}
}
catch (Exception ex)
{
@ -126,7 +126,7 @@ public sealed class CoroutineScheduler(
#region Pause / Resume / Kill
/// <summary>
/// 暂停指定协程
/// 暂停指定协程
/// </summary>
/// <param name="handle">协程句柄</param>
/// <returns>是否成功暂停</returns>
@ -145,7 +145,7 @@ public sealed class CoroutineScheduler(
}
/// <summary>
/// 恢复指定协程
/// 恢复指定协程
/// </summary>
/// <param name="handle">协程句柄</param>
/// <returns>是否成功恢复</returns>
@ -164,7 +164,7 @@ public sealed class CoroutineScheduler(
}
/// <summary>
/// 终止指定协程
/// 终止指定协程
/// </summary>
/// <param name="handle">协程句柄</param>
/// <returns>是否成功终止</returns>
@ -182,7 +182,7 @@ public sealed class CoroutineScheduler(
#region Wait / Tag / Clear
/// <summary>
/// 让当前协程等待目标协程完成
/// 让当前协程等待目标协程完成
/// </summary>
/// <param name="current">当前协程句柄</param>
/// <param name="target">目标协程句柄</param>
@ -216,7 +216,7 @@ public sealed class CoroutineScheduler(
}
/// <summary>
/// 根据标签终止协程
/// 根据标签终止协程
/// </summary>
/// <param name="tag">协程标签</param>
/// <returns>被终止的协程数量</returns>
@ -229,12 +229,12 @@ public sealed class CoroutineScheduler(
}
/// <summary>
/// 清空所有协程
/// 清空所有协程
/// </summary>
/// <returns>被清除的协程数量</returns>
public int Clear()
{
var count = _activeCount;
var count = ActiveCoroutineCount;
Array.Clear(_slots);
_metadata.Clear();
@ -242,7 +242,7 @@ public sealed class CoroutineScheduler(
_waiting.Clear();
_nextSlot = 0;
_activeCount = 0;
ActiveCoroutineCount = 0;
return count;
}
@ -252,7 +252,7 @@ public sealed class CoroutineScheduler(
#region Internal
/// <summary>
/// 预热协程槽位,执行协程的第一步
/// 预热协程槽位,执行协程的第一步
/// </summary>
/// <param name="slotIndex">槽位索引</param>
private void Prewarm(int slotIndex)
@ -264,13 +264,9 @@ public sealed class CoroutineScheduler(
try
{
if (!slot.Enumerator.MoveNext())
{
Complete(slotIndex);
}
else
{
slot.Waiting = slot.Enumerator.Current;
}
}
catch (Exception ex)
{
@ -279,7 +275,7 @@ public sealed class CoroutineScheduler(
}
/// <summary>
/// 完成指定槽位的协程
/// 完成指定槽位的协程
/// </summary>
/// <param name="slotIndex">槽位索引</param>
private void Complete(int slotIndex)
@ -293,7 +289,7 @@ public sealed class CoroutineScheduler(
return;
_slots[slotIndex] = null;
_activeCount--;
ActiveCoroutineCount--;
RemoveTag(handle);
_metadata.Remove(handle);
@ -313,7 +309,7 @@ public sealed class CoroutineScheduler(
}
/// <summary>
/// 处理协程执行中的错误
/// 处理协程执行中的错误
/// </summary>
/// <param name="slotIndex">槽位索引</param>
/// <param name="ex">异常对象</param>
@ -324,7 +320,7 @@ public sealed class CoroutineScheduler(
}
/// <summary>
/// 扩展协程槽位数组容量
/// 扩展协程槽位数组容量
/// </summary>
private void Expand()
{
@ -332,7 +328,7 @@ public sealed class CoroutineScheduler(
}
/// <summary>
/// 为协程添加标签
/// 为协程添加标签
/// </summary>
/// <param name="tag">标签名称</param>
/// <param name="handle">协程句柄</param>
@ -349,7 +345,7 @@ public sealed class CoroutineScheduler(
}
/// <summary>
/// 移除协程标签
/// 移除协程标签
/// </summary>
/// <param name="handle">协程句柄</param>
private void RemoveTag(CoroutineHandle handle)
@ -368,8 +364,4 @@ public sealed class CoroutineScheduler(
}
#endregion
public bool IsCoroutineAlive(CoroutineHandle handle)
{
return _metadata.ContainsKey(handle);
}
}

View File

@ -3,27 +3,27 @@
namespace GFramework.Core.coroutine;
/// <summary>
/// 协程槽位类,用于管理单个协程的执行状态和调度信息
/// 协程槽位类,用于管理单个协程的执行状态和调度信息
/// </summary>
internal sealed class CoroutineSlot
{
/// <summary>
/// 协程枚举器,包含协程的执行逻辑
/// 协程枚举器,包含协程的执行逻辑
/// </summary>
public required IEnumerator<IYieldInstruction> Enumerator;
/// <summary>
/// 协程当前状态
/// 协程句柄,用于标识和管理协程实例
/// </summary>
public CoroutineHandle Handle;
/// <summary>
/// 协程当前状态
/// </summary>
public CoroutineState State;
/// <summary>
/// 当前等待的指令,用于控制协程的暂停和恢复
/// 当前等待的指令,用于控制协程的暂停和恢复
/// </summary>
public IYieldInstruction? Waiting;
/// <summary>
/// 协程句柄,用于标识和管理协程实例
/// </summary>
public CoroutineHandle Handle;
}
}

View File

@ -4,12 +4,12 @@ using GFramework.Core.coroutine.instructions;
namespace GFramework.Core.coroutine.extensions;
/// <summary>
/// 协程相关的扩展方法
/// 协程相关的扩展方法
/// </summary>
public static class CoroutineExtensions
{
/// <summary>
/// 在指定时间间隔内重复执行动作的协程
/// 在指定时间间隔内重复执行动作的协程
/// </summary>
/// <param name="interval">执行间隔时间(秒)</param>
/// <param name="action">要重复执行的动作</param>
@ -20,10 +20,7 @@ public static class CoroutineExtensions
Action action,
int? count = null)
{
if (count is < 0)
{
yield break;
}
if (count is < 0) yield break;
var executedCount = 0;
while (count == null || executedCount < count)
@ -35,7 +32,7 @@ public static class CoroutineExtensions
}
/// <summary>
/// 在指定延迟后执行动作的协程
/// 在指定延迟后执行动作的协程
/// </summary>
/// <param name="delay">延迟时间(秒)</param>
/// <param name="action">要执行的动作</param>
@ -44,17 +41,14 @@ public static class CoroutineExtensions
double delay,
Action? action)
{
if (delay < 0)
{
yield break;
}
if (delay < 0) yield break;
yield return new Delay(delay);
action?.Invoke();
}
/// <summary>
/// 顺序执行多个协程
/// 顺序执行多个协程
/// </summary>
/// <param name="coroutines">要顺序执行的协程集合</param>
/// <returns>协程枚举器</returns>
@ -63,19 +57,16 @@ public static class CoroutineExtensions
{
foreach (var coroutine in coroutines)
{
while (coroutine.MoveNext())
{
yield return coroutine.Current;
}
while (coroutine.MoveNext()) yield return coroutine.Current;
// 清理协程
coroutine.Dispose();
}
}
/// <summary>
/// 并行执行多个协程(等待所有协程完成)
/// 注意:这需要协程调度器的支持,这里提供一个包装器返回多个句柄
/// 并行执行多个协程(等待所有协程完成)
/// 注意:这需要协程调度器的支持,这里提供一个包装器返回多个句柄
/// </summary>
/// <param name="scheduler">协程调度器</param>
/// <param name="coroutines">要并行执行的协程集合</param>
@ -84,10 +75,7 @@ public static class CoroutineExtensions
this CoroutineScheduler scheduler,
params IEnumerator<IYieldInstruction>[]? coroutines)
{
if (coroutines == null || coroutines.Length == 0)
{
yield break;
}
if (coroutines == null || coroutines.Length == 0) yield break;
// 启动所有协程并收集句柄
var handles = new List<CoroutineHandle>();
@ -98,11 +86,11 @@ public static class CoroutineExtensions
}
// 等待所有协程完成
yield return new WaitForAllCoroutines(scheduler,handles);
yield return new WaitForAllCoroutines(scheduler, handles);
}
/// <summary>
/// 带进度回调的等待协程
/// 带进度回调的等待协程
/// </summary>
/// <param name="totalTime">总等待时间(秒)</param>
/// <param name="onProgress">进度回调参数为0-1之间的进度值</param>
@ -120,12 +108,8 @@ public static class CoroutineExtensions
onProgress?.Invoke(0.0f);
if (onProgress != null)
{
yield return new WaitForProgress(totalTime, onProgress);
}
else
{
yield return new Delay(totalTime);
}
}
}
}

View File

@ -4,12 +4,12 @@ using GFramework.Core.coroutine.instructions;
namespace GFramework.Core.coroutine.extensions;
/// <summary>
/// Task与协程之间的扩展方法
/// Task与协程之间的扩展方法
/// </summary>
public static class TaskCoroutineExtensions
{
/// <summary>
/// 将Task转换为协程等待指令
/// 将Task转换为协程等待指令
/// </summary>
/// <param name="task">要等待的Task</param>
/// <returns>等待Task的协程指令</returns>
@ -19,7 +19,7 @@ public static class TaskCoroutineExtensions
}
/// <summary>
/// 将泛型Task转换为协程等待指令
/// 将泛型Task转换为协程等待指令
/// </summary>
/// <typeparam name="T">Task返回值的类型</typeparam>
/// <param name="task">要等待的Task</param>
@ -30,7 +30,7 @@ public static class TaskCoroutineExtensions
}
/// <summary>
/// 在调度器中启动一个Task并等待其完成
/// 在调度器中启动一个Task并等待其完成
/// </summary>
/// <param name="scheduler">协程调度器</param>
/// <param name="task">要等待的Task</param>
@ -41,7 +41,7 @@ public static class TaskCoroutineExtensions
}
/// <summary>
/// 在调度器中启动一个泛型Task并等待其完成
/// 在调度器中启动一个泛型Task并等待其完成
/// </summary>
/// <typeparam name="T">Task返回值的类型</typeparam>
/// <param name="scheduler">协程调度器</param>
@ -53,7 +53,7 @@ public static class TaskCoroutineExtensions
}
/// <summary>
/// 创建等待Task的协程
/// 创建等待Task的协程
/// </summary>
private static IEnumerator<IYieldInstruction> CreateTaskCoroutine(Task task)
{
@ -61,7 +61,7 @@ public static class TaskCoroutineExtensions
}
/// <summary>
/// 创建等待泛型Task的协程
/// 创建等待泛型Task的协程
/// </summary>
private static IEnumerator<IYieldInstruction> CreateTaskCoroutine<T>(Task<T> task)
{

View File

@ -1,11 +1,10 @@
using System.Runtime.CompilerServices;
using System.Threading;
using GFramework.Core.Abstractions.coroutine;
namespace GFramework.Core.coroutine.instructions;
/// <summary>
/// 异步操作包装器用于桥接协程系统和async/await异步编程模型
/// 异步操作包装器用于桥接协程系统和async/await异步编程模型
/// </summary>
public class AsyncOperation : IYieldInstruction, INotifyCompletion
{
@ -14,75 +13,17 @@ public class AsyncOperation : IYieldInstruction, INotifyCompletion
private volatile Action? _continuation;
/// <summary>
/// 获取异步操作是否已完成
/// </summary>
public bool IsDone => _completed;
/// <summary>
/// 获取异步操作的任务
/// 获取异步操作的任务
/// </summary>
public Task Task => _tcs.Task;
/// <summary>
/// 更新方法,用于处理时间更新逻辑
/// 检查是否已完成
/// </summary>
/// <param name="deltaTime">时间增量</param>
public void Update(double deltaTime)
{
// 由外部调用SetCompleted来更新状态
}
public bool IsCompleted => _completed;
/// <summary>
/// 标记异步操作已完成
/// </summary>
public void SetCompleted()
{
if (_completed) return;
_completed = true;
_tcs.SetResult(null);
var continuation = Interlocked.Exchange(ref _continuation, null);
if (continuation != null)
{
try
{
continuation.Invoke();
}
catch
{
// 忽略延续中的异常
}
}
}
/// <summary>
/// 标记异步操作因异常而失败
/// </summary>
/// <param name="exception">导致失败的异常</param>
public void SetException(Exception exception)
{
if (_completed) return;
_completed = true;
_tcs.SetException(exception);
var continuation = Interlocked.Exchange(ref _continuation, null);
if (continuation != null)
{
try
{
continuation.Invoke();
}
catch
{
// 忽略延续中的异常
}
}
}
/// <summary>
/// 设置延续操作
/// 设置延续操作
/// </summary>
/// <param name="continuation">要执行的延续操作</param>
public void OnCompleted(Action continuation)
@ -95,14 +36,10 @@ public class AsyncOperation : IYieldInstruction, INotifyCompletion
{
// 如果CAS失败说明可能已经完成直接执行
if (_completed)
{
continuation();
}
else
{
// 重试
OnCompleted(continuation);
}
return;
}
@ -111,15 +48,71 @@ public class AsyncOperation : IYieldInstruction, INotifyCompletion
if (_completed)
{
var cont = Interlocked.Exchange(ref _continuation, null);
if (cont != null)
{
cont();
}
if (cont != null) cont();
}
}
/// <summary>
/// 获取异步操作结果
/// 获取异步操作是否已完成
/// </summary>
public bool IsDone => _completed;
/// <summary>
/// 更新方法,用于处理时间更新逻辑
/// </summary>
/// <param name="deltaTime">时间增量</param>
public void Update(double deltaTime)
{
// 由外部调用SetCompleted来更新状态
}
/// <summary>
/// 标记异步操作已完成
/// </summary>
public void SetCompleted()
{
if (_completed) return;
_completed = true;
_tcs.SetResult(null);
var continuation = Interlocked.Exchange(ref _continuation, null);
if (continuation != null)
try
{
continuation.Invoke();
}
catch
{
// 忽略延续中的异常
}
}
/// <summary>
/// 标记异步操作因异常而失败
/// </summary>
/// <param name="exception">导致失败的异常</param>
public void SetException(Exception exception)
{
if (_completed) return;
_completed = true;
_tcs.SetException(exception);
var continuation = Interlocked.Exchange(ref _continuation, null);
if (continuation != null)
try
{
continuation.Invoke();
}
catch
{
// 忽略延续中的异常
}
}
/// <summary>
/// 获取异步操作结果
/// </summary>
/// <returns>操作结果</returns>
public object? GetResult()
@ -128,15 +121,10 @@ public class AsyncOperation : IYieldInstruction, INotifyCompletion
}
/// <summary>
/// 获取awaiter对象
/// 获取awaiter对象
/// </summary>
public AsyncOperation GetAwaiter()
{
return this;
}
/// <summary>
/// 检查是否已完成
/// </summary>
public bool IsCompleted => _completed;
}

View File

@ -3,18 +3,18 @@
namespace GFramework.Core.coroutine.instructions;
/// <summary>
/// 延迟等待指令实现IYieldInstruction接口用于协程中的时间延迟
/// 延迟等待指令实现IYieldInstruction接口用于协程中的时间延迟
/// </summary>
/// <param name="seconds">需要延迟的秒数</param>
public sealed class Delay(double seconds) : IYieldInstruction
{
/// <summary>
/// 剩余等待时间
/// 剩余等待时间
/// </summary>
private double _remaining = Math.Max(0, seconds);
/// <summary>
/// 更新延迟计时器
/// 更新延迟计时器
/// </summary>
/// <param name="deltaTime">时间增量</param>
public void Update(double deltaTime)
@ -23,7 +23,7 @@ public sealed class Delay(double seconds) : IYieldInstruction
}
/// <summary>
/// 获取延迟是否完成
/// 获取延迟是否完成
/// </summary>
public bool IsDone => _remaining <= 0;
}

View File

@ -3,15 +3,17 @@
namespace GFramework.Core.coroutine.instructions;
/// <summary>
/// 等待所有协程完成的等待指令
/// 等待所有协程完成的等待指令
/// </summary>
public sealed class WaitForAllCoroutines(
CoroutineScheduler scheduler,
IReadOnlyList<CoroutineHandle> handles)
: IYieldInstruction
{
private readonly IReadOnlyList<CoroutineHandle> _handles =
handles ?? throw new ArgumentNullException(nameof(handles));
private readonly CoroutineScheduler _scheduler = scheduler ?? throw new ArgumentNullException(nameof(scheduler));
private readonly IReadOnlyList<CoroutineHandle> _handles = handles ?? throw new ArgumentNullException(nameof(handles));
public void Update(double deltaTime)
{
@ -20,9 +22,6 @@ public sealed class WaitForAllCoroutines(
public bool IsDone
{
get
{
return _handles.All(handle => !_scheduler.IsCoroutineAlive(handle));
}
get { return _handles.All(handle => !_scheduler.IsCoroutineAlive(handle)); }
}
}
}

View File

@ -3,14 +3,12 @@
namespace GFramework.Core.coroutine.instructions;
/// <summary>
/// 等待协程完成的指令类实现IYieldInstruction接口
/// 等待协程完成的指令类实现IYieldInstruction接口
/// </summary>
public sealed class WaitForCoroutine : IYieldInstruction
{
private bool _done;
/// <summary>
/// 更新方法,用于处理时间更新逻辑
/// 更新方法,用于处理时间更新逻辑
/// </summary>
/// <param name="delta">时间增量</param>
public void Update(double delta)
@ -18,12 +16,15 @@ public sealed class WaitForCoroutine : IYieldInstruction
}
/// <summary>
/// 获取协程是否已完成的状态
/// 获取协程是否已完成的状态
/// </summary>
public bool IsDone => _done;
public bool IsDone { get; private set; }
/// <summary>
/// 内部方法,用于标记协程完成状态
/// 内部方法,用于标记协程完成状态
/// </summary>
internal void Complete() => _done = true;
internal void Complete()
{
IsDone = true;
}
}

View File

@ -3,18 +3,18 @@
namespace GFramework.Core.coroutine.instructions;
/// <summary>
/// 等待指定帧数的等待指令类
/// 等待指定帧数的等待指令类
/// </summary>
/// <param name="frames">需要等待的帧数最小值为1</param>
public sealed class WaitForFrames(int frames) : IYieldInstruction
{
/// <summary>
/// 剩余等待帧数
/// 剩余等待帧数
/// </summary>
private int _remaining = Math.Max(1, frames);
/// <summary>
/// 更新方法,在每一帧调用时减少剩余帧数
/// 更新方法,在每一帧调用时减少剩余帧数
/// </summary>
/// <param name="deltaTime">时间间隔(秒)</param>
public void Update(double deltaTime)
@ -23,7 +23,7 @@ public sealed class WaitForFrames(int frames) : IYieldInstruction
}
/// <summary>
/// 获取等待是否完成的状态
/// 获取等待是否完成的状态
/// </summary>
public bool IsDone => _remaining <= 0;
}

View File

@ -3,47 +3,46 @@ using GFramework.Core.Abstractions.coroutine;
namespace GFramework.Core.coroutine.instructions;
/// <summary>
/// 带进度回调的等待指令
/// 带进度回调的等待指令
/// </summary>
public class WaitForProgress : IYieldInstruction
{
private readonly double _duration;
private readonly Action<float> _onProgress;
private double _elapsed;
private bool _progressCompleted;
/// <summary>
/// 初始化等待进度指令
/// 初始化等待进度指令
/// </summary>
/// <param name="duration">总持续时间(秒)</param>
/// <param name="onProgress">进度回调参数为0-1之间的进度值</param>
public WaitForProgress(double duration, Action<float> onProgress)
{
if (duration <= 0)
if (duration <= 0)
throw new ArgumentException("Duration must be positive", nameof(duration));
_duration = duration;
_onProgress = onProgress ?? throw new ArgumentNullException(nameof(onProgress));
_elapsed = 0;
_progressCompleted = false;
IsDone = false;
}
/// <summary>
/// 更新方法
/// 更新方法
/// </summary>
/// <param name="deltaTime">时间增量</param>
public void Update(double deltaTime)
{
if (_progressCompleted)
if (IsDone)
return;
_elapsed += deltaTime;
// 计算进度并回调
if (_elapsed >= _duration)
{
_elapsed = _duration;
_progressCompleted = true;
IsDone = true;
_onProgress(1.0f);
}
else
@ -54,7 +53,7 @@ public class WaitForProgress : IYieldInstruction
}
/// <summary>
/// 获取等待是否已完成
/// 获取等待是否已完成
/// </summary>
public bool IsDone => _progressCompleted;
public bool IsDone { get; private set; }
}

View File

@ -3,7 +3,7 @@ using GFramework.Core.Abstractions.coroutine;
namespace GFramework.Core.coroutine.instructions;
/// <summary>
/// 等待泛型Task完成的等待指令
/// 等待泛型Task完成的等待指令
/// </summary>
/// <typeparam name="T">Task返回值的类型</typeparam>
public sealed class WaitForTask<T> : IYieldInstruction
@ -12,30 +12,33 @@ public sealed class WaitForTask<T> : IYieldInstruction
private volatile bool _done;
/// <summary>
/// 初始化等待泛型Task的指令
/// 初始化等待泛型Task的指令
/// </summary>
/// <param name="task">要等待完成的Task</param>
public WaitForTask(Task<T> task)
{
_task = task ?? throw new ArgumentNullException(nameof(task));
// 检查Task是否已经完成
if (_task.IsCompleted)
{
_done = true;
}
else
{
// 注册完成回调
_task.ContinueWith(_ =>
{
_done = true;
}, TaskContinuationOptions.ExecuteSynchronously);
}
_task.ContinueWith(_ => { _done = true; }, TaskContinuationOptions.ExecuteSynchronously);
}
/// <summary>
/// 更新方法,用于处理时间更新逻辑
/// 获取Task的结果值
/// </summary>
public T Result => _task.GetAwaiter().GetResult();
/// <summary>
/// 获取Task的异常如果有
/// </summary>
public Exception? Exception => _task.Exception;
/// <summary>
/// 更新方法,用于处理时间更新逻辑
/// </summary>
/// <param name="deltaTime">时间增量</param>
public void Update(double deltaTime)
@ -44,17 +47,7 @@ public sealed class WaitForTask<T> : IYieldInstruction
}
/// <summary>
/// 获取等待是否已完成
/// 获取等待是否已完成
/// </summary>
public bool IsDone => _done;
/// <summary>
/// 获取Task的结果值
/// </summary>
public T Result => _task.GetAwaiter().GetResult();
/// <summary>
/// 获取Task的异常如果有
/// </summary>
public Exception? Exception => _task.Exception;
}

View File

@ -3,10 +3,10 @@ using GFramework.Core.Abstractions.coroutine;
namespace GFramework.Core.coroutine.instructions;
/// <summary>
/// 等待Task完成的等待指令
/// 等待Task完成的等待指令
/// </summary>
/// <summary>
/// 等待Task完成的等待指令
/// 等待Task完成的等待指令
/// </summary>
public sealed class WaitForTask : IYieldInstruction
{
@ -14,30 +14,28 @@ public sealed class WaitForTask : IYieldInstruction
private volatile bool _done;
/// <summary>
/// 初始化等待Task的指令
/// 初始化等待Task的指令
/// </summary>
/// <param name="task">要等待完成的Task</param>
public WaitForTask(Task task)
{
_task = task ?? throw new ArgumentNullException(nameof(task));
// 检查Task是否已经完成
if (_task.IsCompleted)
{
_done = true;
}
else
{
// 注册完成回调
_task.ContinueWith(_ =>
{
_done = true;
}, TaskContinuationOptions.ExecuteSynchronously);
}
_task.ContinueWith(_ => { _done = true; }, TaskContinuationOptions.ExecuteSynchronously);
}
/// <summary>
/// 更新方法,用于处理时间更新逻辑
/// 获取Task的异常如果有
/// </summary>
public Exception? Exception => _task.Exception;
/// <summary>
/// 更新方法,用于处理时间更新逻辑
/// </summary>
/// <param name="deltaTime">时间增量</param>
public void Update(double deltaTime)
@ -46,12 +44,7 @@ public sealed class WaitForTask : IYieldInstruction
}
/// <summary>
/// 获取等待是否已完成
/// 获取等待是否已完成
/// </summary>
public bool IsDone => _done;
/// <summary>
/// 获取Task的异常如果有
/// </summary>
public Exception? Exception => _task.Exception;
}

View File

@ -3,24 +3,22 @@
namespace GFramework.Core.coroutine.instructions;
/// <summary>
/// 表示等待一帧的等待指令实现
/// 实现IYieldInstruction接口用于协程中等待一个游戏帧的执行
/// 表示等待一帧的等待指令实现
/// 实现IYieldInstruction接口用于协程中等待一个游戏帧的执行
/// </summary>
public sealed class WaitOneFrame : IYieldInstruction
{
private bool _done;
/// <summary>
/// 更新方法在每一帧被调用时将完成状态设置为true
/// 更新方法在每一帧被调用时将完成状态设置为true
/// </summary>
/// <param name="deltaTime">时间间隔,表示当前帧与上一帧的时间差</param>
public void Update(double deltaTime)
{
_done = true;
IsDone = true;
}
/// <summary>
/// 获取当前等待指令是否已完成
/// 获取当前等待指令是否已完成
/// </summary>
public bool IsDone => _done;
public bool IsDone { get; private set; }
}

View File

@ -3,7 +3,7 @@
namespace GFramework.Core.coroutine.instructions;
/// <summary>
/// 表示一个等待直到指定条件满足的协程指令
/// 表示一个等待直到指定条件满足的协程指令
/// </summary>
/// <param name="predicate">用于判断条件是否满足的函数委托</param>
public sealed class WaitUntil(Func<bool> predicate) : IYieldInstruction
@ -11,7 +11,7 @@ public sealed class WaitUntil(Func<bool> predicate) : IYieldInstruction
private readonly Func<bool> _predicate = predicate ?? throw new ArgumentNullException(nameof(predicate));
/// <summary>
/// 更新协程状态(此实现中不需要处理时间)
/// 更新协程状态(此实现中不需要处理时间)
/// </summary>
/// <param name="deltaTime">时间增量</param>
public void Update(double deltaTime)
@ -20,7 +20,7 @@ public sealed class WaitUntil(Func<bool> predicate) : IYieldInstruction
}
/// <summary>
/// 获取协程指令是否已完成
/// 获取协程指令是否已完成
/// </summary>
public bool IsDone => _predicate();
}

View File

@ -3,7 +3,7 @@
namespace GFramework.Core.coroutine.instructions;
/// <summary>
/// 表示一个等待条件为假时才完成的协程指令
/// 表示一个等待条件为假时才完成的协程指令
/// </summary>
/// <param name="predicate">用于判断是否继续等待的条件函数当返回true时继续等待返回false时完成</param>
public sealed class WaitWhile(Func<bool> predicate) : IYieldInstruction
@ -11,7 +11,7 @@ public sealed class WaitWhile(Func<bool> predicate) : IYieldInstruction
private readonly Func<bool> _predicate = predicate ?? throw new ArgumentNullException(nameof(predicate));
/// <summary>
/// 更新协程状态(此实现中为空方法)
/// 更新协程状态(此实现中为空方法)
/// </summary>
/// <param name="deltaTime">时间增量</param>
public void Update(double deltaTime)
@ -19,8 +19,8 @@ public sealed class WaitWhile(Func<bool> predicate) : IYieldInstruction
}
/// <summary>
/// 获取协程指令是否已完成
/// 当谓词函数返回false时表示条件不再满足指令完成
/// 获取协程指令是否已完成
/// 当谓词函数返回false时表示条件不再满足指令完成
/// </summary>
public bool IsDone => !_predicate();
}

View File

@ -1,5 +1,4 @@
using System;
using GFramework.Core.Abstractions.events;
using GFramework.Core.Abstractions.events;
namespace GFramework.Core.events;

View File

@ -1,5 +1,4 @@
using System;
using GFramework.Core.Abstractions.events;
using GFramework.Core.Abstractions.events;
namespace GFramework.Core.events;

View File

@ -27,6 +27,7 @@ void UnRegister(); // 执行注销操作
```
### 3. [
`IUnRegisterList`](file:///d:/Project/Rider/GFramework/GFramework.Core.Abstractions/events/IUnRegisterList.cs#L6-L10)
注销列表接口,用于批量管理注销对象。

View File

@ -1,6 +1,4 @@
using System;
namespace GFramework.Core.extensions;
namespace GFramework.Core.extensions;
/// <summary>
/// 提供基于运行时类型判断的对象扩展方法,

View File

@ -1,4 +1,3 @@
using System.Threading;
using GFramework.Core.Abstractions.ioc;
using GFramework.Core.Abstractions.logging;
using GFramework.Core.Abstractions.system;

View File

@ -390,9 +390,11 @@ public bool Contains<T>() where T : class
```
**参数:**
- 无泛型参数
**返回值:**
- 如果容器中包含指定类型的实例则返回 `true`,否则返回 `false`
**使用示例:**
@ -414,6 +416,7 @@ if (!container.Contains<ISettingsService>())
```
**应用场景:**
- 条件注册服务
- 检查依赖是否可用
- 动态功能开关
@ -427,9 +430,11 @@ public bool ContainsInstance(object instance)
```
**参数:**
- `instance`:待查询的实例对象
**返回值:**
- 若容器中包含该实例则返回 `true`,否则返回 `false`
**使用示例:**
@ -455,6 +460,7 @@ if (!container.ContainsInstance(anotherService))
```
**应用场景:**
- 避免重复注册同一实例
- 检查对象是否已被管理
- 调试和日志记录
@ -486,11 +492,13 @@ Console.WriteLine($"Contains IService2: {container.Contains<IService2>()}"); //
```
**应用场景:**
- 重置容器状态
- 内存清理
- 测试环境准备
**注意事项:**
- 容器冻结后也可以调用 `Clear()` 方法
- 清空后,所有已注册的实例都将丢失
- 不会自动清理已注册对象的其他引用

Some files were not shown because too many files have changed in this diff Show More