diff --git a/GFramework.Core.Abstractions/architecture/IArchitectureContext.cs b/GFramework.Core.Abstractions/architecture/IArchitectureContext.cs index 6f4ba1e..760f7cb 100644 --- a/GFramework.Core.Abstractions/architecture/IArchitectureContext.cs +++ b/GFramework.Core.Abstractions/architecture/IArchitectureContext.cs @@ -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; diff --git a/GFramework.Core.Abstractions/architecture/IAsyncInitializable.cs b/GFramework.Core.Abstractions/architecture/IAsyncInitializable.cs index 77b0420..49b6cf3 100644 --- a/GFramework.Core.Abstractions/architecture/IAsyncInitializable.cs +++ b/GFramework.Core.Abstractions/architecture/IAsyncInitializable.cs @@ -1,6 +1,4 @@ -using System.Threading.Tasks; - -namespace GFramework.Core.Abstractions.architecture; +namespace GFramework.Core.Abstractions.architecture; /// /// 定义异步初始化接口,用于需要异步初始化的组件或服务 diff --git a/GFramework.Core.Abstractions/bases/IKeyValue.cs b/GFramework.Core.Abstractions/bases/IKeyValue.cs index ad2fca2..eb3116d 100644 --- a/GFramework.Core.Abstractions/bases/IKeyValue.cs +++ b/GFramework.Core.Abstractions/bases/IKeyValue.cs @@ -1,19 +1,19 @@ namespace GFramework.Core.Abstractions.bases; /// -/// 表示键值对的接口,定义了通用的键值对数据结构契约 +/// 表示键值对的接口,定义了通用的键值对数据结构契约 /// /// 键的类型 /// 值的类型 public interface IKeyValue { /// - /// 获取键值对中的键 + /// 获取键值对中的键 /// TKey Key { get; } /// - /// 获取键值对中的值 + /// 获取键值对中的值 /// TValue Value { get; } } \ No newline at end of file diff --git a/GFramework.Core.Abstractions/command/IAsyncCommand.cs b/GFramework.Core.Abstractions/command/IAsyncCommand.cs index a6ae752..ff094eb 100644 --- a/GFramework.Core.Abstractions/command/IAsyncCommand.cs +++ b/GFramework.Core.Abstractions/command/IAsyncCommand.cs @@ -1,28 +1,27 @@ -using System.Threading.Tasks; using GFramework.Core.Abstractions.rule; namespace GFramework.Core.Abstractions.command; /// -/// 表示一个异步命令接口,该命令不返回结果 +/// 表示一个异步命令接口,该命令不返回结果 /// public interface IAsyncCommand : IContextAware { /// - /// 异步执行命令 + /// 异步执行命令 /// /// 表示异步操作的任务 Task ExecuteAsync(); } /// -/// 表示一个异步命令接口,该命令返回指定类型的结果 +/// 表示一个异步命令接口,该命令返回指定类型的结果 /// /// 命令执行结果的类型 public interface IAsyncCommand : IContextAware { /// - /// 异步执行命令并返回结果 + /// 异步执行命令并返回结果 /// /// 表示异步操作的任务,任务结果为命令执行的返回值 Task ExecuteAsync(); diff --git a/GFramework.Core.Abstractions/command/ICommandBus.cs b/GFramework.Core.Abstractions/command/ICommandBus.cs index 15a3568..824ba51 100644 --- a/GFramework.Core.Abstractions/command/ICommandBus.cs +++ b/GFramework.Core.Abstractions/command/ICommandBus.cs @@ -1,5 +1,3 @@ -using System.Threading.Tasks; - namespace GFramework.Core.Abstractions.command; /// diff --git a/GFramework.Core.Abstractions/coroutine/CoroutineState.cs b/GFramework.Core.Abstractions/coroutine/CoroutineState.cs index 0ee6e3c..e9c7c07 100644 --- a/GFramework.Core.Abstractions/coroutine/CoroutineState.cs +++ b/GFramework.Core.Abstractions/coroutine/CoroutineState.cs @@ -1,32 +1,32 @@ namespace GFramework.Core.Abstractions.coroutine; /// -/// 表示协程的执行状态枚举 +/// 表示协程的执行状态枚举 /// public enum CoroutineState { /// - /// 协程正在运行中 + /// 协程正在运行中 /// Running, /// - /// 协程已暂停 + /// 协程已暂停 /// Paused, /// - /// 协程被锁定或等待其他协程完成 + /// 协程被锁定或等待其他协程完成 /// Held, /// - /// 协程已完成执行 + /// 协程已完成执行 /// Completed, /// - /// 协程已被取消 + /// 协程已被取消 /// - Cancelled, + Cancelled } \ No newline at end of file diff --git a/GFramework.Core.Abstractions/coroutine/ITimeSource.cs b/GFramework.Core.Abstractions/coroutine/ITimeSource.cs index f15e065..0fa2a03 100644 --- a/GFramework.Core.Abstractions/coroutine/ITimeSource.cs +++ b/GFramework.Core.Abstractions/coroutine/ITimeSource.cs @@ -1,22 +1,22 @@ namespace GFramework.Core.Abstractions.coroutine; /// -/// 时间源接口,提供当前时间、时间增量以及更新功能 +/// 时间源接口,提供当前时间、时间增量以及更新功能 /// public interface ITimeSource { /// - /// 获取当前时间 + /// 获取当前时间 /// double CurrentTime { get; } /// - /// 获取时间增量(上一帧到当前帧的时间差) + /// 获取时间增量(上一帧到当前帧的时间差) /// double DeltaTime { get; } /// - /// 更新时间源的状态 + /// 更新时间源的状态 /// void Update(); } \ No newline at end of file diff --git a/GFramework.Core.Abstractions/coroutine/IYieldInstruction.cs b/GFramework.Core.Abstractions/coroutine/IYieldInstruction.cs index 761a57a..1d75bfe 100644 --- a/GFramework.Core.Abstractions/coroutine/IYieldInstruction.cs +++ b/GFramework.Core.Abstractions/coroutine/IYieldInstruction.cs @@ -1,17 +1,17 @@ namespace GFramework.Core.Abstractions.coroutine; /// -/// 定义一个可等待指令的接口,用于协程系统中的异步操作控制 +/// 定义一个可等待指令的接口,用于协程系统中的异步操作控制 /// public interface IYieldInstruction { /// - /// 获取当前等待指令是否已完成执行 + /// 获取当前等待指令是否已完成执行 /// bool IsDone { get; } /// - /// 每帧由调度器调用,用于更新当前等待指令的状态 + /// 每帧由调度器调用,用于更新当前等待指令的状态 /// /// 自上一帧以来的时间间隔(以秒为单位) void Update(double deltaTime); diff --git a/GFramework.Core.Abstractions/enums/ArchitecturePhase.cs b/GFramework.Core.Abstractions/enums/ArchitecturePhase.cs index 93b2aa3..8df1bc9 100644 --- a/GFramework.Core.Abstractions/enums/ArchitecturePhase.cs +++ b/GFramework.Core.Abstractions/enums/ArchitecturePhase.cs @@ -15,12 +15,12 @@ public enum ArchitecturePhase None = 0, /// - /// 工具类初始化之前阶段 + /// 工具类初始化之前阶段 /// BeforeUtilityInit, /// - /// 工具类初始化之后阶段 + /// 工具类初始化之后阶段 /// AfterUtilityInit, diff --git a/GFramework.Core.Abstractions/events/IEvent.cs b/GFramework.Core.Abstractions/events/IEvent.cs index ef66913..cd4e7a3 100644 --- a/GFramework.Core.Abstractions/events/IEvent.cs +++ b/GFramework.Core.Abstractions/events/IEvent.cs @@ -1,6 +1,4 @@ -using System; - -namespace GFramework.Core.Abstractions.events; +namespace GFramework.Core.Abstractions.events; /// /// 事件接口,定义了事件注册的基本功能 diff --git a/GFramework.Core.Abstractions/events/IEventBus.cs b/GFramework.Core.Abstractions/events/IEventBus.cs index acf94f1..e8beddf 100644 --- a/GFramework.Core.Abstractions/events/IEventBus.cs +++ b/GFramework.Core.Abstractions/events/IEventBus.cs @@ -1,9 +1,7 @@ -using System; - -namespace GFramework.Core.Abstractions.events; +namespace GFramework.Core.Abstractions.events; /// -/// 事件总线接口,提供事件的发送、注册和注销功能 +/// 事件总线接口,提供事件的发送、注册和注销功能 /// public interface IEventBus { diff --git a/GFramework.Core.Abstractions/events/IUnRegisterList.cs b/GFramework.Core.Abstractions/events/IUnRegisterList.cs index d95d4de..970abd0 100644 --- a/GFramework.Core.Abstractions/events/IUnRegisterList.cs +++ b/GFramework.Core.Abstractions/events/IUnRegisterList.cs @@ -1,6 +1,4 @@ -using System.Collections.Generic; - -namespace GFramework.Core.Abstractions.events; +namespace GFramework.Core.Abstractions.events; /// /// 提供统一注销功能的接口,用于管理需要注销的对象列表 diff --git a/GFramework.Core.Abstractions/ioc/IIocContainer.cs b/GFramework.Core.Abstractions/ioc/IIocContainer.cs index 834303e..17e8702 100644 --- a/GFramework.Core.Abstractions/ioc/IIocContainer.cs +++ b/GFramework.Core.Abstractions/ioc/IIocContainer.cs @@ -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; diff --git a/GFramework.Core.Abstractions/logging/ILogger.cs b/GFramework.Core.Abstractions/logging/ILogger.cs index 0e63de8..185d604 100644 --- a/GFramework.Core.Abstractions/logging/ILogger.cs +++ b/GFramework.Core.Abstractions/logging/ILogger.cs @@ -1,6 +1,4 @@ -using System; - -namespace GFramework.Core.Abstractions.logging; +namespace GFramework.Core.Abstractions.logging; /// /// 定义日志记录接口,提供日志记录和级别检查功能 diff --git a/GFramework.Core.Abstractions/pool/IObjectPoolSystem.cs b/GFramework.Core.Abstractions/pool/IObjectPoolSystem.cs index 074eba2..c7c8b30 100644 --- a/GFramework.Core.Abstractions/pool/IObjectPoolSystem.cs +++ b/GFramework.Core.Abstractions/pool/IObjectPoolSystem.cs @@ -1,7 +1,7 @@ namespace GFramework.Core.Abstractions.pool; /// -/// 对象池系统接口,定义了对象池的基本操作 +/// 对象池系统接口,定义了对象池的基本操作 /// /// 池键的类型 /// 池中对象的类型,必须实现IPoolableObject接口 @@ -10,21 +10,21 @@ public interface IObjectPoolSystem where TKey : notnull { /// - /// 从对象池中获取一个对象实例 + /// 从对象池中获取一个对象实例 /// /// 对象池的键 /// 池中的对象实例,如果池中没有可用对象则创建新实例 TObject Acquire(TKey key); /// - /// 将对象释放回对象池 + /// 将对象释放回对象池 /// /// 对象池的键 /// 要释放的对象 void Release(TKey key, TObject obj); /// - /// 清空所有对象池 + /// 清空所有对象池 /// void Clear(); } \ No newline at end of file diff --git a/GFramework.Core.Abstractions/pool/IPoolableObject.cs b/GFramework.Core.Abstractions/pool/IPoolableObject.cs index fbe0404..acbc5a9 100644 --- a/GFramework.Core.Abstractions/pool/IPoolableObject.cs +++ b/GFramework.Core.Abstractions/pool/IPoolableObject.cs @@ -1,22 +1,22 @@ namespace GFramework.Core.Abstractions.pool; /// -/// 定义可池化对象的接口,提供对象在池中的生命周期管理方法 +/// 定义可池化对象的接口,提供对象在池中的生命周期管理方法 /// public interface IPoolableObject { /// - /// 当对象从池中被获取时调用,用于初始化或重置对象状态 + /// 当对象从池中被获取时调用,用于初始化或重置对象状态 /// void OnAcquire(); /// - /// 当对象被释放回池中时调用,用于清理或重置对象状态以便下次使用 + /// 当对象被释放回池中时调用,用于清理或重置对象状态以便下次使用 /// void OnRelease(); /// - /// 当对象池被销毁时调用,用于执行最终的清理工作 + /// 当对象池被销毁时调用,用于执行最终的清理工作 /// void OnPoolDestroy(); } \ No newline at end of file diff --git a/GFramework.Core.Abstractions/property/IReadonlyBindableProperty.cs b/GFramework.Core.Abstractions/property/IReadonlyBindableProperty.cs index e4d86a8..36510fc 100644 --- a/GFramework.Core.Abstractions/property/IReadonlyBindableProperty.cs +++ b/GFramework.Core.Abstractions/property/IReadonlyBindableProperty.cs @@ -1,4 +1,3 @@ -using System; using GFramework.Core.Abstractions.events; namespace GFramework.Core.Abstractions.property; diff --git a/GFramework.Core.Abstractions/query/IAsyncQuery.cs b/GFramework.Core.Abstractions/query/IAsyncQuery.cs index 5574933..202d057 100644 --- a/GFramework.Core.Abstractions/query/IAsyncQuery.cs +++ b/GFramework.Core.Abstractions/query/IAsyncQuery.cs @@ -1,15 +1,13 @@ -using System.Threading.Tasks; - -namespace GFramework.Core.Abstractions.query; +namespace GFramework.Core.Abstractions.query; /// -/// 异步查询接口,定义了执行异步查询操作的方法 +/// 异步查询接口,定义了执行异步查询操作的方法 /// /// 查询结果的类型 public interface IAsyncQuery { /// - /// 执行异步查询操作 + /// 执行异步查询操作 /// /// 返回查询结果的Task,结果类型为TResult Task DoAsync(); diff --git a/GFramework.Core.Abstractions/query/IAsyncQueryBus.cs b/GFramework.Core.Abstractions/query/IAsyncQueryBus.cs index 5ba3128..db1700c 100644 --- a/GFramework.Core.Abstractions/query/IAsyncQueryBus.cs +++ b/GFramework.Core.Abstractions/query/IAsyncQueryBus.cs @@ -1,14 +1,12 @@ -using System.Threading.Tasks; - -namespace GFramework.Core.Abstractions.query; +namespace GFramework.Core.Abstractions.query; /// -/// 异步查询总线接口,用于处理异步查询请求 +/// 异步查询总线接口,用于处理异步查询请求 /// public interface IAsyncQueryBus { /// - /// 异步发送查询请求并返回结果 + /// 异步发送查询请求并返回结果 /// /// 查询结果的类型 /// 要执行的异步查询对象 diff --git a/GFramework.Core.Abstractions/registries/IRegistry.cs b/GFramework.Core.Abstractions/registries/IRegistry.cs index 8c26073..c7fdd39 100644 --- a/GFramework.Core.Abstractions/registries/IRegistry.cs +++ b/GFramework.Core.Abstractions/registries/IRegistry.cs @@ -3,34 +3,34 @@ namespace GFramework.Game.Abstractions.registry; /// -/// 表示一个通用的注册表接口,用于根据键类型T获取值类型TR的对象 +/// 表示一个通用的注册表接口,用于根据键类型T获取值类型TR的对象 /// /// 注册表中用作键的类型 /// 注册表中存储的值的类型 public interface IRegistry { /// - /// 根据指定的键获取对应的值 + /// 根据指定的键获取对应的值 /// /// 用于查找值的键 /// 与指定键关联的值 Tr Get(T key); /// - /// 检查注册表是否包含指定的键 + /// 检查注册表是否包含指定的键 /// /// 要检查的键 /// 如果注册表包含具有指定键的元素,则为true;否则为false bool Contains(T key); /// - /// 添加一个键值对到注册表中 + /// 添加一个键值对到注册表中 /// /// 要添加的键值对映射对象 IRegistry Registry(IKeyValue mapping); /// - /// 添加一个键值对到注册表中 + /// 添加一个键值对到注册表中 /// /// 要添加的键 /// 要添加的值 diff --git a/GFramework.Core.Abstractions/registries/KeyValueRegistryBase.cs b/GFramework.Core.Abstractions/registries/KeyValueRegistryBase.cs index f1fb0cc..4046d17 100644 --- a/GFramework.Core.Abstractions/registries/KeyValueRegistryBase.cs +++ b/GFramework.Core.Abstractions/registries/KeyValueRegistryBase.cs @@ -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; /// -/// 基于Dictionary的通用键值注册表基类 -/// 提供基于字典的键值对注册、查询和管理功能 +/// 基于Dictionary的通用键值注册表基类 +/// 提供基于字典的键值对注册、查询和管理功能 /// /// 键的类型 /// 值的类型 @@ -14,12 +13,12 @@ public abstract class KeyValueRegistryBase : IRegistry { /// - /// 存储键值对映射关系的字典 + /// 存储键值对映射关系的字典 /// protected readonly IDictionary Map; /// - /// 初始化KeyValueRegistryBase的新实例 + /// 初始化KeyValueRegistryBase的新实例 /// /// 用于比较键的相等性的比较器,如果为null则使用默认比较器 protected KeyValueRegistryBase(IEqualityComparer? comparer = null) @@ -29,26 +28,30 @@ public abstract class KeyValueRegistryBase } /// - /// 根据指定的键获取对应的值 + /// 根据指定的键获取对应的值 /// /// 要查找的键 /// 与键关联的值 /// 当键不存在时抛出异常 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}"); + } /// - /// 判断是否包含指定的键 + /// 判断是否包含指定的键 /// /// 要检查的键 /// 如果包含该键返回true,否则返回false public virtual bool Contains(TKey key) - => Map.ContainsKey(key); + { + return Map.ContainsKey(key); + } /// - /// 注册键值对到注册表中 + /// 注册键值对到注册表中 /// /// 要注册的键 /// 要注册的值 @@ -60,10 +63,12 @@ public abstract class KeyValueRegistryBase } /// - /// 注册键值对映射对象到注册表中 + /// 注册键值对映射对象到注册表中 /// /// 包含键值对的映射对象 /// 当前注册表实例,支持链式调用 public virtual IRegistry Registry(IKeyValue mapping) - => Registry(mapping.Key, mapping.Value); + { + return Registry(mapping.Key, mapping.Value); + } } \ No newline at end of file diff --git a/GFramework.Core.Abstractions/state/IState.cs b/GFramework.Core.Abstractions/state/IState.cs index 8159804..8867c6f 100644 --- a/GFramework.Core.Abstractions/state/IState.cs +++ b/GFramework.Core.Abstractions/state/IState.cs @@ -1,24 +1,24 @@ namespace GFramework.Core.Abstractions.state; /// -/// 状态机状态接口,定义了状态的基本行为和转换规则 +/// 状态机状态接口,定义了状态的基本行为和转换规则 /// public interface IState { /// - /// 当状态被激活进入时调用 + /// 当状态被激活进入时调用 /// /// 从哪个状态转换而来,可能为null表示初始状态 void OnEnter(IState? from); /// - /// 当状态退出时调用 + /// 当状态退出时调用 /// /// 将要转换到的目标状态,可能为null表示结束状态 void OnExit(IState? to); /// - /// 判断当前状态是否可以转换到目标状态 + /// 判断当前状态是否可以转换到目标状态 /// /// 目标状态 /// 如果可以转换则返回true,否则返回false diff --git a/GFramework.Core.Abstractions/state/IStateMachine.cs b/GFramework.Core.Abstractions/state/IStateMachine.cs index 1e36c85..4c4b5c3 100644 --- a/GFramework.Core.Abstractions/state/IStateMachine.cs +++ b/GFramework.Core.Abstractions/state/IStateMachine.cs @@ -1,84 +1,81 @@ -using System; -using System.Collections.Generic; - namespace GFramework.Core.Abstractions.state; /// -/// 状态机接口,用于管理状态的注册、切换和验证 +/// 状态机接口,用于管理状态的注册、切换和验证 /// public interface IStateMachine { /// - /// 获取当前激活的状态 + /// 获取当前激活的状态 /// IState? Current { get; } /// - /// 注册一个状态到状态机中 + /// 注册一个状态到状态机中 /// /// 要注册的状态实例 IStateMachine Register(IState state); /// - /// 从状态机中注销指定类型的状态 + /// 从状态机中注销指定类型的状态 /// /// 要注销的状态类型,必须实现IState接口 IStateMachine Unregister() where T : IState; /// - /// 检查是否可以切换到指定类型的状态 + /// 检查是否可以切换到指定类型的状态 /// /// 目标状态类型,必须实现IState接口 /// 如果可以切换则返回true,否则返回false bool CanChangeTo() where T : IState; /// - /// 切换到指定类型的状态 + /// 切换到指定类型的状态 /// /// 要切换到的状态类型,必须实现IState接口 /// 如果成功切换则返回true,否则返回false bool ChangeTo() where T : IState; /// - /// 检查指定类型的状态是否已注册 + /// 检查指定类型的状态是否已注册 /// /// 要检查的状态类型 /// 如果状态已注册则返回true,否则返回false bool IsRegistered() where T : IState; /// - /// 获取指定类型的已注册状态实例 + /// 获取指定类型的已注册状态实例 /// /// 要获取的状态类型 /// 如果状态存在则返回对应实例,否则返回null T? GetState() where T : class, IState; /// - /// 获取所有已注册状态的类型集合 + /// 获取所有已注册状态的类型集合 /// /// 包含所有已注册状态类型的枚举器 IEnumerable GetRegisteredStateTypes(); /// - /// 获取上一个状态 + /// 获取上一个状态 /// /// 如果历史记录存在则返回上一个状态,否则返回null IState? GetPreviousState(); /// - /// 获取状态历史记录 + /// 获取状态历史记录 /// /// 状态历史记录的只读副本 IReadOnlyList GetStateHistory(); /// - /// 回退到上一个状态 + /// 回退到上一个状态 /// /// 如果成功回退则返回true,否则返回false bool GoBack(); /// - /// 清空状态历史记录 + /// 清空状态历史记录 /// void ClearHistory(); } \ No newline at end of file diff --git a/GFramework.Core.Abstractions/state/IStateMachineSystem.cs b/GFramework.Core.Abstractions/state/IStateMachineSystem.cs index c31021b..982400f 100644 --- a/GFramework.Core.Abstractions/state/IStateMachineSystem.cs +++ b/GFramework.Core.Abstractions/state/IStateMachineSystem.cs @@ -3,7 +3,7 @@ namespace GFramework.Core.Abstractions.state; /// -/// 状态机系统接口,继承自ISystem和IStateMachine接口 -/// 提供状态机系统的功能定义,结合了系统管理和状态机管理的能力 +/// 状态机系统接口,继承自ISystem和IStateMachine接口 +/// 提供状态机系统的功能定义,结合了系统管理和状态机管理的能力 /// public interface IStateMachineSystem : ISystem, IStateMachine; \ No newline at end of file diff --git a/GFramework.Core.Abstractions/storage/IStorage.cs b/GFramework.Core.Abstractions/storage/IStorage.cs index a39105b..8216ca8 100644 --- a/GFramework.Core.Abstractions/storage/IStorage.cs +++ b/GFramework.Core.Abstractions/storage/IStorage.cs @@ -1,29 +1,28 @@ -using System.Threading.Tasks; -using GFramework.Core.Abstractions.utility; +using GFramework.Core.Abstractions.utility; namespace GFramework.Core.Abstractions.storage; /// -/// 存储接口,提供同步和异步的数据存储操作功能 +/// 存储接口,提供同步和异步的数据存储操作功能 /// public interface IStorage : IUtility { /// - /// 检查指定键的存储项是否存在 + /// 检查指定键的存储项是否存在 /// /// 要检查的键 /// 如果键存在则返回true,否则返回false bool Exists(string key); /// - /// 异步检查指定键的存储项是否存在 + /// 异步检查指定键的存储项是否存在 /// /// 要检查的键 /// 如果键存在则返回true,否则返回false Task ExistsAsync(string key); /// - /// 读取指定键的值 + /// 读取指定键的值 /// /// 要读取的值的类型 /// 要读取的键 @@ -31,7 +30,7 @@ public interface IStorage : IUtility T Read(string key); /// - /// 读取指定键的值,如果键不存在则返回默认值 + /// 读取指定键的值,如果键不存在则返回默认值 /// /// 要读取的值的类型 /// 要读取的键 @@ -40,7 +39,7 @@ public interface IStorage : IUtility T Read(string key, T defaultValue); /// - /// 异步读取指定键的值 + /// 异步读取指定键的值 /// /// 要读取的值的类型 /// 要读取的键 @@ -48,7 +47,7 @@ public interface IStorage : IUtility Task ReadAsync(string key); /// - /// 将值写入指定键 + /// 将值写入指定键 /// /// 要写入的值的类型 /// 要写入的键 @@ -56,7 +55,7 @@ public interface IStorage : IUtility void Write(string key, T value); /// - /// 异步将值写入指定键 + /// 异步将值写入指定键 /// /// 要写入的值的类型 /// 要写入的键 @@ -65,7 +64,7 @@ public interface IStorage : IUtility Task WriteAsync(string key, T value); /// - /// 删除指定键的存储项 + /// 删除指定键的存储项 /// /// 要删除的键 void Delete(string key); diff --git a/GFramework.Core.Tests/GFramework.Core.Tests.csproj b/GFramework.Core.Tests/GFramework.Core.Tests.csproj index cf4b142..86171dc 100644 --- a/GFramework.Core.Tests/GFramework.Core.Tests.csproj +++ b/GFramework.Core.Tests/GFramework.Core.Tests.csproj @@ -6,13 +6,13 @@ net10.0;net8.0 - - - + + + - + diff --git a/GFramework.Core.Tests/architecture/ArchitectureConfigurationTests.cs b/GFramework.Core.Tests/architecture/ArchitectureConfigurationTests.cs index 30e3705..af6afa9 100644 --- a/GFramework.Core.Tests/architecture/ArchitectureConfigurationTests.cs +++ b/GFramework.Core.Tests/architecture/ArchitectureConfigurationTests.cs @@ -8,15 +8,15 @@ using NUnit.Framework; namespace GFramework.Core.Tests.architecture; /// -/// ArchitectureConfiguration类的单元测试 -/// 测试内容包括: -/// - 构造函数默认值 -/// - LoggerProperties默认配置(ConsoleLoggerFactoryProvider + Info级别) -/// - ArchitectureProperties默认配置(AllowLateRegistration=false, StrictPhaseValidation=true) -/// - 自定义配置替换 -/// - LoggerProperties独立修改 -/// - ArchitectureProperties独立修改 -/// - IArchitectureConfiguration接口实现验证 +/// ArchitectureConfiguration类的单元测试 +/// 测试内容包括: +/// - 构造函数默认值 +/// - LoggerProperties默认配置(ConsoleLoggerFactoryProvider + Info级别) +/// - ArchitectureProperties默认配置(AllowLateRegistration=false, StrictPhaseValidation=true) +/// - 自定义配置替换 +/// - LoggerProperties独立修改 +/// - ArchitectureProperties独立修改 +/// - IArchitectureConfiguration接口实现验证 /// [TestFixture] public class ArchitectureConfigurationTests @@ -30,7 +30,7 @@ public class ArchitectureConfigurationTests private ArchitectureConfiguration? _configuration; /// - /// 测试构造函数是否正确初始化LoggerProperties + /// 测试构造函数是否正确初始化LoggerProperties /// [Test] public void Constructor_Should_Initialize_LoggerProperties_With_Default_Values() @@ -40,7 +40,7 @@ public class ArchitectureConfigurationTests } /// - /// 测试LoggerProperties默认使用ConsoleLoggerFactoryProvider + /// 测试LoggerProperties默认使用ConsoleLoggerFactoryProvider /// [Test] public void LoggerProperties_Should_Use_ConsoleLoggerFactoryProvider_By_Default() @@ -50,7 +50,7 @@ public class ArchitectureConfigurationTests } /// - /// 测试LoggerProperties默认使用Info日志级别 + /// 测试LoggerProperties默认使用Info日志级别 /// [Test] public void LoggerProperties_Should_Use_Info_LogLevel_By_Default() @@ -63,7 +63,7 @@ public class ArchitectureConfigurationTests } /// - /// 测试ArchitectureProperties的AllowLateRegistration默认为false + /// 测试ArchitectureProperties的AllowLateRegistration默认为false /// [Test] public void ArchitectureProperties_Should_Have_AllowLateRegistration_Set_To_False_By_Default() @@ -73,7 +73,7 @@ public class ArchitectureConfigurationTests } /// - /// 测试ArchitectureProperties的StrictPhaseValidation默认为true + /// 测试ArchitectureProperties的StrictPhaseValidation默认为true /// [Test] public void ArchitectureProperties_Should_Have_StrictPhaseValidation_Set_To_True_By_Default() @@ -83,7 +83,7 @@ public class ArchitectureConfigurationTests } /// - /// 测试LoggerProperties可以被自定义配置替换 + /// 测试LoggerProperties可以被自定义配置替换 /// [Test] public void LoggerProperties_Should_Be_Replaced_With_Custom_Configuration() @@ -105,7 +105,7 @@ public class ArchitectureConfigurationTests } /// - /// 测试ArchitectureProperties可以被自定义配置替换 + /// 测试ArchitectureProperties可以被自定义配置替换 /// [Test] public void ArchitectureProperties_Should_Be_Replaced_With_Custom_Configuration() @@ -126,7 +126,7 @@ public class ArchitectureConfigurationTests } /// - /// 测试LoggerProperties可以独立修改 + /// 测试LoggerProperties可以独立修改 /// [Test] public void LoggerProperties_Should_Be_Modifiable_Independently() @@ -142,7 +142,7 @@ public class ArchitectureConfigurationTests } /// - /// 测试ArchitectureProperties可以独立修改 + /// 测试ArchitectureProperties可以独立修改 /// [Test] public void ArchitectureProperties_Should_Be_Modifiable_Independently() @@ -157,7 +157,7 @@ public class ArchitectureConfigurationTests } /// - /// 测试ArchitectureConfiguration实现IArchitectureConfiguration接口 + /// 测试ArchitectureConfiguration实现IArchitectureConfiguration接口 /// [Test] public void ArchitectureConfiguration_Should_Implement_IArchitectureConfiguration_Interface() @@ -166,7 +166,7 @@ public class ArchitectureConfigurationTests } /// - /// 测试新实例不与其他实例共享LoggerProperties + /// 测试新实例不与其他实例共享LoggerProperties /// [Test] public void New_Instance_Should_Not_Share_LoggerProperties_With_Other_Instance() @@ -178,7 +178,7 @@ public class ArchitectureConfigurationTests } /// - /// 测试新实例不与其他实例共享ArchitectureProperties + /// 测试新实例不与其他实例共享ArchitectureProperties /// [Test] public void New_Instance_Should_Not_Share_ArchitectureProperties_With_Other_Instance() diff --git a/GFramework.Core.Tests/architecture/ArchitectureConstantsTests.cs b/GFramework.Core.Tests/architecture/ArchitectureConstantsTests.cs index 02bb50a..866bf2d 100644 --- a/GFramework.Core.Tests/architecture/ArchitectureConstantsTests.cs +++ b/GFramework.Core.Tests/architecture/ArchitectureConstantsTests.cs @@ -6,19 +6,19 @@ using NUnit.Framework; namespace GFramework.Core.Tests.architecture; /// -/// ArchitectureConstants类的单元测试 -/// 测试内容包括: -/// - 常量值的正确性 -/// - 常量类型验证 -/// - 常量可访问性 -/// - 常量命名规范 -/// - 架构阶段定义常量 +/// ArchitectureConstants类的单元测试 +/// 测试内容包括: +/// - 常量值的正确性 +/// - 常量类型验证 +/// - 常量可访问性 +/// - 常量命名规范 +/// - 架构阶段定义常量 /// [TestFixture] public class ArchitectureConstantsTests { /// - /// 测试PhaseOrder数组不为空 + /// 测试PhaseOrder数组不为空 /// [Test] public void PhaseOrder_Should_Not_Be_Empty() @@ -28,7 +28,7 @@ public class ArchitectureConstantsTests } /// - /// 测试PhaseOrder包含所有预期的架构阶段 + /// 测试PhaseOrder包含所有预期的架构阶段 /// [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)); - } } /// - /// 测试PhaseOrder数组是只读的 + /// 测试PhaseOrder数组是只读的 /// [Test] public void PhaseOrder_Should_Be_Immutable() @@ -67,7 +65,7 @@ public class ArchitectureConstantsTests } /// - /// 测试PhaseOrder的顺序是正确的 + /// 测试PhaseOrder的顺序是正确的 /// [Test] public void PhaseOrder_Should_Be_In_Correct_Sequence() @@ -91,7 +89,7 @@ public class ArchitectureConstantsTests } /// - /// 测试PhaseTransitions字典不为空 + /// 测试PhaseTransitions字典不为空 /// [Test] public void PhaseTransitions_Should_Not_Be_Empty() @@ -101,7 +99,7 @@ public class ArchitectureConstantsTests } /// - /// 测试PhaseTransitions是只读的 + /// 测试PhaseTransitions是只读的 /// [Test] public void PhaseTransitions_Should_Be_Immutable() @@ -111,7 +109,7 @@ public class ArchitectureConstantsTests } /// - /// 测试PhaseTransitions包含正常线性流程的转换 + /// 测试PhaseTransitions包含正常线性流程的转换 /// [Test] public void PhaseTransitions_Should_Contain_Normal_Linear_Transitions() @@ -128,7 +126,7 @@ public class ArchitectureConstantsTests } /// - /// 测试PhaseTransitions中的转换方向是正确的 + /// 测试PhaseTransitions中的转换方向是正确的 /// [Test] public void PhaseTransitions_Should_Have_Correct_Directions() @@ -147,7 +145,7 @@ public class ArchitectureConstantsTests } /// - /// 测试PhaseTransitions包含失败初始化的转换路径 + /// 测试PhaseTransitions包含失败初始化的转换路径 /// [Test] public void PhaseTransitions_Should_Contain_FailedInitialization_Transition() @@ -158,20 +156,18 @@ public class ArchitectureConstantsTests } /// - /// 测试每个阶段的转换数量不超过1个(线性转换) + /// 测试每个阶段的转换数量不超过1个(线性转换) /// [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"); - } } /// - /// 测试PhaseOrder和PhaseTransitions的一致性 + /// 测试PhaseOrder和PhaseTransitions的一致性 /// [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]; diff --git a/GFramework.Core.Tests/architecture/ArchitectureContextTests.cs b/GFramework.Core.Tests/architecture/ArchitectureContextTests.cs index da2ed5f..1104c3f 100644 --- a/GFramework.Core.Tests/architecture/ArchitectureContextTests.cs +++ b/GFramework.Core.Tests/architecture/ArchitectureContextTests.cs @@ -19,26 +19,26 @@ using NUnit.Framework; namespace GFramework.Core.Tests.architecture; /// -/// 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方法 - 获取环境对象 /// [TestFixture] public class ArchitectureContextTests @@ -83,7 +83,7 @@ public class ArchitectureContextTests private DefaultEnvironment? _environment; /// - /// 测试构造函数在所有参数都有效时不应抛出异常 + /// 测试构造函数在所有参数都有效时不应抛出异常 /// [Test] public void Constructor_Should_NotThrow_When_AllParameters_AreValid() @@ -92,7 +92,7 @@ public class ArchitectureContextTests } /// - /// 测试构造函数在 container 为 null 时应抛出 ArgumentNullException + /// 测试构造函数在 container 为 null 时应抛出 ArgumentNullException /// [Test] public void Constructor_Should_Throw_When_Container_IsNull() @@ -101,7 +101,7 @@ public class ArchitectureContextTests } /// - /// 测试构造函数在Container为null时应抛出ArgumentNullException + /// 测试构造函数在Container为null时应抛出ArgumentNullException /// [Test] public void Constructor_Should_ThrowArgumentNullException_When_Container_IsNull() @@ -111,7 +111,7 @@ public class ArchitectureContextTests } /// - /// 测试SendQuery方法在查询有效时返回正确结果 + /// 测试SendQuery方法在查询有效时返回正确结果 /// [Test] public void SendQuery_Should_ReturnResult_When_Query_IsValid() @@ -123,7 +123,7 @@ public class ArchitectureContextTests } /// - /// 测试SendQuery方法在查询为null时应抛出ArgumentNullException + /// 测试SendQuery方法在查询为null时应抛出ArgumentNullException /// [Test] public void SendQuery_Should_ThrowArgumentNullException_When_Query_IsNull() @@ -133,7 +133,7 @@ public class ArchitectureContextTests } /// - /// 测试SendCommand方法在命令有效时正确执行 + /// 测试SendCommand方法在命令有效时正确执行 /// [Test] public void SendCommand_Should_ExecuteCommand_When_Command_IsValid() @@ -144,17 +144,17 @@ public class ArchitectureContextTests } /// - /// 测试SendCommand方法在命令为null时应抛出ArgumentNullException + /// 测试SendCommand方法在命令为null时应抛出ArgumentNullException /// [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")); } /// - /// 测试SendCommand方法(带返回值)在命令有效时返回正确结果 + /// 测试SendCommand方法(带返回值)在命令有效时返回正确结果 /// [Test] public void SendCommand_WithResult_Should_ReturnResult_When_Command_IsValid() @@ -166,7 +166,7 @@ public class ArchitectureContextTests } /// - /// 测试SendCommand方法(带返回值)在命令为null时应抛出ArgumentNullException + /// 测试SendCommand方法(带返回值)在命令为null时应抛出ArgumentNullException /// [Test] public void SendCommand_WithResult_Should_ThrowArgumentNullException_When_Command_IsNull() @@ -176,12 +176,12 @@ public class ArchitectureContextTests } /// - /// 测试SendEvent方法在事件类型有效时正确发送事件 + /// 测试SendEvent方法在事件类型有效时正确发送事件 /// [Test] public void SendEvent_Should_SendEvent_When_EventType_IsValid() { - bool eventReceived = false; + var eventReceived = false; _context!.RegisterEvent(_ => eventReceived = true); _context.SendEvent(); @@ -189,12 +189,12 @@ public class ArchitectureContextTests } /// - /// 测试SendEvent方法(带实例)在事件实例有效时正确发送事件 + /// 测试SendEvent方法(带实例)在事件实例有效时正确发送事件 /// [Test] public void SendEvent_WithInstance_Should_SendEvent_When_EventInstance_IsValid() { - bool eventReceived = false; + var eventReceived = false; var testEvent = new TestEventV2(); _context!.RegisterEvent(_ => eventReceived = true); _context.SendEvent(testEvent); @@ -203,7 +203,7 @@ public class ArchitectureContextTests } /// - /// 测试SendEvent方法(带实例)在事件实例为null时应抛出ArgumentNullException + /// 测试SendEvent方法(带实例)在事件实例为null时应抛出ArgumentNullException /// [Test] public void SendEvent_WithInstance_Should_ThrowArgumentNullException_When_EventInstance_IsNull() @@ -213,7 +213,7 @@ public class ArchitectureContextTests } /// - /// 测试GetSystem方法在系统已注册时返回注册的系统 + /// 测试GetSystem方法在系统已注册时返回注册的系统 /// [Test] public void GetSystem_Should_ReturnRegisteredSystem_When_SystemIsRegistered() @@ -228,7 +228,7 @@ public class ArchitectureContextTests } /// - /// 测试GetSystem方法在系统未注册时返回null + /// 测试GetSystem方法在系统未注册时返回null /// [Test] public void GetSystem_Should_ReturnNull_When_SystemIsNotRegistered() @@ -239,7 +239,7 @@ public class ArchitectureContextTests } /// - /// 测试GetModel方法在模型已注册时返回注册的模型 + /// 测试GetModel方法在模型已注册时返回注册的模型 /// [Test] public void GetModel_Should_ReturnRegisteredModel_When_ModelIsRegistered() @@ -254,7 +254,7 @@ public class ArchitectureContextTests } /// - /// 测试GetModel方法在模型未注册时返回null + /// 测试GetModel方法在模型未注册时返回null /// [Test] public void GetModel_Should_ReturnNull_When_ModelIsNotRegistered() @@ -265,7 +265,7 @@ public class ArchitectureContextTests } /// - /// 测试GetUtility方法在工具已注册时返回注册的工具 + /// 测试GetUtility方法在工具已注册时返回注册的工具 /// [Test] public void GetUtility_Should_ReturnRegisteredUtility_When_UtilityIsRegistered() @@ -280,7 +280,7 @@ public class ArchitectureContextTests } /// - /// 测试GetUtility方法在工具未注册时返回null + /// 测试GetUtility方法在工具未注册时返回null /// [Test] public void GetUtility_Should_ReturnNull_When_UtilityIsNotRegistered() @@ -291,7 +291,7 @@ public class ArchitectureContextTests } /// - /// 测试GetEnvironment方法返回环境实例 + /// 测试GetEnvironment方法返回环境实例 /// [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 @@ -361,9 +382,20 @@ public class TestQueryV2 : IQuery 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 @@ -381,9 +424,20 @@ public class TestCommandWithResultV2 : ICommand 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 diff --git a/GFramework.Core.Tests/architecture/ArchitectureServicesTests.cs b/GFramework.Core.Tests/architecture/ArchitectureServicesTests.cs index fb1e7bb..78858f1 100644 --- a/GFramework.Core.Tests/architecture/ArchitectureServicesTests.cs +++ b/GFramework.Core.Tests/architecture/ArchitectureServicesTests.cs @@ -18,17 +18,17 @@ using NUnit.Framework; namespace GFramework.Core.Tests.architecture; /// -/// ArchitectureServices类的单元测试 -/// 测试内容包括: -/// - 服务容器初始化 -/// - 所有服务实例创建(Container, EventBus, CommandBus, QueryBus) -/// - SetContext方法 - 设置上下文 -/// - SetContext方法 - 重复设置上下文 -/// - GetContext方法 - 获取已设置上下文 -/// - GetContext方法 - 未设置上下文时返回null -/// - 上下文传播到容器 -/// - IArchitectureServices接口实现验证 -/// - 服务独立性验证(多个实例) +/// ArchitectureServices类的单元测试 +/// 测试内容包括: +/// - 服务容器初始化 +/// - 所有服务实例创建(Container, EventBus, CommandBus, QueryBus) +/// - SetContext方法 - 设置上下文 +/// - SetContext方法 - 重复设置上下文 +/// - GetContext方法 - 获取已设置上下文 +/// - GetContext方法 - 未设置上下文时返回null +/// - 上下文传播到容器 +/// - IArchitectureServices接口实现验证 +/// - 服务独立性验证(多个实例) /// [TestFixture] public class ArchitectureServicesTests @@ -44,7 +44,7 @@ public class ArchitectureServicesTests private TestArchitectureContextV3? _context; /// - /// 测试构造函数初始化所有服务 + /// 测试构造函数初始化所有服务 /// [Test] public void Constructor_Should_Initialize_AllServices() @@ -63,7 +63,7 @@ public class ArchitectureServicesTests } /// - /// 测试EventBus是EventBus的实例 + /// 测试EventBus是EventBus的实例 /// [Test] public void EventBus_Should_Be_Instance_Of_EventBus() @@ -73,7 +73,7 @@ public class ArchitectureServicesTests } /// - /// 测试CommandBus是CommandBus的实例 + /// 测试CommandBus是CommandBus的实例 /// [Test] public void CommandBus_Should_Be_Instance_Of_CommandBus() @@ -83,7 +83,7 @@ public class ArchitectureServicesTests } /// - /// 测试QueryBus是QueryBus的实例 + /// 测试QueryBus是QueryBus的实例 /// [Test] public void QueryBus_Should_Be_Instance_Of_QueryBus() @@ -93,7 +93,7 @@ public class ArchitectureServicesTests } /// - /// 测试SetContext设置内部Context字段 + /// 测试SetContext设置内部Context字段 /// [Test] public void SetContext_Should_Set_Context_Internal_Field() @@ -105,7 +105,7 @@ public class ArchitectureServicesTests } /// - /// 测试SetContext将上下文传播到Container + /// 测试SetContext将上下文传播到Container /// [Test] public void SetContext_Should_Propagate_Context_To_Container() @@ -117,7 +117,7 @@ public class ArchitectureServicesTests } /// - /// 测试GetContext在SetContext后返回上下文 + /// 测试GetContext在SetContext后返回上下文 /// [Test] public void GetContext_Should_Return_Context_After_SetContext() @@ -130,7 +130,7 @@ public class ArchitectureServicesTests } /// - /// 测试GetContext在未设置上下文时返回null + /// 测试GetContext在未设置上下文时返回null /// [Test] public void GetContext_Should_ReturnNull_When_Context_Not_Set() @@ -141,7 +141,7 @@ public class ArchitectureServicesTests } /// - /// 测试SetContext替换已存在的上下文 + /// 测试SetContext替换已存在的上下文 /// [Test] public void SetContext_Should_Replace_Existing_Context() @@ -157,7 +157,7 @@ public class ArchitectureServicesTests } /// - /// 测试ArchitectureServices实现IArchitectureServices接口 + /// 测试ArchitectureServices实现IArchitectureServices接口 /// [Test] public void ArchitectureServices_Should_Implement_IArchitectureServices_Interface() @@ -166,7 +166,7 @@ public class ArchitectureServicesTests } /// - /// 测试多个实例有独立的Container + /// 测试多个实例有独立的Container /// [Test] public void Multiple_Instances_Should_Have_Independent_Container() @@ -178,7 +178,7 @@ public class ArchitectureServicesTests } /// - /// 测试多个实例有独立的EventBus + /// 测试多个实例有独立的EventBus /// [Test] public void Multiple_Instances_Should_Have_Independent_EventBus() @@ -190,7 +190,7 @@ public class ArchitectureServicesTests } /// - /// 测试多个实例有独立的CommandBus + /// 测试多个实例有独立的CommandBus /// [Test] public void Multiple_Instances_Should_Have_Independent_CommandBus() @@ -202,7 +202,7 @@ public class ArchitectureServicesTests } /// - /// 测试多个实例有独立的QueryBus + /// 测试多个实例有独立的QueryBus /// [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() where TService : class => _container.Get(); - public TModel? GetModel() where TModel : class, IModel => _container.Get(); - public TSystem? GetSystem() where TSystem : class, ISystem => _container.Get(); - public TUtility? GetUtility() where TUtility : class, IUtility => _container.Get(); + public TService? GetService() where TService : class + { + return _container.Get(); + } + + public TModel? GetModel() where TModel : class, IModel + { + return _container.Get(); + } + + public TSystem? GetSystem() where TSystem : class, ISystem + { + return _container.Get(); + } + + public TUtility? GetUtility() where TUtility : class, IUtility + { + return _container.Get(); + } public void SendEvent() where TEvent : new() { @@ -240,7 +255,10 @@ public class TestArchitectureContextV3 : IArchitectureContext { } - public IUnRegister RegisterEvent(Action handler) => new DefaultUnRegister(() => { }); + public IUnRegister RegisterEvent(Action handler) + { + return new DefaultUnRegister(() => { }); + } public void UnRegisterEvent(Action onEvent) { @@ -250,7 +268,10 @@ public class TestArchitectureContextV3 : IArchitectureContext { } - public TResult SendCommand(ICommand command) => default!; + public TResult SendCommand(ICommand command) + { + return default!; + } public Task SendCommandAsync(IAsyncCommand command) { @@ -262,11 +283,20 @@ public class TestArchitectureContextV3 : IArchitectureContext return (Task)Task.CompletedTask; } - public TResult SendQuery(IQuery query) => default!; + public TResult SendQuery(IQuery query) + { + return default!; + } - public Task SendQueryAsync(IAsyncQuery query) => (Task)Task.CompletedTask; + public Task SendQueryAsync(IAsyncQuery query) + { + return (Task)Task.CompletedTask; + } - public IEnvironment GetEnvironment() => _environment; + public IEnvironment GetEnvironment() + { + return _environment; + } } #endregion \ No newline at end of file diff --git a/GFramework.Core.Tests/architecture/GameContextTests.cs b/GFramework.Core.Tests/architecture/GameContextTests.cs index 588830e..f52881f 100644 --- a/GFramework.Core.Tests/architecture/GameContextTests.cs +++ b/GFramework.Core.Tests/architecture/GameContextTests.cs @@ -18,26 +18,26 @@ using NUnit.Framework; namespace GFramework.Core.Tests.architecture; /// -/// 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移除所有上下文 /// [TestFixture] public class GameContextTests { /// - /// 测试初始化方法,在每个测试方法执行前清空GameContext + /// 测试初始化方法,在每个测试方法执行前清空GameContext /// [SetUp] public void SetUp() @@ -46,7 +46,7 @@ public class GameContextTests } /// - /// 测试清理方法,在每个测试方法执行后清空GameContext + /// 测试清理方法,在每个测试方法执行后清空GameContext /// [TearDown] public void TearDown() @@ -55,7 +55,7 @@ public class GameContextTests } /// - /// 测试ArchitectureReadOnlyDictionary在启动时返回空字典 + /// 测试ArchitectureReadOnlyDictionary在启动时返回空字典 /// [Test] public void ArchitectureReadOnlyDictionary_Should_Return_Empty_At_Start() @@ -66,7 +66,7 @@ public class GameContextTests } /// - /// 测试Bind方法是否正确将上下文添加到字典中 + /// 测试Bind方法是否正确将上下文添加到字典中 /// [Test] public void Bind_Should_Add_Context_To_Dictionary() @@ -79,7 +79,7 @@ public class GameContextTests } /// - /// 测试Bind方法在绑定重复类型时是否抛出InvalidOperationException异常 + /// 测试Bind方法在绑定重复类型时是否抛出InvalidOperationException异常 /// [Test] public void Bind_WithDuplicateType_Should_ThrowInvalidOperationException() @@ -94,7 +94,7 @@ public class GameContextTests } /// - /// 测试GetByType方法是否返回正确的上下文 + /// 测试GetByType方法是否返回正确的上下文 /// [Test] public void GetByType_Should_Return_Correct_Context() @@ -108,7 +108,7 @@ public class GameContextTests } /// - /// 测试GetByType方法在未找到对应类型时是否抛出InvalidOperationException异常 + /// 测试GetByType方法在未找到对应类型时是否抛出InvalidOperationException异常 /// [Test] public void GetByType_Should_Throw_When_Not_Found() @@ -118,7 +118,7 @@ public class GameContextTests } /// - /// 测试Get泛型方法是否返回正确的上下文 + /// 测试Get泛型方法是否返回正确的上下文 /// [Test] public void GetGeneric_Should_Return_Correct_Context() @@ -132,7 +132,7 @@ public class GameContextTests } /// - /// 测试TryGet方法在找到上下文时是否返回true并正确设置输出参数 + /// 测试TryGet方法在找到上下文时是否返回true并正确设置输出参数 /// [Test] public void TryGet_Should_ReturnTrue_When_Found() @@ -147,7 +147,7 @@ public class GameContextTests } /// - /// 测试TryGet方法在未找到上下文时是否返回false且输出参数为null + /// 测试TryGet方法在未找到上下文时是否返回false且输出参数为null /// [Test] public void TryGet_Should_ReturnFalse_When_Not_Found() @@ -159,7 +159,7 @@ public class GameContextTests } /// - /// 测试GetFirstArchitectureContext方法在存在上下文时是否返回正确的上下文 + /// 测试GetFirstArchitectureContext方法在存在上下文时是否返回正确的上下文 /// [Test] public void GetFirstArchitectureContext_Should_Return_When_Exists() @@ -173,7 +173,7 @@ public class GameContextTests } /// - /// 测试GetFirstArchitectureContext方法在没有上下文时是否抛出InvalidOperationException异常 + /// 测试GetFirstArchitectureContext方法在没有上下文时是否抛出InvalidOperationException异常 /// [Test] public void GetFirstArchitectureContext_Should_Throw_When_Empty() @@ -183,7 +183,7 @@ public class GameContextTests } /// - /// 测试Unbind方法是否正确移除指定类型的上下文 + /// 测试Unbind方法是否正确移除指定类型的上下文 /// [Test] public void Unbind_Should_Remove_Context() @@ -197,7 +197,7 @@ public class GameContextTests } /// - /// 测试Clear方法是否正确移除所有上下文 + /// 测试Clear方法是否正确移除所有上下文 /// [Test] public void Clear_Should_Remove_All_Contexts() @@ -212,12 +212,12 @@ public class GameContextTests } /// -/// 测试用的架构类,继承自Architecture +/// 测试用的架构类,继承自Architecture /// public class TestArchitecture : Architecture { /// - /// 初始化方法,当前为空实现 + /// 初始化方法,当前为空实现 /// protected override void Init() { @@ -225,67 +225,79 @@ public class TestArchitecture : Architecture } /// -/// 测试用的架构上下文类,实现了IArchitectureContext接口 +/// 测试用的架构上下文类,实现了IArchitectureContext接口 /// public class TestArchitectureContext : IArchitectureContext { private readonly IocContainer _container = new(); /// - /// 获取依赖注入容器 + /// 获取依赖注入容器 /// public IIocContainer Container => _container; /// - /// 获取事件总线 + /// 获取事件总线 /// public IEventBus EventBus => new EventBus(); /// - /// 获取命令总线 + /// 获取命令总线 /// public ICommandBus CommandBus => new CommandBus(); /// - /// 获取查询总线 + /// 获取查询总线 /// public IQueryBus QueryBus => new QueryBus(); /// - /// 获取环境对象 + /// 获取环境对象 /// public IEnvironment Environment => new DefaultEnvironment(); /// - /// 获取指定类型的服务 + /// 获取指定类型的服务 /// /// 服务类型 /// 服务实例或null - public TService? GetService() where TService : class => _container.Get(); + public TService? GetService() where TService : class + { + return _container.Get(); + } /// - /// 获取指定类型的模型 + /// 获取指定类型的模型 /// /// 模型类型 /// 模型实例或null - public TModel? GetModel() where TModel : class, IModel => _container.Get(); + public TModel? GetModel() where TModel : class, IModel + { + return _container.Get(); + } /// - /// 获取指定类型的系统 + /// 获取指定类型的系统 /// /// 系统类型 /// 系统实例或null - public TSystem? GetSystem() where TSystem : class, ISystem => _container.Get(); + public TSystem? GetSystem() where TSystem : class, ISystem + { + return _container.Get(); + } /// - /// 获取指定类型的工具 + /// 获取指定类型的工具 /// /// 工具类型 /// 工具实例或null - public TUtility? GetUtility() where TUtility : class, IUtility => _container.Get(); + public TUtility? GetUtility() where TUtility : class, IUtility + { + return _container.Get(); + } /// - /// 发送事件 + /// 发送事件 /// /// 事件类型 public void SendEvent() where TEvent : new() @@ -293,7 +305,7 @@ public class TestArchitectureContext : IArchitectureContext } /// - /// 发送事件 + /// 发送事件 /// /// 事件类型 /// 事件实例 @@ -302,15 +314,18 @@ public class TestArchitectureContext : IArchitectureContext } /// - /// 注册事件处理器 + /// 注册事件处理器 /// /// 事件类型 /// 事件处理委托 /// 取消注册接口 - public IUnRegister RegisterEvent(Action handler) => new DefaultUnRegister(() => { }); + public IUnRegister RegisterEvent(Action handler) + { + return new DefaultUnRegister(() => { }); + } /// - /// 取消注册事件处理器 + /// 取消注册事件处理器 /// /// 事件类型 /// 事件处理委托 @@ -319,7 +334,7 @@ public class TestArchitectureContext : IArchitectureContext } /// - /// 发送命令 + /// 发送命令 /// /// 命令对象 public void SendCommand(ICommand command) @@ -327,12 +342,15 @@ public class TestArchitectureContext : IArchitectureContext } /// - /// 发送带返回值的命令 + /// 发送带返回值的命令 /// /// 返回值类型 /// 命令对象 /// 命令执行结果 - public TResult SendCommand(ICommand command) => default!; + public TResult SendCommand(ICommand command) + { + return default!; + } public Task SendCommandAsync(IAsyncCommand command) { @@ -345,24 +363,33 @@ public class TestArchitectureContext : IArchitectureContext } /// - /// 发送查询请求 + /// 发送查询请求 /// /// 查询结果类型 /// 查询对象 /// 查询结果 - public TResult SendQuery(IQuery query) => default!; + public TResult SendQuery(IQuery query) + { + return default!; + } /// - /// 异步发送查询请求 + /// 异步发送查询请求 /// /// 查询结果类型 /// 异步查询对象 /// 查询结果 - public Task SendQueryAsync(IAsyncQuery query) => (Task)Task.CompletedTask; + public Task SendQueryAsync(IAsyncQuery query) + { + return (Task)Task.CompletedTask; + } /// - /// 获取环境对象 + /// 获取环境对象 /// /// 环境对象 - public IEnvironment GetEnvironment() => Environment; + public IEnvironment GetEnvironment() + { + return Environment; + } } \ No newline at end of file diff --git a/GFramework.Core.Tests/command/AbstractAsyncCommandTests.cs b/GFramework.Core.Tests/command/AbstractAsyncCommandTests.cs index cedd3fc..988e612 100644 --- a/GFramework.Core.Tests/command/AbstractAsyncCommandTests.cs +++ b/GFramework.Core.Tests/command/AbstractAsyncCommandTests.cs @@ -11,20 +11,20 @@ using NUnit.Framework; namespace GFramework.Core.Tests.command; /// -/// AbstractAsyncCommand类的单元测试 -/// 测试内容包括: -/// - 异步命令无返回值版本的基础实现 -/// - 异步命令有返回值版本的基础实现 -/// - ExecuteAsync方法调用 -/// - ExecuteAsync方法的异常处理 -/// - 上下文感知功能(SetContext, GetContext) -/// - 日志功能(Logger属性) -/// - 子类继承行为验证(两个版本) -/// - 命令执行前日志记录 -/// - 命令执行后日志记录 -/// - 错误情况下的日志记录 -/// - 无返回值版本的行为 -/// - 有返回值版本的行为 +/// AbstractAsyncCommand类的单元测试 +/// 测试内容包括: +/// - 异步命令无返回值版本的基础实现 +/// - 异步命令有返回值版本的基础实现 +/// - ExecuteAsync方法调用 +/// - ExecuteAsync方法的异常处理 +/// - 上下文感知功能(SetContext, GetContext) +/// - 日志功能(Logger属性) +/// - 子类继承行为验证(两个版本) +/// - 命令执行前日志记录 +/// - 命令执行后日志记录 +/// - 错误情况下的日志记录 +/// - 无返回值版本的行为 +/// - 有返回值版本的行为 /// [TestFixture] public class AbstractAsyncCommandTests @@ -45,7 +45,7 @@ public class AbstractAsyncCommandTests private IocContainer _container = null!; /// - /// 测试异步命令无返回值版本的基础实现 + /// 测试异步命令无返回值版本的基础实现 /// [Test] public async Task AbstractAsyncCommand_Should_Implement_IAsyncCommand_Interface() @@ -57,7 +57,7 @@ public class AbstractAsyncCommandTests } /// - /// 测试异步命令有返回值版本的基础实现 + /// 测试异步命令有返回值版本的基础实现 /// [Test] public async Task AbstractAsyncCommand_WithResult_Should_Implement_IAsyncCommand_Interface() @@ -69,7 +69,7 @@ public class AbstractAsyncCommandTests } /// - /// 测试ExecuteAsync方法调用 + /// 测试ExecuteAsync方法调用 /// [Test] public async Task ExecuteAsync_Should_Invoke_OnExecuteAsync_Method() @@ -85,7 +85,7 @@ public class AbstractAsyncCommandTests } /// - /// 测试ExecuteAsync方法(带返回值)调用 + /// 测试ExecuteAsync方法(带返回值)调用 /// [Test] public async Task ExecuteAsync_WithResult_Should_Invoke_OnExecuteAsync_Method_And_Return_Result() @@ -101,7 +101,7 @@ public class AbstractAsyncCommandTests } /// - /// 测试ExecuteAsync方法的异常处理 + /// 测试ExecuteAsync方法的异常处理 /// [Test] public void ExecuteAsync_Should_Propagate_Exception_From_OnExecuteAsync() @@ -114,7 +114,7 @@ public class AbstractAsyncCommandTests } /// - /// 测试上下文感知功能 - SetContext方法 + /// 测试上下文感知功能 - SetContext方法 /// [Test] public void SetContext_Should_Set_Context_Property() @@ -130,7 +130,7 @@ public class AbstractAsyncCommandTests } /// - /// 测试上下文感知功能 - GetContext方法 + /// 测试上下文感知功能 - GetContext方法 /// [Test] public void GetContext_Should_Return_Context_Property() @@ -147,7 +147,7 @@ public class AbstractAsyncCommandTests } /// - /// 测试子类继承行为验证 - 无返回值版本 + /// 测试子类继承行为验证 - 无返回值版本 /// [Test] public async Task Child_Class_Should_Inherit_And_Override_OnExecuteAsync_Method() @@ -163,7 +163,7 @@ public class AbstractAsyncCommandTests } /// - /// 测试子类继承行为验证 - 有返回值版本 + /// 测试子类继承行为验证 - 有返回值版本 /// [Test] public async Task Child_Class_WithResult_Should_Inherit_And_Override_OnExecuteAsync_Method() @@ -179,7 +179,7 @@ public class AbstractAsyncCommandTests } /// - /// 测试异步命令执行生命周期完整性 + /// 测试异步命令执行生命周期完整性 /// [Test] public async Task AsyncCommand_Should_Complete_Execution_Lifecycle() @@ -197,7 +197,7 @@ public class AbstractAsyncCommandTests } /// - /// 测试异步命令多次执行 + /// 测试异步命令多次执行 /// [Test] public async Task AsyncCommand_Should_Be_Executable_Multiple_Times() @@ -214,7 +214,7 @@ public class AbstractAsyncCommandTests } /// - /// 测试异步命令(带返回值)的返回值类型 + /// 测试异步命令(带返回值)的返回值类型 /// [Test] public async Task AsyncCommand_WithResult_Should_Return_Correct_Type() @@ -231,23 +231,23 @@ public class AbstractAsyncCommandTests } /// -/// 测试用命令输入类V2 +/// 测试用命令输入类V2 /// public sealed class TestCommandInputV2 : ICommandInput { /// - /// 获取或设置值 + /// 获取或设置值 /// public int Value { get; init; } } /// -/// 测试用异步命令类V3(无返回值) +/// 测试用异步命令类V3(无返回值) /// public sealed class TestAsyncCommandV3 : AbstractAsyncCommand { /// - /// 构造函数 + /// 构造函数 /// /// 命令输入 public TestAsyncCommandV3(TestCommandInputV2 input) : base(input) @@ -255,17 +255,17 @@ public sealed class TestAsyncCommandV3 : AbstractAsyncCommand - /// 获取命令是否已执行 + /// 获取命令是否已执行 /// public bool Executed { get; private set; } /// - /// 获取执行的值 + /// 获取执行的值 /// public int ExecutedValue { get; private set; } /// - /// 执行异步命令的重写方法 + /// 执行异步命令的重写方法 /// /// 命令输入 /// 表示异步操作的任务 @@ -278,12 +278,12 @@ public sealed class TestAsyncCommandV3 : AbstractAsyncCommand -/// 测试用异步命令类V3(有返回值) +/// 测试用异步命令类V3(有返回值) /// public sealed class TestAsyncCommandWithResultV3 : AbstractAsyncCommand { /// - /// 构造函数 + /// 构造函数 /// /// 命令输入 public TestAsyncCommandWithResultV3(TestCommandInputV2 input) : base(input) @@ -291,12 +291,12 @@ public sealed class TestAsyncCommandWithResultV3 : AbstractAsyncCommand - /// 获取命令是否已执行 + /// 获取命令是否已执行 /// public bool Executed { get; private set; } /// - /// 执行异步命令并返回结果的重写方法 + /// 执行异步命令并返回结果的重写方法 /// /// 命令输入 /// 执行结果的异步任务 @@ -308,12 +308,12 @@ public sealed class TestAsyncCommandWithResultV3 : AbstractAsyncCommand -/// 测试用异步命令类(抛出异常) +/// 测试用异步命令类(抛出异常) /// public sealed class TestAsyncCommandWithExceptionV3 : AbstractAsyncCommand { /// - /// 构造函数 + /// 构造函数 /// /// 命令输入 public TestAsyncCommandWithExceptionV3(TestCommandInputV2 input) : base(input) @@ -321,7 +321,7 @@ public sealed class TestAsyncCommandWithExceptionV3 : AbstractAsyncCommand - /// 执行异步命令并抛出异常的重写方法 + /// 执行异步命令并抛出异常的重写方法 /// /// 命令输入 /// 表示异步操作的任务 @@ -333,12 +333,12 @@ public sealed class TestAsyncCommandWithExceptionV3 : AbstractAsyncCommand -/// 测试用异步命令子类(无返回值) +/// 测试用异步命令子类(无返回值) /// public sealed class TestAsyncCommandChildV3 : AbstractAsyncCommand { /// - /// 构造函数 + /// 构造函数 /// /// 命令输入 public TestAsyncCommandChildV3(TestCommandInputV2 input) : base(input) @@ -346,17 +346,17 @@ public sealed class TestAsyncCommandChildV3 : AbstractAsyncCommand - /// 获取命令是否已执行 + /// 获取命令是否已执行 /// public bool Executed { get; private set; } /// - /// 获取执行的值 + /// 获取执行的值 /// public int ExecutedValue { get; private set; } /// - /// 执行异步命令的重写方法(子类实现) + /// 执行异步命令的重写方法(子类实现) /// /// 命令输入 /// 表示异步操作的任务 @@ -369,12 +369,12 @@ public sealed class TestAsyncCommandChildV3 : AbstractAsyncCommand -/// 测试用异步命令子类(有返回值) +/// 测试用异步命令子类(有返回值) /// public sealed class TestAsyncCommandWithResultChildV3 : AbstractAsyncCommand { /// - /// 构造函数 + /// 构造函数 /// /// 命令输入 public TestAsyncCommandWithResultChildV3(TestCommandInputV2 input) : base(input) @@ -382,12 +382,12 @@ public sealed class TestAsyncCommandWithResultChildV3 : AbstractAsyncCommand - /// 获取命令是否已执行 + /// 获取命令是否已执行 /// public bool Executed { get; private set; } /// - /// 执行异步命令并返回结果的重写方法(子类实现) + /// 执行异步命令并返回结果的重写方法(子类实现) /// /// 命令输入 /// 执行结果的异步任务 diff --git a/GFramework.Core.Tests/command/CommandBusTests.cs b/GFramework.Core.Tests/command/CommandBusTests.cs index 07a6f48..2b0f032 100644 --- a/GFramework.Core.Tests/command/CommandBusTests.cs +++ b/GFramework.Core.Tests/command/CommandBusTests.cs @@ -5,16 +5,16 @@ using NUnit.Framework; namespace GFramework.Core.Tests.command; /// -/// 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异步命令 /// [TestFixture] public class CommandBusTests @@ -28,7 +28,7 @@ public class CommandBusTests private CommandBus _commandBus = null!; /// - /// 测试Send方法执行命令 + /// 测试Send方法执行命令 /// [Test] public void Send_Should_Execute_Command() @@ -42,7 +42,7 @@ public class CommandBusTests } /// - /// 测试Send方法处理null命令时抛出ArgumentNullException异常 + /// 测试Send方法处理null命令时抛出ArgumentNullException异常 /// [Test] public void Send_WithNullCommand_Should_ThrowArgumentNullException() @@ -51,7 +51,7 @@ public class CommandBusTests } /// - /// 测试Send方法(带返回值)正确返回值 + /// 测试Send方法(带返回值)正确返回值 /// [Test] public void Send_WithResult_Should_Return_Value() @@ -66,7 +66,7 @@ public class CommandBusTests } /// - /// 测试Send方法(带返回值)处理null命令时抛出ArgumentNullException异常 + /// 测试Send方法(带返回值)处理null命令时抛出ArgumentNullException异常 /// [Test] public void Send_WithResult_AndNullCommand_Should_ThrowArgumentNullException() @@ -75,7 +75,7 @@ public class CommandBusTests } /// - /// 测试SendAsync方法执行异步命令 + /// 测试SendAsync方法执行异步命令 /// [Test] public async Task SendAsync_Should_Execute_AsyncCommand() @@ -90,7 +90,7 @@ public class CommandBusTests } /// - /// 测试SendAsync方法处理null异步命令时抛出ArgumentNullException异常 + /// 测试SendAsync方法处理null异步命令时抛出ArgumentNullException异常 /// [Test] public void SendAsync_WithNullCommand_Should_ThrowArgumentNullException() @@ -99,7 +99,7 @@ public class CommandBusTests } /// - /// 测试SendAsync方法(带返回值)正确返回值 + /// 测试SendAsync方法(带返回值)正确返回值 /// [Test] public async Task SendAsync_WithResult_Should_Return_Value() @@ -114,7 +114,7 @@ public class CommandBusTests } /// - /// 测试SendAsync方法(带返回值)处理null异步命令时抛出ArgumentNullException异常 + /// 测试SendAsync方法(带返回值)处理null异步命令时抛出ArgumentNullException异常 /// [Test] public void SendAsync_WithResult_AndNullCommand_Should_ThrowArgumentNullException() @@ -124,23 +124,23 @@ public class CommandBusTests } /// -/// 测试用命令输入类,实现ICommandInput接口 +/// 测试用命令输入类,实现ICommandInput接口 /// public sealed class TestCommandInput : ICommandInput { /// - /// 获取或设置值 + /// 获取或设置值 /// public int Value { get; init; } } /// -/// 测试用命令类,继承AbstractCommand +/// 测试用命令类,继承AbstractCommand /// public sealed class TestCommand : AbstractCommand { /// - /// 构造函数 + /// 构造函数 /// /// 命令输入 public TestCommand(TestCommandInput input) : base(input) @@ -148,17 +148,17 @@ public sealed class TestCommand : AbstractCommand } /// - /// 获取命令是否已执行 + /// 获取命令是否已执行 /// public bool Executed { get; private set; } /// - /// 获取执行的值 + /// 获取执行的值 /// public int ExecutedValue { get; private set; } /// - /// 执行命令的重写方法 + /// 执行命令的重写方法 /// /// 命令输入 protected override void OnExecute(TestCommandInput input) @@ -169,12 +169,12 @@ public sealed class TestCommand : AbstractCommand } /// -/// 测试用带返回值的命令类,继承AbstractCommand +/// 测试用带返回值的命令类,继承AbstractCommand /// public sealed class TestCommandWithResult : AbstractCommand { /// - /// 构造函数 + /// 构造函数 /// /// 命令输入 public TestCommandWithResult(TestCommandInput input) : base(input) @@ -182,12 +182,12 @@ public sealed class TestCommandWithResult : AbstractCommand - /// 获取命令是否已执行 + /// 获取命令是否已执行 /// public bool Executed { get; private set; } /// - /// 执行命令并返回结果的重写方法 + /// 执行命令并返回结果的重写方法 /// /// 命令输入 /// 执行结果 @@ -199,12 +199,12 @@ public sealed class TestCommandWithResult : AbstractCommand -/// 测试用异步命令类,继承AbstractAsyncCommand +/// 测试用异步命令类,继承AbstractAsyncCommand /// public sealed class TestAsyncCommand : AbstractAsyncCommand { /// - /// 构造函数 + /// 构造函数 /// /// 命令输入 public TestAsyncCommand(TestCommandInput input) : base(input) @@ -212,17 +212,17 @@ public sealed class TestAsyncCommand : AbstractAsyncCommand } /// - /// 获取命令是否已执行 + /// 获取命令是否已执行 /// public bool Executed { get; private set; } /// - /// 获取执行的值 + /// 获取执行的值 /// public int ExecutedValue { get; private set; } /// - /// 执行异步命令的重写方法 + /// 执行异步命令的重写方法 /// /// 命令输入 /// 表示异步操作的任务 @@ -235,12 +235,12 @@ public sealed class TestAsyncCommand : AbstractAsyncCommand } /// -/// 测试用带返回值的异步命令类,继承AbstractAsyncCommand +/// 测试用带返回值的异步命令类,继承AbstractAsyncCommand /// public sealed class TestAsyncCommandWithResult : AbstractAsyncCommand { /// - /// 构造函数 + /// 构造函数 /// /// 命令输入 public TestAsyncCommandWithResult(TestCommandInput input) : base(input) @@ -248,12 +248,12 @@ public sealed class TestAsyncCommandWithResult : AbstractAsyncCommand - /// 获取命令是否已执行 + /// 获取命令是否已执行 /// public bool Executed { get; private set; } /// - /// 执行异步命令并返回结果的重写方法 + /// 执行异步命令并返回结果的重写方法 /// /// 命令输入 /// 执行结果的异步任务 diff --git a/GFramework.Core.Tests/constants/GFrameworkConstantsTests.cs b/GFramework.Core.Tests/constants/GFrameworkConstantsTests.cs index 99f2894..185ae71 100644 --- a/GFramework.Core.Tests/constants/GFrameworkConstantsTests.cs +++ b/GFramework.Core.Tests/constants/GFrameworkConstantsTests.cs @@ -4,19 +4,19 @@ using NUnit.Framework; namespace GFramework.Core.Tests.constants; /// -/// GFrameworkConstants类的单元测试 -/// 测试内容包括: -/// - 版本号常量格式正确性 -/// - 其他框架常量 -/// - 常量值正确性 -/// - 常量类型验证 -/// - 常量可访问性 +/// GFrameworkConstants类的单元测试 +/// 测试内容包括: +/// - 版本号常量格式正确性 +/// - 其他框架常量 +/// - 常量值正确性 +/// - 常量类型验证 +/// - 常量可访问性 /// [TestFixture] public class GFrameworkConstantsTests { /// - /// 测试FrameworkName常量的值正确性 + /// 测试FrameworkName常量的值正确性 /// [Test] public void FrameworkName_Should_Have_Correct_Value() @@ -25,7 +25,7 @@ public class GFrameworkConstantsTests } /// - /// 测试FrameworkName常量的类型 + /// 测试FrameworkName常量的类型 /// [Test] public void FrameworkName_Should_Be_String_Type() @@ -34,7 +34,7 @@ public class GFrameworkConstantsTests } /// - /// 测试FrameworkName常量不为空 + /// 测试FrameworkName常量不为空 /// [Test] public void FrameworkName_Should_Not_Be_Null_Or_Empty() @@ -44,7 +44,7 @@ public class GFrameworkConstantsTests } /// - /// 测试FrameworkName常量是公共可访问的 + /// 测试FrameworkName常量是公共可访问的 /// [Test] public void FrameworkName_Should_Be_Publicly_Accessible() @@ -58,7 +58,7 @@ public class GFrameworkConstantsTests } /// - /// 测试FrameworkName常量是只读的(const) + /// 测试FrameworkName常量是只读的(const) /// [Test] public void FrameworkName_Should_Be_Constant() diff --git a/GFramework.Core.Tests/coroutine/AsyncOperationTests.cs b/GFramework.Core.Tests/coroutine/AsyncOperationTests.cs index fb41180..15c6f94 100644 --- a/GFramework.Core.Tests/coroutine/AsyncOperationTests.cs +++ b/GFramework.Core.Tests/coroutine/AsyncOperationTests.cs @@ -5,20 +5,20 @@ using NUnit.Framework; namespace GFramework.Core.Tests.coroutine; /// -/// AsyncOperation的单元测试类 -/// 测试内容包括: -/// - 初始化状态 -/// - 完成和状态检查 -/// - 异常处理 -/// - 延续操作 -/// - GetAwaiter -/// - IsCompleted属性 +/// AsyncOperation的单元测试类 +/// 测试内容包括: +/// - 初始化状态 +/// - 完成和状态检查 +/// - 异常处理 +/// - 延续操作 +/// - GetAwaiter +/// - IsCompleted属性 /// [TestFixture] public class AsyncOperationTests { /// - /// 验证AsyncOperation初始状态为未完成 + /// 验证AsyncOperation初始状态为未完成 /// [Test] public void AsyncOperation_Should_Not_Be_Done_Initially() @@ -29,7 +29,7 @@ public class AsyncOperationTests } /// - /// 验证AsyncOperation初始状态IsCompleted为false + /// 验证AsyncOperation初始状态IsCompleted为false /// [Test] public void AsyncOperation_Should_Not_Be_Completed_Initially() @@ -40,7 +40,7 @@ public class AsyncOperationTests } /// - /// 验证SetCompleted后IsDone应该为true + /// 验证SetCompleted后IsDone应该为true /// [Test] public void SetCompleted_Should_Set_IsDone_To_True() @@ -53,7 +53,7 @@ public class AsyncOperationTests } /// - /// 验证SetCompleted后IsCompleted应该为true + /// 验证SetCompleted后IsCompleted应该为true /// [Test] public void SetCompleted_Should_Set_IsCompleted_To_True() @@ -66,7 +66,7 @@ public class AsyncOperationTests } /// - /// 验证SetCompleted只能被调用一次 + /// 验证SetCompleted只能被调用一次 /// [Test] public void SetCompleted_Should_Be_Idempotent() @@ -81,7 +81,7 @@ public class AsyncOperationTests } /// - /// 验证SetException后IsDone应该为true + /// 验证SetException后IsDone应该为true /// [Test] public void SetException_Should_Set_IsDone_To_True() @@ -94,7 +94,7 @@ public class AsyncOperationTests } /// - /// 验证SetException后Task应该包含异常 + /// 验证SetException后Task应该包含异常 /// [Test] public void SetException_Should_Set_Exception_On_Task() @@ -108,7 +108,7 @@ public class AsyncOperationTests } /// - /// 验证OnCompleted应该在已完成时立即执行延续 + /// 验证OnCompleted应该在已完成时立即执行延续 /// [Test] public void OnCompleted_Should_Execute_Immediately_When_Already_Completed() @@ -123,7 +123,7 @@ public class AsyncOperationTests } /// - /// 验证OnCompleted应该在未完成时不立即执行延续 + /// 验证OnCompleted应该在未完成时不立即执行延续 /// [Test] public void OnCompleted_Should_Not_Execute_Immediately_When_Not_Completed() @@ -137,7 +137,7 @@ public class AsyncOperationTests } /// - /// 验证延续应该在SetCompleted后被调用 + /// 验证延续应该在SetCompleted后被调用 /// [Test] public void Continuation_Should_Be_Called_After_SetCompleted() @@ -152,7 +152,7 @@ public class AsyncOperationTests } /// - /// 验证多个延续应该都能被调用 + /// 验证多个延续应该都能被调用 /// [Test] public void Multiple_Continuations_Should_All_Be_Called() @@ -169,7 +169,7 @@ public class AsyncOperationTests } /// - /// 验证延续应该在SetException后被调用 + /// 验证延续应该在SetException后被调用 /// [Test] public void Continuation_Should_Be_Called_After_SetException() @@ -184,7 +184,7 @@ public class AsyncOperationTests } /// - /// 验证SetCompleted后设置的延续也应该被调用 + /// 验证SetCompleted后设置的延续也应该被调用 /// [Test] public void Continuation_Registered_After_Completed_Should_Be_Called() @@ -202,7 +202,7 @@ public class AsyncOperationTests } /// - /// 验证GetAwaiter应该返回自身 + /// 验证GetAwaiter应该返回自身 /// [Test] public void GetAwaiter_Should_Return_Self() @@ -215,7 +215,7 @@ public class AsyncOperationTests } /// - /// 验证Update方法不应该改变状态 + /// 验证Update方法不应该改变状态 /// [Test] public void Update_Should_Not_Change_State() @@ -228,7 +228,7 @@ public class AsyncOperationTests } /// - /// 验证AsyncOperation实现IYieldInstruction接口 + /// 验证AsyncOperation实现IYieldInstruction接口 /// [Test] public void AsyncOperation_Should_Implement_IYieldInstruction() @@ -239,7 +239,7 @@ public class AsyncOperationTests } /// - /// 验证Task属性应该返回有效的Task + /// 验证Task属性应该返回有效的Task /// [Test] public void Task_Property_Should_Return_Valid_Task() @@ -250,7 +250,7 @@ public class AsyncOperationTests } /// - /// 验证SetCompleted后Task应该完成 + /// 验证SetCompleted后Task应该完成 /// [Test] public async Task Task_Should_Complete_After_SetCompleted() @@ -265,7 +265,7 @@ public class AsyncOperationTests } /// - /// 验证SetException后Task应该失败 + /// 验证SetException后Task应该失败 /// [Test] public void Task_Should_Fault_After_SetException() @@ -278,7 +278,7 @@ public class AsyncOperationTests } /// - /// 验证SetCompleted只能设置一次 + /// 验证SetCompleted只能设置一次 /// [Test] public void SetCompleted_Should_Only_Set_Once() @@ -298,7 +298,7 @@ public class AsyncOperationTests } /// - /// 验证SetException只能在未完成时设置 + /// 验证SetException只能在未完成时设置 /// [Test] public void SetException_Should_Not_Work_After_SetCompleted() @@ -313,7 +313,7 @@ public class AsyncOperationTests } /// - /// 验证SetCompleted不能在SetException后设置 + /// 验证SetCompleted不能在SetException后设置 /// [Test] public void SetCompleted_Should_Not_Work_After_SetException() @@ -328,7 +328,7 @@ public class AsyncOperationTests } /// - /// 验证延续抛出的异常应该被捕获 + /// 验证延续抛出的异常应该被捕获 /// [Test] public void Continuation_Exception_Should_Be_Caught() @@ -339,4 +339,4 @@ public class AsyncOperationTests Assert.DoesNotThrow(() => op.SetCompleted()); } -} +} \ No newline at end of file diff --git a/GFramework.Core.Tests/coroutine/CoroutineExtensionsTests.cs b/GFramework.Core.Tests/coroutine/CoroutineExtensionsTests.cs index 2d1f3e4..37f0895 100644 --- a/GFramework.Core.Tests/coroutine/CoroutineExtensionsTests.cs +++ b/GFramework.Core.Tests/coroutine/CoroutineExtensionsTests.cs @@ -7,19 +7,19 @@ using NUnit.Framework; namespace GFramework.Core.Tests.coroutine; /// -/// 协程扩展方法的单元测试类 -/// 测试内容包括: -/// - RepeatEvery方法 -/// - ExecuteAfter方法 -/// - Sequence方法 -/// - ParallelCoroutines方法 -/// - WaitForSecondsWithProgress方法 +/// 协程扩展方法的单元测试类 +/// 测试内容包括: +/// - RepeatEvery方法 +/// - ExecuteAfter方法 +/// - Sequence方法 +/// - ParallelCoroutines方法 +/// - WaitForSecondsWithProgress方法 /// [TestFixture] public class CoroutineExtensionsTests { /// - /// 验证RepeatEvery应该返回有效的协程 + /// 验证RepeatEvery应该返回有效的协程 /// [Test] public void RepeatEvery_Should_Return_Valid_Coroutine() @@ -31,7 +31,7 @@ public class CoroutineExtensionsTests } /// - /// 验证RepeatEvery应该执行指定次数 + /// 验证RepeatEvery应该执行指定次数 /// [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)); } /// - /// 验证RepeatEvery应该无限执行当count为null + /// 验证RepeatEvery应该无限执行当count为null /// [Test] public void RepeatEvery_Should_Execute_Forever_When_Count_Is_Null() @@ -67,7 +64,7 @@ public class CoroutineExtensionsTests } /// - /// 验证RepeatEvery应该处理负数count + /// 验证RepeatEvery应该处理负数count /// [Test] public void RepeatEvery_Should_Handle_Negative_Count() @@ -80,7 +77,7 @@ public class CoroutineExtensionsTests } /// - /// 验证RepeatEvery应该处理零count + /// 验证RepeatEvery应该处理零count /// [Test] public void RepeatEvery_Should_Handle_Zero_Count() @@ -93,24 +90,21 @@ public class CoroutineExtensionsTests } /// - /// 验证RepeatEvery应该处理null action + /// 验证RepeatEvery应该处理null action /// [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); }); } /// - /// 验证ExecuteAfter应该返回有效的协程 + /// 验证ExecuteAfter应该返回有效的协程 /// [Test] public void ExecuteAfter_Should_Return_Valid_Coroutine() @@ -122,7 +116,7 @@ public class CoroutineExtensionsTests } /// - /// 验证ExecuteAfter应该在延迟后执行action + /// 验证ExecuteAfter应该在延迟后执行action /// [Test] public void ExecuteAfter_Should_Execute_Action_After_Delay() @@ -144,7 +138,7 @@ public class CoroutineExtensionsTests } /// - /// 验证ExecuteAfter应该处理零延迟 + /// 验证ExecuteAfter应该处理零延迟 /// [Test] public void ExecuteAfter_Should_Handle_Zero_Delay() @@ -159,7 +153,7 @@ public class CoroutineExtensionsTests } /// - /// 验证ExecuteAfter应该处理负数延迟 + /// 验证ExecuteAfter应该处理负数延迟 /// [Test] public void ExecuteAfter_Should_Handle_Negative_Delay() @@ -172,14 +166,14 @@ public class CoroutineExtensionsTests } /// - /// 验证ExecuteAfter应该处理null action + /// 验证ExecuteAfter应该处理null action /// [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 } /// - /// 验证Sequence应该返回有效的协程 + /// 验证Sequence应该返回有效的协程 /// [Test] public void Sequence_Should_Return_Valid_Coroutine() @@ -200,7 +194,7 @@ public class CoroutineExtensionsTests } /// - /// 验证Sequence应该按顺序执行多个协程 + /// 验证Sequence应该按顺序执行多个协程 /// [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 { 1, 2, 3 })); } /// - /// 验证Sequence应该处理空协程数组 + /// 验证Sequence应该处理空协程数组 /// [Test] public void Sequence_Should_Handle_Empty_Coroutines() @@ -232,7 +223,7 @@ public class CoroutineExtensionsTests } /// - /// 验证Sequence应该处理单个协程 + /// 验证Sequence应该处理单个协程 /// [Test] public void Sequence_Should_Handle_Single_Coroutine() @@ -244,7 +235,7 @@ public class CoroutineExtensionsTests } /// - /// 验证Sequence应该处理null协程 + /// 验证Sequence应该处理null协程 /// [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(() => + Assert.Throws(() => { - while (sequence.MoveNext()) - { - sequence.Current.Update(0.1); - } + while (sequence.MoveNext()) sequence.Current.Update(0.1); }); } /// - /// 验证ParallelCoroutines应该返回有效的协程 + /// 验证ParallelCoroutines应该返回有效的协程 /// [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 } /// - /// 验证ParallelCoroutines应该并行执行多个协程 + /// 验证ParallelCoroutines应该并行执行多个协程 /// [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 { { 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 } /// - /// 验证ParallelCoroutines应该处理空数组 + /// 验证ParallelCoroutines应该处理空数组 /// [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 } /// - /// 验证ParallelCoroutines应该处理null数组 + /// 验证ParallelCoroutines应该处理null数组 /// [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 } /// - /// 验证WaitForSecondsWithProgress应该返回有效的协程 + /// 验证WaitForSecondsWithProgress应该返回有效的协程 /// [Test] public void WaitForSecondsWithProgress_Should_Return_Valid_Coroutine() @@ -348,7 +333,7 @@ public class CoroutineExtensionsTests } /// - /// 验证WaitForSecondsWithProgress应该在指定时间后完成 + /// 验证WaitForSecondsWithProgress应该在指定时间后完成 /// [Test] public void WaitForSecondsWithProgress_Should_Complete_After_Duration() @@ -364,7 +349,7 @@ public class CoroutineExtensionsTests } /// - /// 验证WaitForSecondsWithProgress应该调用进度回调 + /// 验证WaitForSecondsWithProgress应该调用进度回调 /// [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 } /// - /// 验证WaitForSecondsWithProgress应该处理零时间 + /// 验证WaitForSecondsWithProgress应该处理零时间 /// [Test] public void WaitForSecondsWithProgress_Should_Handle_Zero_Duration() @@ -398,7 +380,7 @@ public class CoroutineExtensionsTests } /// - /// 验证WaitForSecondsWithProgress应该处理负数时间 + /// 验证WaitForSecondsWithProgress应该处理负数时间 /// [Test] public void WaitForSecondsWithProgress_Should_Handle_Negative_Duration() @@ -411,7 +393,7 @@ public class CoroutineExtensionsTests } /// - /// 验证WaitForSecondsWithProgress应该处理null回调 + /// 验证WaitForSecondsWithProgress应该处理null回调 /// [Test] public void WaitForSecondsWithProgress_Should_Handle_Null_Callback() @@ -427,7 +409,7 @@ public class CoroutineExtensionsTests } /// - /// 验证RepeatEvery应该使用Delay指令 + /// 验证RepeatEvery应该使用Delay指令 /// [Test] public void RepeatEvery_Should_Use_Delay_Instruction() @@ -439,7 +421,7 @@ public class CoroutineExtensionsTests } /// - /// 验证ExecuteAfter应该使用Delay指令 + /// 验证ExecuteAfter应该使用Delay指令 /// [Test] public void ExecuteAfter_Should_Use_Delay_Instruction() @@ -451,7 +433,7 @@ public class CoroutineExtensionsTests } /// - /// 验证Sequence应该清理已完成的协程 + /// 验证Sequence应该清理已完成的协程 /// [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); } /// - /// 验证RepeatEvery的间隔时间 + /// 验证RepeatEvery的间隔时间 /// [Test] public void RepeatEvery_Should_Respect_Interval() @@ -489,7 +468,7 @@ public class CoroutineExtensionsTests } /// - /// 验证ExecuteAfter的延迟时间 + /// 验证ExecuteAfter的延迟时间 /// [Test] public void ExecuteAfter_Should_Respect_Delay() @@ -513,7 +492,7 @@ public class CoroutineExtensionsTests } /// - /// 创建简单的立即完成协程 + /// 创建简单的立即完成协程 /// private IEnumerator CreateSimpleCoroutine() { @@ -521,7 +500,7 @@ public class CoroutineExtensionsTests } /// - /// 创建带回调的协程 + /// 创建带回调的协程 /// private IEnumerator CreateCoroutineWithCallback(int id, Action callback) { @@ -530,7 +509,7 @@ public class CoroutineExtensionsTests } /// - /// 创建计数协程 + /// 创建计数协程 /// private IEnumerator CreateCountingCoroutine(int id, Action callback) { @@ -539,7 +518,7 @@ public class CoroutineExtensionsTests } /// - /// 创建延迟协程 + /// 创建延迟协程 /// private IEnumerator CreateDelayedCoroutine(Action callback, double delay) { @@ -548,7 +527,7 @@ public class CoroutineExtensionsTests } /// - /// 测试用时间源类 + /// 测试用时间源类 /// private class TestTimeSource : ITimeSource { @@ -561,4 +540,4 @@ public class CoroutineExtensionsTests CurrentTime += DeltaTime; } } -} +} \ No newline at end of file diff --git a/GFramework.Core.Tests/coroutine/CoroutineHandleTests.cs b/GFramework.Core.Tests/coroutine/CoroutineHandleTests.cs index 2b51a49..c9ca14c 100644 --- a/GFramework.Core.Tests/coroutine/CoroutineHandleTests.cs +++ b/GFramework.Core.Tests/coroutine/CoroutineHandleTests.cs @@ -4,19 +4,19 @@ using NUnit.Framework; namespace GFramework.Core.Tests.coroutine; /// -/// 协程句柄的单元测试类 -/// 测试内容包括: -/// - 协程句柄创建和有效性验证 -/// - 相等性比较 -/// - 哈希码生成 -/// - 操作符重载 -/// - 多实例独立性 +/// 协程句柄的单元测试类 +/// 测试内容包括: +/// - 协程句柄创建和有效性验证 +/// - 相等性比较 +/// - 哈希码生成 +/// - 操作符重载 +/// - 多实例独立性 /// [TestFixture] public class CoroutineHandleTests { /// - /// 验证协程句柄创建时应有有效的Key + /// 验证协程句柄创建时应有有效的Key /// [Test] public void CoroutineHandle_Should_Have_Valid_Key_When_Created() @@ -28,7 +28,7 @@ public class CoroutineHandleTests } /// - /// 验证默认协程句柄应该无效 + /// 验证默认协程句柄应该无效 /// [Test] public void Default_CoroutineHandle_Should_Be_Invalid() @@ -40,7 +40,7 @@ public class CoroutineHandleTests } /// - /// 验证相同实例ID创建的句柄应该具有不同的Key + /// 验证相同实例ID创建的句柄应该具有不同的Key /// [Test] public void CoroutineHandles_With_Same_InstanceId_Should_Have_Different_Keys() @@ -52,7 +52,7 @@ public class CoroutineHandleTests } /// - /// 验证不同实例ID创建的句柄应该不同 + /// 验证不同实例ID创建的句柄应该不同 /// [Test] public void CoroutineHandles_With_Different_InstanceIds_Should_Be_Different() @@ -64,7 +64,7 @@ public class CoroutineHandleTests } /// - /// 验证协程句柄的相等性比较 + /// 验证协程句柄的相等性比较 /// [Test] public void Equals_Should_Return_True_For_Identical_Handles() @@ -76,7 +76,7 @@ public class CoroutineHandleTests } /// - /// 验证协程句柄的不相等性比较 + /// 验证协程句柄的不相等性比较 /// [Test] public void Equals_Should_Return_False_For_Different_Handles() @@ -93,7 +93,7 @@ public class CoroutineHandleTests /// - /// 验证Equals方法与null对象的比较 + /// 验证Equals方法与null对象的比较 /// [Test] public void Equals_Should_Return_False_When_Comparing_To_Null() @@ -104,7 +104,7 @@ public class CoroutineHandleTests } /// - /// 验证Equals方法与其他类型对象的比较 + /// 验证Equals方法与其他类型对象的比较 /// [Test] public void Equals_Should_Return_False_When_Comparing_To_Other_Type() @@ -115,7 +115,7 @@ public class CoroutineHandleTests } /// - /// 验证哈希码的一致性 + /// 验证哈希码的一致性 /// [Test] public void GetHashCode_Should_Be_Consistent() @@ -128,7 +128,7 @@ public class CoroutineHandleTests } /// - /// 验证不同句柄应该有不同的哈希码 + /// 验证不同句柄应该有不同的哈希码 /// [Test] public void GetHashCode_Should_Be_Different_For_Different_Handles() @@ -140,7 +140,7 @@ public class CoroutineHandleTests } /// - /// 验证相等操作符的正确性 + /// 验证相等操作符的正确性 /// [Test] public void EqualityOperator_Should_Work_Correctly() @@ -154,7 +154,7 @@ public class CoroutineHandleTests } /// - /// 验证不等操作符的正确性 + /// 验证不等操作符的正确性 /// [Test] public void InequalityOperator_Should_Work_Correctly() @@ -168,7 +168,7 @@ public class CoroutineHandleTests } /// - /// 验证协程句柄实现了IEquatable接口 + /// 验证协程句柄实现了IEquatable接口 /// [Test] public void CoroutineHandle_Should_Implement_IEquatable_Interface() @@ -179,7 +179,7 @@ public class CoroutineHandleTests } /// - /// 验证协程句柄是只读结构体 + /// 验证协程句柄是只读结构体 /// [Test] public void CoroutineHandle_Should_Be_Immutable_Struct() @@ -189,7 +189,7 @@ public class CoroutineHandleTests } /// - /// 验证实例ID超过预留空间时的处理 + /// 验证实例ID超过预留空间时的处理 /// [Test] public void CoroutineHandle_Should_Handle_Large_InstanceId() @@ -201,25 +201,19 @@ public class CoroutineHandleTests } /// - /// 验证多个连续创建的句柄Key递增 + /// 验证多个连续创建的句柄Key递增 /// [Test] public void Multiple_Creates_Should_Increment_Keys() { var handles = new List(); - 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); } /// - /// 验证协程句柄的内部ID属性可以通过Key访问 + /// 验证协程句柄的内部ID属性可以通过Key访问 /// [Test] public void CoroutineHandle_Key_Should_Return_Low_4_Bits_Of_Id() diff --git a/GFramework.Core.Tests/coroutine/CoroutineHelperTests.cs b/GFramework.Core.Tests/coroutine/CoroutineHelperTests.cs index 965df34..0f80f79 100644 --- a/GFramework.Core.Tests/coroutine/CoroutineHelperTests.cs +++ b/GFramework.Core.Tests/coroutine/CoroutineHelperTests.cs @@ -6,22 +6,22 @@ using NUnit.Framework; namespace GFramework.Core.Tests.coroutine; /// -/// 协程辅助方法的单元测试类 -/// 测试内容包括: -/// - WaitForSeconds方法 -/// - WaitForOneFrame方法 -/// - WaitForFrames方法 -/// - WaitUntil方法 -/// - WaitWhile方法 -/// - DelayedCall方法 -/// - RepeatCall方法 -/// - RepeatCallForever方法 +/// 协程辅助方法的单元测试类 +/// 测试内容包括: +/// - WaitForSeconds方法 +/// - WaitForOneFrame方法 +/// - WaitForFrames方法 +/// - WaitUntil方法 +/// - WaitWhile方法 +/// - DelayedCall方法 +/// - RepeatCall方法 +/// - RepeatCallForever方法 /// [TestFixture] public class CoroutineHelperTests { /// - /// 验证WaitForSeconds应该返回Delay实例 + /// 验证WaitForSeconds应该返回Delay实例 /// [Test] public void WaitForSeconds_Should_Return_Delay_Instance() @@ -32,7 +32,7 @@ public class CoroutineHelperTests } /// - /// 验证WaitForSeconds可以处理正数秒数 + /// 验证WaitForSeconds可以处理正数秒数 /// [Test] public void WaitForSeconds_Should_Handle_Positive_Seconds() @@ -44,7 +44,7 @@ public class CoroutineHelperTests } /// - /// 验证WaitForSeconds可以处理零秒数 + /// 验证WaitForSeconds可以处理零秒数 /// [Test] public void WaitForSeconds_Should_Handle_Zero_Seconds() @@ -55,7 +55,7 @@ public class CoroutineHelperTests } /// - /// 验证WaitForOneFrame应该返回WaitOneFrame实例 + /// 验证WaitForOneFrame应该返回WaitOneFrame实例 /// [Test] public void WaitForOneFrame_Should_Return_WaitOneFrame_Instance() @@ -66,7 +66,7 @@ public class CoroutineHelperTests } /// - /// 验证WaitForFrames应该返回WaitForFrames实例 + /// 验证WaitForFrames应该返回WaitForFrames实例 /// [Test] public void WaitForFrames_Should_Return_WaitForFrames_Instance() @@ -77,7 +77,7 @@ public class CoroutineHelperTests } /// - /// 验证WaitForFrames可以处理正数帧数 + /// 验证WaitForFrames可以处理正数帧数 /// [Test] public void WaitForFrames_Should_Handle_Positive_Frames() @@ -89,7 +89,7 @@ public class CoroutineHelperTests } /// - /// 验证WaitForFrames可以处理最小帧数1 + /// 验证WaitForFrames可以处理最小帧数1 /// [Test] public void WaitForFrames_Should_Handle_Minimum_Frame_Count_Of_1() @@ -101,7 +101,7 @@ public class CoroutineHelperTests } /// - /// 验证WaitUntil应该返回WaitUntil实例 + /// 验证WaitUntil应该返回WaitUntil实例 /// [Test] public void WaitUntil_Should_Return_WaitUntil_Instance() @@ -113,7 +113,7 @@ public class CoroutineHelperTests } /// - /// 验证WaitUntil应该使用提供的谓词函数 + /// 验证WaitUntil应该使用提供的谓词函数 /// [Test] public void WaitUntil_Should_Use_Provided_Predicate() @@ -129,7 +129,7 @@ public class CoroutineHelperTests } /// - /// 验证WaitWhile应该返回WaitWhile实例 + /// 验证WaitWhile应该返回WaitWhile实例 /// [Test] public void WaitWhile_Should_Return_WaitWhile_Instance() @@ -141,7 +141,7 @@ public class CoroutineHelperTests } /// - /// 验证WaitWhile应该在条件为假时完成 + /// 验证WaitWhile应该在条件为假时完成 /// [Test] public void WaitWhile_Should_Complete_When_Condition_Is_False() @@ -157,7 +157,7 @@ public class CoroutineHelperTests } /// - /// 验证DelayedCall应该返回IEnumerator实例 + /// 验证DelayedCall应该返回IEnumerator实例 /// [Test] public void DelayedCall_Should_Return_IEnumerator() @@ -169,7 +169,7 @@ public class CoroutineHelperTests } /// - /// 验证DelayedCall的action可以在延迟后执行 + /// 验证DelayedCall的action可以在延迟后执行 /// [Test] public void DelayedCall_Should_Execute_Action_After_Delay() @@ -187,7 +187,7 @@ public class CoroutineHelperTests } /// - /// 验证DelayedCall可以处理null action + /// 验证DelayedCall可以处理null action /// [Test] public void DelayedCall_Should_Handle_Null_Action() @@ -199,7 +199,7 @@ public class CoroutineHelperTests } /// - /// 验证RepeatCall应该返回IEnumerator实例 + /// 验证RepeatCall应该返回IEnumerator实例 /// [Test] public void RepeatCall_Should_Return_IEnumerator() @@ -211,7 +211,7 @@ public class CoroutineHelperTests } /// - /// 验证RepeatCall应该执行指定次数 + /// 验证RepeatCall应该执行指定次数 /// [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)); } /// - /// 验证RepeatCall可以处理0次调用 + /// 验证RepeatCall可以处理0次调用 /// [Test] public void RepeatCall_Should_Handle_Zero_Count() @@ -241,7 +238,7 @@ public class CoroutineHelperTests } /// - /// 验证RepeatCallForever应该返回IEnumerator实例 + /// 验证RepeatCallForever应该返回IEnumerator实例 /// [Test] public void RepeatCallForever_Should_Return_IEnumerator() @@ -253,7 +250,7 @@ public class CoroutineHelperTests } /// - /// 验证RepeatCallForever应该无限执行 + /// 验证RepeatCallForever应该无限执行 /// [Test] public void RepeatCallForever_Should_Execute_Forever() @@ -273,7 +270,7 @@ public class CoroutineHelperTests } /// - /// 验证RepeatCallForever可以处理null action + /// 验证RepeatCallForever可以处理null action /// [Test] public void RepeatCallForever_Should_Handle_Null_Action() @@ -285,7 +282,7 @@ public class CoroutineHelperTests } /// - /// 验证RepeatCallForever可以处理负数间隔 + /// 验证RepeatCallForever可以处理负数间隔 /// [Test] public void RepeatCallForever_Should_Handle_Negative_Interval() @@ -298,7 +295,7 @@ public class CoroutineHelperTests } /// - /// 验证DelayedCall可以处理负数延迟 + /// 验证DelayedCall可以处理负数延迟 /// [Test] public void DelayedCall_Should_Handle_Negative_Delay() @@ -311,7 +308,7 @@ public class CoroutineHelperTests } /// - /// 验证RepeatCall可以处理负数间隔 + /// 验证RepeatCall可以处理负数间隔 /// [Test] public void RepeatCall_Should_Handle_Negative_Interval() @@ -324,7 +321,7 @@ public class CoroutineHelperTests } /// - /// 验证WaitUntil应该抛出ArgumentNullException当predicate为null + /// 验证WaitUntil应该抛出ArgumentNullException当predicate为null /// [Test] public void WaitUntil_Should_Throw_ArgumentNullException_When_Predicate_Is_Null() @@ -333,7 +330,7 @@ public class CoroutineHelperTests } /// - /// 验证WaitWhile应该抛出ArgumentNullException当predicate为null + /// 验证WaitWhile应该抛出ArgumentNullException当predicate为null /// [Test] public void WaitWhile_Should_Throw_ArgumentNullException_When_Predicate_Is_Null() diff --git a/GFramework.Core.Tests/coroutine/CoroutineSchedulerTests.cs b/GFramework.Core.Tests/coroutine/CoroutineSchedulerTests.cs index 9e8e43d..db2f9ce 100644 --- a/GFramework.Core.Tests/coroutine/CoroutineSchedulerTests.cs +++ b/GFramework.Core.Tests/coroutine/CoroutineSchedulerTests.cs @@ -6,46 +6,46 @@ using NUnit.Framework; namespace GFramework.Core.Tests.coroutine; /// -/// 协程调度器的单元测试类 -/// 测试内容包括: -/// - 协程调度器的创建和初始化 -/// - 运行协程 -/// - 更新协程状态 -/// - 暂停和恢复协程 -/// - 终止协程 -/// - 协程等待机制 -/// - 标签管理 -/// - 清空所有协程 -/// - 异常处理 -/// - 扩展容量 -/// - 主动协程计数 -/// - 时间差值属性 +/// 协程调度器的单元测试类 +/// 测试内容包括: +/// - 协程调度器的创建和初始化 +/// - 运行协程 +/// - 更新协程状态 +/// - 暂停和恢复协程 +/// - 终止协程 +/// - 协程等待机制 +/// - 标签管理 +/// - 清空所有协程 +/// - 异常处理 +/// - 扩展容量 +/// - 主动协程计数 +/// - 时间差值属性 /// [TestFixture] public class CoroutineSchedulerTests { /// - /// 测试初始化方法,在每个测试方法执行前设置测试环境 + /// 测试初始化方法,在每个测试方法执行前设置测试环境 /// [SetUp] public void SetUp() { _timeSource = new TestTimeSource(); - _scheduler = new CoroutineScheduler(_timeSource, instanceId: 1, initialCapacity: 4); + _scheduler = new CoroutineScheduler(_timeSource, 1, 4); } /// - /// 测试用的时间源实例 + /// 测试用的时间源实例 /// private TestTimeSource _timeSource = null!; /// - /// 测试用的协程调度器实例 + /// 测试用的协程调度器实例 /// private CoroutineScheduler _scheduler = null!; /// - /// 验证协程调度器创建时应该有正确的初始状态 + /// 验证协程调度器创建时应该有正确的初始状态 /// [Test] public void CoroutineScheduler_Should_Initialize_With_Correct_State() @@ -54,7 +54,7 @@ public class CoroutineSchedulerTests } /// - /// 验证协程调度器应该在创建时接受有效的时间源 + /// 验证协程调度器应该在创建时接受有效的时间源 /// [Test] public void CoroutineScheduler_Should_Accept_Valid_TimeSource() @@ -63,7 +63,7 @@ public class CoroutineSchedulerTests } /// - /// 验证协程调度器应该抛出ArgumentNullException当timeSource为null + /// 验证协程调度器应该抛出ArgumentNullException当timeSource为null /// [Test] public void CoroutineScheduler_Should_Throw_ArgumentNullException_When_TimeSource_Is_Null() @@ -72,7 +72,7 @@ public class CoroutineSchedulerTests } /// - /// 验证运行协程应该返回有效的句柄 + /// 验证运行协程应该返回有效的句柄 /// [Test] public void Run_Should_Return_Valid_Handle() @@ -85,7 +85,7 @@ public class CoroutineSchedulerTests } /// - /// 验证运行null协程应该返回无效的句柄 + /// 验证运行null协程应该返回无效的句柄 /// [Test] public void Run_Should_Return_Invalid_Handle_For_Null_Coroutine() @@ -97,7 +97,7 @@ public class CoroutineSchedulerTests } /// - /// 验证Update方法应该推进时间并更新协程状态 + /// 验证Update方法应该推进时间并更新协程状态 /// [Test] public void Update_Should_Advance_Time_And_Update_Coroutines() @@ -111,7 +111,7 @@ public class CoroutineSchedulerTests } /// - /// 验证暂停协程应该成功 + /// 验证暂停协程应该成功 /// [Test] public void Pause_Should_Succeed_For_Valid_Handle() @@ -125,7 +125,7 @@ public class CoroutineSchedulerTests } /// - /// 验证暂停无效的句柄应该失败 + /// 验证暂停无效的句柄应该失败 /// [Test] public void Pause_Should_Fail_For_Invalid_Handle() @@ -136,7 +136,7 @@ public class CoroutineSchedulerTests } /// - /// 验证恢复协程应该成功 + /// 验证恢复协程应该成功 /// [Test] public void Resume_Should_Succeed_For_Valid_Handle() @@ -151,7 +151,7 @@ public class CoroutineSchedulerTests } /// - /// 验证恢复无效的句柄应该失败 + /// 验证恢复无效的句柄应该失败 /// [Test] public void Resume_Should_Fail_For_Invalid_Handle() @@ -162,7 +162,7 @@ public class CoroutineSchedulerTests } /// - /// 验证终止协程应该成功 + /// 验证终止协程应该成功 /// [Test] public void Kill_Should_Succeed_For_Valid_Handle() @@ -177,7 +177,7 @@ public class CoroutineSchedulerTests } /// - /// 验证终止无效的句柄应该失败 + /// 验证终止无效的句柄应该失败 /// [Test] public void Kill_Should_Fail_For_Invalid_Handle() @@ -188,7 +188,7 @@ public class CoroutineSchedulerTests } /// - /// 验证WaitForCoroutine方法应该正确设置等待状态 + /// 验证WaitForCoroutine方法应该正确设置等待状态 /// [Test] public void WaitForCoroutine_Should_Set_Waiting_State() @@ -205,7 +205,7 @@ public class CoroutineSchedulerTests } /// - /// 验证WaitForCoroutine方法应该抛出异常当等待自己 + /// 验证WaitForCoroutine方法应该抛出异常当等待自己 /// [Test] public void WaitForCoroutine_Should_Throw_When_Waiting_For_Self() @@ -217,7 +217,7 @@ public class CoroutineSchedulerTests } /// - /// 验证WaitForCoroutine方法应该处理无效的目标句柄 + /// 验证WaitForCoroutine方法应该处理无效的目标句柄 /// [Test] public void WaitForCoroutine_Should_Handle_Invalid_Target_Handle() @@ -229,7 +229,7 @@ public class CoroutineSchedulerTests } /// - /// 验证根据标签终止协程应该正确工作 + /// 验证根据标签终止协程应该正确工作 /// [Test] public void KillByTag_Should_Kill_All_Coroutines_With_Tag() @@ -249,7 +249,7 @@ public class CoroutineSchedulerTests } /// - /// 验证根据不存在的标签终止协程应该返回0 + /// 验证根据不存在的标签终止协程应该返回0 /// [Test] public void KillByTag_Should_Return_Zero_For_Nonexistent_Tag() @@ -264,7 +264,7 @@ public class CoroutineSchedulerTests } /// - /// 验证清空所有协程应该正确工作 + /// 验证清空所有协程应该正确工作 /// [Test] public void Clear_Should_Remove_All_Coroutines() @@ -282,7 +282,7 @@ public class CoroutineSchedulerTests } /// - /// 验证清空空的调度器应该返回0 + /// 验证清空空的调度器应该返回0 /// [Test] public void Clear_Should_Return_Zero_For_Empty_Scheduler() @@ -293,7 +293,7 @@ public class CoroutineSchedulerTests } /// - /// 验证协程调度器应该正确处理协程异常 + /// 验证协程调度器应该正确处理协程异常 /// [Test] public void Scheduler_Should_Handle_Coroutine_Exceptions() @@ -305,7 +305,7 @@ public class CoroutineSchedulerTests } /// - /// 验证协程调度器应该在协程抛出异常后减少活跃协程计数 + /// 验证协程调度器应该在协程抛出异常后减少活跃协程计数 /// [Test] public void Scheduler_Should_Decrement_ActiveCount_After_Exception() @@ -321,27 +321,21 @@ public class CoroutineSchedulerTests } /// - /// 验证协程调度器应该扩展容量当槽位已满 + /// 验证协程调度器应该扩展容量当槽位已满 /// [Test] public void Scheduler_Should_Expand_Capacity_When_Slots_Full() { var coroutines = new List>(); - 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)); } /// - /// 验证协程调度器应该使用提供的时间源 + /// 验证协程调度器应该使用提供的时间源 /// [Test] public void Scheduler_Should_Use_Provided_TimeSource() @@ -355,7 +349,7 @@ public class CoroutineSchedulerTests } /// - /// 验证协程调度器应该正确计算活跃协程计数 + /// 验证协程调度器应该正确计算活跃协程计数 /// [Test] public void ActiveCoroutineCount_Should_Reflect_Active_Coroutines() @@ -377,7 +371,7 @@ public class CoroutineSchedulerTests } /// - /// 验证暂停的协程不应该被更新 + /// 验证暂停的协程不应该被更新 /// [Test] public void Paused_Coroutine_Should_Not_Be_Updated() @@ -393,7 +387,7 @@ public class CoroutineSchedulerTests } /// - /// 验证恢复的协程应该继续执行 + /// 验证恢复的协程应该继续执行 /// [Test] public void Resumed_Coroutine_Should_Continue_Execution() @@ -412,7 +406,7 @@ public class CoroutineSchedulerTests } /// - /// 创建简单的立即完成协程 + /// 创建简单的立即完成协程 /// private IEnumerator CreateSimpleCoroutine() { @@ -420,7 +414,7 @@ public class CoroutineSchedulerTests } /// - /// 创建带等待指令的协程 + /// 创建带等待指令的协程 /// private IEnumerator CreateYieldingCoroutine(IYieldInstruction yieldInstruction) { @@ -428,7 +422,7 @@ public class CoroutineSchedulerTests } /// - /// 创建带等待指令和回调的协程 + /// 创建带等待指令和回调的协程 /// private IEnumerator CreateYieldingCoroutine(IYieldInstruction yieldInstruction, Action? onComplete = null) @@ -438,7 +432,7 @@ public class CoroutineSchedulerTests } /// - /// 创建立即完成并执行回调的协程 + /// 创建立即完成并执行回调的协程 /// private IEnumerator CreateImmediateCoroutine(Action? onComplete = null) { @@ -447,7 +441,7 @@ public class CoroutineSchedulerTests } /// - /// 创建计数协程 + /// 创建计数协程 /// private IEnumerator CreateCountingCoroutine(Action? onExecute = null) { @@ -458,7 +452,7 @@ public class CoroutineSchedulerTests } /// - /// 创建抛出异常的协程 + /// 创建抛出异常的协程 /// private IEnumerator CreateExceptionCoroutine() { @@ -468,22 +462,22 @@ public class CoroutineSchedulerTests } /// -/// 测试用时间源类,实现ITimeSource接口 +/// 测试用时间源类,实现ITimeSource接口 /// public class TestTimeSource : ITimeSource { /// - /// 获取当前时间 + /// 获取当前时间 /// public double CurrentTime { get; private set; } /// - /// 获取时间增量 + /// 获取时间增量 /// public double DeltaTime { get; private set; } /// - /// 更新时间源状态 + /// 更新时间源状态 /// public void Update() { diff --git a/GFramework.Core.Tests/coroutine/CoroutineStateTests.cs b/GFramework.Core.Tests/coroutine/CoroutineStateTests.cs index b125ea8..6524682 100644 --- a/GFramework.Core.Tests/coroutine/CoroutineStateTests.cs +++ b/GFramework.Core.Tests/coroutine/CoroutineStateTests.cs @@ -4,16 +4,16 @@ using NUnit.Framework; namespace GFramework.Core.Tests.coroutine; /// -/// 协程状态枚举的单元测试类 -/// 测试内容包括: -/// - 枚举值存在性验证 -/// - 枚举值正确性 +/// 协程状态枚举的单元测试类 +/// 测试内容包括: +/// - 枚举值存在性验证 +/// - 枚举值正确性 /// [TestFixture] public class CoroutineStateTests { /// - /// 验证协程状态枚举包含所有预期值 + /// 验证协程状态枚举包含所有预期值 /// [Test] public void CoroutineState_Should_Have_All_Expected_Values() @@ -29,7 +29,7 @@ public class CoroutineStateTests } /// - /// 验证枚举基础值为整数类型 + /// 验证枚举基础值为整数类型 /// [Test] public void CoroutineState_Should_Be_Integer_Based_Enum() diff --git a/GFramework.Core.Tests/coroutine/TaskCoroutineExtensionsTests.cs b/GFramework.Core.Tests/coroutine/TaskCoroutineExtensionsTests.cs index 518f282..01f8ab5 100644 --- a/GFramework.Core.Tests/coroutine/TaskCoroutineExtensionsTests.cs +++ b/GFramework.Core.Tests/coroutine/TaskCoroutineExtensionsTests.cs @@ -7,16 +7,16 @@ using NUnit.Framework; namespace GFramework.Core.Tests.coroutine; /// -/// TaskCoroutineExtensions的单元测试类 -/// 测试内容包括: -/// - AsCoroutineInstruction方法 -/// - StartTaskAsCoroutine方法 +/// TaskCoroutineExtensions的单元测试类 +/// 测试内容包括: +/// - AsCoroutineInstruction方法 +/// - StartTaskAsCoroutine方法 /// [TestFixture] public class TaskCoroutineExtensionsTests { /// - /// 验证AsCoroutineInstruction应该返回WaitForTask + /// 验证AsCoroutineInstruction应该返回WaitForTask /// [Test] public void AsCoroutineInstruction_Should_Return_WaitForTask() @@ -28,19 +28,19 @@ public class TaskCoroutineExtensionsTests } /// - /// 验证AsCoroutineInstruction应该返回WaitForTask + /// 验证AsCoroutineInstruction应该返回WaitForTask /// [Test] public void AsCoroutineInstructionOfT_Should_Return_WaitForTaskOfT() { var task = Task.FromResult(42); - var instruction = task.AsCoroutineInstruction(); + var instruction = task.AsCoroutineInstruction(); Assert.That(instruction, Is.InstanceOf>()); } /// - /// 验证AsCoroutineInstruction可以处理已完成的Task并验证其状态 + /// 验证AsCoroutineInstruction可以处理已完成的Task并验证其状态 /// [Test] public void AsCoroutineInstruction_Should_Handle_Completed_Task() @@ -50,21 +50,21 @@ public class TaskCoroutineExtensionsTests // 验证指令类型 Assert.That(instruction, Is.InstanceOf()); - + // 验证已完成的任务是否立即可用 Assert.That(task.IsCompleted, Is.True); Assert.That(task.Status, Is.EqualTo(TaskStatus.RanToCompletion)); } - + /// - /// 验证AsCoroutineInstruction应该能够访问Task结果 + /// 验证AsCoroutineInstruction应该能够访问Task结果 /// [Test] public void AsCoroutineInstructionOfT_Should_Access_Task_Result() { var task = Task.FromResult(42); - var instruction = task.AsCoroutineInstruction(); + var instruction = task.AsCoroutineInstruction(); task.Wait(); @@ -72,7 +72,7 @@ public class TaskCoroutineExtensionsTests } /// - /// 验证AsCoroutineInstruction应该处理null Task(抛出异常) + /// 验证AsCoroutineInstruction应该处理null Task(抛出异常) /// [Test] public void AsCoroutineInstruction_Should_Handle_Null_Task() @@ -83,18 +83,18 @@ public class TaskCoroutineExtensionsTests } /// - /// 验证AsCoroutineInstruction应该处理null Task(抛出异常) + /// 验证AsCoroutineInstruction应该处理null Task(抛出异常) /// [Test] public void AsCoroutineInstructionOfT_Should_Handle_Null_Task() { Task task = null!; - Assert.Throws(() => task.AsCoroutineInstruction()); + Assert.Throws(() => task.AsCoroutineInstruction()); } /// - /// 验证AsCoroutineInstruction应该处理失败的Task + /// 验证AsCoroutineInstruction应该处理失败的Task /// [Test] public void AsCoroutineInstruction_Should_Handle_Faulted_Task() @@ -106,25 +106,25 @@ public class TaskCoroutineExtensionsTests } /// - /// 验证AsCoroutineInstruction应该处理失败的Task + /// 验证AsCoroutineInstruction应该处理失败的Task /// [Test] public void AsCoroutineInstructionOfT_Should_Handle_Faulted_Task() { var task = Task.FromException(new InvalidOperationException("Test exception")); - var instruction = task.AsCoroutineInstruction(); + var instruction = task.AsCoroutineInstruction(); Assert.That(instruction, Is.InstanceOf>()); } /// - /// 验证StartTaskAsCoroutine应该返回有效的协程句柄 + /// 验证StartTaskAsCoroutine应该返回有效的协程句柄 /// [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 } /// - /// 验证StartTaskAsCoroutine应该返回有效的协程句柄 + /// 验证StartTaskAsCoroutine应该返回有效的协程句柄 /// [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 } /// - /// 验证StartTaskAsCoroutine应该等待Task完成 + /// 验证StartTaskAsCoroutine应该等待Task完成 /// [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(); @@ -174,13 +174,13 @@ public class TaskCoroutineExtensionsTests } /// - /// 验证StartTaskAsCoroutine应该等待Task完成 + /// 验证StartTaskAsCoroutine应该等待Task完成 /// [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(); @@ -198,13 +198,13 @@ public class TaskCoroutineExtensionsTests } /// - /// 验证StartTaskAsCoroutine应该处理已完成的Task + /// 验证StartTaskAsCoroutine应该处理已完成的Task /// [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 } /// - /// 验证StartTaskAsCoroutine应该处理失败的Task + /// 验证StartTaskAsCoroutine应该处理失败的Task /// [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 } /// - /// 验证StartTaskAsCoroutine应该处理失败的Task + /// 验证StartTaskAsCoroutine应该处理失败的Task /// [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(new InvalidOperationException("Test")); scheduler.StartTaskAsCoroutine(task); Assert.DoesNotThrow(() => scheduler.Update()); } - - + + /// - /// 验证StartTaskAsCoroutine应该与调度器正常协作 + /// 验证StartTaskAsCoroutine应该与调度器正常协作 /// [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(); scheduler.StartTaskAsCoroutine(tcs.Task); @@ -273,7 +273,7 @@ public class TaskCoroutineExtensionsTests } /// - /// 测试用时间源类 + /// 测试用时间源类 /// private class TestTimeSource : ITimeSource { @@ -286,4 +286,4 @@ public class TaskCoroutineExtensionsTests CurrentTime += DeltaTime; } } -} +} \ No newline at end of file diff --git a/GFramework.Core.Tests/coroutine/WaitForAllCoroutinesTests.cs b/GFramework.Core.Tests/coroutine/WaitForAllCoroutinesTests.cs index 6b94f05..e1bcf2d 100644 --- a/GFramework.Core.Tests/coroutine/WaitForAllCoroutinesTests.cs +++ b/GFramework.Core.Tests/coroutine/WaitForAllCoroutinesTests.cs @@ -7,26 +7,26 @@ using NUnit.Framework; namespace GFramework.Core.Tests.coroutine; /// -/// WaitForAllCoroutines的单元测试类 -/// 测试内容包括: -/// - 初始化和基本功能 -/// - IsDone属性行为 -/// - 空句柄集合处理 -/// - 单个协程处理 -/// - 多个协程处理 -/// - 与CoroutineScheduler集成 +/// WaitForAllCoroutines的单元测试类 +/// 测试内容包括: +/// - 初始化和基本功能 +/// - IsDone属性行为 +/// - 空句柄集合处理 +/// - 单个协程处理 +/// - 多个协程处理 +/// - 与CoroutineScheduler集成 /// [TestFixture] public class WaitForAllCoroutinesTests { /// - /// 验证WaitForAllCoroutines初始状态为未完成 + /// 验证WaitForAllCoroutines初始状态为未完成 /// [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 } /// - /// 验证WaitForAllCoroutines应该在所有协程完成后完成 + /// 验证WaitForAllCoroutines应该在所有协程完成后完成 /// [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 } /// - /// 验证WaitForAllCoroutines应该在所有协程完成后完成(使用Delay) + /// 验证WaitForAllCoroutines应该在所有协程完成后完成(使用Delay) /// [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)); } /// - /// 验证WaitForAllCoroutines应该处理空句柄列表 + /// 验证WaitForAllCoroutines应该处理空句柄列表 /// [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(); var wait = new WaitForAllCoroutines(scheduler, handles); @@ -117,19 +114,19 @@ public class WaitForAllCoroutinesTests } /// - /// 验证WaitForAllCoroutines应该抛出ArgumentNullException当handles为null + /// 验证WaitForAllCoroutines应该抛出ArgumentNullException当handles为null /// [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(() => new WaitForAllCoroutines(scheduler, null!)); } /// - /// 验证WaitForAllCoroutines应该抛出ArgumentNullException当scheduler为null + /// 验证WaitForAllCoroutines应该抛出ArgumentNullException当scheduler为null /// [Test] public void WaitForAllCoroutines_Should_Throw_ArgumentNullException_When_Scheduler_Is_Null() @@ -140,13 +137,13 @@ public class WaitForAllCoroutinesTests } /// - /// 验证WaitForAllCoroutines应该处理单个协程 + /// 验证WaitForAllCoroutines应该处理单个协程 /// [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 { scheduler.Run(coroutine) }; @@ -159,13 +156,13 @@ public class WaitForAllCoroutinesTests } /// - /// 验证WaitForAllCoroutines应该在部分协程完成时未完成 + /// 验证WaitForAllCoroutines应该在部分协程完成时未完成 /// [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 } /// - /// 验证WaitForAllCoroutines应该处理被终止的协程 + /// 验证WaitForAllCoroutines应该处理被终止的协程 /// [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 } /// - /// 验证WaitForAllCoroutines应该处理被暂停和恢复的协程 + /// 验证WaitForAllCoroutines应该处理被暂停和恢复的协程 /// [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)); } /// - /// 验证WaitForAllCoroutines的Update方法不影响状态 + /// 验证WaitForAllCoroutines的Update方法不影响状态 /// [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 { scheduler.Run(coroutine) }; @@ -281,13 +272,13 @@ public class WaitForAllCoroutinesTests } /// - /// 验证WaitForAllCoroutines应该处理无效句柄 + /// 验证WaitForAllCoroutines应该处理无效句柄 /// [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 { default }; @@ -297,13 +288,13 @@ public class WaitForAllCoroutinesTests } /// - /// 验证WaitForAllCoroutines应该处理混合的有效和无效句柄 + /// 验证WaitForAllCoroutines应该处理混合的有效和无效句柄 /// [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 @@ -320,42 +311,36 @@ public class WaitForAllCoroutinesTests } /// - /// 验证WaitForAllCoroutines应该处理大量协程 + /// 验证WaitForAllCoroutines应该处理大量协程 /// [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(); - 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)); } /// - /// 验证WaitForAllCoroutines应该处理抛出异常的协程 + /// 验证WaitForAllCoroutines应该处理抛出异常的协程 /// [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 } /// - /// 验证WaitForAllCoroutines应该与ParallelCoroutines扩展方法一起工作 + /// 验证WaitForAllCoroutines应该与ParallelCoroutines扩展方法一起工作 /// [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(); var coroutine1 = CreateDelayedCoroutine(() => executionOrder.Add(1), 0.5); @@ -406,13 +391,13 @@ public class WaitForAllCoroutinesTests } /// - /// 验证WaitForAllCoroutines应该实现IYieldInstruction接口 + /// 验证WaitForAllCoroutines应该实现IYieldInstruction接口 /// [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(); var wait = new WaitForAllCoroutines(scheduler, handles); @@ -421,13 +406,13 @@ public class WaitForAllCoroutinesTests } /// - /// 验证WaitForAllCoroutines应该在所有协程立即完成时立即完成 + /// 验证WaitForAllCoroutines应该在所有协程立即完成时立即完成 /// [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 } /// - /// 验证WaitForAllCoroutines应该处理重复的句柄 + /// 验证WaitForAllCoroutines应该处理重复的句柄 /// [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); } /// - /// 创建简单的立即完成协程 + /// 创建简单的立即完成协程 /// private IEnumerator CreateSimpleCoroutine() { @@ -478,7 +460,7 @@ public class WaitForAllCoroutinesTests } /// - /// 创建带回调的协程 + /// 创建带回调的协程 /// private IEnumerator CreateCoroutineWithCallback(int id, Action callback) { @@ -487,7 +469,7 @@ public class WaitForAllCoroutinesTests } /// - /// 创建延迟协程 + /// 创建延迟协程 /// private IEnumerator CreateDelayedCoroutine(Action callback, double delay) { @@ -496,7 +478,7 @@ public class WaitForAllCoroutinesTests } /// - /// 创建抛出异常的协程 + /// 创建抛出异常的协程 /// private IEnumerator CreateExceptionCoroutine() { @@ -505,7 +487,7 @@ public class WaitForAllCoroutinesTests } /// - /// 测试用时间源类 + /// 测试用时间源类 /// private class TestTimeSource : ITimeSource { @@ -518,4 +500,4 @@ public class WaitForAllCoroutinesTests CurrentTime += DeltaTime; } } -} +} \ No newline at end of file diff --git a/GFramework.Core.Tests/coroutine/WaitForProgressTests.cs b/GFramework.Core.Tests/coroutine/WaitForProgressTests.cs index 6bc1b99..f0588ec 100644 --- a/GFramework.Core.Tests/coroutine/WaitForProgressTests.cs +++ b/GFramework.Core.Tests/coroutine/WaitForProgressTests.cs @@ -5,18 +5,18 @@ using NUnit.Framework; namespace GFramework.Core.Tests.coroutine; /// -/// WaitForProgress的单元测试类 -/// 测试内容包括: -/// - 初始化和基本功能 -/// - 进度回调 -/// - 边界条件 -/// - 异常处理 +/// WaitForProgress的单元测试类 +/// 测试内容包括: +/// - 初始化和基本功能 +/// - 进度回调 +/// - 边界条件 +/// - 异常处理 /// [TestFixture] public class WaitForProgressTests { /// - /// 验证WaitForProgress初始状态为未完成 + /// 验证WaitForProgress初始状态为未完成 /// [Test] public void WaitForProgress_Should_Not_Be_Done_Initially() @@ -28,7 +28,7 @@ public class WaitForProgressTests } /// - /// 验证WaitForProgress应该在指定时间后完成 + /// 验证WaitForProgress应该在指定时间后完成 /// [Test] public void WaitForProgress_Should_Be_Done_After_Duration() @@ -44,7 +44,7 @@ public class WaitForProgressTests } /// - /// 验证WaitForProgress应该在Update时调用进度回调 + /// 验证WaitForProgress应该在Update时调用进度回调 /// [Test] public void WaitForProgress_Should_Call_Progress_Callback_On_Update() @@ -58,7 +58,7 @@ public class WaitForProgressTests } /// - /// 验证进度值应该在0到1之间 + /// 验证进度值应该在0到1之间 /// [Test] public void WaitForProgress_Should_Have_Progress_Between_0_And_1() @@ -66,10 +66,7 @@ public class WaitForProgressTests var progressValues = new List(); 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 } /// - /// 验证进度值应该随着时间增加 + /// 验证进度值应该随着时间增加 /// [Test] public void WaitForProgress_Should_Increase_Progress_Over_Time() @@ -101,7 +98,7 @@ public class WaitForProgressTests } /// - /// 验证WaitForProgress应该抛出ArgumentNullException当回调为null + /// 验证WaitForProgress应该抛出ArgumentNullException当回调为null /// [Test] public void WaitForProgress_Should_Throw_ArgumentNullException_When_Callback_Is_Null() @@ -110,7 +107,7 @@ public class WaitForProgressTests } /// - /// 验证WaitForProgress应该抛出ArgumentException当duration为0 + /// 验证WaitForProgress应该抛出ArgumentException当duration为0 /// [Test] public void WaitForProgress_Should_Throw_ArgumentException_When_Duration_Is_Zero() @@ -119,7 +116,7 @@ public class WaitForProgressTests } /// - /// 验证WaitForProgress应该抛出ArgumentException当duration为负数 + /// 验证WaitForProgress应该抛出ArgumentException当duration为负数 /// [Test] public void WaitForProgress_Should_Throw_ArgumentException_When_Duration_Is_Negative() @@ -128,7 +125,7 @@ public class WaitForProgressTests } /// - /// 验证WaitForProgress应该处理超过duration的更新 + /// 验证WaitForProgress应该处理超过duration的更新 /// [Test] public void WaitForProgress_Should_Clamp_Progress_To_1_When_Exceeding_Duration() @@ -144,7 +141,7 @@ public class WaitForProgressTests } /// - /// 验证WaitForProgress可以处理精确的duration + /// 验证WaitForProgress可以处理精确的duration /// [Test] public void WaitForProgress_Should_Handle_Exact_Duration() @@ -160,7 +157,7 @@ public class WaitForProgressTests } /// - /// 验证WaitForProgress可以处理不同的delta time + /// 验证WaitForProgress可以处理不同的delta time /// [Test] public void WaitForProgress_Should_Handle_Variable_Delta_Time() @@ -179,7 +176,7 @@ public class WaitForProgressTests } /// - /// 验证WaitForProgress可以处理多次Update + /// 验证WaitForProgress可以处理多次Update /// [Test] public void WaitForProgress_Should_Handle_Multiple_Updates() @@ -199,7 +196,7 @@ public class WaitForProgressTests } /// - /// 验证WaitForProgress应该确保最后一个进度为1.0 + /// 验证WaitForProgress应该确保最后一个进度为1.0 /// [Test] public void WaitForProgress_Should_Ensure_Final_Progress_Is_1() @@ -207,16 +204,13 @@ public class WaitForProgressTests var progressValues = new List(); 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)); } /// - /// 验证WaitForProgress实现IYieldInstruction接口 + /// 验证WaitForProgress实现IYieldInstruction接口 /// [Test] public void WaitForProgress_Should_Implement_IYieldInstruction() @@ -228,7 +222,7 @@ public class WaitForProgressTests } /// - /// 验证WaitForProgress可以处理很短的duration + /// 验证WaitForProgress可以处理很短的duration /// [Test] public void WaitForProgress_Should_Handle_Short_Duration() @@ -242,7 +236,7 @@ public class WaitForProgressTests } /// - /// 验证WaitForProgress可以处理很长的duration + /// 验证WaitForProgress可以处理很长的duration /// [Test] public void WaitForProgress_Should_Handle_Long_Duration() @@ -258,7 +252,7 @@ public class WaitForProgressTests } /// - /// 验证WaitForProgress在完成前不会超过1.0 + /// 验证WaitForProgress在完成前不会超过1.0 /// [Test] public void WaitForProgress_Should_Not_Exceed_1_Before_Completion() @@ -277,7 +271,7 @@ public class WaitForProgressTests } /// - /// 验证WaitForProgress的Update方法不影响未完成状态 + /// 验证WaitForProgress的Update方法不影响未完成状态 /// [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); } -} +} \ No newline at end of file diff --git a/GFramework.Core.Tests/coroutine/WaitForTaskTests.cs b/GFramework.Core.Tests/coroutine/WaitForTaskTests.cs index 6c6e702..6180956 100644 --- a/GFramework.Core.Tests/coroutine/WaitForTaskTests.cs +++ b/GFramework.Core.Tests/coroutine/WaitForTaskTests.cs @@ -5,18 +5,20 @@ using NUnit.Framework; namespace GFramework.Core.Tests.coroutine; /// -/// WaitForTask的单元测试类 -/// 测试内容包括: -/// - WaitForTask初始化和等待 -/// - WaitForTask初始化、等待和结果获取 -/// - 异常处理 -/// - 边界条件 +/// WaitForTask的单元测试类 +/// 测试内容包括: +/// - WaitForTask初始化和等待 +/// - WaitForTask +/// +/// 初始化、等待和结果获取 +/// - 异常处理 +/// - 边界条件 /// [TestFixture] public class WaitForTaskTests { /// - /// 验证WaitForTask初始状态为未完成 + /// 验证WaitForTask初始状态为未完成 /// [Test] public void WaitForTask_Should_Not_Be_Done_Initially() @@ -26,9 +28,9 @@ public class WaitForTaskTests Assert.That(wait.IsDone, Is.False); } - + /// - /// 验证WaitForTask应该在Task完成后完成 + /// 验证WaitForTask应该在Task完成后完成 /// [Test] public void WaitForTask_Should_Be_Done_After_Task_Completes() @@ -46,7 +48,7 @@ public class WaitForTaskTests } /// - /// 验证WaitForTask应该处理已完成的Task + /// 验证WaitForTask应该处理已完成的Task /// [Test] public void WaitForTask_Should_Handle_Already_Completed_Task() @@ -63,7 +65,7 @@ public class WaitForTaskTests } /// - /// 验证WaitForTask应该处理失败的Task + /// 验证WaitForTask应该处理失败的Task /// [Test] public void WaitForTask_Should_Handle_Faulted_Task() @@ -79,7 +81,7 @@ public class WaitForTaskTests } /// - /// 验证WaitForTask应该处理取消的Task + /// 验证WaitForTask应该处理取消的Task /// [Test] public void WaitForTask_Should_Handle_Cancelled_Task() @@ -98,7 +100,7 @@ public class WaitForTaskTests } /// - /// 验证WaitForTask应该抛出ArgumentNullException当task为null + /// 验证WaitForTask应该抛出ArgumentNullException当task为null /// [Test] public void WaitForTask_Should_Throw_ArgumentNullException_When_Task_Is_Null() @@ -107,7 +109,7 @@ public class WaitForTaskTests } /// - /// 验证WaitForTask初始状态为未完成 + /// 验证WaitForTask初始状态为未完成 /// [Test] public void WaitForTaskOfT_Should_Not_Be_Done_Initially() @@ -119,7 +121,7 @@ public class WaitForTaskTests } /// - /// 验证WaitForTask应该在Task完成后完成 + /// 验证WaitForTask应该在Task完成后完成 /// [Test] public void WaitForTaskOfT_Should_Be_Done_After_Task_Completes() @@ -137,7 +139,7 @@ public class WaitForTaskTests } /// - /// 验证WaitForTask应该返回Task的结果 + /// 验证WaitForTask应该返回Task的结果 /// [Test] public void WaitForTaskOfT_Should_Return_Task_Result() @@ -153,7 +155,7 @@ public class WaitForTaskTests } /// - /// 验证WaitForTask应该处理已完成的Task + /// 验证WaitForTask应该处理已完成的Task /// [Test] public void WaitForTaskOfT_Should_Handle_Already_Completed_Task() @@ -171,7 +173,7 @@ public class WaitForTaskTests } /// - /// 验证WaitForTask应该处理失败的Task + /// 验证WaitForTask应该处理失败的Task /// [Test] public void WaitForTaskOfT_Should_Handle_Faulted_Task() @@ -185,11 +187,14 @@ public class WaitForTaskTests Assert.That(wait.IsDone, Is.True); - Assert.Throws(() => { var _ = wait.Result; }); + Assert.Throws(() => + { + var _ = wait.Result; + }); } /// - /// 验证WaitForTask应该抛出ArgumentNullException当task为null + /// 验证WaitForTask应该抛出ArgumentNullException当task为null /// [Test] public void WaitForTaskOfT_Should_Throw_ArgumentNullException_When_Task_Is_Null() @@ -198,7 +203,7 @@ public class WaitForTaskTests } /// - /// 验证WaitForTask实现IYieldInstruction接口 + /// 验证WaitForTask实现IYieldInstruction接口 /// [Test] public void WaitForTask_Should_Implement_IYieldInstruction() @@ -210,7 +215,7 @@ public class WaitForTaskTests } /// - /// 验证WaitForTask实现IYieldInstruction接口 + /// 验证WaitForTask实现IYieldInstruction接口 /// [Test] public void WaitForTaskOfT_Should_Implement_IYieldInstruction() @@ -222,7 +227,7 @@ public class WaitForTaskTests } /// - /// 验证WaitForTask的Update方法不影响状态 + /// 验证WaitForTask的Update方法不影响状态 /// [Test] public void WaitForTask_Update_Should_Not_Affect_State() @@ -238,7 +243,7 @@ public class WaitForTaskTests } /// - /// 验证WaitForTask的Update方法不影响状态 + /// 验证WaitForTask的Update方法不影响状态 /// [Test] public void WaitForTaskOfT_Update_Should_Not_Affect_State() @@ -254,7 +259,7 @@ public class WaitForTaskTests } /// - /// 验证WaitForTask在延迟完成后能够正确等待 + /// 验证WaitForTask在延迟完成后能够正确等待 /// [Test] public void WaitForTask_Should_Wait_For_Delayed_Task() @@ -271,7 +276,7 @@ public class WaitForTaskTests } /// - /// 验证WaitForTask在异步操作完成后能够正确获取结果 + /// 验证WaitForTask在异步操作完成后能够正确获取结果 /// [Test] public async Task WaitForTaskOfT_Should_Get_Result_From_Async_Operation() @@ -294,7 +299,7 @@ public class WaitForTaskTests } /// - /// 验证WaitForTask应该处理长时间运行的Task + /// 验证WaitForTask应该处理长时间运行的Task /// [Test] public void WaitForTask_Should_Handle_Long_Running_Task() @@ -308,4 +313,4 @@ public class WaitForTaskTests Assert.That(wait.IsDone, Is.True); } -} +} \ No newline at end of file diff --git a/GFramework.Core.Tests/coroutine/YieldInstructionTests.cs b/GFramework.Core.Tests/coroutine/YieldInstructionTests.cs index 4574f70..9264274 100644 --- a/GFramework.Core.Tests/coroutine/YieldInstructionTests.cs +++ b/GFramework.Core.Tests/coroutine/YieldInstructionTests.cs @@ -5,20 +5,20 @@ using NUnit.Framework; namespace GFramework.Core.Tests.coroutine; /// -/// 等待指令的单元测试类 -/// 测试内容包括: -/// - Delay指令 -/// - WaitOneFrame指令 -/// - WaitForFrames指令 -/// - WaitUntil指令 -/// - WaitWhile指令 -/// - WaitForCoroutine指令 +/// 等待指令的单元测试类 +/// 测试内容包括: +/// - Delay指令 +/// - WaitOneFrame指令 +/// - WaitForFrames指令 +/// - WaitUntil指令 +/// - WaitWhile指令 +/// - WaitForCoroutine指令 /// [TestFixture] public class YieldInstructionTests { /// - /// 验证Delay指令初始状态为未完成 + /// 验证Delay指令初始状态为未完成 /// [Test] public void Delay_Should_Not_Be_Done_Initially() @@ -29,7 +29,7 @@ public class YieldInstructionTests } /// - /// 验证Delay指令应该在指定时间后完成 + /// 验证Delay指令应该在指定时间后完成 /// [Test] public void Delay_Should_Be_Done_After_Specified_Time() @@ -44,7 +44,7 @@ public class YieldInstructionTests } /// - /// 验证Delay指令可以处理零秒延迟 + /// 验证Delay指令可以处理零秒延迟 /// [Test] public void Delay_Should_Handle_Zero_Seconds() @@ -55,7 +55,7 @@ public class YieldInstructionTests } /// - /// 验证Delay指令可以处理负数秒数 + /// 验证Delay指令可以处理负数秒数 /// [Test] public void Delay_Should_Handle_Negative_Seconds() @@ -66,7 +66,7 @@ public class YieldInstructionTests } /// - /// 验证WaitOneFrame指令初始状态为未完成 + /// 验证WaitOneFrame指令初始状态为未完成 /// [Test] public void WaitOneFrame_Should_Not_Be_Done_Initially() @@ -77,7 +77,7 @@ public class YieldInstructionTests } /// - /// 验证WaitOneFrame指令应该在第一次Update后完成 + /// 验证WaitOneFrame指令应该在第一次Update后完成 /// [Test] public void WaitOneFrame_Should_Be_Done_After_First_Update() @@ -89,7 +89,7 @@ public class YieldInstructionTests } /// - /// 验证WaitForFrames指令初始状态为未完成 + /// 验证WaitForFrames指令初始状态为未完成 /// [Test] public void WaitForFrames_Should_Not_Be_Done_Initially() @@ -100,7 +100,7 @@ public class YieldInstructionTests } /// - /// 验证WaitForFrames指令应该在指定帧数后完成 + /// 验证WaitForFrames指令应该在指定帧数后完成 /// [Test] public void WaitForFrames_Should_Be_Done_After_Specified_Frames() @@ -118,7 +118,7 @@ public class YieldInstructionTests } /// - /// 验证WaitForFrames指令可以处理最小帧数1 + /// 验证WaitForFrames指令可以处理最小帧数1 /// [Test] public void WaitForFrames_Should_Handle_Minimum_Frames_Of_1() @@ -130,7 +130,7 @@ public class YieldInstructionTests } /// - /// 验证WaitForFrames指令可以处理0帧数(会被修正为1) + /// 验证WaitForFrames指令可以处理0帧数(会被修正为1) /// [Test] public void WaitForFrames_Should_Handle_Zero_Frames_As_1() @@ -142,7 +142,7 @@ public class YieldInstructionTests } /// - /// 验证WaitForFrames指令可以处理负数帧数(会被修正为1) + /// 验证WaitForFrames指令可以处理负数帧数(会被修正为1) /// [Test] public void WaitForFrames_Should_Handle_Negative_Frames_As_1() @@ -154,7 +154,7 @@ public class YieldInstructionTests } /// - /// 验证WaitForFrames指令每次Update减少剩余帧数 + /// 验证WaitForFrames指令每次Update减少剩余帧数 /// [Test] public void WaitForFrames_Should_Decrement_On_Each_Update() @@ -171,7 +171,7 @@ public class YieldInstructionTests } /// - /// 验证WaitUntil指令使用谓词函数 + /// 验证WaitUntil指令使用谓词函数 /// [Test] public void WaitUntil_Should_Use_Predicate_Function() @@ -186,7 +186,7 @@ public class YieldInstructionTests } /// - /// 验证WaitUntil指令应该在条件满足时完成 + /// 验证WaitUntil指令应该在条件满足时完成 /// [Test] public void WaitUntil_Should_Be_Done_When_Condition_Is_True() @@ -207,7 +207,7 @@ public class YieldInstructionTests } /// - /// 验证WaitUntil指令抛出ArgumentNullException当predicate为null + /// 验证WaitUntil指令抛出ArgumentNullException当predicate为null /// [Test] public void WaitUntil_Should_Throw_ArgumentNullException_When_Predicate_Is_Null() @@ -216,7 +216,7 @@ public class YieldInstructionTests } /// - /// 验证WaitWhile指令使用谓词函数 + /// 验证WaitWhile指令使用谓词函数 /// [Test] public void WaitWhile_Should_Use_Predicate_Function() @@ -246,7 +246,7 @@ public class YieldInstructionTests } /// - /// 验证WaitWhile指令应该在条件为假时完成 + /// 验证WaitWhile指令应该在条件为假时完成 /// [Test] public void WaitWhile_Should_Be_Done_When_Condition_Is_False() @@ -261,7 +261,7 @@ public class YieldInstructionTests } /// - /// 验证WaitWhile指令应该在条件为真时持续等待 + /// 验证WaitWhile指令应该在条件为真时持续等待 /// [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); } /// - /// 验证WaitWhile指令抛出ArgumentNullException当predicate为null + /// 验证WaitWhile指令抛出ArgumentNullException当predicate为null /// [Test] public void WaitWhile_Should_Throw_ArgumentNullException_When_Predicate_Is_Null() @@ -290,7 +287,7 @@ public class YieldInstructionTests } /// - /// 验证WaitForCoroutine指令初始状态为未完成 + /// 验证WaitForCoroutine指令初始状态为未完成 /// [Test] public void WaitForCoroutine_Should_Not_Be_Done_Initially() @@ -301,7 +298,7 @@ public class YieldInstructionTests } /// - /// 验证WaitForCoroutine指令的Update方法不影响状态 + /// 验证WaitForCoroutine指令的Update方法不影响状态 /// [Test] public void WaitForCoroutine_Update_Should_Not_Affect_State() @@ -316,7 +313,7 @@ public class YieldInstructionTests } /// - /// 验证Delay指令实现IYieldInstruction接口 + /// 验证Delay指令实现IYieldInstruction接口 /// [Test] public void Delay_Should_Implement_IYieldInstruction_Interface() @@ -327,7 +324,7 @@ public class YieldInstructionTests } /// - /// 验证WaitOneFrame指令实现IYieldInstruction接口 + /// 验证WaitOneFrame指令实现IYieldInstruction接口 /// [Test] public void WaitOneFrame_Should_Implement_IYieldInstruction_Interface() @@ -338,7 +335,7 @@ public class YieldInstructionTests } /// - /// 验证WaitForFrames指令实现IYieldInstruction接口 + /// 验证WaitForFrames指令实现IYieldInstruction接口 /// [Test] public void WaitForFrames_Should_Implement_IYieldInstruction_Interface() @@ -349,7 +346,7 @@ public class YieldInstructionTests } /// - /// 验证WaitUntil指令实现IYieldInstruction接口 + /// 验证WaitUntil指令实现IYieldInstruction接口 /// [Test] public void WaitUntil_Should_Implement_IYieldInstruction_Interface() @@ -360,7 +357,7 @@ public class YieldInstructionTests } /// - /// 验证WaitWhile指令实现IYieldInstruction接口 + /// 验证WaitWhile指令实现IYieldInstruction接口 /// [Test] public void WaitWhile_Should_Implement_IYieldInstruction_Interface() @@ -371,7 +368,7 @@ public class YieldInstructionTests } /// - /// 验证WaitForCoroutine指令实现IYieldInstruction接口 + /// 验证WaitForCoroutine指令实现IYieldInstruction接口 /// [Test] public void WaitForCoroutine_Should_Implement_IYieldInstruction_Interface() @@ -382,7 +379,7 @@ public class YieldInstructionTests } /// - /// 验证WaitUntil指令在Update后立即检查条件 + /// 验证WaitUntil指令在Update后立即检查条件 /// [Test] public void WaitUntil_Should_Evaluate_Condition_Immediately() @@ -397,7 +394,7 @@ public class YieldInstructionTests } /// - /// 验证WaitWhile指令在Update后立即检查条件 + /// 验证WaitWhile指令在Update后立即检查条件 /// [Test] public void WaitWhile_Should_Evaluate_Condition_Immediately() diff --git a/GFramework.Core.Tests/environment/EnvironmentTests.cs b/GFramework.Core.Tests/environment/EnvironmentTests.cs index 5de91ef..f20bb8e 100644 --- a/GFramework.Core.Tests/environment/EnvironmentTests.cs +++ b/GFramework.Core.Tests/environment/EnvironmentTests.cs @@ -5,13 +5,13 @@ using NUnit.Framework; namespace GFramework.Core.Tests.environment; /// -/// 测试环境相关的单元测试类,用于验证环境管理功能的正确性 +/// 测试环境相关的单元测试类,用于验证环境管理功能的正确性 /// [TestFixture] public class EnvironmentTests { /// - /// 在每个测试方法执行前进行初始化设置 + /// 在每个测试方法执行前进行初始化设置 /// [SetUp] public void SetUp() @@ -23,7 +23,7 @@ public class EnvironmentTests private TestEnvironment _environment = null!; /// - /// 验证默认环境的名称是否正确返回"Default" + /// 验证默认环境的名称是否正确返回"Default" /// [Test] public void DefaultEnvironment_Name_Should_ReturnDefault() @@ -34,7 +34,7 @@ public class EnvironmentTests } /// - /// 验证默认环境的初始化方法不会抛出异常 + /// 验证默认环境的初始化方法不会抛出异常 /// [Test] public void DefaultEnvironment_Initialize_Should_NotThrow() @@ -45,7 +45,7 @@ public class EnvironmentTests } /// - /// 验证当键存在时Get方法应该返回正确的值 + /// 验证当键存在时Get方法应该返回正确的值 /// [Test] public void Get_Should_Return_Value_When_Key_Exists() @@ -58,7 +58,7 @@ public class EnvironmentTests } /// - /// 验证当键不存在时Get方法应该返回null + /// 验证当键不存在时Get方法应该返回null /// [Test] public void Get_Should_ReturnNull_When_Key_Not_Exists() @@ -69,7 +69,7 @@ public class EnvironmentTests } /// - /// 验证当类型不匹配时Get方法应该返回null + /// 验证当类型不匹配时Get方法应该返回null /// [Test] public void Get_Should_ReturnNull_When_Type_Does_Not_Match() @@ -82,7 +82,7 @@ public class EnvironmentTests } /// - /// 验证当键存在时TryGet方法应该返回true并输出正确的值 + /// 验证当键存在时TryGet方法应该返回true并输出正确的值 /// [Test] public void TryGet_Should_ReturnTrue_And_Value_When_Key_Exists() @@ -96,7 +96,7 @@ public class EnvironmentTests } /// - /// 验证当键不存在时TryGet方法应该返回false且输出值为null + /// 验证当键不存在时TryGet方法应该返回false且输出值为null /// [Test] public void TryGet_Should_ReturnFalse_When_Key_Not_Exists() @@ -108,7 +108,7 @@ public class EnvironmentTests } /// - /// 验证当类型不匹配时TryGet方法应该返回false且输出值为null + /// 验证当类型不匹配时TryGet方法应该返回false且输出值为null /// [Test] public void TryGet_Should_ReturnFalse_When_Type_Does_Not_Match() @@ -122,7 +122,7 @@ public class EnvironmentTests } /// - /// 验证当键存在时GetRequired方法应该返回正确的值 + /// 验证当键存在时GetRequired方法应该返回正确的值 /// [Test] public void GetRequired_Should_Return_Value_When_Key_Exists() @@ -135,7 +135,7 @@ public class EnvironmentTests } /// - /// 验证当键不存在时GetRequired方法应该抛出InvalidOperationException异常 + /// 验证当键不存在时GetRequired方法应该抛出InvalidOperationException异常 /// [Test] public void GetRequired_Should_ThrowInvalidOperationException_When_Key_Not_Exists() @@ -145,7 +145,7 @@ public class EnvironmentTests } /// - /// 验证Register方法应该将值添加到字典中 + /// 验证Register方法应该将值添加到字典中 /// [Test] public void Register_Should_Add_Value_To_Dictionary() @@ -158,7 +158,7 @@ public class EnvironmentTests } /// - /// 验证Register方法应该覆盖已存在的值 + /// 验证Register方法应该覆盖已存在的值 /// [Test] public void Register_Should_Overwrite_Existing_Value() @@ -172,7 +172,7 @@ public class EnvironmentTests } /// - /// 验证通过IEnvironment接口的Register方法应该能够添加值 + /// 验证通过IEnvironment接口的Register方法应该能够添加值 /// [Test] public void IEnvironment_Register_Should_Add_Value() @@ -187,17 +187,17 @@ public class EnvironmentTests } /// -/// 测试环境实现类,继承自EnvironmentBase +/// 测试环境实现类,继承自EnvironmentBase /// public class TestEnvironment : EnvironmentBase { /// - /// 获取环境名称 + /// 获取环境名称 /// public override string Name { get; } = "TestEnvironment"; /// - /// 注册键值对到环境中 + /// 注册键值对到环境中 /// /// 要注册的键 /// 要注册的值 @@ -207,7 +207,7 @@ public class TestEnvironment : EnvironmentBase } /// - /// 初始化环境 + /// 初始化环境 /// public override void Initialize() { diff --git a/GFramework.Core.Tests/events/EasyEventsTests.cs b/GFramework.Core.Tests/events/EasyEventsTests.cs index 7c8e1e0..fda6199 100644 --- a/GFramework.Core.Tests/events/EasyEventsTests.cs +++ b/GFramework.Core.Tests/events/EasyEventsTests.cs @@ -4,13 +4,13 @@ using NUnit.Framework; namespace GFramework.Core.Tests.events; /// -/// EasyEvents功能测试类,用于验证事件系统的注册、触发和参数传递功能 +/// EasyEvents功能测试类,用于验证事件系统的注册、触发和参数传递功能 /// [TestFixture] public class EasyEventsTests { /// - /// 测试用例初始化方法,在每个测试方法执行前设置EasyEvents实例 + /// 测试用例初始化方法,在每个测试方法执行前设置EasyEvents实例 /// [SetUp] public void SetUp() @@ -21,7 +21,7 @@ public class EasyEventsTests private EasyEvents _easyEvents = null!; /// - /// 测试单参数事件的功能,验证事件能够正确接收并传递int类型参数 + /// 测试单参数事件的功能,验证事件能够正确接收并传递int类型参数 /// [Test] public void Get_EventT_Should_Trigger_With_Parameter() @@ -38,7 +38,7 @@ public class EasyEventsTests } /// - /// 测试双参数事件的功能,验证事件能够正确接收并传递int和string类型的参数 + /// 测试双参数事件的功能,验证事件能够正确接收并传递int和string类型的参数 /// [Test] public void Get_EventTTK_Should_Trigger_With_Two_Parameters() diff --git a/GFramework.Core.Tests/events/EventBusTests.cs b/GFramework.Core.Tests/events/EventBusTests.cs index bb9fd5d..13167c0 100644 --- a/GFramework.Core.Tests/events/EventBusTests.cs +++ b/GFramework.Core.Tests/events/EventBusTests.cs @@ -4,13 +4,13 @@ using NUnit.Framework; namespace GFramework.Core.Tests.events; /// -/// EventBus测试类,用于验证事件总线的各种功能 +/// EventBus测试类,用于验证事件总线的各种功能 /// [TestFixture] public class EventBusTests { /// - /// 测试设置方法,在每个测试方法执行前初始化EventBus实例 + /// 测试设置方法,在每个测试方法执行前初始化EventBus实例 /// [SetUp] public void SetUp() @@ -21,8 +21,8 @@ public class EventBusTests private EventBus _eventBus = null!; /// - /// 测试注册事件处理器的功能 - /// 验证注册的处理器能够在发送对应事件时被正确调用 + /// 测试注册事件处理器的功能 + /// 验证注册的处理器能够在发送对应事件时被正确调用 /// [Test] public void Register_Should_Add_Handler() @@ -36,8 +36,8 @@ public class EventBusTests } /// - /// 测试注销事件处理器的功能 - /// 验证已注册的处理器在注销后不会再被调用 + /// 测试注销事件处理器的功能 + /// 验证已注册的处理器在注销后不会再被调用 /// [Test] public void UnRegister_Should_Remove_Handler() @@ -57,8 +57,8 @@ public class EventBusTests } /// - /// 测试发送事件时调用所有处理器的功能 - /// 验证同一事件类型的多个处理器都能被正确调用 + /// 测试发送事件时调用所有处理器的功能 + /// 验证同一事件类型的多个处理器都能被正确调用 /// [Test] public void SendEvent_Should_Invoke_All_Handlers() @@ -78,7 +78,7 @@ public class EventBusTests } /// -/// EventBus测试专用事件类 +/// EventBus测试专用事件类 /// public class EventBusTestsEvent { diff --git a/GFramework.Core.Tests/events/EventTests.cs b/GFramework.Core.Tests/events/EventTests.cs index 6f13af4..fc4aac6 100644 --- a/GFramework.Core.Tests/events/EventTests.cs +++ b/GFramework.Core.Tests/events/EventTests.cs @@ -4,13 +4,13 @@ using NUnit.Framework; namespace GFramework.Core.Tests.events; /// -/// 测试事件系统功能的测试类 +/// 测试事件系统功能的测试类 /// [TestFixture] public class EventTests { /// - /// 在每个测试方法执行前进行初始化设置 + /// 在每个测试方法执行前进行初始化设置 /// [SetUp] public void SetUp() @@ -25,7 +25,7 @@ public class EventTests private Event _eventIntString = null!; /// - /// 测试EasyEvent注册功能是否正确添加处理器 + /// 测试EasyEvent注册功能是否正确添加处理器 /// [Test] public void EasyEvent_Register_Should_Add_Handler() @@ -39,7 +39,7 @@ public class EventTests } /// - /// 测试EasyEvent取消注册功能是否正确移除处理器 + /// 测试EasyEvent取消注册功能是否正确移除处理器 /// [Test] public void EasyEvent_UnRegister_Should_Remove_Handler() @@ -57,7 +57,7 @@ public class EventTests } /// - /// 测试EasyEvent多个处理器是否都能被调用 + /// 测试EasyEvent多个处理器是否都能被调用 /// [Test] public void EasyEvent_Multiple_Handlers_Should_All_Be_Called() @@ -75,7 +75,7 @@ public class EventTests } /// - /// 测试带泛型参数的事件注册功能是否正确添加处理器 + /// 测试带泛型参数的事件注册功能是否正确添加处理器 /// [Test] public void EventT_Register_Should_Add_Handler() @@ -89,7 +89,7 @@ public class EventTests } /// - /// 测试带泛型参数的事件取消注册功能是否正确移除处理器 + /// 测试带泛型参数的事件取消注册功能是否正确移除处理器 /// [Test] public void EventT_UnRegister_Should_Remove_Handler() @@ -107,7 +107,7 @@ public class EventTests } /// - /// 测试带泛型参数的事件多个处理器是否都能被调用 + /// 测试带泛型参数的事件多个处理器是否都能被调用 /// [Test] public void EventT_Multiple_Handlers_Should_All_Be_Called() @@ -125,7 +125,7 @@ public class EventTests } /// - /// 测试带两个泛型参数的事件注册功能是否正确添加处理器 + /// 测试带两个泛型参数的事件注册功能是否正确添加处理器 /// [Test] public void EventTTK_Register_Should_Add_Handler() @@ -145,7 +145,7 @@ public class EventTests } /// - /// 测试带两个泛型参数的事件取消注册功能是否正确移除处理器 + /// 测试带两个泛型参数的事件取消注册功能是否正确移除处理器 /// [Test] public void EventTTK_UnRegister_Should_Remove_Handler() diff --git a/GFramework.Core.Tests/events/OrEventTests.cs b/GFramework.Core.Tests/events/OrEventTests.cs index 79a553a..5936351 100644 --- a/GFramework.Core.Tests/events/OrEventTests.cs +++ b/GFramework.Core.Tests/events/OrEventTests.cs @@ -4,14 +4,14 @@ using NUnit.Framework; namespace GFramework.Core.Tests.events; /// -/// 测试OrEvent类的功能,验证其在多个事件中的逻辑或操作行为 +/// 测试OrEvent类的功能,验证其在多个事件中的逻辑或操作行为 /// [TestFixture] public class OrEventTests { /// - /// 测试当任意一个事件触发时,OrEvent应该被触发 - /// 验证基本的OR逻辑功能 + /// 测试当任意一个事件触发时,OrEvent应该被触发 + /// 验证基本的OR逻辑功能 /// [Test] public void OrEvent_Should_Trigger_When_Any_Event_Fires() @@ -32,8 +32,8 @@ public class OrEventTests } /// - /// 测试当第二个事件触发时,OrEvent应该被触发 - /// 验证OR逻辑对所有注册事件都有效 + /// 测试当第二个事件触发时,OrEvent应该被触发 + /// 验证OR逻辑对所有注册事件都有效 /// [Test] public void OrEvent_Should_Trigger_When_Second_Event_Fires() @@ -54,8 +54,8 @@ public class OrEventTests } /// - /// 测试OrEvent支持多个处理程序 - /// 验证单个OrEvent可以注册多个回调函数 + /// 测试OrEvent支持多个处理程序 + /// 验证单个OrEvent可以注册多个回调函数 /// [Test] public void OrEvent_Should_Support_Multiple_Handlers() @@ -78,8 +78,8 @@ public class OrEventTests } /// - /// 测试UnRegister方法应该移除处理程序 - /// 验证注销功能能够正确移除已注册的回调函数 + /// 测试UnRegister方法应该移除处理程序 + /// 验证注销功能能够正确移除已注册的回调函数 /// [Test] public void OrEvent_UnRegister_Should_Remove_Handler() diff --git a/GFramework.Core.Tests/events/UnRegisterTests.cs b/GFramework.Core.Tests/events/UnRegisterTests.cs index 516818b..74b990a 100644 --- a/GFramework.Core.Tests/events/UnRegisterTests.cs +++ b/GFramework.Core.Tests/events/UnRegisterTests.cs @@ -5,13 +5,13 @@ using NUnit.Framework; namespace GFramework.Core.Tests.events; /// -/// 注销功能测试类,用于测试不同类型的注销行为 +/// 注销功能测试类,用于测试不同类型的注销行为 /// [TestFixture] public class UnRegisterTests { /// - /// 测试DefaultUnRegister在调用注销时是否正确触发回调函数 + /// 测试DefaultUnRegister在调用注销时是否正确触发回调函数 /// [Test] public void DefaultUnRegister_Should_InvokeCallback_When_UnRegisterCalled() @@ -25,7 +25,7 @@ public class UnRegisterTests } /// - /// 测试DefaultUnRegister在注销后是否清除回调函数,防止重复执行 + /// 测试DefaultUnRegister在注销后是否清除回调函数,防止重复执行 /// [Test] public void DefaultUnRegister_Should_ClearCallback_After_UnRegister() @@ -40,7 +40,7 @@ public class UnRegisterTests } /// - /// 测试DefaultUnRegister在传入空回调函数时不会抛出异常 + /// 测试DefaultUnRegister在传入空回调函数时不会抛出异常 /// [Test] public void DefaultUnRegister_WithNullCallback_Should_NotThrow() @@ -51,12 +51,12 @@ public class UnRegisterTests } /// - /// 测试BindablePropertyUnRegister是否能正确从属性中注销事件处理器 + /// 测试BindablePropertyUnRegister是否能正确从属性中注销事件处理器 /// [Test] public void BindablePropertyUnRegister_Should_UnRegister_From_Property() { - var property = new BindableProperty(0); + var property = new BindableProperty(); var callCount = 0; Action handler = _ => { callCount++; }; @@ -71,12 +71,12 @@ public class UnRegisterTests } /// - /// 测试BindablePropertyUnRegister在注销后是否清除内部引用 + /// 测试BindablePropertyUnRegister在注销后是否清除内部引用 /// [Test] public void BindablePropertyUnRegister_Should_Clear_References() { - var property = new BindableProperty(0); + var property = new BindableProperty(); Action handler = _ => { }; var unRegister = new BindablePropertyUnRegister(property, handler); @@ -89,7 +89,7 @@ public class UnRegisterTests } /// - /// 测试BindablePropertyUnRegister在传入空属性时不会抛出异常 + /// 测试BindablePropertyUnRegister在传入空属性时不会抛出异常 /// [Test] public void BindablePropertyUnRegister_WithNull_Property_Should_NotThrow() @@ -101,12 +101,12 @@ public class UnRegisterTests } /// - /// 测试BindablePropertyUnRegister在传入空处理器时不会抛出异常 + /// 测试BindablePropertyUnRegister在传入空处理器时不会抛出异常 /// [Test] public void BindablePropertyUnRegister_WithNull_Handler_Should_NotThrow() { - var property = new BindableProperty(0); + var property = new BindableProperty(); var unRegister = new BindablePropertyUnRegister(property, null!); Assert.DoesNotThrow(() => unRegister.UnRegister()); diff --git a/GFramework.Core.Tests/extensions/ObjectExtensionsTests.cs b/GFramework.Core.Tests/extensions/ObjectExtensionsTests.cs index 24dce89..519cff1 100644 --- a/GFramework.Core.Tests/extensions/ObjectExtensionsTests.cs +++ b/GFramework.Core.Tests/extensions/ObjectExtensionsTests.cs @@ -4,13 +4,13 @@ using NUnit.Framework; namespace GFramework.Core.Tests.extensions; /// -/// 测试ObjectExtensions扩展方法的功能 +/// 测试ObjectExtensions扩展方法的功能 /// [TestFixture] public class ObjectExtensionsTests { /// - /// 验证IfType方法在类型匹配时执行指定操作 + /// 验证IfType方法在类型匹配时执行指定操作 /// [Test] public void IfType_Should_Execute_Action_When_Type_Matches() @@ -24,7 +24,7 @@ public class ObjectExtensionsTests } /// - /// 验证IfType方法在类型不匹配时不执行指定操作 + /// 验证IfType方法在类型不匹配时不执行指定操作 /// [Test] public void IfType_Should_Not_Execute_Action_When_Type_Does_Not_Match() @@ -38,7 +38,7 @@ public class ObjectExtensionsTests } /// - /// 验证IfType方法在类型匹配且谓词条件为真时执行指定操作 + /// 验证IfType方法在类型匹配且谓词条件为真时执行指定操作 /// [Test] public void IfType_WithPredicate_Should_Execute_When_Type_Matches_And_Predicate_True() @@ -52,7 +52,7 @@ public class ObjectExtensionsTests } /// - /// 验证IfType方法在谓词条件为假时不执行指定操作 + /// 验证IfType方法在谓词条件为假时不执行指定操作 /// [Test] public void IfType_WithPredicate_Should_Not_Execute_When_Predicate_False() @@ -66,7 +66,7 @@ public class ObjectExtensionsTests } /// - /// 验证IfType方法在类型匹配时执行匹配操作,在类型不匹配时执行不匹配操作 + /// 验证IfType方法在类型匹配时执行匹配操作,在类型不匹配时执行不匹配操作 /// [Test] public void IfType_WithBoth_Actions_Should_Execute_Correct_Action() @@ -85,7 +85,7 @@ public class ObjectExtensionsTests } /// - /// 验证IfType方法在类型匹配时返回转换结果 + /// 验证IfType方法在类型匹配时返回转换结果 /// [Test] public void IfType_WithResult_Should_Return_Value_When_Type_Matches() @@ -98,7 +98,7 @@ public class ObjectExtensionsTests } /// - /// 验证IfType方法在类型不匹配时返回默认值 + /// 验证IfType方法在类型不匹配时返回默认值 /// [Test] public void IfType_WithResult_Should_Return_Default_When_Type_Does_Not_Match() @@ -111,7 +111,7 @@ public class ObjectExtensionsTests } /// - /// 验证As方法在类型匹配时返回实例 + /// 验证As方法在类型匹配时返回实例 /// [Test] public void As_Should_Return_Instance_When_Type_Matches() @@ -125,7 +125,7 @@ public class ObjectExtensionsTests } /// - /// 验证As方法在类型不匹配时返回null + /// 验证As方法在类型不匹配时返回null /// [Test] public void As_Should_Return_Null_When_Type_Does_Not_Match() @@ -138,7 +138,7 @@ public class ObjectExtensionsTests } /// - /// 验证Do方法执行操作并返回对象本身 + /// 验证Do方法执行操作并返回对象本身 /// [Test] public void Do_Should_Execute_Action_And_Return_Object() @@ -152,7 +152,7 @@ public class ObjectExtensionsTests } /// - /// 验证Do方法支持链式调用 + /// 验证Do方法支持链式调用 /// [Test] public void Do_Should_Support_Chaining() @@ -167,7 +167,7 @@ public class ObjectExtensionsTests } /// - /// 验证SwitchType方法执行匹配的处理器 + /// 验证SwitchType方法执行匹配的处理器 /// [Test] public void SwitchType_Should_Execute_Matching_Handler() @@ -184,7 +184,7 @@ public class ObjectExtensionsTests } /// - /// 验证SwitchType方法只执行第一个匹配的处理器 + /// 验证SwitchType方法只执行第一个匹配的处理器 /// [Test] public void SwitchType_Should_Execute_First_Matching_Handler() @@ -201,7 +201,7 @@ public class ObjectExtensionsTests } /// - /// 验证SwitchType方法在没有匹配项时不执行任何处理器 + /// 验证SwitchType方法在没有匹配项时不执行任何处理器 /// [Test] public void SwitchType_Should_Not_Execute_When_No_Match() @@ -219,17 +219,17 @@ public class ObjectExtensionsTests } /// -/// 测试用的简单类 +/// 测试用的简单类 /// public class TestClass { /// - /// 获取或设置整数值 + /// 获取或设置整数值 /// public int Value { get; set; } /// - /// 获取或设置名称字符串 + /// 获取或设置名称字符串 /// public string Name { get; set; } = string.Empty; } \ No newline at end of file diff --git a/GFramework.Core.Tests/extensions/UnRegisterListExtensionTests.cs b/GFramework.Core.Tests/extensions/UnRegisterListExtensionTests.cs index 4e389d4..404c87a 100644 --- a/GFramework.Core.Tests/extensions/UnRegisterListExtensionTests.cs +++ b/GFramework.Core.Tests/extensions/UnRegisterListExtensionTests.cs @@ -6,13 +6,13 @@ using NUnit.Framework; namespace GFramework.Core.Tests.extensions; /// -/// 测试UnRegisterList扩展方法的功能 +/// 测试UnRegisterList扩展方法的功能 /// [TestFixture] public class UnRegisterListExtensionTests { /// - /// 在每个测试方法执行前初始化测试环境 + /// 在每个测试方法执行前初始化测试环境 /// [SetUp] public void SetUp() @@ -23,7 +23,7 @@ public class UnRegisterListExtensionTests private TestUnRegisterList _unRegisterList = null!; /// - /// 验证AddToUnregisterList方法能够正确将元素添加到列表中 + /// 验证AddToUnregisterList方法能够正确将元素添加到列表中 /// [Test] public void AddToUnregisterList_Should_Add_To_List() @@ -36,7 +36,7 @@ public class UnRegisterListExtensionTests } /// - /// 验证AddToUnregisterList方法能够正确添加多个元素到列表中 + /// 验证AddToUnregisterList方法能够正确添加多个元素到列表中 /// [Test] public void AddToUnregisterList_Should_Add_Multiple_Elements() @@ -53,7 +53,7 @@ public class UnRegisterListExtensionTests } /// - /// 验证UnRegisterAll方法能够正确注销所有元素 + /// 验证UnRegisterAll方法能够正确注销所有元素 /// [Test] public void UnRegisterAll_Should_UnRegister_All_Elements() @@ -79,7 +79,7 @@ public class UnRegisterListExtensionTests } /// - /// 验证UnRegisterAll方法在执行后会清空列表 + /// 验证UnRegisterAll方法在执行后会清空列表 /// [Test] public void UnRegisterAll_Should_Clear_List() @@ -94,7 +94,7 @@ public class UnRegisterListExtensionTests } /// - /// 验证UnRegisterAll方法在空列表情况下不会抛出异常 + /// 验证UnRegisterAll方法在空列表情况下不会抛出异常 /// [Test] public void UnRegisterAll_Should_Not_Throw_When_Empty() @@ -103,7 +103,7 @@ public class UnRegisterListExtensionTests } /// - /// 验证UnRegisterAll方法对每个元素只调用一次注销操作 + /// 验证UnRegisterAll方法对每个元素只调用一次注销操作 /// [Test] public void UnRegisterAll_Should_Invoke_Once_Per_Element() @@ -121,12 +121,12 @@ public class UnRegisterListExtensionTests } /// -/// 测试用的UnRegisterList实现类,用于验证扩展方法功能 +/// 测试用的UnRegisterList实现类,用于验证扩展方法功能 /// public class TestUnRegisterList : IUnRegisterList { /// - /// 获取或设置注销列表 + /// 获取或设置注销列表 /// public IList UnregisterList { get; } = new List(); } \ No newline at end of file diff --git a/GFramework.Core.Tests/ioc/IocContainerTests.cs b/GFramework.Core.Tests/ioc/IocContainerTests.cs index 8f4aad2..7f3d785 100644 --- a/GFramework.Core.Tests/ioc/IocContainerTests.cs +++ b/GFramework.Core.Tests/ioc/IocContainerTests.cs @@ -7,13 +7,13 @@ using NUnit.Framework; namespace GFramework.Core.Tests.ioc; /// -/// 测试 IoC 容器功能的单元测试类 +/// 测试 IoC 容器功能的单元测试类 /// [TestFixture] public class IocContainerTests { /// - /// 在每个测试方法执行前进行设置 + /// 在每个测试方法执行前进行设置 /// [SetUp] public void SetUp() @@ -33,7 +33,7 @@ public class IocContainerTests private readonly Dictionary _mockContextServices = new(); /// - /// 测试注册单例实例的功能 + /// 测试注册单例实例的功能 /// [Test] public void RegisterSingleton_Should_Register_Instance() @@ -44,7 +44,7 @@ public class IocContainerTests } /// - /// 测试重复注册单例时应抛出 InvalidOperationException 异常 + /// 测试重复注册单例时应抛出 InvalidOperationException 异常 /// [Test] public void RegisterSingleton_WithDuplicate_Should_ThrowInvalidOperationException() @@ -58,7 +58,7 @@ public class IocContainerTests } /// - /// 测试在容器冻结后注册单例时应抛出 InvalidOperationException 异常 + /// 测试在容器冻结后注册单例时应抛出 InvalidOperationException 异常 /// [Test] public void RegisterSingleton_AfterFreeze_Should_ThrowInvalidOperationException() @@ -70,7 +70,7 @@ public class IocContainerTests } /// - /// 测试注册多样性实例到所有类型的功能 + /// 测试注册多样性实例到所有类型的功能 /// [Test] public void RegisterPlurality_Should_Register_Instance_To_All_Types() @@ -84,7 +84,7 @@ public class IocContainerTests } /// - /// 测试在容器冻结后注册多样性实例时应抛出 InvalidOperationException 异常 + /// 测试在容器冻结后注册多样性实例时应抛出 InvalidOperationException 异常 /// [Test] public void RegisterPlurality_AfterFreeze_Should_ThrowInvalidOperationException() @@ -96,7 +96,7 @@ public class IocContainerTests } /// - /// 测试泛型注册实例的功能 + /// 测试泛型注册实例的功能 /// [Test] public void Register_Generic_Should_Register_Instance() @@ -109,7 +109,7 @@ public class IocContainerTests } /// - /// 测试在容器冻结后使用泛型注册时应抛出 InvalidOperationException 异常 + /// 测试在容器冻结后使用泛型注册时应抛出 InvalidOperationException 异常 /// [Test] public void Register_Generic_AfterFreeze_Should_ThrowInvalidOperationException() @@ -121,7 +121,7 @@ public class IocContainerTests } /// - /// 测试按类型注册实例的功能 + /// 测试按类型注册实例的功能 /// [Test] public void Register_Type_Should_Register_Instance() @@ -134,7 +134,7 @@ public class IocContainerTests } /// - /// 测试获取第一个实例的功能 + /// 测试获取第一个实例的功能 /// [Test] public void Get_Should_Return_First_Instance() @@ -149,7 +149,7 @@ public class IocContainerTests } /// - /// 测试当没有实例时获取应返回 null 的功能 + /// 测试当没有实例时获取应返回 null 的功能 /// [Test] public void Get_WithNoInstances_Should_ReturnNull() @@ -160,7 +160,7 @@ public class IocContainerTests } /// - /// 测试获取必需的单个实例的功能 + /// 测试获取必需的单个实例的功能 /// [Test] public void GetRequired_Should_Return_Single_Instance() @@ -175,7 +175,7 @@ public class IocContainerTests } /// - /// 测试当没有实例时获取必需实例应抛出 InvalidOperationException 异常 + /// 测试当没有实例时获取必需实例应抛出 InvalidOperationException 异常 /// [Test] public void GetRequired_WithNoInstances_Should_ThrowInvalidOperationException() @@ -184,7 +184,7 @@ public class IocContainerTests } /// - /// 测试当有多个实例时获取必需实例应抛出 InvalidOperationException 异常 + /// 测试当有多个实例时获取必需实例应抛出 InvalidOperationException 异常 /// [Test] public void GetRequired_WithMultipleInstances_Should_ThrowInvalidOperationException() @@ -196,7 +196,7 @@ public class IocContainerTests } /// - /// 测试获取所有实例的功能 + /// 测试获取所有实例的功能 /// [Test] public void GetAll_Should_Return_All_Instances() @@ -215,7 +215,7 @@ public class IocContainerTests } /// - /// 测试当没有实例时获取所有实例应返回空数组的功能 + /// 测试当没有实例时获取所有实例应返回空数组的功能 /// [Test] public void GetAll_WithNoInstances_Should_Return_Empty_Array() @@ -226,7 +226,7 @@ public class IocContainerTests } /// - /// 测试获取排序后的所有实例的功能 + /// 测试获取排序后的所有实例的功能 /// [Test] public void GetAllSorted_Should_Return_Sorted_Instances() @@ -244,7 +244,7 @@ public class IocContainerTests } /// - /// 测试当存在实例时检查包含关系应返回 true 的功能 + /// 测试当存在实例时检查包含关系应返回 true 的功能 /// [Test] public void Contains_WithExistingInstance_Should_ReturnTrue() @@ -256,7 +256,7 @@ public class IocContainerTests } /// - /// 测试当不存在实例时检查包含关系应返回 false 的功能 + /// 测试当不存在实例时检查包含关系应返回 false 的功能 /// [Test] public void Contains_WithNoInstances_Should_ReturnFalse() @@ -265,7 +265,7 @@ public class IocContainerTests } /// - /// 测试当实例存在时检查实例包含关系应返回 true 的功能 + /// 测试当实例存在时检查实例包含关系应返回 true 的功能 /// [Test] public void ContainsInstance_WithExistingInstance_Should_ReturnTrue() @@ -277,7 +277,7 @@ public class IocContainerTests } /// - /// 测试当实例不存在时检查实例包含关系应返回 false 的功能 + /// 测试当实例不存在时检查实例包含关系应返回 false 的功能 /// [Test] public void ContainsInstance_WithNonExistingInstance_Should_ReturnFalse() @@ -288,7 +288,7 @@ public class IocContainerTests } /// - /// 测试清除所有实例的功能 + /// 测试清除所有实例的功能 /// [Test] public void Clear_Should_Remove_All_Instances() @@ -302,7 +302,7 @@ public class IocContainerTests } /// - /// 测试冻结容器以防止进一步注册的功能 + /// 测试冻结容器以防止进一步注册的功能 /// [Test] public void Freeze_Should_Prevent_Further_Registrations() @@ -316,7 +316,7 @@ public class IocContainerTests } /// - /// 测试注册系统实例的功能 + /// 测试注册系统实例的功能 /// [Test] public void RegisterSystem_Should_Register_Instance() @@ -330,17 +330,17 @@ public class IocContainerTests } /// -/// 服务接口定义 +/// 服务接口定义 /// public interface IService; /// -/// 测试服务类,实现 IService 接口 +/// 测试服务类,实现 IService 接口 /// public sealed class TestService : IService { /// - /// 获取或设置优先级 + /// 获取或设置优先级 /// public int Priority { get; set; } } \ No newline at end of file diff --git a/GFramework.Core.Tests/logging/ConsoleLoggerTests.cs b/GFramework.Core.Tests/logging/ConsoleLoggerTests.cs index e754a9e..809fd42 100644 --- a/GFramework.Core.Tests/logging/ConsoleLoggerTests.cs +++ b/GFramework.Core.Tests/logging/ConsoleLoggerTests.cs @@ -6,14 +6,14 @@ using NUnit.Framework; namespace GFramework.Core.Tests.logging; /// -/// 测试ConsoleLogger类的功能和行为的单元测试类 +/// 测试ConsoleLogger类的功能和行为的单元测试类 /// [TestFixture] public class ConsoleLoggerTests { /// - /// 在每个测试方法执行前设置测试环境 - /// 创建StringWriter和ConsoleLogger实例用于测试 + /// 在每个测试方法执行前设置测试环境 + /// 创建StringWriter和ConsoleLogger实例用于测试 /// [SetUp] public void SetUp() @@ -23,8 +23,8 @@ public class ConsoleLoggerTests } /// - /// 在每个测试方法执行后清理测试资源 - /// 释放StringWriter资源 + /// 在每个测试方法执行后清理测试资源 + /// 释放StringWriter资源 /// [TearDown] public void TearDown() @@ -36,8 +36,8 @@ public class ConsoleLoggerTests private ConsoleLogger _logger = null!; /// - /// 测试使用默认名称构造函数时是否正确使用根日志器名称 - /// 验证当未指定名称时,日志器使用"ROOT"作为默认名称 + /// 测试使用默认名称构造函数时是否正确使用根日志器名称 + /// 验证当未指定名称时,日志器使用"ROOT"作为默认名称 /// [Test] public void Constructor_WithDefaultName_ShouldUseRootLoggerName() @@ -48,8 +48,8 @@ public class ConsoleLoggerTests } /// - /// 测试使用自定义名称构造函数时是否正确使用自定义名称 - /// 验证构造函数能够正确设置并返回指定的日志器名称 + /// 测试使用自定义名称构造函数时是否正确使用自定义名称 + /// 验证构造函数能够正确设置并返回指定的日志器名称 /// [Test] public void Constructor_WithCustomName_ShouldUseCustomName() @@ -60,8 +60,8 @@ public class ConsoleLoggerTests } /// - /// 测试使用自定义最小级别构造函数时是否正确遵循最小日志级别 - /// 验证只有达到或超过最小级别的日志消息才会被记录 + /// 测试使用自定义最小级别构造函数时是否正确遵循最小日志级别 + /// 验证只有达到或超过最小级别的日志消息才会被记录 /// [Test] public void Constructor_WithCustomMinLevel_ShouldRespectMinLevel() @@ -77,8 +77,8 @@ public class ConsoleLoggerTests } /// - /// 测试使用自定义写入器构造函数时是否将日志写入到自定义写入器 - /// 验证日志消息能够正确写入到指定的StringWriter中 + /// 测试使用自定义写入器构造函数时是否将日志写入到自定义写入器 + /// 验证日志消息能够正确写入到指定的StringWriter中 /// [Test] public void Constructor_WithCustomWriter_ShouldWriteToCustomWriter() @@ -90,8 +90,8 @@ public class ConsoleLoggerTests } /// - /// 测试写入操作是否包含时间戳信息 - /// 验证每条日志消息都包含格式化的日期时间信息 + /// 测试写入操作是否包含时间戳信息 + /// 验证每条日志消息都包含格式化的日期时间信息 /// [Test] public void Write_ShouldIncludeTimestamp() @@ -103,8 +103,8 @@ public class ConsoleLoggerTests } /// - /// 测试写入操作是否包含日志级别信息 - /// 验证不同级别的日志消息都能正确显示对应的级别标识 + /// 测试写入操作是否包含日志级别信息 + /// 验证不同级别的日志消息都能正确显示对应的级别标识 /// [Test] public void Write_ShouldIncludeLevel() @@ -121,8 +121,8 @@ public class ConsoleLoggerTests } /// - /// 测试写入操作是否包含日志器名称 - /// 验证日志输出中包含创建时指定的日志器名称 + /// 测试写入操作是否包含日志器名称 + /// 验证日志输出中包含创建时指定的日志器名称 /// [Test] public void Write_ShouldIncludeLoggerName() @@ -134,8 +134,8 @@ public class ConsoleLoggerTests } /// - /// 测试写入操作在包含异常时是否正确包含异常信息 - /// 验证异常的详细信息能够正确记录在日志中 + /// 测试写入操作在包含异常时是否正确包含异常信息 + /// 验证异常的详细信息能够正确记录在日志中 /// [Test] public void Write_WithException_ShouldIncludeException() @@ -149,8 +149,8 @@ public class ConsoleLoggerTests } /// - /// 测试写入多行日志时是否正确格式化 - /// 验证多条日志消息能够正确分行显示且包含正确的级别信息 + /// 测试写入多行日志时是否正确格式化 + /// 验证多条日志消息能够正确分行显示且包含正确的级别信息 /// [Test] public void Write_WithMultipleLines_ShouldFormatCorrectly() @@ -169,8 +169,8 @@ public class ConsoleLoggerTests } /// - /// 测试写入格式化消息时是否正确格式化 - /// 验证带参数的消息格式化功能正常工作 + /// 测试写入格式化消息时是否正确格式化 + /// 验证带参数的消息格式化功能正常工作 /// [Test] public void Write_WithFormattedMessage_ShouldFormatCorrectly() @@ -182,8 +182,8 @@ public class ConsoleLoggerTests } /// - /// 测试写入操作是否遵循最小日志级别限制 - /// 验证低于最小级别的日志消息不会被记录 + /// 测试写入操作是否遵循最小日志级别限制 + /// 验证低于最小级别的日志消息不会被记录 /// [Test] public void Write_ShouldRespectMinLevel() @@ -199,8 +199,8 @@ public class ConsoleLoggerTests } /// - /// 测试启用颜色功能时是否不影响输出内容 - /// 验证即使颜色功能被禁用,日志内容仍然正确记录 + /// 测试启用颜色功能时是否不影响输出内容 + /// 验证即使颜色功能被禁用,日志内容仍然正确记录 /// [Test] public void Write_WithColorsEnabled_ShouldNotAffectOutputContent() @@ -214,8 +214,8 @@ public class ConsoleLoggerTests } /// - /// 测试所有日志级别是否都能正确格式化 - /// 验证从Trace到Fatal的所有日志级别都能正确显示 + /// 测试所有日志级别是否都能正确格式化 + /// 验证从Trace到Fatal的所有日志级别都能正确显示 /// [Test] public void Write_AllLogLevels_ShouldFormatCorrectly() @@ -235,8 +235,8 @@ public class ConsoleLoggerTests } /// - /// 测试写入嵌套异常时是否包含完整的异常信息 - /// 验证嵌套异常的所有层级信息都能被正确记录 + /// 测试写入嵌套异常时是否包含完整的异常信息 + /// 验证嵌套异常的所有层级信息都能被正确记录 /// [Test] public void Write_WithNestedException_ShouldIncludeFullException() @@ -253,8 +253,8 @@ public class ConsoleLoggerTests } /// - /// 测试使用空写入器时是否不会抛出异常 - /// 验证当传入null写入器时,日志器能够安全处理而不崩溃 + /// 测试使用空写入器时是否不会抛出异常 + /// 验证当传入null写入器时,日志器能够安全处理而不崩溃 /// [Test] public void Write_WithNullWriter_ShouldNotThrow() @@ -265,8 +265,8 @@ public class ConsoleLoggerTests } /// - /// 测试写入空消息时是否仍能正常写入 - /// 验证即使消息为空字符串,日志框架仍能生成包含其他信息的完整日志条目 + /// 测试写入空消息时是否仍能正常写入 + /// 验证即使消息为空字符串,日志框架仍能生成包含其他信息的完整日志条目 /// [Test] public void Write_WithEmptyMessage_ShouldStillWrite() diff --git a/GFramework.Core.Tests/logging/LoggerFactoryTests.cs b/GFramework.Core.Tests/logging/LoggerFactoryTests.cs index d3529dd..f76a60f 100644 --- a/GFramework.Core.Tests/logging/LoggerFactoryTests.cs +++ b/GFramework.Core.Tests/logging/LoggerFactoryTests.cs @@ -6,19 +6,19 @@ using NUnit.Framework; namespace GFramework.Core.Tests.logging; /// -/// 测试LoggerFactory相关功能的测试类 +/// 测试LoggerFactory相关功能的测试类 /// [TestFixture] public class LoggerFactoryTests { /// - /// 测试ConsoleLoggerFactory的GetLogger方法是否返回ConsoleLogger实例 + /// 测试ConsoleLoggerFactory的GetLogger方法是否返回ConsoleLogger实例 /// [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()); @@ -26,7 +26,7 @@ public class LoggerFactoryTests } /// - /// 测试ConsoleLoggerFactory使用不同名称获取不同的logger实例 + /// 测试ConsoleLoggerFactory使用不同名称获取不同的logger实例 /// [Test] public void ConsoleLoggerFactory_GetLogger_WithDifferentNames_ShouldReturnDifferentLoggers() @@ -40,7 +40,7 @@ public class LoggerFactoryTests } /// - /// 测试ConsoleLoggerFactory使用默认最小级别时的行为(默认为Info级别) + /// 测试ConsoleLoggerFactory使用默认最小级别时的行为(默认为Info级别) /// [Test] public void ConsoleLoggerFactory_GetLogger_WithDefaultMinLevel_ShouldUseInfo() @@ -61,7 +61,7 @@ public class LoggerFactoryTests } /// - /// 测试ConsoleLoggerFactoryProvider创建logger时使用提供者的最小级别设置 + /// 测试ConsoleLoggerFactoryProvider创建logger时使用提供者的最小级别设置 /// [Test] public void ConsoleLoggerFactoryProvider_CreateLogger_ShouldReturnLoggerWithProviderMinLevel() @@ -82,7 +82,7 @@ public class LoggerFactoryTests } /// - /// 测试ConsoleLoggerFactoryProvider创建logger时使用提供的名称 + /// 测试ConsoleLoggerFactoryProvider创建logger时使用提供的名称 /// [Test] public void ConsoleLoggerFactoryProvider_CreateLogger_ShouldUseProvidedName() @@ -94,7 +94,7 @@ public class LoggerFactoryTests } /// - /// 测试LoggerFactoryResolver的Provider属性是否有默认值 + /// 测试LoggerFactoryResolver的Provider属性是否有默认值 /// [Test] public void LoggerFactoryResolver_Provider_ShouldHaveDefaultValue() @@ -104,7 +104,7 @@ public class LoggerFactoryTests } /// - /// 测试LoggerFactoryResolver的Provider属性可以被更改 + /// 测试LoggerFactoryResolver的Provider属性可以被更改 /// [Test] public void LoggerFactoryResolver_Provider_CanBeChanged() @@ -120,7 +120,7 @@ public class LoggerFactoryTests } /// - /// 测试LoggerFactoryResolver的MinLevel属性是否有默认值 + /// 测试LoggerFactoryResolver的MinLevel属性是否有默认值 /// [Test] public void LoggerFactoryResolver_MinLevel_ShouldHaveDefaultValue() @@ -129,7 +129,7 @@ public class LoggerFactoryTests } /// - /// 测试LoggerFactoryResolver的MinLevel属性可以被更改 + /// 测试LoggerFactoryResolver的MinLevel属性可以被更改 /// [Test] public void LoggerFactoryResolver_MinLevel_CanBeChanged() @@ -144,7 +144,7 @@ public class LoggerFactoryTests } /// - /// 测试ConsoleLoggerFactoryProvider的MinLevel属性是否有默认值 + /// 测试ConsoleLoggerFactoryProvider的MinLevel属性是否有默认值 /// [Test] public void ConsoleLoggerFactoryProvider_MinLevel_ShouldHaveDefaultValue() @@ -155,7 +155,7 @@ public class LoggerFactoryTests } /// - /// 测试ConsoleLoggerFactoryProvider的MinLevel属性可以被更改 + /// 测试ConsoleLoggerFactoryProvider的MinLevel属性可以被更改 /// [Test] public void ConsoleLoggerFactoryProvider_MinLevel_CanBeChanged() @@ -168,7 +168,7 @@ public class LoggerFactoryTests } /// - /// 测试LoggerFactoryResolver的Provider创建logger时使用提供者设置 + /// 测试LoggerFactoryResolver的Provider创建logger时使用提供者设置 /// [Test] public void LoggerFactoryResolver_Provider_CreateLogger_ShouldUseProviderSettings() @@ -195,7 +195,7 @@ public class LoggerFactoryTests } /// - /// 测试LoggerFactoryResolver的MinLevel属性影响新创建的logger + /// 测试LoggerFactoryResolver的MinLevel属性影响新创建的logger /// [Test] public void LoggerFactoryResolver_MinLevel_AffectsNewLoggers() @@ -222,13 +222,13 @@ public class LoggerFactoryTests } /// - /// 测试ConsoleLoggerFactory创建的多个logger实例是独立的 + /// 测试ConsoleLoggerFactory创建的多个logger实例是独立的 /// [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 } /// - /// 测试ConsoleLoggerFactoryProvider的MinLevel不会影响已创建的logger + /// 测试ConsoleLoggerFactoryProvider的MinLevel不会影响已创建的logger /// [Test] public void ConsoleLoggerFactoryProvider_MinLevel_DoesNotAffectCreatedLogger() diff --git a/GFramework.Core.Tests/logging/LoggerTests.cs b/GFramework.Core.Tests/logging/LoggerTests.cs index 5e62625..a14f34b 100644 --- a/GFramework.Core.Tests/logging/LoggerTests.cs +++ b/GFramework.Core.Tests/logging/LoggerTests.cs @@ -5,25 +5,25 @@ using NUnit.Framework; namespace GFramework.Core.Tests.logging; /// -/// 测试Logger功能的单元测试类 +/// 测试Logger功能的单元测试类 /// [TestFixture] public class LoggerTests { /// - /// 在每个测试方法执行前设置测试环境 - /// 创建一个新的TestLogger实例,名称为"TestLogger",最小日志级别为Info + /// 在每个测试方法执行前设置测试环境 + /// 创建一个新的TestLogger实例,名称为"TestLogger",最小日志级别为Info /// [SetUp] public void SetUp() { - _logger = new TestLogger("TestLogger", LogLevel.Info); + _logger = new TestLogger("TestLogger"); } private TestLogger _logger = null!; /// - /// 验证Name方法是否正确返回Logger的名称 + /// 验证Name方法是否正确返回Logger的名称 /// [Test] public void Name_Should_ReturnLoggerName() @@ -34,7 +34,7 @@ public class LoggerTests } /// - /// 验证当使用默认名称时,Name方法是否返回根Logger名称"ROOT" + /// 验证当使用默认名称时,Name方法是否返回根Logger名称"ROOT" /// [Test] public void Name_WithDefaultName_Should_ReturnRootLoggerName() @@ -45,7 +45,7 @@ public class LoggerTests } /// - /// 验证当最小日志级别为Info时,IsTraceEnabled方法是否返回false + /// 验证当最小日志级别为Info时,IsTraceEnabled方法是否返回false /// [Test] public void IsTraceEnabled_WithInfoMinLevel_Should_ReturnFalse() @@ -54,7 +54,7 @@ public class LoggerTests } /// - /// 验证当最小日志级别为Info时,IsDebugEnabled方法是否返回false + /// 验证当最小日志级别为Info时,IsDebugEnabled方法是否返回false /// [Test] public void IsDebugEnabled_WithInfoMinLevel_Should_ReturnFalse() @@ -63,7 +63,7 @@ public class LoggerTests } /// - /// 验证当最小日志级别为Info时,IsInfoEnabled方法是否返回true + /// 验证当最小日志级别为Info时,IsInfoEnabled方法是否返回true /// [Test] public void IsInfoEnabled_WithInfoMinLevel_Should_ReturnTrue() @@ -72,7 +72,7 @@ public class LoggerTests } /// - /// 验证当最小日志级别为Info时,IsWarnEnabled方法是否返回true + /// 验证当最小日志级别为Info时,IsWarnEnabled方法是否返回true /// [Test] public void IsWarnEnabled_WithInfoMinLevel_Should_ReturnTrue() @@ -81,7 +81,7 @@ public class LoggerTests } /// - /// 验证当最小日志级别为Info时,IsErrorEnabled方法是否返回true + /// 验证当最小日志级别为Info时,IsErrorEnabled方法是否返回true /// [Test] public void IsErrorEnabled_WithInfoMinLevel_Should_ReturnTrue() @@ -90,7 +90,7 @@ public class LoggerTests } /// - /// 验证当最小日志级别为Info时,IsFatalEnabled方法是否返回true + /// 验证当最小日志级别为Info时,IsFatalEnabled方法是否返回true /// [Test] public void IsFatalEnabled_WithInfoMinLevel_Should_ReturnTrue() @@ -99,7 +99,7 @@ public class LoggerTests } /// - /// 验证IsEnabledForLevel方法对于不同日志级别的返回值是否正确 + /// 验证IsEnabledForLevel方法对于不同日志级别的返回值是否正确 /// [Test] public void IsEnabledForLevel_WithValidLevel_Should_ReturnCorrectResult() @@ -113,7 +113,7 @@ public class LoggerTests } /// - /// 验证当传入无效的日志级别时,IsEnabledForLevel方法是否会抛出ArgumentException异常 + /// 验证当传入无效的日志级别时,IsEnabledForLevel方法是否会抛出ArgumentException异常 /// [Test] public void IsEnabledForLevel_WithInvalidLevel_Should_ThrowArgumentException() @@ -122,7 +122,7 @@ public class LoggerTests } /// - /// 验证当Trace级别被禁用时,Trace方法不会写入日志 + /// 验证当Trace级别被禁用时,Trace方法不会写入日志 /// [Test] public void Trace_ShouldNotWrite_WhenTraceDisabled() @@ -133,7 +133,7 @@ public class LoggerTests } /// - /// 验证当Trace级别被禁用时,带格式化参数的Trace方法不会写入日志 + /// 验证当Trace级别被禁用时,带格式化参数的Trace方法不会写入日志 /// [Test] public void Trace_WithFormat_ShouldNotWrite_WhenTraceDisabled() @@ -144,7 +144,7 @@ public class LoggerTests } /// - /// 验证当Trace级别被禁用时,带两个参数的Trace方法不会写入日志 + /// 验证当Trace级别被禁用时,带两个参数的Trace方法不会写入日志 /// [Test] public void Trace_WithTwoArgs_ShouldNotWrite_WhenTraceDisabled() @@ -155,7 +155,7 @@ public class LoggerTests } /// - /// 验证当Trace级别被禁用时,带异常参数的Trace方法不会写入日志 + /// 验证当Trace级别被禁用时,带异常参数的Trace方法不会写入日志 /// [Test] public void Trace_WithException_ShouldNotWrite_WhenTraceDisabled() @@ -167,7 +167,7 @@ public class LoggerTests } /// - /// 验证当Debug级别被禁用时,Debug方法不会写入日志 + /// 验证当Debug级别被禁用时,Debug方法不会写入日志 /// [Test] public void Debug_ShouldNotWrite_WhenDebugDisabled() @@ -178,7 +178,7 @@ public class LoggerTests } /// - /// 验证当Debug级别被禁用时,带格式化参数的Debug方法不会写入日志 + /// 验证当Debug级别被禁用时,带格式化参数的Debug方法不会写入日志 /// [Test] public void Debug_WithFormat_ShouldNotWrite_WhenDebugDisabled() @@ -189,7 +189,7 @@ public class LoggerTests } /// - /// 验证当Info级别启用时,Info方法会正确写入日志 + /// 验证当Info级别启用时,Info方法会正确写入日志 /// [Test] public void Info_ShouldWrite_WhenInfoEnabled() @@ -203,7 +203,7 @@ public class LoggerTests } /// - /// 验证带格式化参数的Info方法会正确写入格式化后的消息 + /// 验证带格式化参数的Info方法会正确写入格式化后的消息 /// [Test] public void Info_WithFormat_ShouldWriteFormattedMessage() @@ -215,7 +215,7 @@ public class LoggerTests } /// - /// 验证带两个参数的Info方法会正确写入格式化后的消息 + /// 验证带两个参数的Info方法会正确写入格式化后的消息 /// [Test] public void Info_WithTwoArgs_ShouldWriteFormattedMessage() @@ -227,7 +227,7 @@ public class LoggerTests } /// - /// 验证带多个参数的Info方法会正确写入格式化后的消息 + /// 验证带多个参数的Info方法会正确写入格式化后的消息 /// [Test] public void Info_WithMultipleArgs_ShouldWriteFormattedMessage() @@ -239,7 +239,7 @@ public class LoggerTests } /// - /// 验证带异常参数的Info方法会正确写入消息和异常 + /// 验证带异常参数的Info方法会正确写入消息和异常 /// [Test] public void Info_WithException_ShouldWriteMessageAndException() @@ -253,7 +253,7 @@ public class LoggerTests } /// - /// 验证当Warn级别启用时,Warn方法会正确写入日志 + /// 验证当Warn级别启用时,Warn方法会正确写入日志 /// [Test] public void Warn_ShouldWrite_WhenWarnEnabled() @@ -266,7 +266,7 @@ public class LoggerTests } /// - /// 验证带格式化参数的Warn方法会正确写入格式化后的消息 + /// 验证带格式化参数的Warn方法会正确写入格式化后的消息 /// [Test] public void Warn_WithFormat_ShouldWriteFormattedMessage() @@ -278,7 +278,7 @@ public class LoggerTests } /// - /// 验证带异常参数的Warn方法会正确写入消息和异常 + /// 验证带异常参数的Warn方法会正确写入消息和异常 /// [Test] public void Warn_WithException_ShouldWriteMessageAndException() @@ -291,7 +291,7 @@ public class LoggerTests } /// - /// 验证当Error级别启用时,Error方法会正确写入日志 + /// 验证当Error级别启用时,Error方法会正确写入日志 /// [Test] public void Error_ShouldWrite_WhenErrorEnabled() @@ -304,7 +304,7 @@ public class LoggerTests } /// - /// 验证带格式化参数的Error方法会正确写入格式化后的消息 + /// 验证带格式化参数的Error方法会正确写入格式化后的消息 /// [Test] public void Error_WithFormat_ShouldWriteFormattedMessage() @@ -316,7 +316,7 @@ public class LoggerTests } /// - /// 验证带异常参数的Error方法会正确写入消息和异常 + /// 验证带异常参数的Error方法会正确写入消息和异常 /// [Test] public void Error_WithException_ShouldWriteMessageAndException() @@ -329,7 +329,7 @@ public class LoggerTests } /// - /// 验证当Fatal级别启用时,Fatal方法会正确写入日志 + /// 验证当Fatal级别启用时,Fatal方法会正确写入日志 /// [Test] public void Fatal_ShouldWrite_WhenFatalEnabled() @@ -342,7 +342,7 @@ public class LoggerTests } /// - /// 验证带格式化参数的Fatal方法会正确写入格式化后的消息 + /// 验证带格式化参数的Fatal方法会正确写入格式化后的消息 /// [Test] public void Fatal_WithFormat_ShouldWriteFormattedMessage() @@ -354,7 +354,7 @@ public class LoggerTests } /// - /// 验证带异常参数的Fatal方法会正确写入消息和异常 + /// 验证带异常参数的Fatal方法会正确写入消息和异常 /// [Test] public void Fatal_WithException_ShouldWriteMessageAndException() @@ -367,7 +367,7 @@ public class LoggerTests } /// - /// 验证多次调用日志方法会累积日志条目 + /// 验证多次调用日志方法会累积日志条目 /// [Test] public void MultipleLogCalls_ShouldAccumulateLogs() @@ -383,7 +383,7 @@ public class LoggerTests } /// - /// 验证当最小日志级别设置为Trace时,所有级别的日志都会被启用 + /// 验证当最小日志级别设置为Trace时,所有级别的日志都会被启用 /// [Test] public void Logger_WithTraceMinLevel_ShouldEnableAllLevels() @@ -401,7 +401,7 @@ public class LoggerTests } /// - /// 验证当最小日志级别设置为Fatal时,只有Fatal级别的日志会被启用 + /// 验证当最小日志级别设置为Fatal时,只有Fatal级别的日志会被启用 /// [Test] public void Logger_WithFatalMinLevel_ShouldDisableAllButFatal() @@ -421,12 +421,12 @@ public class LoggerTests } /// -/// 测试用的日志记录器实现类,继承自AbstractLogger +/// 测试用的日志记录器实现类,继承自AbstractLogger /// public sealed class TestLogger : AbstractLogger { /// - /// 初始化TestLogger的新实例 + /// 初始化TestLogger的新实例 /// /// 日志记录器的名称,默认为null /// 最小日志级别,默认为LogLevel.Info @@ -435,12 +435,12 @@ public sealed class TestLogger : AbstractLogger } /// - /// 获取记录的日志条目列表 + /// 获取记录的日志条目列表 /// public List Logs { get; } = new(); /// - /// 将日志信息写入内部存储 + /// 将日志信息写入内部存储 /// /// 日志级别 /// 日志消息 @@ -451,7 +451,7 @@ public sealed class TestLogger : AbstractLogger } /// - /// 表示单个日志条目的记录类型 + /// 表示单个日志条目的记录类型 /// /// 日志级别 /// 日志消息 diff --git a/GFramework.Core.Tests/pool/ObjectPoolTests.cs b/GFramework.Core.Tests/pool/ObjectPoolTests.cs index ec262a2..b3fa16c 100644 --- a/GFramework.Core.Tests/pool/ObjectPoolTests.cs +++ b/GFramework.Core.Tests/pool/ObjectPoolTests.cs @@ -5,13 +5,13 @@ using NUnit.Framework; namespace GFramework.Core.Tests.pool; /// -/// 对象池功能测试类,用于验证对象池的基本操作和行为 +/// 对象池功能测试类,用于验证对象池的基本操作和行为 /// [TestFixture] public class ObjectPoolTests { /// - /// 测试初始化方法,在每个测试方法执行前设置测试环境 + /// 测试初始化方法,在每个测试方法执行前设置测试环境 /// [SetUp] public void SetUp() @@ -20,12 +20,12 @@ public class ObjectPoolTests } /// - /// 测试用的对象池实例 + /// 测试用的对象池实例 /// private TestObjectPool _pool = null!; /// - /// 验证当对象池为空时,Acquire方法应该创建新对象 + /// 验证当对象池为空时,Acquire方法应该创建新对象 /// [Test] public void Acquire_Should_Create_New_Object_When_Pool_Empty() @@ -38,7 +38,7 @@ public class ObjectPoolTests } /// - /// 验证Acquire方法应该返回池中的可用对象 + /// 验证Acquire方法应该返回池中的可用对象 /// [Test] public void Acquire_Should_Return_Pooled_Object() @@ -56,7 +56,7 @@ public class ObjectPoolTests } /// - /// 验证Release方法应该调用对象的OnRelease回调 + /// 验证Release方法应该调用对象的OnRelease回调 /// [Test] public void Release_Should_Call_OnRelease() @@ -69,7 +69,7 @@ public class ObjectPoolTests } /// - /// 验证Clear方法应该销毁所有对象 + /// 验证Clear方法应该销毁所有对象 /// [Test] public void Clear_Should_Destroy_All_Objects() @@ -87,7 +87,7 @@ public class ObjectPoolTests } /// - /// 验证多个池键应该相互独立 + /// 验证多个池键应该相互独立 /// [Test] public void Multiple_Pools_Should_Be_Independent() @@ -105,7 +105,7 @@ public class ObjectPoolTests } /// - /// 验证OnAcquire回调应该在新对象和池中对象上都被调用 + /// 验证OnAcquire回调应该在新对象和池中对象上都被调用 /// [Test] public void OnAcquire_Should_Be_Called_On_New_And_Pooled_Objects() @@ -122,12 +122,12 @@ public class ObjectPoolTests } /// -/// 测试用对象池实现类,继承自AbstractObjectPoolSystem +/// 测试用对象池实现类,继承自AbstractObjectPoolSystem /// public class TestObjectPool : AbstractObjectPoolSystem { /// - /// 创建新的池化对象 + /// 创建新的池化对象 /// /// 用于标识对象的键 /// 新创建的TestPoolableObject实例 @@ -137,7 +137,7 @@ public class TestObjectPool : AbstractObjectPoolSystem - /// 初始化方法,用于对象池初始化时的操作 + /// 初始化方法,用于对象池初始化时的操作 /// protected override void OnInit() { @@ -145,37 +145,37 @@ public class TestObjectPool : AbstractObjectPoolSystem -/// 测试用池化对象类,实现了IPoolableObject接口 +/// 测试用池化对象类,实现了IPoolableObject接口 /// public class TestPoolableObject : IPoolableObject { /// - /// 获取或设置对象的池键 + /// 获取或设置对象的池键 /// public string PoolKey { get; set; } = string.Empty; /// - /// 获取或设置测试用的整数值 + /// 获取或设置测试用的整数值 /// public int TestValue { get; set; } /// - /// 获取或设置OnAcquire方法是否被调用的标志 + /// 获取或设置OnAcquire方法是否被调用的标志 /// public bool OnAcquireCalled { get; set; } /// - /// 获取或设置OnRelease方法是否被调用的标志 + /// 获取或设置OnRelease方法是否被调用的标志 /// public bool OnReleaseCalled { get; set; } /// - /// 获取或设置OnPoolDestroy方法是否被调用的标志 + /// 获取或设置OnPoolDestroy方法是否被调用的标志 /// public bool OnPoolDestroyCalled { get; set; } /// - /// 对象被获取时的回调方法 + /// 对象被获取时的回调方法 /// public void OnAcquire() { @@ -183,7 +183,7 @@ public class TestPoolableObject : IPoolableObject } /// - /// 对象被释放时的回调方法 + /// 对象被释放时的回调方法 /// public void OnRelease() { @@ -191,7 +191,7 @@ public class TestPoolableObject : IPoolableObject } /// - /// 对象被销毁时的回调方法 + /// 对象被销毁时的回调方法 /// public void OnPoolDestroy() { diff --git a/GFramework.Core.Tests/property/BindablePropertyTests.cs b/GFramework.Core.Tests/property/BindablePropertyTests.cs index 650a0e8..fd360d9 100644 --- a/GFramework.Core.Tests/property/BindablePropertyTests.cs +++ b/GFramework.Core.Tests/property/BindablePropertyTests.cs @@ -4,13 +4,13 @@ using NUnit.Framework; namespace GFramework.Core.Tests.property; /// -/// BindableProperty类的单元测试 +/// BindableProperty类的单元测试 /// [TestFixture] public class BindablePropertyTests { /// - /// 测试清理方法,在每个测试方法执行后重置比较器 + /// 测试清理方法,在每个测试方法执行后重置比较器 /// [TearDown] public void TearDown() @@ -19,7 +19,7 @@ public class BindablePropertyTests } /// - /// 测试获取值时应返回默认值 + /// 测试获取值时应返回默认值 /// [Test] public void Value_Get_Should_Return_Default_Value() @@ -30,7 +30,7 @@ public class BindablePropertyTests } /// - /// 测试设置值时应触发事件 + /// 测试设置值时应触发事件 /// [Test] public void Value_Set_Should_Trigger_Event() @@ -46,7 +46,7 @@ public class BindablePropertyTests } /// - /// 测试设置相同值时不触发事件 + /// 测试设置相同值时不触发事件 /// [Test] public void Value_Set_To_Same_Value_Should_Not_Trigger_Event() @@ -62,7 +62,7 @@ public class BindablePropertyTests } /// - /// 测试取消注册应移除处理器 + /// 测试取消注册应移除处理器 /// [Test] public void UnRegister_Should_Remove_Handler() @@ -82,7 +82,7 @@ public class BindablePropertyTests } /// - /// 测试带初始值注册应立即调用处理器 + /// 测试带初始值注册应立即调用处理器 /// [Test] public void RegisterWithInitValue_Should_Call_Handler_Immediately() @@ -96,7 +96,7 @@ public class BindablePropertyTests } /// - /// 测试无事件设置值不应触发事件 + /// 测试无事件设置值不应触发事件 /// [Test] public void SetValueWithoutEvent_Should_Not_Trigger_Event() @@ -113,7 +113,7 @@ public class BindablePropertyTests } /// - /// 测试使用自定义比较器 + /// 测试使用自定义比较器 /// [Test] public void WithComparer_Should_Use_Custom_Comparer() @@ -141,7 +141,7 @@ public class BindablePropertyTests } /// - /// 测试多个处理器都应被调用 + /// 测试多个处理器都应被调用 /// [Test] public void Multiple_Handlers_Should_All_Be_Called() @@ -160,7 +160,7 @@ public class BindablePropertyTests } /// - /// 测试注册应返回IUnRegister接口 + /// 测试注册应返回IUnRegister接口 /// [Test] public void Register_Should_Return_IUnRegister() @@ -172,7 +172,7 @@ public class BindablePropertyTests } /// - /// 测试ToString应返回值的字符串表示 + /// 测试ToString应返回值的字符串表示 /// [Test] public void ToString_Should_Return_Value_As_String() diff --git a/GFramework.Core.Tests/query/AbstractAsyncQueryTests.cs b/GFramework.Core.Tests/query/AbstractAsyncQueryTests.cs index b165954..4cf020b 100644 --- a/GFramework.Core.Tests/query/AbstractAsyncQueryTests.cs +++ b/GFramework.Core.Tests/query/AbstractAsyncQueryTests.cs @@ -11,18 +11,18 @@ using NUnit.Framework; namespace GFramework.Core.Tests.query; /// -/// AbstractAsyncQuery类的单元测试 -/// 测试内容包括: -/// - 异步查询的基础实现 -/// - DoAsync方法调用 -/// - DoAsync方法的异常处理 -/// - 上下文感知功能(SetContext, GetContext) -/// - 日志功能(Logger属性) -/// - 子类继承行为验证 -/// - 查询执行前日志记录 -/// - 查询执行后日志记录 -/// - 返回值类型验证 -/// - 错误情况下的日志记录 +/// AbstractAsyncQuery类的单元测试 +/// 测试内容包括: +/// - 异步查询的基础实现 +/// - DoAsync方法调用 +/// - DoAsync方法的异常处理 +/// - 上下文感知功能(SetContext, GetContext) +/// - 日志功能(Logger属性) +/// - 子类继承行为验证 +/// - 查询执行前日志记录 +/// - 查询执行后日志记录 +/// - 返回值类型验证 +/// - 错误情况下的日志记录 /// [TestFixture] public class AbstractAsyncQueryTests @@ -43,7 +43,7 @@ public class AbstractAsyncQueryTests private IocContainer _container = null!; /// - /// 测试异步查询的基础实现 + /// 测试异步查询的基础实现 /// [Test] public async Task AbstractAsyncQuery_Should_Implement_IAsyncQuery_Interface() @@ -55,7 +55,7 @@ public class AbstractAsyncQueryTests } /// - /// 测试DoAsync方法调用 + /// 测试DoAsync方法调用 /// [Test] public async Task DoAsync_Should_Invoke_OnDoAsync_Method() @@ -71,7 +71,7 @@ public class AbstractAsyncQueryTests } /// - /// 测试DoAsync方法的异常处理 + /// 测试DoAsync方法的异常处理 /// [Test] public void DoAsync_Should_Propagate_Exception_From_OnDoAsync() @@ -84,7 +84,7 @@ public class AbstractAsyncQueryTests } /// - /// 测试上下文感知功能 - SetContext方法 + /// 测试上下文感知功能 - SetContext方法 /// [Test] public void SetContext_Should_Set_Context_Property() @@ -100,7 +100,7 @@ public class AbstractAsyncQueryTests } /// - /// 测试上下文感知功能 - GetContext方法 + /// 测试上下文感知功能 - GetContext方法 /// [Test] public void GetContext_Should_Return_Context_Property() @@ -117,7 +117,7 @@ public class AbstractAsyncQueryTests } /// - /// 测试子类继承行为验证 + /// 测试子类继承行为验证 /// [Test] public async Task Child_Class_Should_Inherit_And_Override_OnDoAsync_Method() @@ -133,7 +133,7 @@ public class AbstractAsyncQueryTests } /// - /// 测试异步查询执行生命周期完整性 + /// 测试异步查询执行生命周期完整性 /// [Test] public async Task AsyncQuery_Should_Complete_Execution_Lifecycle() @@ -151,7 +151,7 @@ public class AbstractAsyncQueryTests } /// - /// 测试异步查询多次执行 + /// 测试异步查询多次执行 /// [Test] public async Task AsyncQuery_Should_Be_Executable_Multiple_Times() @@ -168,7 +168,7 @@ public class AbstractAsyncQueryTests } /// - /// 测试异步查询的返回值类型 + /// 测试异步查询的返回值类型 /// [Test] public async Task AsyncQuery_Should_Return_Correct_Type() @@ -184,7 +184,7 @@ public class AbstractAsyncQueryTests } /// - /// 测试异步查询的字符串返回值 + /// 测试异步查询的字符串返回值 /// [Test] public async Task AsyncQuery_WithStringResult_Should_Return_String() @@ -200,7 +200,7 @@ public class AbstractAsyncQueryTests } /// - /// 测试异步查询的复杂对象返回值 + /// 测试异步查询的复杂对象返回值 /// [Test] public async Task AsyncQuery_WithComplexResult_Should_Return_ComplexObject() @@ -217,7 +217,7 @@ public class AbstractAsyncQueryTests } /// - /// 测试异步查询在不同实例之间的独立性 + /// 测试异步查询在不同实例之间的独立性 /// [Test] public async Task AsyncQuery_Should_Maintain_Independence_Between_Different_Instances() @@ -238,23 +238,23 @@ public class AbstractAsyncQueryTests } /// -/// 测试用异步查询输入类V2 +/// 测试用异步查询输入类V2 /// public sealed class TestAsyncQueryInputV2 : IQueryInput { /// - /// 获取或设置值 + /// 获取或设置值 /// public int Value { get; init; } } /// -/// 整数类型测试异步查询类V4,继承AbstractAsyncQuery +/// 整数类型测试异步查询类V4,继承AbstractAsyncQuery /// public sealed class TestAsyncQueryV4 : AbstractAsyncQuery { /// - /// 初始化TestAsyncQueryV4的新实例 + /// 初始化TestAsyncQueryV4的新实例 /// /// 查询输入参数 public TestAsyncQueryV4(TestAsyncQueryInputV2 input) : base(input) @@ -262,12 +262,12 @@ public sealed class TestAsyncQueryV4 : AbstractAsyncQuery - /// 获取查询是否已执行 + /// 获取查询是否已执行 /// public bool Executed { get; private set; } /// - /// 执行异步查询操作的具体实现 + /// 执行异步查询操作的具体实现 /// /// 查询输入参数 /// 查询结果,将输入值乘以2 @@ -279,12 +279,12 @@ public sealed class TestAsyncQueryV4 : AbstractAsyncQuery -/// 字符串类型测试异步查询类V4,继承AbstractAsyncQuery +/// 字符串类型测试异步查询类V4,继承AbstractAsyncQuery /// public sealed class TestAsyncStringQueryV4 : AbstractAsyncQuery { /// - /// 初始化TestAsyncStringQueryV4的新实例 + /// 初始化TestAsyncStringQueryV4的新实例 /// /// 查询输入参数 public TestAsyncStringQueryV4(TestAsyncQueryInputV2 input) : base(input) @@ -292,12 +292,12 @@ public sealed class TestAsyncStringQueryV4 : AbstractAsyncQuery - /// 获取查询是否已执行 + /// 获取查询是否已执行 /// public bool Executed { get; private set; } /// - /// 执行异步查询操作的具体实现 + /// 执行异步查询操作的具体实现 /// /// 查询输入参数 /// 格式化的字符串结果 @@ -309,12 +309,12 @@ public sealed class TestAsyncStringQueryV4 : AbstractAsyncQuery -/// 复杂对象类型测试异步查询类V4,继承AbstractAsyncQuery +/// 复杂对象类型测试异步查询类V4,继承AbstractAsyncQuery /// public sealed class TestAsyncComplexQueryV4 : AbstractAsyncQuery { /// - /// 初始化TestAsyncComplexQueryV4的新实例 + /// 初始化TestAsyncComplexQueryV4的新实例 /// /// 查询输入参数 public TestAsyncComplexQueryV4(TestAsyncQueryInputV2 input) : base(input) @@ -322,12 +322,12 @@ public sealed class TestAsyncComplexQueryV4 : AbstractAsyncQuery - /// 获取查询是否已执行 + /// 获取查询是否已执行 /// public bool Executed { get; private set; } /// - /// 执行异步查询操作的具体实现 + /// 执行异步查询操作的具体实现 /// /// 查询输入参数 /// 复杂对象查询结果 @@ -344,12 +344,12 @@ public sealed class TestAsyncComplexQueryV4 : AbstractAsyncQuery -/// 测试用异步查询类(抛出异常) +/// 测试用异步查询类(抛出异常) /// public sealed class TestAsyncQueryWithExceptionV4 : AbstractAsyncQuery { /// - /// 初始化TestAsyncQueryWithExceptionV4的新实例 + /// 初始化TestAsyncQueryWithExceptionV4的新实例 /// /// 查询输入参数 public TestAsyncQueryWithExceptionV4(TestAsyncQueryInputV2 input) : base(input) @@ -357,7 +357,7 @@ public sealed class TestAsyncQueryWithExceptionV4 : AbstractAsyncQuery - /// 执行异步查询操作并抛出异常 + /// 执行异步查询操作并抛出异常 /// /// 查询输入参数 /// 总是抛出异常 @@ -368,12 +368,12 @@ public sealed class TestAsyncQueryWithExceptionV4 : AbstractAsyncQuery -/// 测试用异步查询子类V4,继承AbstractAsyncQuery +/// 测试用异步查询子类V4,继承AbstractAsyncQuery /// public sealed class TestAsyncQueryChildV4 : AbstractAsyncQuery { /// - /// 初始化TestAsyncQueryChildV4的新实例 + /// 初始化TestAsyncQueryChildV4的新实例 /// /// 查询输入参数 public TestAsyncQueryChildV4(TestAsyncQueryInputV2 input) : base(input) @@ -381,12 +381,12 @@ public sealed class TestAsyncQueryChildV4 : AbstractAsyncQuery - /// 获取查询是否已执行 + /// 获取查询是否已执行 /// public bool Executed { get; private set; } /// - /// 执行异步查询操作的具体实现(子类实现,乘以3) + /// 执行异步查询操作的具体实现(子类实现,乘以3) /// /// 查询输入参数 /// 查询结果,将输入值乘以3 @@ -398,17 +398,17 @@ public sealed class TestAsyncQueryChildV4 : AbstractAsyncQuery -/// 测试用复杂查询结果类V2 +/// 测试用复杂查询结果类V2 /// public sealed class TestAsyncQueryResultV2 { /// - /// 获取或设置值 + /// 获取或设置值 /// public int Value { get; init; } /// - /// 获取或设置双倍值 + /// 获取或设置双倍值 /// public int DoubleValue { get; init; } } \ No newline at end of file diff --git a/GFramework.Core.Tests/query/AsyncQueryBusTests.cs b/GFramework.Core.Tests/query/AsyncQueryBusTests.cs index 8c748a4..2bdb793 100644 --- a/GFramework.Core.Tests/query/AsyncQueryBusTests.cs +++ b/GFramework.Core.Tests/query/AsyncQueryBusTests.cs @@ -5,14 +5,14 @@ using NUnit.Framework; namespace GFramework.Core.Tests.query; /// -/// AsyncQueryBus类的单元测试 -/// 测试内容包括: -/// - SendAsync方法 - 正常查询发送 -/// - SendAsync方法 - 空查询异常 -/// - 异步查询结果正确性 -/// - 不同返回类型的异步查询支持 -/// - 异步查询的异常处理 -/// - 异步查询的上下文传递 +/// AsyncQueryBus类的单元测试 +/// 测试内容包括: +/// - SendAsync方法 - 正常查询发送 +/// - SendAsync方法 - 空查询异常 +/// - 异步查询结果正确性 +/// - 不同返回类型的异步查询支持 +/// - 异步查询的异常处理 +/// - 异步查询的上下文传递 /// [TestFixture] public class AsyncQueryBusTests @@ -26,7 +26,7 @@ public class AsyncQueryBusTests private AsyncQueryBus _asyncQueryBus = null!; /// - /// 测试SendAsync方法正确返回查询结果 + /// 测试SendAsync方法正确返回查询结果 /// [Test] public async Task SendAsync_Should_Return_Query_Result() @@ -40,7 +40,7 @@ public class AsyncQueryBusTests } /// - /// 测试SendAsync方法在传入空查询对象时是否会抛出ArgumentNullException异常 + /// 测试SendAsync方法在传入空查询对象时是否会抛出ArgumentNullException异常 /// [Test] public void SendAsync_WithNullQuery_Should_ThrowArgumentNullException() @@ -49,7 +49,7 @@ public class AsyncQueryBusTests } /// - /// 测试SendAsync方法是否能正确返回字符串类型的查询结果 + /// 测试SendAsync方法是否能正确返回字符串类型的查询结果 /// [Test] public async Task SendAsync_WithStringResult_Should_Return_String() @@ -63,7 +63,7 @@ public class AsyncQueryBusTests } /// - /// 测试SendAsync方法是否能正确返回布尔类型的查询结果 + /// 测试SendAsync方法是否能正确返回布尔类型的查询结果 /// [Test] public async Task SendAsync_WithBooleanResult_Should_Return_Boolean() @@ -77,7 +77,7 @@ public class AsyncQueryBusTests } /// - /// 测试SendAsync方法是否能正确处理复杂对象的查询结果 + /// 测试SendAsync方法是否能正确处理复杂对象的查询结果 /// [Test] public async Task SendAsync_WithComplexObjectResult_Should_Return_ComplexObject() @@ -93,7 +93,7 @@ public class AsyncQueryBusTests } /// - /// 测试SendAsync方法是否能正确处理抛出异常的查询 + /// 测试SendAsync方法是否能正确处理抛出异常的查询 /// [Test] public void SendAsync_Should_Propagate_Exception_From_Query() @@ -105,7 +105,7 @@ public class AsyncQueryBusTests } /// - /// 测试SendAsync方法多次调用 + /// 测试SendAsync方法多次调用 /// [Test] public async Task SendAsync_Should_Be_Callable_Multiple_Times() @@ -121,7 +121,7 @@ public class AsyncQueryBusTests } /// - /// 测试SendAsync方法在不同查询之间保持独立性 + /// 测试SendAsync方法在不同查询之间保持独立性 /// [Test] public async Task SendAsync_Should_Maintain_Independence_Between_Different_Queries() @@ -140,24 +140,24 @@ public class AsyncQueryBusTests } /// -/// 测试用异步查询输入类,实现IQueryInput接口 +/// 测试用异步查询输入类,实现IQueryInput接口 /// public sealed class TestAsyncQueryInput : IQueryInput { /// - /// 获取或设置查询值 + /// 获取或设置查询值 /// public int Value { get; init; } } /// -/// 整数类型测试异步查询类,继承AbstractAsyncQuery -/// 实现具体的异步查询逻辑并返回整数结果 +/// 整数类型测试异步查询类,继承AbstractAsyncQuery +/// 实现具体的异步查询逻辑并返回整数结果 /// public sealed class TestAsyncQuery : AbstractAsyncQuery { /// - /// 初始化TestAsyncQuery的新实例 + /// 初始化TestAsyncQuery的新实例 /// /// 查询输入参数 public TestAsyncQuery(TestAsyncQueryInput input) : base(input) @@ -165,7 +165,7 @@ public sealed class TestAsyncQuery : AbstractAsyncQuery - /// 执行异步查询操作的具体实现 + /// 执行异步查询操作的具体实现 /// /// 查询输入参数 /// 查询结果,将输入值乘以2 @@ -176,13 +176,13 @@ public sealed class TestAsyncQuery : AbstractAsyncQuery -/// 字符串类型测试异步查询类,继承AbstractAsyncQuery -/// 实现具体的异步查询逻辑并返回字符串结果 +/// 字符串类型测试异步查询类,继承AbstractAsyncQuery +/// 实现具体的异步查询逻辑并返回字符串结果 /// public sealed class TestAsyncStringQuery : AbstractAsyncQuery { /// - /// 初始化TestAsyncStringQuery的新实例 + /// 初始化TestAsyncStringQuery的新实例 /// /// 查询输入参数 public TestAsyncStringQuery(TestAsyncQueryInput input) : base(input) @@ -190,7 +190,7 @@ public sealed class TestAsyncStringQuery : AbstractAsyncQuery - /// 执行异步查询操作的具体实现 + /// 执行异步查询操作的具体实现 /// /// 查询输入参数 /// 格式化的字符串结果 @@ -201,13 +201,13 @@ public sealed class TestAsyncStringQuery : AbstractAsyncQuery -/// 布尔类型测试异步查询类,继承AbstractAsyncQuery -/// 实现具体的异步查询逻辑并返回布尔结果 +/// 布尔类型测试异步查询类,继承AbstractAsyncQuery +/// 实现具体的异步查询逻辑并返回布尔结果 /// public sealed class TestAsyncBooleanQuery : AbstractAsyncQuery { /// - /// 初始化TestAsyncBooleanQuery的新实例 + /// 初始化TestAsyncBooleanQuery的新实例 /// /// 查询输入参数 public TestAsyncBooleanQuery(TestAsyncQueryInput input) : base(input) @@ -215,7 +215,7 @@ public sealed class TestAsyncBooleanQuery : AbstractAsyncQuery - /// 执行异步查询操作的具体实现 + /// 执行异步查询操作的具体实现 /// /// 查询输入参数 /// 如果值大于0返回true,否则返回false @@ -226,13 +226,13 @@ public sealed class TestAsyncBooleanQuery : AbstractAsyncQuery -/// 复杂对象类型测试异步查询类,继承AbstractAsyncQuery -/// 实现具体的异步查询逻辑并返回复杂对象结果 +/// 复杂对象类型测试异步查询类,继承AbstractAsyncQuery +/// 实现具体的异步查询逻辑并返回复杂对象结果 /// public sealed class TestAsyncComplexQuery : AbstractAsyncQuery { /// - /// 初始化TestAsyncComplexQuery的新实例 + /// 初始化TestAsyncComplexQuery的新实例 /// /// 查询输入参数 public TestAsyncComplexQuery(TestAsyncQueryInput input) : base(input) @@ -240,7 +240,7 @@ public sealed class TestAsyncComplexQuery : AbstractAsyncQuery - /// 执行异步查询操作的具体实现 + /// 执行异步查询操作的具体实现 /// /// 查询输入参数 /// 复杂对象查询结果 @@ -256,12 +256,12 @@ public sealed class TestAsyncComplexQuery : AbstractAsyncQuery -/// 测试用异步查询类(抛出异常) +/// 测试用异步查询类(抛出异常) /// public sealed class TestAsyncQueryWithException : AbstractAsyncQuery { /// - /// 初始化TestAsyncQueryWithException的新实例 + /// 初始化TestAsyncQueryWithException的新实例 /// /// 查询输入参数 public TestAsyncQueryWithException(TestAsyncQueryInput input) : base(input) @@ -269,7 +269,7 @@ public sealed class TestAsyncQueryWithException : AbstractAsyncQuery - /// 执行异步查询操作并抛出异常 + /// 执行异步查询操作并抛出异常 /// /// 查询输入参数 /// 总是抛出异常 @@ -280,17 +280,17 @@ public sealed class TestAsyncQueryWithException : AbstractAsyncQuery -/// 测试用复杂查询结果类 +/// 测试用复杂查询结果类 /// public sealed class TestAsyncQueryResult { /// - /// 获取或设置值 + /// 获取或设置值 /// public int Value { get; init; } /// - /// 获取或设置双倍值 + /// 获取或设置双倍值 /// public int DoubleValue { get; init; } } \ No newline at end of file diff --git a/GFramework.Core.Tests/query/QueryBusTests.cs b/GFramework.Core.Tests/query/QueryBusTests.cs index 89e9a62..84416f4 100644 --- a/GFramework.Core.Tests/query/QueryBusTests.cs +++ b/GFramework.Core.Tests/query/QueryBusTests.cs @@ -5,13 +5,13 @@ using NUnit.Framework; namespace GFramework.Core.Tests.query; /// -/// 查询总线测试类,用于测试QueryBus的功能和异常处理 +/// 查询总线测试类,用于测试QueryBus的功能和异常处理 /// [TestFixture] public class QueryBusTests { /// - /// 测试设置方法,在每个测试方法执行前初始化查询总线实例 + /// 测试设置方法,在每个测试方法执行前初始化查询总线实例 /// [SetUp] public void SetUp() @@ -22,8 +22,8 @@ public class QueryBusTests private QueryBus _queryBus = null!; /// - /// 测试Send方法是否能正确返回查询结果 - /// 验证当传入有效查询对象时,能够得到预期的计算结果 + /// 测试Send方法是否能正确返回查询结果 + /// 验证当传入有效查询对象时,能够得到预期的计算结果 /// [Test] public void Send_Should_Return_Query_Result() @@ -37,8 +37,8 @@ public class QueryBusTests } /// - /// 测试Send方法在传入空查询对象时是否会抛出ArgumentNullException异常 - /// 验证参数验证功能的正确性 + /// 测试Send方法在传入空查询对象时是否会抛出ArgumentNullException异常 + /// 验证参数验证功能的正确性 /// [Test] public void Send_WithNullQuery_Should_ThrowArgumentNullException() @@ -47,8 +47,8 @@ public class QueryBusTests } /// - /// 测试Send方法是否能正确返回字符串类型的查询结果 - /// 验证不同返回类型的支持情况 + /// 测试Send方法是否能正确返回字符串类型的查询结果 + /// 验证不同返回类型的支持情况 /// [Test] public void Send_WithStringResult_Should_Return_String() @@ -63,25 +63,25 @@ public class QueryBusTests } /// -/// 测试用查询输入类,实现IQueryInput接口 -/// 用于传递查询所需的参数信息 +/// 测试用查询输入类,实现IQueryInput接口 +/// 用于传递查询所需的参数信息 /// public sealed class TestQueryInput : IQueryInput { /// - /// 获取或设置查询值 + /// 获取或设置查询值 /// public int Value { get; init; } } /// -/// 整数类型测试查询类,继承自AbstractQuery -/// 实现具体的查询逻辑并返回整数结果 +/// 整数类型测试查询类,继承自AbstractQuery +/// 实现具体的查询逻辑并返回整数结果 /// public sealed class TestQuery : AbstractQuery { /// - /// 初始化TestQuery的新实例 + /// 初始化TestQuery的新实例 /// /// 查询输入参数 public TestQuery(TestQueryInput input) : base(input) @@ -89,7 +89,7 @@ public sealed class TestQuery : AbstractQuery } /// - /// 执行查询操作的具体实现 + /// 执行查询操作的具体实现 /// /// 查询输入参数 /// 查询结果,将输入值乘以2 @@ -100,13 +100,13 @@ public sealed class TestQuery : AbstractQuery } /// -/// 字符串类型测试查询类,继承自AbstractQuery -/// 实现具体的查询逻辑并返回字符串结果 +/// 字符串类型测试查询类,继承自AbstractQuery +/// 实现具体的查询逻辑并返回字符串结果 /// public sealed class TestStringQuery : AbstractQuery { /// - /// 初始化TestStringQuery的新实例 + /// 初始化TestStringQuery的新实例 /// /// 查询输入参数 public TestStringQuery(TestQueryInput input) : base(input) @@ -114,7 +114,7 @@ public sealed class TestStringQuery : AbstractQuery } /// - /// 执行查询操作的具体实现 + /// 执行查询操作的具体实现 /// /// 查询输入参数 /// 格式化的字符串结果 diff --git a/GFramework.Core.Tests/rule/ContextAwareTests.cs b/GFramework.Core.Tests/rule/ContextAwareTests.cs index 8aec9f1..d28574c 100644 --- a/GFramework.Core.Tests/rule/ContextAwareTests.cs +++ b/GFramework.Core.Tests/rule/ContextAwareTests.cs @@ -8,15 +8,15 @@ using NUnit.Framework; namespace GFramework.Core.Tests.rule; /// -/// 测试 ContextAware 功能的单元测试类 -/// 验证上下文感知对象的设置、获取和回调功能 +/// 测试 ContextAware 功能的单元测试类 +/// 验证上下文感知对象的设置、获取和回调功能 /// [TestFixture] public class ContextAwareTests { /// - /// 在每个测试方法执行前进行初始化设置 - /// 创建测试用的 ContextAware 对象和模拟上下文,并绑定到游戏上下文中 + /// 在每个测试方法执行前进行初始化设置 + /// 创建测试用的 ContextAware 对象和模拟上下文,并绑定到游戏上下文中 /// [SetUp] public void SetUp() @@ -27,8 +27,8 @@ public class ContextAwareTests } /// - /// 在每个测试方法执行后进行清理工作 - /// 从游戏上下文中解绑测试用的架构上下文类型 + /// 在每个测试方法执行后进行清理工作 + /// 从游戏上下文中解绑测试用的架构上下文类型 /// [TearDown] public void TearDown() @@ -40,8 +40,8 @@ public class ContextAwareTests private TestArchitectureContext _mockContext = null!; /// - /// 测试 SetContext 方法是否正确设置上下文属性 - /// 验证通过 IContextAware 接口设置上下文后,内部的 PublicContext 属性能够正确返回设置的上下文 + /// 测试 SetContext 方法是否正确设置上下文属性 + /// 验证通过 IContextAware 接口设置上下文后,内部的 PublicContext 属性能够正确返回设置的上下文 /// [Test] public void SetContext_Should_Set_Context_Property() @@ -53,8 +53,8 @@ public class ContextAwareTests } /// - /// 测试 SetContext 方法是否正确调用 OnContextReady 回调方法 - /// 验证设置上下文后,OnContextReady 方法被正确触发 + /// 测试 SetContext 方法是否正确调用 OnContextReady 回调方法 + /// 验证设置上下文后,OnContextReady 方法被正确触发 /// [Test] public void SetContext_Should_Call_OnContextReady() @@ -66,8 +66,8 @@ public class ContextAwareTests } /// - /// 测试 GetContext 方法是否返回已设置的上下文 - /// 验证通过 IContextAware 接口设置上下文后,GetContext 方法能正确返回相同的上下文实例 + /// 测试 GetContext 方法是否返回已设置的上下文 + /// 验证通过 IContextAware 接口设置上下文后,GetContext 方法能正确返回相同的上下文实例 /// [Test] public void GetContext_Should_Return_Set_Context() @@ -81,9 +81,9 @@ public class ContextAwareTests } /// - /// 测试 GetContext 方法在未设置上下文时的行为 - /// 验证当内部 Context 为 null 时,GetContext 方法不会抛出异常 - /// 此时应返回第一个架构上下文(在测试环境中验证不抛出异常即可) + /// 测试 GetContext 方法在未设置上下文时的行为 + /// 验证当内部 Context 为 null 时,GetContext 方法不会抛出异常 + /// 此时应返回第一个架构上下文(在测试环境中验证不抛出异常即可) /// [Test] public void GetContext_Should_Return_FirstArchitectureContext_When_Not_Set() @@ -102,24 +102,24 @@ public class ContextAwareTests } /// -/// 用于测试的 ContextAware 实现类 -/// 继承自 ContextAwareBase,提供公共访问的上下文属性和回调状态跟踪 +/// 用于测试的 ContextAware 实现类 +/// 继承自 ContextAwareBase,提供公共访问的上下文属性和回调状态跟踪 /// public class TestContextAware : ContextAwareBase { /// - /// 获取内部上下文的公共访问属性 + /// 获取内部上下文的公共访问属性 /// public IArchitectureContext? PublicContext => Context; /// - /// 跟踪 OnContextReady 方法是否被调用的状态 + /// 跟踪 OnContextReady 方法是否被调用的状态 /// public bool OnContextReadyCalled { get; private set; } /// - /// 重写上下文就绪回调方法 - /// 设置 OnContextReadyCalled 标志为 true,用于测试验证 + /// 重写上下文就绪回调方法 + /// 设置 OnContextReadyCalled 标志为 true,用于测试验证 /// protected override void OnContextReady() { diff --git a/GFramework.Core.Tests/state/StateMachineSystemTests.cs b/GFramework.Core.Tests/state/StateMachineSystemTests.cs index 631cf13..b41ba5e 100644 --- a/GFramework.Core.Tests/state/StateMachineSystemTests.cs +++ b/GFramework.Core.Tests/state/StateMachineSystemTests.cs @@ -15,21 +15,21 @@ using NUnit.Framework; namespace GFramework.Core.Tests.state; /// -/// ContextAwareStateMachine类的单元测试 -/// 测试内容包括: -/// - 作为ISystem的集成测试 -/// - Init方法 - 初始化上下文感知状态 -/// - Init方法 - 设置Context属性 -/// - Destroy方法 - 清理状态 -/// - OnArchitecturePhase方法 - 接收架构阶段 -/// - 上下文感知状态初始化 -/// - 状态变更事件发送 -/// - SetContext方法 -/// - GetContext方法 -/// - ISystem接口实现验证 -/// - 与EventBus的集成测试 -/// - 多状态注册和切换 -/// - 状态机生命周期完整性 +/// ContextAwareStateMachine类的单元测试 +/// 测试内容包括: +/// - 作为ISystem的集成测试 +/// - Init方法 - 初始化上下文感知状态 +/// - Init方法 - 设置Context属性 +/// - Destroy方法 - 清理状态 +/// - OnArchitecturePhase方法 - 接收架构阶段 +/// - 上下文感知状态初始化 +/// - 状态变更事件发送 +/// - SetContext方法 +/// - GetContext方法 +/// - ISystem接口实现验证 +/// - 与EventBus的集成测试 +/// - 多状态注册和切换 +/// - 状态机生命周期完整性 /// [TestFixture] public class StateMachineSystemTests @@ -66,7 +66,7 @@ public class StateMachineSystemTests private EventBus? _eventBus; /// - /// 测试ContextAwareStateMachine实现ISystem接口 + /// 测试ContextAwareStateMachine实现ISystem接口 /// [Test] public void ContextAwareStateMachine_Should_Implement_ISystem_Interface() @@ -75,7 +75,7 @@ public class StateMachineSystemTests } /// - /// 测试SetContext设置Context属性 + /// 测试SetContext设置Context属性 /// [Test] public void SetContext_Should_Set_Context_Property() @@ -87,7 +87,7 @@ public class StateMachineSystemTests } /// - /// 测试GetContext返回Context属性 + /// 测试GetContext返回Context属性 /// [Test] public void GetContext_Should_Return_Context_Property() @@ -100,7 +100,7 @@ public class StateMachineSystemTests } /// - /// 测试Init方法为所有ContextAware状态设置Context + /// 测试Init方法为所有ContextAware状态设置Context /// [Test] public void Init_Should_SetContext_On_All_ContextAware_States() @@ -121,7 +121,7 @@ public class StateMachineSystemTests } /// - /// 测试Init方法不为非ContextAware状态设置Context + /// 测试Init方法不为非ContextAware状态设置Context /// [Test] public void Init_Should_Not_SetContext_On_NonContextAware_States() @@ -133,7 +133,7 @@ public class StateMachineSystemTests } /// - /// 测试Destroy方法不抛出异常 + /// 测试Destroy方法不抛出异常 /// [Test] public void Destroy_Should_Not_Throw_Exception() @@ -142,7 +142,7 @@ public class StateMachineSystemTests } /// - /// 测试OnArchitecturePhase方法不抛出异常 + /// 测试OnArchitecturePhase方法不抛出异常 /// [Test] public void OnArchitecturePhase_Should_Not_Throw_Exception() @@ -152,14 +152,14 @@ public class StateMachineSystemTests } /// - /// 测试ChangeTo发送StateChangedEvent事件 - /// 验证当状态机切换到新状态时,会正确触发StateChangedEvent事件,并且事件中的旧状态为null(首次切换) + /// 测试ChangeTo发送StateChangedEvent事件 + /// 验证当状态机切换到新状态时,会正确触发StateChangedEvent事件,并且事件中的旧状态为null(首次切换) /// [Test] public void ChangeTo_Should_Send_StateChangedEvent() { // 订阅StateChangedEvent事件以验证事件是否被正确发送 - bool eventReceived = false; + var eventReceived = false; StateChangedEvent? receivedEvent = null; _eventBus!.Register(e => @@ -183,15 +183,15 @@ public class StateMachineSystemTests } /// - /// 测试ChangeTo发送StateChangedEvent事件(包含旧状态) - /// 验证当状态机从一个状态切换到另一个状态时,会正确触发StateChangedEvent事件, - /// 并且事件中包含正确的旧状态和新状态信息 + /// 测试ChangeTo发送StateChangedEvent事件(包含旧状态) + /// 验证当状态机从一个状态切换到另一个状态时,会正确触发StateChangedEvent事件, + /// 并且事件中包含正确的旧状态和新状态信息 /// [Test] public void ChangeTo_Should_Send_StateChangedEvent_With_OldState() { // 订阅StateChangedEvent事件以验证事件是否被正确发送 - bool eventReceived = false; + var eventReceived = false; StateChangedEvent? receivedEvent = null; _eventBus!.Register(e => @@ -216,8 +216,8 @@ public class StateMachineSystemTests } /// - /// 测试CanChangeTo方法对于已注册状态的工作情况 - /// 验证当状态已注册到状态机中时,CanChangeTo方法应返回true + /// 测试CanChangeTo方法对于已注册状态的工作情况 + /// 验证当状态已注册到状态机中时,CanChangeTo方法应返回true /// [Test] public void CanChangeTo_Should_Work_With_Registered_States() @@ -231,8 +231,8 @@ public class StateMachineSystemTests } /// - /// 测试可以注册多个状态 - /// 验证状态机能够成功注册多个不同的状态实例,并且能够切换到这些已注册的状态 + /// 测试可以注册多个状态 + /// 验证状态机能够成功注册多个不同的状态实例,并且能够切换到这些已注册的状态 /// [Test] public void Multiple_States_Should_Be_Registered() @@ -251,7 +251,7 @@ public class StateMachineSystemTests /// - /// 测试状态机生命周期完整 + /// 测试状态机生命周期完整 /// [Test] public void StateMachine_Lifecycle_Should_Be_Complete() @@ -275,24 +275,27 @@ public class StateMachineSystemTests #region Test Classes /// -/// 测试用的ContextAwareStateMachine派生类,用于访问内部状态字典 +/// 测试用的ContextAwareStateMachine派生类,用于访问内部状态字典 /// public class TestStateMachineSystemV5 : StateMachineSystem { /// - /// 获取状态机内部的状态字典 + /// 获取状态机内部的状态字典 /// /// 类型到状态实例的映射字典 - public Dictionary GetStates() => States; + public Dictionary GetStates() + { + return States; + } } /// -/// 测试用的上下文感知状态基类实现 +/// 测试用的上下文感知状态基类实现 /// public class TestContextAwareStateV5 : ContextAwareStateBase { /// - /// 进入状态时调用 + /// 进入状态时调用 /// /// 前一个状态 public override void OnEnter(IState? previous) @@ -300,7 +303,7 @@ public class TestContextAwareStateV5 : ContextAwareStateBase } /// - /// 退出状态时调用 + /// 退出状态时调用 /// /// 下一个状态 public override void OnExit(IState? next) @@ -309,12 +312,12 @@ public class TestContextAwareStateV5 : ContextAwareStateBase } /// -/// 第二个测试用的上下文感知状态基类实现 +/// 第二个测试用的上下文感知状态基类实现 /// public class TestContextAwareStateV5_2 : ContextAwareStateBase { /// - /// 进入状态时调用 + /// 进入状态时调用 /// /// 前一个状态 public override void OnEnter(IState? previous) @@ -322,7 +325,7 @@ public class TestContextAwareStateV5_2 : ContextAwareStateBase } /// - /// 退出状态时调用 + /// 退出状态时调用 /// /// 下一个状态 public override void OnExit(IState? next) @@ -331,24 +334,27 @@ public class TestContextAwareStateV5_2 : ContextAwareStateBase } /// -/// 测试用的普通状态实现 +/// 测试用的普通状态实现 /// public class TestStateV5 : IState { /// - /// 状态标识符 + /// 状态标识符 /// public int Id { get; set; } /// - /// 检查是否可以转换到指定状态 + /// 检查是否可以转换到指定状态 /// /// 目标状态 /// 始终返回true表示允许转换 - public bool CanTransitionTo(IState next) => true; + public bool CanTransitionTo(IState next) + { + return true; + } /// - /// 进入状态时调用 + /// 进入状态时调用 /// /// 前一个状态 public void OnEnter(IState? previous) @@ -356,7 +362,7 @@ public class TestStateV5 : IState } /// - /// 退出状态时调用 + /// 退出状态时调用 /// /// 下一个状态 public void OnExit(IState? next) diff --git a/GFramework.Core.Tests/state/StateMachineTests.cs b/GFramework.Core.Tests/state/StateMachineTests.cs index 87438ee..59485ae 100644 --- a/GFramework.Core.Tests/state/StateMachineTests.cs +++ b/GFramework.Core.Tests/state/StateMachineTests.cs @@ -6,13 +6,13 @@ using NUnit.Framework; namespace GFramework.Core.Tests.state; /// -/// 测试状态机功能的单元测试类 +/// 测试状态机功能的单元测试类 /// [TestFixture] public class StateMachineTests { /// - /// 在每个测试方法执行前初始化状态机实例 + /// 在每个测试方法执行前初始化状态机实例 /// [SetUp] public void SetUp() @@ -23,7 +23,7 @@ public class StateMachineTests private StateMachine _stateMachine = null!; /// - /// 验证当没有活动状态时,当前状态应为null + /// 验证当没有活动状态时,当前状态应为null /// [Test] public void Current_Should_BeNull_When_NoState_Active() @@ -32,7 +32,7 @@ public class StateMachineTests } /// - /// 验证注册状态后,状态会被添加到状态字典中 + /// 验证注册状态后,状态会被添加到状态字典中 /// [Test] public void Register_Should_AddState_To_StatesDictionary() @@ -44,7 +44,7 @@ public class StateMachineTests } /// - /// 验证ChangeTo方法能够正确设置当前状态 + /// 验证ChangeTo方法能够正确设置当前状态 /// [Test] public void ChangeTo_Should_SetCurrentState() @@ -57,7 +57,7 @@ public class StateMachineTests } /// - /// 验证ChangeTo方法会调用OnEnter回调 + /// 验证ChangeTo方法会调用OnEnter回调 /// [Test] public void ChangeTo_Should_Invoke_OnEnter() @@ -71,7 +71,7 @@ public class StateMachineTests } /// - /// 验证当存在当前状态时,切换到新状态会调用原状态的OnExit回调 + /// 验证当存在当前状态时,切换到新状态会调用原状态的OnExit回调 /// [Test] public void ChangeTo_When_CurrentStateExists_Should_Invoke_OnExit() @@ -89,7 +89,7 @@ public class StateMachineTests } /// - /// 验证当存在当前状态时,切换到新状态会调用新状态的OnEnter回调 + /// 验证当存在当前状态时,切换到新状态会调用新状态的OnEnter回调 /// [Test] public void ChangeTo_When_CurrentStateExists_Should_Invoke_OnEnter() @@ -107,7 +107,7 @@ public class StateMachineTests } /// - /// 验证切换到相同状态时不应调用回调方法 + /// 验证切换到相同状态时不应调用回调方法 /// [Test] public void ChangeTo_ToSameState_Should_NotInvoke_Callbacks() @@ -126,7 +126,7 @@ public class StateMachineTests } /// - /// 验证切换到未注册状态时应抛出InvalidOperationException异常 + /// 验证切换到未注册状态时应抛出InvalidOperationException异常 /// [Test] public void ChangeTo_ToUnregisteredState_Should_ThrowInvalidOperationException() @@ -135,7 +135,7 @@ public class StateMachineTests } /// - /// 验证当状态未注册时CanChangeTo方法应返回false + /// 验证当状态未注册时CanChangeTo方法应返回false /// [Test] public void CanChangeTo_WhenStateNotRegistered_Should_ReturnFalse() @@ -145,7 +145,7 @@ public class StateMachineTests } /// - /// 验证当状态已注册时CanChangeTo方法应返回true + /// 验证当状态已注册时CanChangeTo方法应返回true /// [Test] public void CanChangeTo_WhenStateRegistered_Should_ReturnTrue() @@ -158,7 +158,7 @@ public class StateMachineTests } /// - /// 验证当当前状态拒绝转换时CanChangeTo方法应返回false + /// 验证当当前状态拒绝转换时CanChangeTo方法应返回false /// [Test] public void CanChangeTo_WhenCurrentStateDeniesTransition_Should_ReturnFalse() @@ -195,7 +195,7 @@ public class StateMachineTests } /// - /// 验证注销状态后应从字典中移除该状态 + /// 验证注销状态后应从字典中移除该状态 /// [Test] public void Unregister_Should_RemoveState_FromDictionary() @@ -208,7 +208,7 @@ public class StateMachineTests } /// - /// 验证当活动状态被注销时应调用OnExit并清除当前状态 + /// 验证当活动状态被注销时应调用OnExit并清除当前状态 /// [Test] public void Unregister_WhenStateIsActive_Should_Invoke_OnExit_AndClearCurrent() @@ -224,7 +224,7 @@ public class StateMachineTests } /// - /// 验证当非活动状态被注销时不应调用OnExit + /// 验证当非活动状态被注销时不应调用OnExit /// [Test] public void Unregister_WhenStateNotActive_Should_Not_Invoke_OnExit() @@ -242,7 +242,7 @@ public class StateMachineTests } /// - /// 验证多次状态转换应正确调用回调方法 + /// 验证多次状态转换应正确调用回调方法 /// [Test] public void MultipleStateChanges_Should_Invoke_Callbacks_Correctly() @@ -267,7 +267,7 @@ public class StateMachineTests } /// - /// 验证ChangeTo方法应遵循CanTransitionTo逻辑 + /// 验证ChangeTo方法应遵循CanTransitionTo逻辑 /// [Test] public void ChangeTo_Should_Respect_CanTransitionTo_Logic() @@ -289,7 +289,7 @@ public class StateMachineTests } /// -/// 测试状态类V2版本,实现IState接口用于测试 +/// 测试状态类V2版本,实现IState接口用于测试 /// public sealed class TestStateV2 : IState { @@ -302,7 +302,7 @@ public sealed class TestStateV2 : IState public IState? ExitTo { get; private set; } /// - /// 进入状态时的回调方法 + /// 进入状态时的回调方法 /// /// 从哪个状态进入 public void OnEnter(IState? from) @@ -313,7 +313,7 @@ public sealed class TestStateV2 : IState } /// - /// 离开状态时的回调方法 + /// 离开状态时的回调方法 /// /// 离开到哪个状态 public void OnExit(IState? to) @@ -324,7 +324,7 @@ public sealed class TestStateV2 : IState } /// - /// 判断是否可以转换到目标状态 + /// 判断是否可以转换到目标状态 /// /// 目标状态 /// 是否允许转换 @@ -335,7 +335,7 @@ public sealed class TestStateV2 : IState } /// -/// 测试状态类V3版本,实现IState接口用于测试 +/// 测试状态类V3版本,实现IState接口用于测试 /// public sealed class TestStateV3 : IState { @@ -347,7 +347,7 @@ public sealed class TestStateV3 : IState public IState? ExitTo { get; private set; } /// - /// 进入状态时的回调方法 + /// 进入状态时的回调方法 /// /// 从哪个状态进入 public void OnEnter(IState? from) @@ -358,7 +358,7 @@ public sealed class TestStateV3 : IState } /// - /// 离开状态时的回调方法 + /// 离开状态时的回调方法 /// /// 离开到哪个状态 public void OnExit(IState? to) @@ -369,7 +369,7 @@ public sealed class TestStateV3 : IState } /// - /// 判断是否可以转换到目标状态 + /// 判断是否可以转换到目标状态 /// /// 目标状态 /// 是否允许转换 @@ -380,7 +380,7 @@ public sealed class TestStateV3 : IState } /// -/// 测试状态类V4版本,实现IState接口用于测试 +/// 测试状态类V4版本,实现IState接口用于测试 /// public sealed class TestStateV4 : IState { @@ -392,7 +392,7 @@ public sealed class TestStateV4 : IState public IState? ExitTo { get; private set; } /// - /// 进入状态时的回调方法 + /// 进入状态时的回调方法 /// /// 从哪个状态进入 public void OnEnter(IState? from) @@ -403,7 +403,7 @@ public sealed class TestStateV4 : IState } /// - /// 离开状态时的回调方法 + /// 离开状态时的回调方法 /// /// 离开到哪个状态 public void OnExit(IState? to) @@ -414,7 +414,7 @@ public sealed class TestStateV4 : IState } /// - /// 判断是否可以转换到目标状态 + /// 判断是否可以转换到目标状态 /// /// 目标状态 /// 是否允许转换 @@ -425,12 +425,12 @@ public sealed class TestStateV4 : IState } /// -/// 状态机扩展方法类 +/// 状态机扩展方法类 /// public static class StateMachineExtensions { /// - /// 检查状态机是否包含指定类型的状态 + /// 检查状态机是否包含指定类型的状态 /// /// 要检查的状态类型 /// 状态机实例 diff --git a/GFramework.Core.Tests/state/StateTests.cs b/GFramework.Core.Tests/state/StateTests.cs index 30db73c..850e59b 100644 --- a/GFramework.Core.Tests/state/StateTests.cs +++ b/GFramework.Core.Tests/state/StateTests.cs @@ -4,13 +4,13 @@ using NUnit.Framework; namespace GFramework.Core.Tests.state; /// -/// 测试状态模式实现的功能和行为 +/// 测试状态模式实现的功能和行为 /// [TestFixture] public class StateTests { /// - /// 验证状态类是否正确实现了IState接口 + /// 验证状态类是否正确实现了IState接口 /// [Test] public void State_Should_Implement_IState_Interface() @@ -21,7 +21,7 @@ public class StateTests } /// - /// 验证进入状态时OnEnter方法被正确调用并记录来源状态 + /// 验证进入状态时OnEnter方法被正确调用并记录来源状态 /// [Test] public void OnEnter_Should_BeCalled_When_State_Enters() @@ -36,7 +36,7 @@ public class StateTests } /// - /// 验证当传入null作为来源状态时的处理情况 + /// 验证当传入null作为来源状态时的处理情况 /// [Test] public void OnEnter_WithNull_Should_Set_EnterFrom_ToNull() @@ -50,7 +50,7 @@ public class StateTests } /// - /// 验证退出状态时OnExit方法被正确调用并记录目标状态 + /// 验证退出状态时OnExit方法被正确调用并记录目标状态 /// [Test] public void OnExit_Should_BeCalled_When_State_Exits() @@ -65,7 +65,7 @@ public class StateTests } /// - /// 验证当传入null作为目标状态时的处理情况 + /// 验证当传入null作为目标状态时的处理情况 /// [Test] public void OnExit_WithNull_Should_Set_ExitTo_ToNull() @@ -79,7 +79,7 @@ public class StateTests } /// - /// 验证允许转换时CanTransitionTo方法返回true + /// 验证允许转换时CanTransitionTo方法返回true /// [Test] public void CanTransitionTo_WithAllowTrue_Should_ReturnTrue() @@ -93,7 +93,7 @@ public class StateTests } /// - /// 验证不允许转换时CanTransitionTo方法返回false + /// 验证不允许转换时CanTransitionTo方法返回false /// [Test] public void CanTransitionTo_WithAllowFalse_Should_ReturnFalse() @@ -107,7 +107,7 @@ public class StateTests } /// - /// 验证CanTransitionTo方法正确接收目标状态参数 + /// 验证CanTransitionTo方法正确接收目标状态参数 /// [Test] public void CanTransitionTo_Should_Receive_TargetState() @@ -123,7 +123,7 @@ public class StateTests } /// - /// 验证具有复杂转换规则的状态类功能 + /// 验证具有复杂转换规则的状态类功能 /// [Test] public void State_WithComplexTransitionRules_Should_Work() @@ -137,7 +137,7 @@ public class StateTests } /// - /// 验证多个状态之间的协作功能 + /// 验证多个状态之间的协作功能 /// [Test] public void MultipleStates_Should_WorkTogether() @@ -159,7 +159,7 @@ public class StateTests } /// - /// 验证状态对多次转换的跟踪能力 + /// 验证状态对多次转换的跟踪能力 /// [Test] public void State_Should_Track_MultipleTransitions() @@ -177,7 +177,7 @@ public class StateTests } /// - /// 验证相同类型状态间的转换处理 + /// 验证相同类型状态间的转换处理 /// [Test] public void State_Should_Handle_SameState_Transition() @@ -197,42 +197,42 @@ public class StateTests } /// -/// 具体状态实现类V2版本,用于测试状态的基本功能 +/// 具体状态实现类V2版本,用于测试状态的基本功能 /// public sealed class ConcreteStateV2 : IState { /// - /// 获取或设置是否允许转换 + /// 获取或设置是否允许转换 /// public bool AllowTransitions { get; set; } = true; /// - /// 获取进入状态是否被调用的标志 + /// 获取进入状态是否被调用的标志 /// public bool EnterCalled { get; private set; } /// - /// 获取退出状态是否被调用的标志 + /// 获取退出状态是否被调用的标志 /// public bool ExitCalled { get; private set; } /// - /// 获取进入此状态的来源状态 + /// 获取进入此状态的来源状态 /// public IState? EnterFrom { get; private set; } /// - /// 获取从此状态退出的目标状态 + /// 获取从此状态退出的目标状态 /// public IState? ExitTo { get; private set; } /// - /// 获取或设置转换到目标状态时执行的动作 + /// 获取或设置转换到目标状态时执行的动作 /// public Action? CanTransitionToAction { get; set; } /// - /// 进入当前状态时调用的方法 + /// 进入当前状态时调用的方法 /// /// 从哪个状态进入 public void OnEnter(IState? from) @@ -242,7 +242,7 @@ public sealed class ConcreteStateV2 : IState } /// - /// 退出当前状态时调用的方法 + /// 退出当前状态时调用的方法 /// /// 退出到哪个状态 public void OnExit(IState? to) @@ -252,7 +252,7 @@ public sealed class ConcreteStateV2 : IState } /// - /// 判断是否可以转换到目标状态 + /// 判断是否可以转换到目标状态 /// /// 目标状态 /// 如果可以转换则返回true,否则返回false @@ -264,32 +264,32 @@ public sealed class ConcreteStateV2 : IState } /// -/// 具体状态实现类V3版本,用于测试状态的基本功能 +/// 具体状态实现类V3版本,用于测试状态的基本功能 /// public sealed class ConcreteStateV3 : IState { /// - /// 获取进入状态是否被调用的标志 + /// 获取进入状态是否被调用的标志 /// public bool EnterCalled { get; private set; } /// - /// 获取退出状态是否被调用的标志 + /// 获取退出状态是否被调用的标志 /// public bool ExitCalled { get; private set; } /// - /// 获取进入此状态的来源状态 + /// 获取进入此状态的来源状态 /// public IState? EnterFrom { get; private set; } /// - /// 获取从此状态退出的目标状态 + /// 获取从此状态退出的目标状态 /// public IState? ExitTo { get; private set; } /// - /// 进入当前状态时调用的方法 + /// 进入当前状态时调用的方法 /// /// 从哪个状态进入 public void OnEnter(IState? from) @@ -299,7 +299,7 @@ public sealed class ConcreteStateV3 : IState } /// - /// 退出当前状态时调用的方法 + /// 退出当前状态时调用的方法 /// /// 退出到哪个状态 public void OnExit(IState? to) @@ -309,7 +309,7 @@ public sealed class ConcreteStateV3 : IState } /// - /// 判断是否可以转换到目标状态 + /// 判断是否可以转换到目标状态 /// /// 目标状态 /// 如果可以转换则返回true,否则返回false @@ -320,32 +320,32 @@ public sealed class ConcreteStateV3 : IState } /// -/// 具体状态实现类V4版本,用于测试状态的基本功能 +/// 具体状态实现类V4版本,用于测试状态的基本功能 /// public sealed class ConcreteStateV4 : IState { /// - /// 获取进入状态是否被调用的标志 + /// 获取进入状态是否被调用的标志 /// public bool EnterCalled { get; private set; } /// - /// 获取退出状态是否被调用的标志 + /// 获取退出状态是否被调用的标志 /// public bool ExitCalled { get; private set; } /// - /// 获取进入此状态的来源状态 + /// 获取进入此状态的来源状态 /// public IState? EnterFrom { get; private set; } /// - /// 获取从此状态退出的目标状态 + /// 获取从此状态退出的目标状态 /// public IState? ExitTo { get; private set; } /// - /// 进入当前状态时调用的方法 + /// 进入当前状态时调用的方法 /// /// 从哪个状态进入 public void OnEnter(IState? from) @@ -355,7 +355,7 @@ public sealed class ConcreteStateV4 : IState } /// - /// 退出当前状态时调用的方法 + /// 退出当前状态时调用的方法 /// /// 退出到哪个状态 public void OnExit(IState? to) @@ -365,7 +365,7 @@ public sealed class ConcreteStateV4 : IState } /// - /// 判断是否可以转换到目标状态 + /// 判断是否可以转换到目标状态 /// /// 目标状态 /// 如果可以转换则返回true,否则返回false @@ -376,37 +376,37 @@ public sealed class ConcreteStateV4 : IState } /// -/// 条件状态实现类V2版本,支持基于类型的条件转换规则 +/// 条件状态实现类V2版本,支持基于类型的条件转换规则 /// public sealed class ConditionalStateV2 : IState { /// - /// 获取或设置允许转换到的状态类型数组 + /// 获取或设置允许转换到的状态类型数组 /// public Type[] AllowedTransitions { get; set; } = Array.Empty(); /// - /// 获取进入状态是否被调用的标志 + /// 获取进入状态是否被调用的标志 /// public bool EnterCalled { get; private set; } /// - /// 获取退出状态是否被调用的标志 + /// 获取退出状态是否被调用的标志 /// public bool ExitCalled { get; private set; } /// - /// 获取进入此状态的来源状态 + /// 获取进入此状态的来源状态 /// public IState? EnterFrom { get; private set; } /// - /// 获取从此状态退出的目标状态 + /// 获取从此状态退出的目标状态 /// public IState? ExitTo { get; private set; } /// - /// 进入当前状态时调用的方法 + /// 进入当前状态时调用的方法 /// /// 从哪个状态进入 public void OnEnter(IState? from) @@ -416,7 +416,7 @@ public sealed class ConditionalStateV2 : IState } /// - /// 退出当前状态时调用的方法 + /// 退出当前状态时调用的方法 /// /// 退出到哪个状态 public void OnExit(IState? to) @@ -426,7 +426,7 @@ public sealed class ConditionalStateV2 : IState } /// - /// 判断是否可以转换到目标状态 + /// 判断是否可以转换到目标状态 /// /// 目标状态 /// 如果目标状态类型在允许列表中则返回true,否则返回false @@ -437,32 +437,32 @@ public sealed class ConditionalStateV2 : IState } /// -/// 跟踪状态实现类V2版本,用于跟踪状态转换次数 +/// 跟踪状态实现类V2版本,用于跟踪状态转换次数 /// public sealed class TrackingStateV2 : IState { /// - /// 获取进入状态被调用的次数 + /// 获取进入状态被调用的次数 /// public int EnterCallCount { get; private set; } /// - /// 获取退出状态被调用的次数 + /// 获取退出状态被调用的次数 /// public int ExitCallCount { get; private set; } /// - /// 获取进入此状态的来源状态 + /// 获取进入此状态的来源状态 /// public IState? EnterFrom { get; private set; } /// - /// 获取从此状态退出的目标状态 + /// 获取从此状态退出的目标状态 /// public IState? ExitTo { get; private set; } /// - /// 进入当前状态时调用的方法 + /// 进入当前状态时调用的方法 /// /// 从哪个状态进入 public void OnEnter(IState? from) @@ -472,7 +472,7 @@ public sealed class TrackingStateV2 : IState } /// - /// 退出当前状态时调用的方法 + /// 退出当前状态时调用的方法 /// /// 退出到哪个状态 public void OnExit(IState? to) @@ -482,7 +482,7 @@ public sealed class TrackingStateV2 : IState } /// - /// 判断是否可以转换到目标状态 + /// 判断是否可以转换到目标状态 /// /// 目标状态 /// 总是返回true diff --git a/GFramework.Core.Tests/utility/AbstractContextUtilityTests.cs b/GFramework.Core.Tests/utility/AbstractContextUtilityTests.cs index befe58a..61eea3b 100644 --- a/GFramework.Core.Tests/utility/AbstractContextUtilityTests.cs +++ b/GFramework.Core.Tests/utility/AbstractContextUtilityTests.cs @@ -13,16 +13,16 @@ using NUnit.Framework; namespace GFramework.Core.Tests.utility; /// -/// AbstractContextUtility类的单元测试 -/// 测试内容包括: -/// - 抽象工具类实现 -/// - IContextUtility接口实现 -/// - Init方法调用 -/// - 日志初始化 -/// - 上下文感知功能(SetContext, GetContext) -/// - 子类继承行为 -/// - 工具初始化日志记录 -/// - 工具生命周期完整性 +/// AbstractContextUtility类的单元测试 +/// 测试内容包括: +/// - 抽象工具类实现 +/// - IContextUtility接口实现 +/// - Init方法调用 +/// - 日志初始化 +/// - 上下文感知功能(SetContext, GetContext) +/// - 子类继承行为 +/// - 工具初始化日志记录 +/// - 工具生命周期完整性 /// [TestFixture] public class AbstractContextUtilityTests @@ -43,7 +43,7 @@ public class AbstractContextUtilityTests private IocContainer _container = null!; /// - /// 测试AbstractContextUtility实现IContextUtility接口 + /// 测试AbstractContextUtility实现IContextUtility接口 /// [Test] public void AbstractContextUtility_Should_Implement_IContextUtility_Interface() @@ -54,7 +54,7 @@ public class AbstractContextUtilityTests } /// - /// 测试Init方法调用 + /// 测试Init方法调用 /// [Test] public void Init_Should_Call_OnInit_Method() @@ -69,7 +69,7 @@ public class AbstractContextUtilityTests } /// - /// 测试Init方法设置Logger属性 + /// 测试Init方法设置Logger属性 /// [Test] public void Init_Should_Set_Logger_Property() @@ -84,7 +84,7 @@ public class AbstractContextUtilityTests } /// - /// 测试Init方法记录初始化日志 + /// 测试Init方法记录初始化日志 /// [Test] public void Init_Should_Log_Initialization() @@ -99,7 +99,7 @@ public class AbstractContextUtilityTests } /// - /// 测试Destroy方法调用 + /// 测试Destroy方法调用 /// [Test] public void Destroy_Should_Call_OnDestroy_Method() @@ -115,7 +115,7 @@ public class AbstractContextUtilityTests } /// - /// 测试上下文感知功能 - SetContext方法 + /// 测试上下文感知功能 - SetContext方法 /// [Test] public void SetContext_Should_Set_Context_Property() @@ -130,7 +130,7 @@ public class AbstractContextUtilityTests } /// - /// 测试上下文感知功能 - GetContext方法 + /// 测试上下文感知功能 - GetContext方法 /// [Test] public void GetContext_Should_Return_Context_Property() @@ -146,7 +146,7 @@ public class AbstractContextUtilityTests } /// - /// 测试子类继承行为 + /// 测试子类继承行为 /// [Test] public void Child_Class_Should_Override_OnInit_Method() @@ -163,7 +163,7 @@ public class AbstractContextUtilityTests } /// - /// 测试工具生命周期完整性 + /// 测试工具生命周期完整性 /// [Test] public void ContextUtility_Should_Complete_Full_Lifecycle() @@ -186,7 +186,7 @@ public class AbstractContextUtilityTests } /// - /// 测试工具类可以多次初始化和销毁 + /// 测试工具类可以多次初始化和销毁 /// [Test] public void ContextUtility_Should_Be_Initializable_And_Destroyable_Multiple_Times() @@ -211,27 +211,27 @@ public class AbstractContextUtilityTests } /// -/// 测试用上下文工具类V1 +/// 测试用上下文工具类V1 /// public sealed class TestContextUtilityV1 : AbstractContextUtility { /// - /// 获取工具是否已初始化 + /// 获取工具是否已初始化 /// public bool Initialized { get; private set; } /// - /// 获取工具是否已销毁 + /// 获取工具是否已销毁 /// public bool Destroyed { get; set; } /// - /// 获取Init方法是否被调用 + /// 获取Init方法是否被调用 /// public bool InitCalled { get; private set; } /// - /// 获取Logger对象(用于测试) + /// 获取Logger对象(用于测试) /// public ILogger? GetLogger() { @@ -239,7 +239,7 @@ public sealed class TestContextUtilityV1 : AbstractContextUtility } /// - /// 初始化方法 + /// 初始化方法 /// protected override void OnInit() { @@ -248,7 +248,7 @@ public sealed class TestContextUtilityV1 : AbstractContextUtility } /// - /// 销毁方法 + /// 销毁方法 /// protected override void OnDestroy() { @@ -257,27 +257,27 @@ public sealed class TestContextUtilityV1 : AbstractContextUtility } /// -/// 测试用上下文工具类V2,自定义初始化逻辑 +/// 测试用上下文工具类V2,自定义初始化逻辑 /// public sealed class TestContextUtilityV2 : AbstractContextUtility { /// - /// 获取工具是否已初始化 + /// 获取工具是否已初始化 /// public bool Initialized { get; private set; } /// - /// 获取工具是否已销毁 + /// 获取工具是否已销毁 /// public bool Destroyed { get; set; } /// - /// 获取自定义初始化是否完成 + /// 获取自定义初始化是否完成 /// public bool CustomInitializationDone { get; private set; } /// - /// 初始化方法(自定义逻辑) + /// 初始化方法(自定义逻辑) /// protected override void OnInit() { @@ -286,7 +286,7 @@ public sealed class TestContextUtilityV2 : AbstractContextUtility } /// - /// 销毁方法 + /// 销毁方法 /// protected override void OnDestroy() { diff --git a/GFramework.Core/GFramework.Core.csproj b/GFramework.Core/GFramework.Core.csproj index eb54995..203f539 100644 --- a/GFramework.Core/GFramework.Core.csproj +++ b/GFramework.Core/GFramework.Core.csproj @@ -7,6 +7,6 @@ enable - + diff --git a/GFramework.Core/architecture/Architecture.cs b/GFramework.Core/architecture/Architecture.cs index ba1f269..ab5f89e 100644 --- a/GFramework.Core/architecture/Architecture.cs +++ b/GFramework.Core/architecture/Architecture.cs @@ -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; + /// /// 待初始化组件的去重集合 /// @@ -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(); - } } /// @@ -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"); } - + /// - /// 等待架构初始化完成(Ready 阶段) + /// 等待架构初始化完成(Ready 阶段) /// public Task WaitUntilReadyAsync() { return IsReady ? Task.CompletedTask : _readyTcs.Task; } + #endregion } \ No newline at end of file diff --git a/GFramework.Core/architecture/ArchitectureServices.cs b/GFramework.Core/architecture/ArchitectureServices.cs index c97a9ea..16521a4 100644 --- a/GFramework.Core/architecture/ArchitectureServices.cs +++ b/GFramework.Core/architecture/ArchitectureServices.cs @@ -26,8 +26,6 @@ public class ArchitectureServices : IArchitectureServices /// private readonly ICommandBus _commandBus; - private readonly IIocContainer _container; - /// /// 事件总线实例 /// @@ -45,7 +43,7 @@ public class ArchitectureServices : IArchitectureServices /// 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); } /// /// 获取依赖注入容器 /// - public IIocContainer Container => _container; + public IIocContainer Container { get; } /// /// 获取类型事件系统 diff --git a/GFramework.Core/architecture/GameContext.cs b/GFramework.Core/architecture/GameContext.cs index 334135b..f31460b 100644 --- a/GFramework.Core/architecture/GameContext.cs +++ b/GFramework.Core/architecture/GameContext.cs @@ -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; diff --git a/GFramework.Core/architecture/README.md b/GFramework.Core/architecture/README.md index 32f886e..7c0550e 100644 --- a/GFramework.Core/architecture/README.md +++ b/GFramework.Core/architecture/README.md @@ -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,应通过事件通信 diff --git a/GFramework.Core/command/AbstractAsyncCommand.cs b/GFramework.Core/command/AbstractAsyncCommand.cs index 74876d7..3f57347 100644 --- a/GFramework.Core/command/AbstractAsyncCommand.cs +++ b/GFramework.Core/command/AbstractAsyncCommand.cs @@ -4,14 +4,14 @@ using GFramework.Core.rule; namespace GFramework.Core.command; /// -/// 异步命令的抽象基类,实现了IAsyncCommand接口 -/// 提供异步命令执行的基础框架和上下文感知功能 +/// 异步命令的抽象基类,实现了IAsyncCommand接口 +/// 提供异步命令执行的基础框架和上下文感知功能 /// public abstract class AbstractAsyncCommand : ContextAwareBase, IAsyncCommand { /// - /// 执行异步命令的实现方法 - /// 该方法通过调用受保护的抽象方法OnExecuteAsync来执行具体的命令逻辑 + /// 执行异步命令的实现方法 + /// 该方法通过调用受保护的抽象方法OnExecuteAsync来执行具体的命令逻辑 /// /// 表示异步操作的任务 async Task IAsyncCommand.ExecuteAsync() @@ -20,9 +20,9 @@ public abstract class AbstractAsyncCommand : ContextAwareBase, IAsyncCommand } /// - /// 子类必须实现的异步执行方法 - /// 包含具体的命令执行逻辑 + /// 子类必须实现的异步执行方法 + /// 包含具体的命令执行逻辑 /// /// 表示异步操作的任务 protected abstract Task OnExecuteAsync(); -} +} \ No newline at end of file diff --git a/GFramework.Core/command/AbstractAsyncCommandWithInput.cs b/GFramework.Core/command/AbstractAsyncCommandWithInput.cs index c7cbabc..32017b9 100644 --- a/GFramework.Core/command/AbstractAsyncCommandWithInput.cs +++ b/GFramework.Core/command/AbstractAsyncCommandWithInput.cs @@ -4,14 +4,14 @@ using GFramework.Core.rule; namespace GFramework.Core.command; /// -/// 抽象异步命令基类,用于处理无返回值的异步命令操作 +/// 抽象异步命令基类,用于处理无返回值的异步命令操作 /// /// 命令输入类型,必须实现ICommandInput接口 public abstract class AbstractAsyncCommand(TInput input) : ContextAwareBase, IAsyncCommand where TInput : ICommandInput { /// - /// 执行异步命令的实现方法 + /// 执行异步命令的实现方法 /// /// 表示异步操作的任务 async Task IAsyncCommand.ExecuteAsync() @@ -20,7 +20,7 @@ public abstract class AbstractAsyncCommand(TInput input) : ContextAwareB } /// - /// 定义异步执行逻辑的抽象方法,由派生类实现具体业务逻辑 + /// 定义异步执行逻辑的抽象方法,由派生类实现具体业务逻辑 /// /// 命令输入参数 /// 表示异步操作的任务 diff --git a/GFramework.Core/command/AbstractAsyncCommandWithResult.cs b/GFramework.Core/command/AbstractAsyncCommandWithResult.cs index d599b2e..2f0b3e8 100644 --- a/GFramework.Core/command/AbstractAsyncCommandWithResult.cs +++ b/GFramework.Core/command/AbstractAsyncCommandWithResult.cs @@ -4,7 +4,7 @@ using GFramework.Core.rule; namespace GFramework.Core.command; /// -/// 抽象异步命令基类,用于处理有返回值的异步命令操作 +/// 抽象异步命令基类,用于处理有返回值的异步命令操作 /// /// 命令输入类型,必须实现ICommandInput接口 /// 命令执行结果类型 @@ -12,7 +12,7 @@ public abstract class AbstractAsyncCommand(TInput input) : Cont where TInput : ICommandInput { /// - /// 执行异步命令并返回结果的实现方法 + /// 执行异步命令并返回结果的实现方法 /// /// 表示异步操作且包含结果的任务 async Task IAsyncCommand.ExecuteAsync() @@ -21,7 +21,7 @@ public abstract class AbstractAsyncCommand(TInput input) : Cont } /// - /// 定义异步执行逻辑的抽象方法,由派生类实现具体业务逻辑并返回结果 + /// 定义异步执行逻辑的抽象方法,由派生类实现具体业务逻辑并返回结果 /// /// 命令输入参数 /// 表示异步操作且包含结果的任务 diff --git a/GFramework.Core/command/EmptyCommandInput.cs b/GFramework.Core/command/EmptyCommandInput.cs index 0743d3c..fc47ce2 100644 --- a/GFramework.Core/command/EmptyCommandInput.cs +++ b/GFramework.Core/command/EmptyCommandInput.cs @@ -3,10 +3,10 @@ using GFramework.Core.Abstractions.command; namespace GFramework.Core.command; /// -/// 空命令输入类,用于表示一个不包含任何输入参数的命令 +/// 空命令输入类,用于表示一个不包含任何输入参数的命令 /// /// -/// 该类实现了ICommandInput接口,作为命令模式中的输入参数载体 -/// 通常用于不需要额外输入参数的简单命令操作 +/// 该类实现了ICommandInput接口,作为命令模式中的输入参数载体 +/// 通常用于不需要额外输入参数的简单命令操作 /// -public sealed class EmptyCommandInput : ICommandInput; +public sealed class EmptyCommandInput : ICommandInput; \ No newline at end of file diff --git a/GFramework.Core/coroutine/CoroutineHandle.cs b/GFramework.Core/coroutine/CoroutineHandle.cs index 54d6427..39cf1af 100644 --- a/GFramework.Core/coroutine/CoroutineHandle.cs +++ b/GFramework.Core/coroutine/CoroutineHandle.cs @@ -1,30 +1,30 @@ namespace GFramework.Core.coroutine; /// -/// 协程句柄 -/// 用于唯一标识和管理协程实例的结构体,通过ID系统实现协程的跟踪和比较功能 +/// 协程句柄 +/// 用于唯一标识和管理协程实例的结构体,通过ID系统实现协程的跟踪和比较功能 /// public readonly struct CoroutineHandle : IEquatable { /// - /// 预留空间常量,用于ID分配的基数 + /// 预留空间常量,用于ID分配的基数 /// private const byte ReservedSpace = 0x0F; /// - /// 下一个索引数组,用于跟踪每个实例ID的下一个可用索引位置 - /// 索引范围:0-15,对应16个不同的实例槽位 + /// 下一个索引数组,用于跟踪每个实例ID的下一个可用索引位置 + /// 索引范围:0-15,对应16个不同的实例槽位 /// private static readonly int[] NextIndex = new int[16]; /// - /// 协程句柄的内部ID,用于唯一标识协程实例 + /// 协程句柄的内部ID,用于唯一标识协程实例 /// private readonly int _id; /// - /// 静态构造函数,初始化NextIndex数组的默认值 - /// 将索引0的下一个可用位置设置为ReservedSpace + 1 + /// 静态构造函数,初始化NextIndex数组的默认值 + /// 将索引0的下一个可用位置设置为ReservedSpace + 1 /// static CoroutineHandle() { @@ -33,18 +33,18 @@ public readonly struct CoroutineHandle : IEquatable /// - /// 获取当前协程句柄的键值(低4位) + /// 获取当前协程句柄的键值(低4位) /// public byte Key => (byte)(_id & ReservedSpace); /// - /// 判断当前协程句柄是否有效 - /// 有效性通过Key是否为0来判断 + /// 判断当前协程句柄是否有效 + /// 有效性通过Key是否为0来判断 /// public bool IsValid => Key != 0; /// - /// 构造函数,创建一个新的协程句柄 + /// 构造函数,创建一个新的协程句柄 /// /// 实例ID,用于区分不同的协程实例槽位 public CoroutineHandle(byte instanceId) @@ -57,38 +57,53 @@ public readonly struct CoroutineHandle : IEquatable } /// - /// 比较当前协程句柄与另一个协程句柄是否相等 + /// 比较当前协程句柄与另一个协程句柄是否相等 /// /// 要比较的协程句柄 /// 如果两个句柄的ID相同则返回true,否则返回false - public bool Equals(CoroutineHandle other) => _id == other._id; + public bool Equals(CoroutineHandle other) + { + return _id == other._id; + } /// - /// 比较当前对象与指定对象是否相等 + /// 比较当前对象与指定对象是否相等 /// /// 要比较的对象 /// 如果对象是协程句柄且ID相同则返回true,否则返回false - 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); + } /// - /// 获取当前协程句柄的哈希码 + /// 获取当前协程句柄的哈希码 /// /// 基于内部ID计算的哈希码 - public override int GetHashCode() => _id; + public override int GetHashCode() + { + return _id; + } /// - /// 比较两个协程句柄是否相等 + /// 比较两个协程句柄是否相等 /// /// 第一个协程句柄 /// 第二个协程句柄 /// 如果两个句柄的ID相同则返回true,否则返回false - 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; + } /// - /// 比较两个协程句柄是否不相等 + /// 比较两个协程句柄是否不相等 /// /// 第一个协程句柄 /// 第二个协程句柄 /// 如果两个句柄的ID不同则返回true,否则返回false - 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; + } } \ No newline at end of file diff --git a/GFramework.Core/coroutine/CoroutineHelper.cs b/GFramework.Core/coroutine/CoroutineHelper.cs index 7e65929..640fdf1 100644 --- a/GFramework.Core/coroutine/CoroutineHelper.cs +++ b/GFramework.Core/coroutine/CoroutineHelper.cs @@ -1,16 +1,15 @@ -using System.Threading; using GFramework.Core.Abstractions.coroutine; using GFramework.Core.coroutine.instructions; namespace GFramework.Core.coroutine; /// -/// 协程辅助方法 +/// 协程辅助方法 /// public static class CoroutineHelper { /// - /// 等待指定秒数 + /// 等待指定秒数 /// /// 要等待的秒数 /// 延迟等待指令 @@ -20,7 +19,7 @@ public static class CoroutineHelper } /// - /// 等待一帧 + /// 等待一帧 /// /// 等待一帧的指令 public static WaitOneFrame WaitForOneFrame() @@ -29,7 +28,7 @@ public static class CoroutineHelper } /// - /// 等待指定帧数 + /// 等待指定帧数 /// /// 要等待的帧数 /// 等待帧数指令 @@ -39,7 +38,7 @@ public static class CoroutineHelper } /// - /// 等待直到条件满足 + /// 等待直到条件满足 /// /// 条件判断函数 /// 等待条件指令 @@ -49,7 +48,7 @@ public static class CoroutineHelper } /// - /// 等待当条件为真时持续等待 + /// 等待当条件为真时持续等待 /// /// 条件判断函数 /// 等待条件指令 @@ -59,7 +58,7 @@ public static class CoroutineHelper } /// - /// 等待指定时间并提供进度回调 + /// 等待指定时间并提供进度回调 /// /// 等待的持续时间(秒) /// 进度回调函数,接收0-1之间的进度值 @@ -70,7 +69,7 @@ public static class CoroutineHelper } /// - /// 延迟调用指定的委托 + /// 延迟调用指定的委托 /// /// 延迟时间(秒) /// 要执行的动作委托 @@ -82,7 +81,7 @@ public static class CoroutineHelper } /// - /// 重复调用指定的委托指定次数 + /// 重复调用指定的委托指定次数 /// /// 每次调用之间的间隔时间(秒) /// 调用次数 @@ -96,17 +95,17 @@ public static class CoroutineHelper yield return new Delay(interval); } } - + /// - /// 无限重复调用指定的委托,直到条件不满足 + /// 无限重复调用指定的委托,直到条件不满足 /// /// 每次调用之间的间隔时间(秒) /// 要执行的动作委托 /// 继续执行的条件,返回false时停止 /// 返回一个枚举器,用于协程执行 public static IEnumerator RepeatCallForever( - double interval, - Action? action, + double interval, + Action? action, Func? shouldContinue = null) { // 循环执行动作直到条件不再满足 @@ -116,9 +115,9 @@ public static class CoroutineHelper yield return new Delay(interval); } } - + /// - /// 无限重复调用指定的委托,直到取消令牌被触发 + /// 无限重复调用指定的委托,直到取消令牌被触发 /// /// 每次调用之间的间隔时间(秒) /// 要执行的动作委托 diff --git a/GFramework.Core/coroutine/CoroutineMetadata.cs b/GFramework.Core/coroutine/CoroutineMetadata.cs index 4707831..d967d37 100644 --- a/GFramework.Core/coroutine/CoroutineMetadata.cs +++ b/GFramework.Core/coroutine/CoroutineMetadata.cs @@ -3,27 +3,27 @@ namespace GFramework.Core.coroutine; /// -/// 存储协程元数据信息的内部类,包含协程的状态、枚举器、标签等信息 +/// 存储协程元数据信息的内部类,包含协程的状态、枚举器、标签等信息 /// internal class CoroutineMetadata { /// - /// 协程在调度器中的槽位索引 + /// 协程在调度器中的槽位索引 /// public int SlotIndex; /// - /// 协程当前的执行状态 + /// 协程当前的执行状态 /// public CoroutineState State; /// - /// 协程的标签标识符,用于协程的分类和查找 + /// 协程的标签标识符,用于协程的分类和查找 /// public string? Tag; /// - /// 判断协程是否处于活跃状态(运行中、暂停或挂起) + /// 判断协程是否处于活跃状态(运行中、暂停或挂起) /// public bool IsActive => State is CoroutineState.Running diff --git a/GFramework.Core/coroutine/CoroutineScheduler.cs b/GFramework.Core/coroutine/CoroutineScheduler.cs index f91be10..263ad1e 100644 --- a/GFramework.Core/coroutine/CoroutineScheduler.cs +++ b/GFramework.Core/coroutine/CoroutineScheduler.cs @@ -3,7 +3,7 @@ namespace GFramework.Core.coroutine; /// -/// 协程调度器,用于管理和执行协程 +/// 协程调度器,用于管理和执行协程 /// /// 时间源接口,提供时间相关数据 /// 实例ID,默认为1 @@ -17,25 +17,29 @@ public sealed class CoroutineScheduler( private readonly Dictionary> _tagged = new(); private readonly ITimeSource _timeSource = timeSource ?? throw new ArgumentNullException(nameof(timeSource)); private readonly Dictionary> _waiting = new(); - private int _activeCount; private int _nextSlot; private CoroutineSlot?[] _slots = new CoroutineSlot?[initialCapacity]; /// - /// 获取时间差值 + /// 获取时间差值 /// public double DeltaTime => _timeSource.DeltaTime; /// - /// 获取活跃协程数量 + /// 获取活跃协程数量 /// - public int ActiveCoroutineCount => _activeCount; + public int ActiveCoroutineCount { get; private set; } + + public bool IsCoroutineAlive(CoroutineHandle handle) + { + return _metadata.ContainsKey(handle); + } #region Run / Update /// - /// 运行协程 + /// 运行协程 /// /// 要运行的协程枚举器 /// 协程标签,可选 @@ -72,13 +76,13 @@ public sealed class CoroutineScheduler( AddTag(tag, handle); Prewarm(slotIndex); - _activeCount++; + ActiveCoroutineCount++; return handle; } /// - /// 更新所有协程状态 + /// 更新所有协程状态 /// 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 /// - /// 暂停指定协程 + /// 暂停指定协程 /// /// 协程句柄 /// 是否成功暂停 @@ -145,7 +145,7 @@ public sealed class CoroutineScheduler( } /// - /// 恢复指定协程 + /// 恢复指定协程 /// /// 协程句柄 /// 是否成功恢复 @@ -164,7 +164,7 @@ public sealed class CoroutineScheduler( } /// - /// 终止指定协程 + /// 终止指定协程 /// /// 协程句柄 /// 是否成功终止 @@ -182,7 +182,7 @@ public sealed class CoroutineScheduler( #region Wait / Tag / Clear /// - /// 让当前协程等待目标协程完成 + /// 让当前协程等待目标协程完成 /// /// 当前协程句柄 /// 目标协程句柄 @@ -216,7 +216,7 @@ public sealed class CoroutineScheduler( } /// - /// 根据标签终止协程 + /// 根据标签终止协程 /// /// 协程标签 /// 被终止的协程数量 @@ -229,12 +229,12 @@ public sealed class CoroutineScheduler( } /// - /// 清空所有协程 + /// 清空所有协程 /// /// 被清除的协程数量 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 /// - /// 预热协程槽位,执行协程的第一步 + /// 预热协程槽位,执行协程的第一步 /// /// 槽位索引 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( } /// - /// 完成指定槽位的协程 + /// 完成指定槽位的协程 /// /// 槽位索引 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( } /// - /// 处理协程执行中的错误 + /// 处理协程执行中的错误 /// /// 槽位索引 /// 异常对象 @@ -324,7 +320,7 @@ public sealed class CoroutineScheduler( } /// - /// 扩展协程槽位数组容量 + /// 扩展协程槽位数组容量 /// private void Expand() { @@ -332,7 +328,7 @@ public sealed class CoroutineScheduler( } /// - /// 为协程添加标签 + /// 为协程添加标签 /// /// 标签名称 /// 协程句柄 @@ -349,7 +345,7 @@ public sealed class CoroutineScheduler( } /// - /// 移除协程标签 + /// 移除协程标签 /// /// 协程句柄 private void RemoveTag(CoroutineHandle handle) @@ -368,8 +364,4 @@ public sealed class CoroutineScheduler( } #endregion - public bool IsCoroutineAlive(CoroutineHandle handle) - { - return _metadata.ContainsKey(handle); - } } \ No newline at end of file diff --git a/GFramework.Core/coroutine/CoroutineSlot.cs b/GFramework.Core/coroutine/CoroutineSlot.cs index 4c796e8..208c73a 100644 --- a/GFramework.Core/coroutine/CoroutineSlot.cs +++ b/GFramework.Core/coroutine/CoroutineSlot.cs @@ -3,27 +3,27 @@ namespace GFramework.Core.coroutine; /// -/// 协程槽位类,用于管理单个协程的执行状态和调度信息 +/// 协程槽位类,用于管理单个协程的执行状态和调度信息 /// internal sealed class CoroutineSlot { /// - /// 协程枚举器,包含协程的执行逻辑 + /// 协程枚举器,包含协程的执行逻辑 /// public required IEnumerator Enumerator; /// - /// 协程当前状态 + /// 协程句柄,用于标识和管理协程实例 + /// + public CoroutineHandle Handle; + + /// + /// 协程当前状态 /// public CoroutineState State; /// - /// 当前等待的指令,用于控制协程的暂停和恢复 + /// 当前等待的指令,用于控制协程的暂停和恢复 /// public IYieldInstruction? Waiting; - - /// - /// 协程句柄,用于标识和管理协程实例 - /// - public CoroutineHandle Handle; -} +} \ No newline at end of file diff --git a/GFramework.Core/coroutine/extensions/CoroutineExtensions.cs b/GFramework.Core/coroutine/extensions/CoroutineExtensions.cs index b18eb8d..7aed1c7 100644 --- a/GFramework.Core/coroutine/extensions/CoroutineExtensions.cs +++ b/GFramework.Core/coroutine/extensions/CoroutineExtensions.cs @@ -4,12 +4,12 @@ using GFramework.Core.coroutine.instructions; namespace GFramework.Core.coroutine.extensions; /// -/// 协程相关的扩展方法 +/// 协程相关的扩展方法 /// public static class CoroutineExtensions { /// - /// 在指定时间间隔内重复执行动作的协程 + /// 在指定时间间隔内重复执行动作的协程 /// /// 执行间隔时间(秒) /// 要重复执行的动作 @@ -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 } /// - /// 在指定延迟后执行动作的协程 + /// 在指定延迟后执行动作的协程 /// /// 延迟时间(秒) /// 要执行的动作 @@ -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(); } /// - /// 顺序执行多个协程 + /// 顺序执行多个协程 /// /// 要顺序执行的协程集合 /// 协程枚举器 @@ -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(); } } /// - /// 并行执行多个协程(等待所有协程完成) - /// 注意:这需要协程调度器的支持,这里提供一个包装器返回多个句柄 + /// 并行执行多个协程(等待所有协程完成) + /// 注意:这需要协程调度器的支持,这里提供一个包装器返回多个句柄 /// /// 协程调度器 /// 要并行执行的协程集合 @@ -84,10 +75,7 @@ public static class CoroutineExtensions this CoroutineScheduler scheduler, params IEnumerator[]? coroutines) { - if (coroutines == null || coroutines.Length == 0) - { - yield break; - } + if (coroutines == null || coroutines.Length == 0) yield break; // 启动所有协程并收集句柄 var handles = new List(); @@ -98,11 +86,11 @@ public static class CoroutineExtensions } // 等待所有协程完成 - yield return new WaitForAllCoroutines(scheduler,handles); + yield return new WaitForAllCoroutines(scheduler, handles); } /// - /// 带进度回调的等待协程 + /// 带进度回调的等待协程 /// /// 总等待时间(秒) /// 进度回调,参数为0-1之间的进度值 @@ -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); - } } -} +} \ No newline at end of file diff --git a/GFramework.Core/coroutine/extensions/TaskCoroutineExtensions.cs b/GFramework.Core/coroutine/extensions/TaskCoroutineExtensions.cs index 2678f2f..f093d19 100644 --- a/GFramework.Core/coroutine/extensions/TaskCoroutineExtensions.cs +++ b/GFramework.Core/coroutine/extensions/TaskCoroutineExtensions.cs @@ -4,12 +4,12 @@ using GFramework.Core.coroutine.instructions; namespace GFramework.Core.coroutine.extensions; /// -/// Task与协程之间的扩展方法 +/// Task与协程之间的扩展方法 /// public static class TaskCoroutineExtensions { /// - /// 将Task转换为协程等待指令 + /// 将Task转换为协程等待指令 /// /// 要等待的Task /// 等待Task的协程指令 @@ -19,7 +19,7 @@ public static class TaskCoroutineExtensions } /// - /// 将泛型Task转换为协程等待指令 + /// 将泛型Task转换为协程等待指令 /// /// Task返回值的类型 /// 要等待的Task @@ -30,7 +30,7 @@ public static class TaskCoroutineExtensions } /// - /// 在调度器中启动一个Task并等待其完成 + /// 在调度器中启动一个Task并等待其完成 /// /// 协程调度器 /// 要等待的Task @@ -41,7 +41,7 @@ public static class TaskCoroutineExtensions } /// - /// 在调度器中启动一个泛型Task并等待其完成 + /// 在调度器中启动一个泛型Task并等待其完成 /// /// Task返回值的类型 /// 协程调度器 @@ -53,7 +53,7 @@ public static class TaskCoroutineExtensions } /// - /// 创建等待Task的协程 + /// 创建等待Task的协程 /// private static IEnumerator CreateTaskCoroutine(Task task) { @@ -61,7 +61,7 @@ public static class TaskCoroutineExtensions } /// - /// 创建等待泛型Task的协程 + /// 创建等待泛型Task的协程 /// private static IEnumerator CreateTaskCoroutine(Task task) { diff --git a/GFramework.Core/coroutine/instructions/AsyncOperation.cs b/GFramework.Core/coroutine/instructions/AsyncOperation.cs index 91732e5..3f67940 100644 --- a/GFramework.Core/coroutine/instructions/AsyncOperation.cs +++ b/GFramework.Core/coroutine/instructions/AsyncOperation.cs @@ -1,11 +1,10 @@ using System.Runtime.CompilerServices; -using System.Threading; using GFramework.Core.Abstractions.coroutine; namespace GFramework.Core.coroutine.instructions; /// -/// 异步操作包装器,用于桥接协程系统和async/await异步编程模型 +/// 异步操作包装器,用于桥接协程系统和async/await异步编程模型 /// public class AsyncOperation : IYieldInstruction, INotifyCompletion { @@ -14,75 +13,17 @@ public class AsyncOperation : IYieldInstruction, INotifyCompletion private volatile Action? _continuation; /// - /// 获取异步操作是否已完成 - /// - public bool IsDone => _completed; - - /// - /// 获取异步操作的任务 + /// 获取异步操作的任务 /// public Task Task => _tcs.Task; /// - /// 更新方法,用于处理时间更新逻辑 + /// 检查是否已完成 /// - /// 时间增量 - public void Update(double deltaTime) - { - // 由外部调用SetCompleted来更新状态 - } + public bool IsCompleted => _completed; /// - /// 标记异步操作已完成 - /// - 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 - { - // 忽略延续中的异常 - } - } - } - - /// - /// 标记异步操作因异常而失败 - /// - /// 导致失败的异常 - 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 - { - // 忽略延续中的异常 - } - } - } - - /// - /// 设置延续操作 + /// 设置延续操作 /// /// 要执行的延续操作 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(); } } /// - /// 获取异步操作结果 + /// 获取异步操作是否已完成 + /// + public bool IsDone => _completed; + + /// + /// 更新方法,用于处理时间更新逻辑 + /// + /// 时间增量 + public void Update(double deltaTime) + { + // 由外部调用SetCompleted来更新状态 + } + + /// + /// 标记异步操作已完成 + /// + 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 + { + // 忽略延续中的异常 + } + } + + /// + /// 标记异步操作因异常而失败 + /// + /// 导致失败的异常 + 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 + { + // 忽略延续中的异常 + } + } + + /// + /// 获取异步操作结果 /// /// 操作结果 public object? GetResult() @@ -128,15 +121,10 @@ public class AsyncOperation : IYieldInstruction, INotifyCompletion } /// - /// 获取awaiter对象 + /// 获取awaiter对象 /// public AsyncOperation GetAwaiter() { return this; } - - /// - /// 检查是否已完成 - /// - public bool IsCompleted => _completed; } \ No newline at end of file diff --git a/GFramework.Core/coroutine/instructions/Delay.cs b/GFramework.Core/coroutine/instructions/Delay.cs index 6fbdea9..0f9111e 100644 --- a/GFramework.Core/coroutine/instructions/Delay.cs +++ b/GFramework.Core/coroutine/instructions/Delay.cs @@ -3,18 +3,18 @@ namespace GFramework.Core.coroutine.instructions; /// -/// 延迟等待指令,实现IYieldInstruction接口,用于协程中的时间延迟 +/// 延迟等待指令,实现IYieldInstruction接口,用于协程中的时间延迟 /// /// 需要延迟的秒数 public sealed class Delay(double seconds) : IYieldInstruction { /// - /// 剩余等待时间 + /// 剩余等待时间 /// private double _remaining = Math.Max(0, seconds); /// - /// 更新延迟计时器 + /// 更新延迟计时器 /// /// 时间增量 public void Update(double deltaTime) @@ -23,7 +23,7 @@ public sealed class Delay(double seconds) : IYieldInstruction } /// - /// 获取延迟是否完成 + /// 获取延迟是否完成 /// public bool IsDone => _remaining <= 0; } \ No newline at end of file diff --git a/GFramework.Core/coroutine/instructions/WaitForAllCoroutines.cs b/GFramework.Core/coroutine/instructions/WaitForAllCoroutines.cs index fceb997..54d3e2f 100644 --- a/GFramework.Core/coroutine/instructions/WaitForAllCoroutines.cs +++ b/GFramework.Core/coroutine/instructions/WaitForAllCoroutines.cs @@ -3,15 +3,17 @@ namespace GFramework.Core.coroutine.instructions; /// -/// 等待所有协程完成的等待指令 +/// 等待所有协程完成的等待指令 /// public sealed class WaitForAllCoroutines( CoroutineScheduler scheduler, IReadOnlyList handles) : IYieldInstruction { + private readonly IReadOnlyList _handles = + handles ?? throw new ArgumentNullException(nameof(handles)); + private readonly CoroutineScheduler _scheduler = scheduler ?? throw new ArgumentNullException(nameof(scheduler)); - private readonly IReadOnlyList _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)); } } -} +} \ No newline at end of file diff --git a/GFramework.Core/coroutine/instructions/WaitForCoroutine.cs b/GFramework.Core/coroutine/instructions/WaitForCoroutine.cs index 7cfe9c4..ad716e1 100644 --- a/GFramework.Core/coroutine/instructions/WaitForCoroutine.cs +++ b/GFramework.Core/coroutine/instructions/WaitForCoroutine.cs @@ -3,14 +3,12 @@ namespace GFramework.Core.coroutine.instructions; /// -/// 等待协程完成的指令类,实现IYieldInstruction接口 +/// 等待协程完成的指令类,实现IYieldInstruction接口 /// public sealed class WaitForCoroutine : IYieldInstruction { - private bool _done; - /// - /// 更新方法,用于处理时间更新逻辑 + /// 更新方法,用于处理时间更新逻辑 /// /// 时间增量 public void Update(double delta) @@ -18,12 +16,15 @@ public sealed class WaitForCoroutine : IYieldInstruction } /// - /// 获取协程是否已完成的状态 + /// 获取协程是否已完成的状态 /// - public bool IsDone => _done; + public bool IsDone { get; private set; } /// - /// 内部方法,用于标记协程完成状态 + /// 内部方法,用于标记协程完成状态 /// - internal void Complete() => _done = true; + internal void Complete() + { + IsDone = true; + } } \ No newline at end of file diff --git a/GFramework.Core/coroutine/instructions/WaitForFrames.cs b/GFramework.Core/coroutine/instructions/WaitForFrames.cs index 10745ba..64f79c1 100644 --- a/GFramework.Core/coroutine/instructions/WaitForFrames.cs +++ b/GFramework.Core/coroutine/instructions/WaitForFrames.cs @@ -3,18 +3,18 @@ namespace GFramework.Core.coroutine.instructions; /// -/// 等待指定帧数的等待指令类 +/// 等待指定帧数的等待指令类 /// /// 需要等待的帧数,最小值为1 public sealed class WaitForFrames(int frames) : IYieldInstruction { /// - /// 剩余等待帧数 + /// 剩余等待帧数 /// private int _remaining = Math.Max(1, frames); /// - /// 更新方法,在每一帧调用时减少剩余帧数 + /// 更新方法,在每一帧调用时减少剩余帧数 /// /// 时间间隔(秒) public void Update(double deltaTime) @@ -23,7 +23,7 @@ public sealed class WaitForFrames(int frames) : IYieldInstruction } /// - /// 获取等待是否完成的状态 + /// 获取等待是否完成的状态 /// public bool IsDone => _remaining <= 0; } \ No newline at end of file diff --git a/GFramework.Core/coroutine/instructions/WaitForProgress.cs b/GFramework.Core/coroutine/instructions/WaitForProgress.cs index c688de5..cc7e7b0 100644 --- a/GFramework.Core/coroutine/instructions/WaitForProgress.cs +++ b/GFramework.Core/coroutine/instructions/WaitForProgress.cs @@ -3,47 +3,46 @@ using GFramework.Core.Abstractions.coroutine; namespace GFramework.Core.coroutine.instructions; /// -/// 带进度回调的等待指令 +/// 带进度回调的等待指令 /// public class WaitForProgress : IYieldInstruction { private readonly double _duration; private readonly Action _onProgress; private double _elapsed; - private bool _progressCompleted; /// - /// 初始化等待进度指令 + /// 初始化等待进度指令 /// /// 总持续时间(秒) /// 进度回调,参数为0-1之间的进度值 public WaitForProgress(double duration, Action 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; } /// - /// 更新方法 + /// 更新方法 /// /// 时间增量 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 } /// - /// 获取等待是否已完成 + /// 获取等待是否已完成 /// - public bool IsDone => _progressCompleted; + public bool IsDone { get; private set; } } \ No newline at end of file diff --git a/GFramework.Core/coroutine/instructions/WaitForTask.T.cs b/GFramework.Core/coroutine/instructions/WaitForTask.T.cs index 8891799..bcae7d3 100644 --- a/GFramework.Core/coroutine/instructions/WaitForTask.T.cs +++ b/GFramework.Core/coroutine/instructions/WaitForTask.T.cs @@ -3,7 +3,7 @@ using GFramework.Core.Abstractions.coroutine; namespace GFramework.Core.coroutine.instructions; /// -/// 等待泛型Task完成的等待指令 +/// 等待泛型Task完成的等待指令 /// /// Task返回值的类型 public sealed class WaitForTask : IYieldInstruction @@ -12,30 +12,33 @@ public sealed class WaitForTask : IYieldInstruction private volatile bool _done; /// - /// 初始化等待泛型Task的指令 + /// 初始化等待泛型Task的指令 /// /// 要等待完成的Task 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); } /// - /// 更新方法,用于处理时间更新逻辑 + /// 获取Task的结果值 + /// + public T Result => _task.GetAwaiter().GetResult(); + + /// + /// 获取Task的异常(如果有) + /// + public Exception? Exception => _task.Exception; + + /// + /// 更新方法,用于处理时间更新逻辑 /// /// 时间增量 public void Update(double deltaTime) @@ -44,17 +47,7 @@ public sealed class WaitForTask : IYieldInstruction } /// - /// 获取等待是否已完成 + /// 获取等待是否已完成 /// public bool IsDone => _done; - - /// - /// 获取Task的结果值 - /// - public T Result => _task.GetAwaiter().GetResult(); - - /// - /// 获取Task的异常(如果有) - /// - public Exception? Exception => _task.Exception; } \ No newline at end of file diff --git a/GFramework.Core/coroutine/instructions/WaitForTask.cs b/GFramework.Core/coroutine/instructions/WaitForTask.cs index 1c4403e..67212bc 100644 --- a/GFramework.Core/coroutine/instructions/WaitForTask.cs +++ b/GFramework.Core/coroutine/instructions/WaitForTask.cs @@ -3,10 +3,10 @@ using GFramework.Core.Abstractions.coroutine; namespace GFramework.Core.coroutine.instructions; /// -/// 等待Task完成的等待指令 +/// 等待Task完成的等待指令 /// /// -/// 等待Task完成的等待指令 +/// 等待Task完成的等待指令 /// public sealed class WaitForTask : IYieldInstruction { @@ -14,30 +14,28 @@ public sealed class WaitForTask : IYieldInstruction private volatile bool _done; /// - /// 初始化等待Task的指令 + /// 初始化等待Task的指令 /// /// 要等待完成的Task 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); } /// - /// 更新方法,用于处理时间更新逻辑 + /// 获取Task的异常(如果有) + /// + public Exception? Exception => _task.Exception; + + /// + /// 更新方法,用于处理时间更新逻辑 /// /// 时间增量 public void Update(double deltaTime) @@ -46,12 +44,7 @@ public sealed class WaitForTask : IYieldInstruction } /// - /// 获取等待是否已完成 + /// 获取等待是否已完成 /// public bool IsDone => _done; - - /// - /// 获取Task的异常(如果有) - /// - public Exception? Exception => _task.Exception; } \ No newline at end of file diff --git a/GFramework.Core/coroutine/instructions/WaitOneFrame.cs b/GFramework.Core/coroutine/instructions/WaitOneFrame.cs index 9d03b92..9519d4e 100644 --- a/GFramework.Core/coroutine/instructions/WaitOneFrame.cs +++ b/GFramework.Core/coroutine/instructions/WaitOneFrame.cs @@ -3,24 +3,22 @@ namespace GFramework.Core.coroutine.instructions; /// -/// 表示等待一帧的等待指令实现 -/// 实现IYieldInstruction接口,用于协程中等待一个游戏帧的执行 +/// 表示等待一帧的等待指令实现 +/// 实现IYieldInstruction接口,用于协程中等待一个游戏帧的执行 /// public sealed class WaitOneFrame : IYieldInstruction { - private bool _done; - /// - /// 更新方法,在每一帧被调用时将完成状态设置为true + /// 更新方法,在每一帧被调用时将完成状态设置为true /// /// 时间间隔,表示当前帧与上一帧的时间差 public void Update(double deltaTime) { - _done = true; + IsDone = true; } /// - /// 获取当前等待指令是否已完成 + /// 获取当前等待指令是否已完成 /// - public bool IsDone => _done; + public bool IsDone { get; private set; } } \ No newline at end of file diff --git a/GFramework.Core/coroutine/instructions/WaitUntil.cs b/GFramework.Core/coroutine/instructions/WaitUntil.cs index bf9cf8b..fe2a86f 100644 --- a/GFramework.Core/coroutine/instructions/WaitUntil.cs +++ b/GFramework.Core/coroutine/instructions/WaitUntil.cs @@ -3,7 +3,7 @@ namespace GFramework.Core.coroutine.instructions; /// -/// 表示一个等待直到指定条件满足的协程指令 +/// 表示一个等待直到指定条件满足的协程指令 /// /// 用于判断条件是否满足的函数委托 public sealed class WaitUntil(Func predicate) : IYieldInstruction @@ -11,7 +11,7 @@ public sealed class WaitUntil(Func predicate) : IYieldInstruction private readonly Func _predicate = predicate ?? throw new ArgumentNullException(nameof(predicate)); /// - /// 更新协程状态(此实现中不需要处理时间) + /// 更新协程状态(此实现中不需要处理时间) /// /// 时间增量 public void Update(double deltaTime) @@ -20,7 +20,7 @@ public sealed class WaitUntil(Func predicate) : IYieldInstruction } /// - /// 获取协程指令是否已完成 + /// 获取协程指令是否已完成 /// public bool IsDone => _predicate(); } \ No newline at end of file diff --git a/GFramework.Core/coroutine/instructions/WaitWhile.cs b/GFramework.Core/coroutine/instructions/WaitWhile.cs index c37674b..398b2df 100644 --- a/GFramework.Core/coroutine/instructions/WaitWhile.cs +++ b/GFramework.Core/coroutine/instructions/WaitWhile.cs @@ -3,7 +3,7 @@ namespace GFramework.Core.coroutine.instructions; /// -/// 表示一个等待条件为假时才完成的协程指令 +/// 表示一个等待条件为假时才完成的协程指令 /// /// 用于判断是否继续等待的条件函数,当返回true时继续等待,返回false时完成 public sealed class WaitWhile(Func predicate) : IYieldInstruction @@ -11,7 +11,7 @@ public sealed class WaitWhile(Func predicate) : IYieldInstruction private readonly Func _predicate = predicate ?? throw new ArgumentNullException(nameof(predicate)); /// - /// 更新协程状态(此实现中为空方法) + /// 更新协程状态(此实现中为空方法) /// /// 时间增量 public void Update(double deltaTime) @@ -19,8 +19,8 @@ public sealed class WaitWhile(Func predicate) : IYieldInstruction } /// - /// 获取协程指令是否已完成 - /// 当谓词函数返回false时,表示条件不再满足,指令完成 + /// 获取协程指令是否已完成 + /// 当谓词函数返回false时,表示条件不再满足,指令完成 /// public bool IsDone => !_predicate(); } \ No newline at end of file diff --git a/GFramework.Core/events/DefaultUnRegister.cs b/GFramework.Core/events/DefaultUnRegister.cs index d2bd771..79ea0b5 100644 --- a/GFramework.Core/events/DefaultUnRegister.cs +++ b/GFramework.Core/events/DefaultUnRegister.cs @@ -1,5 +1,4 @@ -using System; -using GFramework.Core.Abstractions.events; +using GFramework.Core.Abstractions.events; namespace GFramework.Core.events; diff --git a/GFramework.Core/events/EasyEventGeneric.cs b/GFramework.Core/events/EasyEventGeneric.cs index 3af9e76..ede45ba 100644 --- a/GFramework.Core/events/EasyEventGeneric.cs +++ b/GFramework.Core/events/EasyEventGeneric.cs @@ -1,5 +1,4 @@ -using System; -using GFramework.Core.Abstractions.events; +using GFramework.Core.Abstractions.events; namespace GFramework.Core.events; diff --git a/GFramework.Core/events/README.md b/GFramework.Core/events/README.md index 4d50cbc..26e9207 100644 --- a/GFramework.Core/events/README.md +++ b/GFramework.Core/events/README.md @@ -27,6 +27,7 @@ void UnRegister(); // 执行注销操作 ``` ### 3. [ + `IUnRegisterList`](file:///d:/Project/Rider/GFramework/GFramework.Core.Abstractions/events/IUnRegisterList.cs#L6-L10) 注销列表接口,用于批量管理注销对象。 diff --git a/GFramework.Core/extensions/ObjectExtensions.cs b/GFramework.Core/extensions/ObjectExtensions.cs index 243e2a0..be3f672 100644 --- a/GFramework.Core/extensions/ObjectExtensions.cs +++ b/GFramework.Core/extensions/ObjectExtensions.cs @@ -1,6 +1,4 @@ -using System; - -namespace GFramework.Core.extensions; +namespace GFramework.Core.extensions; /// /// 提供基于运行时类型判断的对象扩展方法, diff --git a/GFramework.Core/ioc/IocContainer.cs b/GFramework.Core/ioc/IocContainer.cs index c4cd341..aecfb4e 100644 --- a/GFramework.Core/ioc/IocContainer.cs +++ b/GFramework.Core/ioc/IocContainer.cs @@ -1,4 +1,3 @@ -using System.Threading; using GFramework.Core.Abstractions.ioc; using GFramework.Core.Abstractions.logging; using GFramework.Core.Abstractions.system; diff --git a/GFramework.Core/ioc/README.md b/GFramework.Core/ioc/README.md index 465fc15..9314e6f 100644 --- a/GFramework.Core/ioc/README.md +++ b/GFramework.Core/ioc/README.md @@ -390,9 +390,11 @@ public bool Contains() where T : class ``` **参数:** + - 无泛型参数 **返回值:** + - 如果容器中包含指定类型的实例则返回 `true`,否则返回 `false` **使用示例:** @@ -414,6 +416,7 @@ if (!container.Contains()) ``` **应用场景:** + - 条件注册服务 - 检查依赖是否可用 - 动态功能开关 @@ -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()}"); // ``` **应用场景:** + - 重置容器状态 - 内存清理 - 测试环境准备 **注意事项:** + - 容器冻结后也可以调用 `Clear()` 方法 - 清空后,所有已注册的实例都将丢失 - 不会自动清理已注册对象的其他引用 diff --git a/GFramework.Core/logging/AbstractLogger.cs b/GFramework.Core/logging/AbstractLogger.cs index e346de0..f924af2 100644 --- a/GFramework.Core/logging/AbstractLogger.cs +++ b/GFramework.Core/logging/AbstractLogger.cs @@ -1,5 +1,4 @@ -using System; -using GFramework.Core.Abstractions.logging; +using GFramework.Core.Abstractions.logging; namespace GFramework.Core.logging; diff --git a/GFramework.Core/logging/ConsoleLogger.cs b/GFramework.Core/logging/ConsoleLogger.cs index afe603e..1645f18 100644 --- a/GFramework.Core/logging/ConsoleLogger.cs +++ b/GFramework.Core/logging/ConsoleLogger.cs @@ -1,4 +1,3 @@ -using System; using System.IO; using GFramework.Core.Abstractions.logging; diff --git a/GFramework.Core/pool/AbstractObjectPoolSystem.cs b/GFramework.Core/pool/AbstractObjectPoolSystem.cs index 9e84622..a5b8110 100644 --- a/GFramework.Core/pool/AbstractObjectPoolSystem.cs +++ b/GFramework.Core/pool/AbstractObjectPoolSystem.cs @@ -4,7 +4,7 @@ using GFramework.Core.system; namespace GFramework.Core.pool; /// -/// 抽象对象池系统,提供基于键值的对象池管理功能 +/// 抽象对象池系统,提供基于键值的对象池管理功能 /// /// 对象池的键类型,必须不为null /// 池化对象类型,必须实现IPoolableObject接口 @@ -12,12 +12,12 @@ public abstract class AbstractObjectPoolSystem : AbstractSystem, IObjectPoolSystem where TObject : IPoolableObject where TKey : notnull { /// - /// 存储对象池的字典,键为池标识,值为对应类型的对象栈 + /// 存储对象池的字典,键为池标识,值为对应类型的对象栈 /// protected readonly Dictionary> Pools = new(); /// - /// 获取对象池中的对象,如果池中没有可用对象则创建新的对象 + /// 获取对象池中的对象,如果池中没有可用对象则创建新的对象 /// /// 对象池的键值 /// 获取到的对象实例 @@ -38,7 +38,7 @@ public abstract class AbstractObjectPoolSystem } /// - /// 将对象释放回对象池中 + /// 将对象释放回对象池中 /// /// 对象池的键值 /// 需要释放的对象 @@ -56,28 +56,25 @@ public abstract class AbstractObjectPoolSystem } /// - /// 清空所有对象池,销毁所有池中的对象并清理池容器 + /// 清空所有对象池,销毁所有池中的对象并清理池容器 /// public void Clear() { // 遍历所有对象池,调用每个对象的销毁方法 - foreach (var obj in Pools.Values.SelectMany(pool => pool)) - { - obj.OnPoolDestroy(); - } + foreach (var obj in Pools.Values.SelectMany(pool => pool)) obj.OnPoolDestroy(); Pools.Clear(); } /// - /// 创建一个新的对象实例(由子类决定怎么创建) + /// 创建一个新的对象实例(由子类决定怎么创建) /// /// 用于创建对象的键值 /// 新创建的对象实例 protected abstract TObject Create(TKey key); /// - /// 系统销毁时的清理操作,清空所有对象池 + /// 系统销毁时的清理操作,清空所有对象池 /// protected override void OnDestroy() { diff --git a/GFramework.Core/pool/README.md b/GFramework.Core/pool/README.md index 7ea5147..f2f690f 100644 --- a/GFramework.Core/pool/README.md +++ b/GFramework.Core/pool/README.md @@ -477,6 +477,7 @@ public class DebuggablePoolSystem : AbstractObjectPoolSystem -/// 异步查询抽象基类,提供异步查询的基本框架和执行机制 -/// 继承自ContextAwareBase并实现IAsyncQuery<TResult>接口 +/// 异步查询抽象基类,提供异步查询的基本框架和执行机制 +/// 继承自ContextAwareBase并实现IAsyncQuery<TResult>接口 /// /// 查询结果的类型 -public abstract class AbstractAsyncQuery : ContextAwareBase, IAsyncQuery { +public abstract class AbstractAsyncQuery : ContextAwareBase, IAsyncQuery +{ /// - /// 执行异步查询操作 + /// 执行异步查询操作 /// /// 返回查询结果的异步任务 public Task DoAsync() @@ -19,8 +20,8 @@ public abstract class AbstractAsyncQuery : ContextAwareBase, IAsyncQuer } /// - /// 抽象方法,用于实现具体的异步查询逻辑 + /// 抽象方法,用于实现具体的异步查询逻辑 /// /// 返回查询结果的异步任务 protected abstract Task OnDoAsync(); -} +} \ No newline at end of file diff --git a/GFramework.Core/query/AbstractAsyncQueryWithResult.cs b/GFramework.Core/query/AbstractAsyncQueryWithResult.cs index 0e04c57..3020ef9 100644 --- a/GFramework.Core/query/AbstractAsyncQueryWithResult.cs +++ b/GFramework.Core/query/AbstractAsyncQueryWithResult.cs @@ -4,7 +4,7 @@ using GFramework.Core.rule; namespace GFramework.Core.query; /// -/// 抽象异步查询基类,用于处理输入类型为TInput、结果类型为TResult的异步查询操作 +/// 抽象异步查询基类,用于处理输入类型为TInput、结果类型为TResult的异步查询操作 /// /// 查询输入类型,必须实现IQueryInput接口 /// 查询结果类型 @@ -15,7 +15,7 @@ public abstract class AbstractAsyncQuery( where TInput : IQueryInput { /// - /// 执行异步查询操作 + /// 执行异步查询操作 /// /// 返回查询结果的异步任务 public Task DoAsync() @@ -24,7 +24,7 @@ public abstract class AbstractAsyncQuery( } /// - /// 抽象方法,用于实现具体的异步查询逻辑 + /// 抽象方法,用于实现具体的异步查询逻辑 /// /// 查询输入参数 /// 返回查询结果的异步任务 diff --git a/GFramework.Core/query/AbstractQuery.cs b/GFramework.Core/query/AbstractQuery.cs index 274f03c..1702bcc 100644 --- a/GFramework.Core/query/AbstractQuery.cs +++ b/GFramework.Core/query/AbstractQuery.cs @@ -8,7 +8,7 @@ namespace GFramework.Core.query; /// /// 查询结果的类型 public abstract class AbstractQuery : ContextAwareBase, IQuery - + { /// /// 执行查询操作 @@ -25,4 +25,4 @@ public abstract class AbstractQuery : ContextAwareBase, IQuery /// /// 查询结果,类型为TResult protected abstract TResult OnDo(); -} +} \ No newline at end of file diff --git a/GFramework.Core/query/AsyncQueryBus.cs b/GFramework.Core/query/AsyncQueryBus.cs index 8468d36..787697e 100644 --- a/GFramework.Core/query/AsyncQueryBus.cs +++ b/GFramework.Core/query/AsyncQueryBus.cs @@ -3,12 +3,12 @@ namespace GFramework.Core.query; /// -/// 异步查询总线实现,用于处理异步查询请求 +/// 异步查询总线实现,用于处理异步查询请求 /// public sealed class AsyncQueryBus : IAsyncQueryBus { /// - /// 异步发送查询请求并返回结果 + /// 异步发送查询请求并返回结果 /// /// 查询结果类型 /// 要执行的异步查询对象 diff --git a/GFramework.Core/query/EmptyQueryInput.cs b/GFramework.Core/query/EmptyQueryInput.cs index 0d4e5eb..80d9eea 100644 --- a/GFramework.Core/query/EmptyQueryInput.cs +++ b/GFramework.Core/query/EmptyQueryInput.cs @@ -3,9 +3,9 @@ namespace GFramework.Core.query; /// -/// 空查询输入类,用于表示不需要任何输入参数的查询操作 +/// 空查询输入类,用于表示不需要任何输入参数的查询操作 /// /// -/// 该类实现了IQueryInput接口,作为占位符使用,适用于那些不需要额外输入参数的查询场景 +/// 该类实现了IQueryInput接口,作为占位符使用,适用于那些不需要额外输入参数的查询场景 /// public sealed class EmptyQueryInput : IQueryInput; \ No newline at end of file diff --git a/GFramework.Core/query/README.md b/GFramework.Core/query/README.md index 38633f1..e8947c3 100644 --- a/GFramework.Core/query/README.md +++ b/GFramework.Core/query/README.md @@ -83,6 +83,7 @@ public GetPlayerGoldQuery() : base(new EmptyQueryInput()) { return this.GetModel().Gold.Value; } + } // 查询玩家是否死亡 @@ -98,6 +99,7 @@ public IsPlayerDeadQuery() : base(new EmptyQueryInput()) { return this.GetModel().Health.Value <= 0; } + } // 查询背包中指定物品的数量 @@ -114,7 +116,9 @@ public GetItemCountQuery(string itemId) : base(new GetItemCountQueryInput(itemId var inventory = this.GetModel(); return inventory.GetItemCount(input.ItemId); } + } + ``` ### 2. 发送查询(在 Controller 中) @@ -155,12 +159,12 @@ public partial class ShopUI : Control, IController ``csharp public class CombatSystem : AbstractSystem { - protected override void OnInit() - { - // 注册事件监听 - this.RegisterEvent(OnEnemyAttack); - } - +protected override void OnInit() +{ +// 注册事件监听 +this.RegisterEvent(OnEnemyAttack); +} + private void OnEnemyAttack(EnemyAttackEvent e) { // 查询玩家是否已经死亡 @@ -172,7 +176,9 @@ public class CombatSystem : AbstractSystem this.SendCommand(new TakeDamageCommand { Damage = e.Damage }); } } + } + ``` ## 高级用法 @@ -207,8 +213,8 @@ var enemies = this.SendQuery(new GetEnemiesInRangeQuery // 查询玩家是否可以使用技能 public class CanUseSkillQuery : AbstractQuery { - public string SkillId { get; set; } - +public string SkillId { get; set; } + protected override bool OnDo() { var playerModel = this.GetModel(); @@ -221,27 +227,31 @@ public class CanUseSkillQuery : AbstractQuery return playerModel.Mana.Value >= skillCost.ManaCost && !this.SendQuery(new IsSkillOnCooldownQuery { SkillId = SkillId }); } + } public class GetSkillCostQuery : AbstractQuery { - public string SkillId { get; set; } - +public string SkillId { get; set; } + protected override SkillCost OnDo() { return this.GetModel().GetSkillCost(SkillId); } + } public class IsSkillOnCooldownQuery : AbstractQuery { - public string SkillId { get; set; } - +public string SkillId { get; set; } + protected override bool OnDo() { return this.GetModel().IsOnCooldown(SkillId); } + } + ``` ### 3. 聚合数据查询 @@ -289,8 +299,8 @@ public class GetPlayerInfoQuery : AbstractQuery // 在 AI System 中查询玩家状态 public class EnemyAISystem : AbstractSystem { - protected override void OnInit() { } - +protected override void OnInit() { } + public void UpdateEnemyBehavior(Enemy enemy) { // 查询玩家位置 @@ -317,7 +327,9 @@ public class EnemyAISystem : AbstractSystem } } } + } + ``` ## Command vs Query @@ -384,8 +396,8 @@ public class AddGoldCommand : AbstractCommand // 在 Model 中缓存复杂计算 public class PlayerModel : AbstractModel { - private int? _cachedPower; - +private int? _cachedPower; + public int GetPower() { if (_cachedPower == null) @@ -405,7 +417,9 @@ public class PlayerModel : AbstractModel { _cachedPower = null; } + } + ``` ### 2. 批量查询 diff --git a/GFramework.Core/rule/README.md b/GFramework.Core/rule/README.md index 6ab74e9..6614df3 100644 --- a/GFramework.Core/rule/README.md +++ b/GFramework.Core/rule/README.md @@ -21,6 +21,7 @@ public interface IContextAware ``` **实现此接口的类型:** + - System - Query - Model diff --git a/GFramework.Core/state/ContextAwareStateBase.cs b/GFramework.Core/state/ContextAwareStateBase.cs index 7eecbe8..4f28d16 100644 --- a/GFramework.Core/state/ContextAwareStateBase.cs +++ b/GFramework.Core/state/ContextAwareStateBase.cs @@ -6,19 +6,19 @@ using IDisposable = GFramework.Core.Abstractions.lifecycle.IDisposable; namespace GFramework.Core.state; /// -/// 上下文感知状态基类 -/// 提供基础的状态管理功能和架构上下文访问能力 -/// 实现了IState和IContextAware接口 +/// 上下文感知状态基类 +/// 提供基础的状态管理功能和架构上下文访问能力 +/// 实现了IState和IContextAware接口 /// public class ContextAwareStateBase : IState, IContextAware, IDisposable { /// - /// 架构上下文引用,用于访问架构相关的服务和数据 + /// 架构上下文引用,用于访问架构相关的服务和数据 /// private IArchitectureContext? _context; /// - /// 设置架构上下文 + /// 设置架构上下文 /// /// 架构上下文实例 public void SetContext(IArchitectureContext context) @@ -27,7 +27,7 @@ public class ContextAwareStateBase : IState, IContextAware, IDisposable } /// - /// 获取架构上下文 + /// 获取架构上下文 /// /// 架构上下文实例 public IArchitectureContext GetContext() @@ -36,16 +36,16 @@ public class ContextAwareStateBase : IState, IContextAware, IDisposable } /// - /// 销毁当前状态,释放相关资源 - /// 子类可重写此方法以执行特定的清理操作 + /// 销毁当前状态,释放相关资源 + /// 子类可重写此方法以执行特定的清理操作 /// public virtual void Destroy() { } /// - /// 进入状态时调用的方法 - /// 子类可重写此方法以实现特定的状态进入逻辑 + /// 进入状态时调用的方法 + /// 子类可重写此方法以实现特定的状态进入逻辑 /// /// 从哪个状态转换而来,可能为null表示初始状态 public virtual void OnEnter(IState? from) @@ -53,8 +53,8 @@ public class ContextAwareStateBase : IState, IContextAware, IDisposable } /// - /// 退出状态时调用的方法 - /// 子类可重写此方法以实现特定的状态退出逻辑 + /// 退出状态时调用的方法 + /// 子类可重写此方法以实现特定的状态退出逻辑 /// /// 将要转换到的目标状态,可能为null表示结束状态 public virtual void OnExit(IState? to) @@ -62,8 +62,8 @@ public class ContextAwareStateBase : IState, IContextAware, IDisposable } /// - /// 判断当前状态是否可以转换到目标状态 - /// 子类可重写此方法以实现自定义的状态转换规则 + /// 判断当前状态是否可以转换到目标状态 + /// 子类可重写此方法以实现自定义的状态转换规则 /// /// 希望转换到的目标状态对象 /// 如果允许转换则返回true,否则返回false diff --git a/GFramework.Core/state/StateChangedEvent.cs b/GFramework.Core/state/StateChangedEvent.cs index 3918874..dde29a1 100644 --- a/GFramework.Core/state/StateChangedEvent.cs +++ b/GFramework.Core/state/StateChangedEvent.cs @@ -3,17 +3,17 @@ namespace GFramework.Core.state; /// -/// 表示状态变更事件的数据类 +/// 表示状态变更事件的数据类 /// public sealed class StateChangedEvent { /// - /// 获取变更前的旧状态 + /// 获取变更前的旧状态 /// public IState? OldState { get; init; } /// - /// 获取变更后的新状态 + /// 获取变更后的新状态 /// public IState? NewState { get; init; } } \ No newline at end of file diff --git a/GFramework.Core/state/StateMachine.cs b/GFramework.Core/state/StateMachine.cs index 7a270ed..a97cc61 100644 --- a/GFramework.Core/state/StateMachine.cs +++ b/GFramework.Core/state/StateMachine.cs @@ -3,7 +3,7 @@ using GFramework.Core.Abstractions.state; namespace GFramework.Core.state; /// -/// 状态机实现类,用于管理状态的注册、切换和生命周期 +/// 状态机实现类,用于管理状态的注册、切换和生命周期 /// public class StateMachine(int maxHistorySize = 10) : IStateMachine { @@ -11,17 +11,17 @@ public class StateMachine(int maxHistorySize = 10) : IStateMachine private readonly Stack _stateHistory = new(); /// - /// 存储所有已注册状态的字典,键为状态类型,值为状态实例 + /// 存储所有已注册状态的字典,键为状态类型,值为状态实例 /// protected readonly Dictionary States = new(); /// - /// 获取当前激活的状态 + /// 获取当前激活的状态 /// public IState? Current { get; protected set; } /// - /// 注册一个状态到状态机中 + /// 注册一个状态到状态机中 /// /// 要注册的状态实例 public IStateMachine Register(IState state) @@ -35,7 +35,7 @@ public class StateMachine(int maxHistorySize = 10) : IStateMachine } /// - /// 从状态机中注销指定类型的状态 + /// 从状态机中注销指定类型的状态 /// /// 要注销的状态类型 public IStateMachine Unregister() where T : IState @@ -55,10 +55,7 @@ public class StateMachine(int maxHistorySize = 10) : IStateMachine // 从历史记录中移除该状态的所有引用 var tempStack = new Stack(_stateHistory.Reverse()); _stateHistory.Clear(); - foreach (var historyState in tempStack.Where(s => s != state)) - { - _stateHistory.Push(historyState); - } + foreach (var historyState in tempStack.Where(s => s != state)) _stateHistory.Push(historyState); States.Remove(type); } @@ -67,7 +64,7 @@ public class StateMachine(int maxHistorySize = 10) : IStateMachine } /// - /// 检查是否可以切换到指定类型的状态 + /// 检查是否可以切换到指定类型的状态 /// /// 目标状态类型 /// 如果可以切换则返回true,否则返回false @@ -80,7 +77,7 @@ public class StateMachine(int maxHistorySize = 10) : IStateMachine } /// - /// 切换到指定类型的状态 + /// 切换到指定类型的状态 /// /// 目标状态类型 /// 如果成功切换则返回true,否则返回false @@ -106,27 +103,36 @@ public class StateMachine(int maxHistorySize = 10) : IStateMachine } /// - /// 检查指定类型的状态是否已注册 + /// 检查指定类型的状态是否已注册 /// /// 要检查的状态类型 /// 如果状态已注册则返回true,否则返回false - public bool IsRegistered() where T : IState => States.ContainsKey(typeof(T)); + public bool IsRegistered() where T : IState + { + return States.ContainsKey(typeof(T)); + } /// - /// 获取指定类型的已注册状态实例 + /// 获取指定类型的已注册状态实例 /// /// 要获取的状态类型 /// 如果状态存在则返回对应实例,否则返回null - public T? GetState() where T : class, IState => States.TryGetValue(typeof(T), out var state) ? state as T : null; + public T? GetState() where T : class, IState + { + return States.TryGetValue(typeof(T), out var state) ? state as T : null; + } /// - /// 获取所有已注册状态的类型集合 + /// 获取所有已注册状态的类型集合 /// /// 包含所有已注册状态类型的枚举器 - public IEnumerable GetRegisteredStateTypes() => States.Keys; + public IEnumerable GetRegisteredStateTypes() + { + return States.Keys; + } /// - /// 获取上一个状态 + /// 获取上一个状态 /// /// 如果历史记录存在则返回上一个状态,否则返回null public IState? GetPreviousState() @@ -138,7 +144,7 @@ public class StateMachine(int maxHistorySize = 10) : IStateMachine } /// - /// 获取状态历史记录 + /// 获取状态历史记录 /// /// 状态历史记录的只读副本,从最近到最远排序 public IReadOnlyList GetStateHistory() @@ -150,7 +156,7 @@ public class StateMachine(int maxHistorySize = 10) : IStateMachine } /// - /// 回退到上一个状态 + /// 回退到上一个状态 /// /// 如果成功回退则返回true,否则返回false public bool GoBack() @@ -163,10 +169,8 @@ public class StateMachine(int maxHistorySize = 10) : IStateMachine // 检查上一个状态是否仍然注册 if (!States.ContainsValue(previousState)) - { // 如果状态已被注销,继续尝试更早的状态 return GoBack(); - } // 回退时不添加到历史记录 ChangeInternalWithoutHistory(previousState); @@ -175,7 +179,7 @@ public class StateMachine(int maxHistorySize = 10) : IStateMachine } /// - /// 清空状态历史记录 + /// 清空状态历史记录 /// public void ClearHistory() { @@ -186,7 +190,7 @@ public class StateMachine(int maxHistorySize = 10) : IStateMachine } /// - /// 内部状态切换方法(不记录历史),用于回退操作 + /// 内部状态切换方法(不记录历史),用于回退操作 /// /// 下一个状态实例 protected virtual void ChangeInternalWithoutHistory(IState next) @@ -204,7 +208,7 @@ public class StateMachine(int maxHistorySize = 10) : IStateMachine } /// - /// 内部状态切换方法,处理状态切换的核心逻辑 + /// 内部状态切换方法,处理状态切换的核心逻辑 /// /// 下一个状态实例 protected virtual void ChangeInternal(IState next) @@ -233,10 +237,7 @@ public class StateMachine(int maxHistorySize = 10) : IStateMachine // 移除最旧的记录(栈底元素) var tempStack = new Stack(_stateHistory.Reverse().Skip(1)); _stateHistory.Clear(); - foreach (var state in tempStack.Reverse()) - { - _stateHistory.Push(state); - } + foreach (var state in tempStack.Reverse()) _stateHistory.Push(state); } } @@ -248,7 +249,7 @@ public class StateMachine(int maxHistorySize = 10) : IStateMachine } /// - /// 当状态转换被拒绝时的回调方法 + /// 当状态转换被拒绝时的回调方法 /// /// 源状态 /// 目标状态 @@ -257,7 +258,7 @@ public class StateMachine(int maxHistorySize = 10) : IStateMachine } /// - /// 当状态即将发生改变时的回调方法 + /// 当状态即将发生改变时的回调方法 /// /// 源状态 /// 目标状态 @@ -266,7 +267,7 @@ public class StateMachine(int maxHistorySize = 10) : IStateMachine } /// - /// 当状态改变完成后的回调方法 + /// 当状态改变完成后的回调方法 /// /// 源状态 /// 目标状态 diff --git a/GFramework.Core/state/StateMachineSystem.cs b/GFramework.Core/state/StateMachineSystem.cs index 477a356..3a3692f 100644 --- a/GFramework.Core/state/StateMachineSystem.cs +++ b/GFramework.Core/state/StateMachineSystem.cs @@ -8,18 +8,18 @@ using IDisposable = GFramework.Core.Abstractions.lifecycle.IDisposable; namespace GFramework.Core.state; /// -/// 上下文感知状态机,继承自StateMachine并实现ISystem接口 -/// 该状态机能够感知架构上下文,并在状态切换时发送状态变更事件 +/// 上下文感知状态机,继承自StateMachine并实现ISystem接口 +/// 该状态机能够感知架构上下文,并在状态切换时发送状态变更事件 /// public class StateMachineSystem : StateMachine, IStateMachineSystem { /// - /// 架构上下文对象,用于提供系统运行所需的上下文信息 + /// 架构上下文对象,用于提供系统运行所需的上下文信息 /// private IArchitectureContext _context = null!; /// - /// 设置架构上下文的方法 + /// 设置架构上下文的方法 /// /// 要设置的架构上下文对象 public void SetContext(IArchitectureContext context) @@ -28,7 +28,7 @@ public class StateMachineSystem : StateMachine, IStateMachineSystem } /// - /// 获取当前架构上下文的方法 + /// 获取当前架构上下文的方法 /// /// 当前的架构上下文对象 public IArchitectureContext GetContext() @@ -37,7 +37,7 @@ public class StateMachineSystem : StateMachine, IStateMachineSystem } /// - /// 处理架构生命周期阶段的方法 + /// 处理架构生命周期阶段的方法 /// /// 当前所处的架构生命周期阶段 public virtual void OnArchitecturePhase(ArchitecturePhase phase) @@ -45,19 +45,16 @@ public class StateMachineSystem : StateMachine, IStateMachineSystem } /// - /// 初始化方法,在系统启动时调用 - /// 遍历所有状态实例,为实现了IContextAware接口的状态设置上下文 + /// 初始化方法,在系统启动时调用 + /// 遍历所有状态实例,为实现了IContextAware接口的状态设置上下文 /// public virtual void Init() { - foreach (var state in States.Values.OfType()) - { - state.SetContext(_context); - } + foreach (var state in States.Values.OfType()) state.SetContext(_context); } /// - /// 销毁方法,在系统关闭时调用 + /// 销毁方法,在系统关闭时调用 /// public virtual void Destroy() { @@ -69,16 +66,13 @@ public class StateMachineSystem : StateMachine, IStateMachineSystem } // 清理所有状态 - foreach (var state in States.Values.OfType()) - { - state.Destroy(); - } + foreach (var state in States.Values.OfType()) state.Destroy(); States.Clear(); } /// - /// 内部状态切换方法,重写基类方法以添加状态变更事件通知功能 + /// 内部状态切换方法,重写基类方法以添加状态变更事件通知功能 /// /// 要切换到的下一个状态 protected override void ChangeInternal(IState next) diff --git a/GFramework.Game.Abstractions/enums/CacheEvictionPolicy.cs b/GFramework.Game.Abstractions/enums/CacheEvictionPolicy.cs index 481d943..030ebd5 100644 --- a/GFramework.Game.Abstractions/enums/CacheEvictionPolicy.cs +++ b/GFramework.Game.Abstractions/enums/CacheEvictionPolicy.cs @@ -1,17 +1,17 @@ namespace GFramework.Game.Abstractions.enums; /// -/// 缓存淘汰策略枚举 +/// 缓存淘汰策略枚举 /// public enum CacheEvictionPolicy { /// - /// 最近最少使用 + /// 最近最少使用 /// Lru, /// - /// 最少使用频率 + /// 最少使用频率 /// - Lfu, -} + Lfu +} \ No newline at end of file diff --git a/GFramework.Game.Abstractions/enums/UITransitionPhases.cs b/GFramework.Game.Abstractions/enums/UITransitionPhases.cs index df6843f..e35bfca 100644 --- a/GFramework.Game.Abstractions/enums/UITransitionPhases.cs +++ b/GFramework.Game.Abstractions/enums/UITransitionPhases.cs @@ -1,27 +1,25 @@ -using System; - namespace GFramework.Game.Abstractions.enums; /// -/// UI切换阶段枚举,定义UI切换过程中的不同阶段 +/// UI切换阶段枚举,定义UI切换过程中的不同阶段 /// [Flags] public enum UITransitionPhases { /// - /// UI切换前阶段,在此阶段执行的Handler可以阻塞UI切换流程 - /// 适用于:淡入淡出动画、用户确认对话框、数据预加载等需要等待完成的操作 + /// UI切换前阶段,在此阶段执行的Handler可以阻塞UI切换流程 + /// 适用于:淡入淡出动画、用户确认对话框、数据预加载等需要等待完成的操作 /// BeforeChange = 1, /// - /// UI切换后阶段,在此阶段执行的Handler不阻塞UI切换流程 - /// 适用于:播放音效、日志记录、统计数据收集等后台操作 + /// UI切换后阶段,在此阶段执行的Handler不阻塞UI切换流程 + /// 适用于:播放音效、日志记录、统计数据收集等后台操作 /// AfterChange = 2, /// - /// 所有阶段,Handler将在BeforeChange和AfterChange阶段都执行 + /// 所有阶段,Handler将在BeforeChange和AfterChange阶段都执行 /// All = BeforeChange | AfterChange } \ No newline at end of file diff --git a/GFramework.Game.Abstractions/enums/UiLayer.cs b/GFramework.Game.Abstractions/enums/UiLayer.cs index b2cf363..ccc1044 100644 --- a/GFramework.Game.Abstractions/enums/UiLayer.cs +++ b/GFramework.Game.Abstractions/enums/UiLayer.cs @@ -1,33 +1,33 @@ namespace GFramework.Game.Abstractions.enums; /// -/// UI层级枚举,定义UI界面的显示层级 -/// 用于管理不同类型的UI在屏幕上的显示顺序 +/// UI层级枚举,定义UI界面的显示层级 +/// 用于管理不同类型的UI在屏幕上的显示顺序 /// public enum UiLayer { /// - /// 页面层,使用栈管理UI的切换 + /// 页面层,使用栈管理UI的切换 /// Page, /// - /// 浮层,用于覆盖层、对话框等 + /// 浮层,用于覆盖层、对话框等 /// Overlay, /// - /// 模态层,会阻挡下层交互,带有遮罩效果 + /// 模态层,会阻挡下层交互,带有遮罩效果 /// Modal, /// - /// 提示层,用于轻量提示如toast消息、loading指示器等 + /// 提示层,用于轻量提示如toast消息、loading指示器等 /// Toast, /// - /// 顶层,用于系统级弹窗、全屏加载等 + /// 顶层,用于系统级弹窗、全屏加载等 /// Topmost -} +} \ No newline at end of file diff --git a/GFramework.Game.Abstractions/enums/UiTransitionPolicy.cs b/GFramework.Game.Abstractions/enums/UiTransitionPolicy.cs index 87abe83..b902d63 100644 --- a/GFramework.Game.Abstractions/enums/UiTransitionPolicy.cs +++ b/GFramework.Game.Abstractions/enums/UiTransitionPolicy.cs @@ -1,18 +1,18 @@ namespace GFramework.Game.Abstractions.enums; /// -/// UI页面过渡策略枚举 -/// 定义了UI页面在出栈时的不同处理方式 +/// UI页面过渡策略枚举 +/// 定义了UI页面在出栈时的不同处理方式 /// public enum UiTransitionPolicy { /// - /// 独占显示(下层页面 Pause + Hide) + /// 独占显示(下层页面 Pause + Hide) /// Exclusive, - + /// - /// 覆盖显示(下层页面仅 Pause,不隐藏) + /// 覆盖显示(下层页面仅 Pause,不隐藏) /// Overlay } \ No newline at end of file diff --git a/GFramework.Game.Abstractions/enums/UiTransitionType.cs b/GFramework.Game.Abstractions/enums/UiTransitionType.cs index 0d0f067..7f5c6af 100644 --- a/GFramework.Game.Abstractions/enums/UiTransitionType.cs +++ b/GFramework.Game.Abstractions/enums/UiTransitionType.cs @@ -1,27 +1,27 @@ namespace GFramework.Game.Abstractions.enums; /// -/// UI切换类型枚举,定义不同的UI切换操作类型 +/// UI切换类型枚举,定义不同的UI切换操作类型 /// public enum UiTransitionType { /// - /// 压入新页面到栈顶 + /// 压入新页面到栈顶 /// Push, /// - /// 弹出栈顶页面 + /// 弹出栈顶页面 /// Pop, /// - /// 替换当前页面 + /// 替换当前页面 /// Replace, /// - /// 清空所有页面 + /// 清空所有页面 /// - Clear, + Clear } \ No newline at end of file diff --git a/GFramework.Game.Abstractions/scene/IGameSceneRegistry.cs b/GFramework.Game.Abstractions/scene/IGameSceneRegistry.cs index a598f4b..e492a3c 100644 --- a/GFramework.Game.Abstractions/scene/IGameSceneRegistry.cs +++ b/GFramework.Game.Abstractions/scene/IGameSceneRegistry.cs @@ -3,7 +3,7 @@ namespace GFramework.Game.Abstractions.scene; /// -/// 游戏场景注册表接口,用于管理游戏场景的注册和查找 +/// 游戏场景注册表接口,用于管理游戏场景的注册和查找 /// /// 场景类型,表示注册表中存储的具体场景对象类型 public interface IGameSceneRegistry : IRegistry; \ No newline at end of file diff --git a/GFramework.Game.Abstractions/serializer/ISerializer.cs b/GFramework.Game.Abstractions/serializer/ISerializer.cs index e324634..f562b2d 100644 --- a/GFramework.Game.Abstractions/serializer/ISerializer.cs +++ b/GFramework.Game.Abstractions/serializer/ISerializer.cs @@ -3,12 +3,12 @@ namespace GFramework.Game.Abstractions.serializer; /// -/// 定义序列化器接口,提供对象序列化和反序列化的通用方法 +/// 定义序列化器接口,提供对象序列化和反序列化的通用方法 /// public interface ISerializer : IUtility { /// - /// 将指定的对象序列化为字符串 + /// 将指定的对象序列化为字符串 /// /// 要序列化的对象类型 /// 要序列化的对象实例 @@ -16,7 +16,7 @@ public interface ISerializer : IUtility string Serialize(T value); /// - /// 将字符串数据反序列化为指定类型的对象 + /// 将字符串数据反序列化为指定类型的对象 /// /// 要反序列化的目标对象类型 /// 包含序列化数据的字符串 diff --git a/GFramework.Game.Abstractions/setting/AudioSettings.cs b/GFramework.Game.Abstractions/setting/AudioSettings.cs index 1f0d6af..a70dce8 100644 --- a/GFramework.Game.Abstractions/setting/AudioSettings.cs +++ b/GFramework.Game.Abstractions/setting/AudioSettings.cs @@ -1,27 +1,27 @@ namespace GFramework.Game.Abstractions.setting; /// -/// 音频设置类,用于管理游戏中的音频配置 +/// 音频设置类,用于管理游戏中的音频配置 /// public class AudioSettings : ISettingsData { /// - /// 获取或设置主音量,控制所有音频的总体音量 + /// 获取或设置主音量,控制所有音频的总体音量 /// public float MasterVolume { get; set; } = 1.0f; /// - /// 获取或设置背景音乐音量,控制BGM的播放音量 + /// 获取或设置背景音乐音量,控制BGM的播放音量 /// public float BgmVolume { get; set; } = 0.8f; /// - /// 获取或设置音效音量,控制SFX的播放音量 + /// 获取或设置音效音量,控制SFX的播放音量 /// public float SfxVolume { get; set; } = 0.8f; /// - /// 重置音频设置为默认值 + /// 重置音频设置为默认值 /// public void Reset() { diff --git a/GFramework.Game.Abstractions/setting/GraphicsSettings.cs b/GFramework.Game.Abstractions/setting/GraphicsSettings.cs index cfd7b86..ed1af12 100644 --- a/GFramework.Game.Abstractions/setting/GraphicsSettings.cs +++ b/GFramework.Game.Abstractions/setting/GraphicsSettings.cs @@ -1,27 +1,27 @@ namespace GFramework.Game.Abstractions.setting; /// -/// 图形设置类,用于管理游戏的图形相关配置 +/// 图形设置类,用于管理游戏的图形相关配置 /// public class GraphicsSettings : ISettingsData { /// - /// 获取或设置是否启用全屏模式 + /// 获取或设置是否启用全屏模式 /// - public bool Fullscreen { get; set; } = false; + public bool Fullscreen { get; set; } /// - /// 获取或设置屏幕分辨率宽度 + /// 获取或设置屏幕分辨率宽度 /// public int ResolutionWidth { get; set; } = 1920; /// - /// 获取或设置屏幕分辨率高度 + /// 获取或设置屏幕分辨率高度 /// public int ResolutionHeight { get; set; } = 1080; /// - /// 重置图形设置为默认值 + /// 重置图形设置为默认值 /// public void Reset() { diff --git a/GFramework.Game.Abstractions/setting/IApplyAbleSettings.cs b/GFramework.Game.Abstractions/setting/IApplyAbleSettings.cs index 5f74b21..c9fc2b1 100644 --- a/GFramework.Game.Abstractions/setting/IApplyAbleSettings.cs +++ b/GFramework.Game.Abstractions/setting/IApplyAbleSettings.cs @@ -1,14 +1,12 @@ -using System.Threading.Tasks; - -namespace GFramework.Game.Abstractions.setting; +namespace GFramework.Game.Abstractions.setting; /// -/// 定义可应用设置的接口,继承自ISettingsSection +/// 定义可应用设置的接口,继承自ISettingsSection /// public interface IApplyAbleSettings : ISettingsSection { /// - /// 应用当前设置到系统中 + /// 应用当前设置到系统中 /// Task Apply(); } \ No newline at end of file diff --git a/GFramework.Game.Abstractions/setting/ISettingsChangedEvent.cs b/GFramework.Game.Abstractions/setting/ISettingsChangedEvent.cs index d965298..87ea615 100644 --- a/GFramework.Game.Abstractions/setting/ISettingsChangedEvent.cs +++ b/GFramework.Game.Abstractions/setting/ISettingsChangedEvent.cs @@ -1,25 +1,23 @@ -using System; - -namespace GFramework.Game.Abstractions.setting; +namespace GFramework.Game.Abstractions.setting; /// -/// 设置变更事件基类 -/// 定义了设置变更事件的基本结构和属性 +/// 设置变更事件基类 +/// 定义了设置变更事件的基本结构和属性 /// public interface ISettingsChangedEvent { /// - /// 获取变更的设置类型 + /// 获取变更的设置类型 /// Type SettingsType { get; } /// - /// 获取变更的设置实例 + /// 获取变更的设置实例 /// ISettingsSection Settings { get; } /// - /// 获取变更发生的时间 + /// 获取变更发生的时间 /// DateTime ChangedAt { get; } } \ No newline at end of file diff --git a/GFramework.Game.Abstractions/setting/ISettingsData.cs b/GFramework.Game.Abstractions/setting/ISettingsData.cs index dfa1a41..7e8ce2e 100644 --- a/GFramework.Game.Abstractions/setting/ISettingsData.cs +++ b/GFramework.Game.Abstractions/setting/ISettingsData.cs @@ -1,12 +1,12 @@ namespace GFramework.Game.Abstractions.setting; /// -/// 设置数据接口 - 纯数据,可自动创建 +/// 设置数据接口 - 纯数据,可自动创建 /// public interface ISettingsData : ISettingsSection { /// - /// 重置设置为默认值 + /// 重置设置为默认值 /// void Reset(); } \ No newline at end of file diff --git a/GFramework.Game.Abstractions/setting/ISettingsModel.cs b/GFramework.Game.Abstractions/setting/ISettingsModel.cs index 8637733..273753d 100644 --- a/GFramework.Game.Abstractions/setting/ISettingsModel.cs +++ b/GFramework.Game.Abstractions/setting/ISettingsModel.cs @@ -1,23 +1,21 @@ -using System; -using System.Collections.Generic; -using GFramework.Core.Abstractions.model; +using GFramework.Core.Abstractions.model; namespace GFramework.Game.Abstractions.setting; /// -/// 定义设置模型的接口,提供获取特定类型设置节的功能 +/// 定义设置模型的接口,提供获取特定类型设置节的功能 /// public interface ISettingsModel : IModel { /// - /// 获取或创建数据设置(自动创建) + /// 获取或创建数据设置(自动创建) /// /// 设置数据的类型,必须继承自class、ISettingsData且具有无参构造函数 /// 指定类型的设置数据实例 T GetData() where T : class, ISettingsData, new(); /// - /// 尝试获取指定类型的设置节实例 + /// 尝试获取指定类型的设置节实例 /// /// 要获取的设置节类型 /// 输出参数,如果成功则包含找到的设置节实例,否则为null @@ -25,20 +23,20 @@ public interface ISettingsModel : IModel bool TryGet(Type type, out ISettingsSection section); /// - /// 获取已注册的可应用设置 + /// 获取已注册的可应用设置 /// /// 可应用设置的类型,必须继承自class和IApplyAbleSettings /// 指定类型的可应用设置实例,如果不存在则返回null T? GetApplicator() where T : class, IApplyAbleSettings; /// - /// 获取所有设置节的集合 + /// 获取所有设置节的集合 /// /// 包含所有设置节的可枚举集合 IEnumerable All(); /// - /// 注册可应用设置(必须手动注册) + /// 注册可应用设置(必须手动注册) /// /// 可应用设置的类型,必须继承自class和IApplyAbleSettings /// 要注册的可应用设置实例 diff --git a/GFramework.Game.Abstractions/setting/ISettingsPersistence.cs b/GFramework.Game.Abstractions/setting/ISettingsPersistence.cs index 569620d..2c19640 100644 --- a/GFramework.Game.Abstractions/setting/ISettingsPersistence.cs +++ b/GFramework.Game.Abstractions/setting/ISettingsPersistence.cs @@ -1,43 +1,40 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; using GFramework.Core.Abstractions.utility; namespace GFramework.Game.Abstractions.setting; /// -/// 设置持久化接口 -/// 定义了设置数据的异步加载、保存、检查存在性和删除操作 +/// 设置持久化接口 +/// 定义了设置数据的异步加载、保存、检查存在性和删除操作 /// public interface ISettingsPersistence : IContextUtility { /// - /// 异步加载指定类型的设置数据 + /// 异步加载指定类型的设置数据 /// Task LoadAsync() where T : class, ISettingsData, new(); /// - /// 异步保存指定的设置数据 + /// 异步保存指定的设置数据 /// Task SaveAsync(T section) where T : class, ISettingsData; /// - /// 异步检查指定类型的设置数据是否存在 + /// 异步检查指定类型的设置数据是否存在 /// Task ExistsAsync() where T : class, ISettingsData; /// - /// 异步删除指定类型的设置数据 + /// 异步删除指定类型的设置数据 /// Task DeleteAsync() where T : class, ISettingsData; /// - /// 保存所有设置数据 + /// 保存所有设置数据 /// Task SaveAllAsync(IEnumerable allData); /// - /// 加载所有已知类型的设置数据 + /// 加载所有已知类型的设置数据 /// Task> LoadAllAsync(IEnumerable knownTypes); } \ No newline at end of file diff --git a/GFramework.Game.Abstractions/setting/ISettingsSection.cs b/GFramework.Game.Abstractions/setting/ISettingsSection.cs index a6b8916..be480fe 100644 --- a/GFramework.Game.Abstractions/setting/ISettingsSection.cs +++ b/GFramework.Game.Abstractions/setting/ISettingsSection.cs @@ -1,7 +1,7 @@ namespace GFramework.Game.Abstractions.setting; /// -/// 表示游戏设置的一个配置节接口 -/// 该接口定义了设置配置节的基本契约,用于管理游戏中的各种配置选项 +/// 表示游戏设置的一个配置节接口 +/// 该接口定义了设置配置节的基本契约,用于管理游戏中的各种配置选项 /// public interface ISettingsSection; \ No newline at end of file diff --git a/GFramework.Game.Abstractions/setting/ISettingsSystem.cs b/GFramework.Game.Abstractions/setting/ISettingsSystem.cs index aeccb4e..f41aca0 100644 --- a/GFramework.Game.Abstractions/setting/ISettingsSystem.cs +++ b/GFramework.Game.Abstractions/setting/ISettingsSystem.cs @@ -1,32 +1,29 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; using GFramework.Core.Abstractions.system; namespace GFramework.Game.Abstractions.setting; /// -/// 定义设置系统的接口,提供应用各种设置的方法 +/// 定义设置系统的接口,提供应用各种设置的方法 /// public interface ISettingsSystem : ISystem { /// - /// 应用所有可应用的设置 + /// 应用所有可应用的设置 /// Task ApplyAll(); /// - /// 应用指定类型的设置 + /// 应用指定类型的设置 /// Task Apply(Type settingsType); /// - /// 应用指定类型的设置(泛型版本) + /// 应用指定类型的设置(泛型版本) /// Task Apply() where T : class, ISettingsSection; /// - /// 批量应用多个设置类型 + /// 批量应用多个设置类型 /// Task Apply(IEnumerable settingsTypes); } \ No newline at end of file diff --git a/GFramework.Game.Abstractions/setting/SettingsData.cs b/GFramework.Game.Abstractions/setting/SettingsData.cs index cc8d9ae..996e2e5 100644 --- a/GFramework.Game.Abstractions/setting/SettingsData.cs +++ b/GFramework.Game.Abstractions/setting/SettingsData.cs @@ -1,16 +1,15 @@ -using System; using System.Reflection; namespace GFramework.Game.Abstractions.setting; /// -/// 设置数据抽象基类,提供默认的 Reset() 实现 +/// 设置数据抽象基类,提供默认的 Reset() 实现 /// public abstract class SettingsData : ISettingsData { /// - /// 重置设置为默认值 - /// 使用反射将所有属性重置为它们的默认值 + /// 重置设置为默认值 + /// 使用反射将所有属性重置为它们的默认值 /// public virtual void Reset() { @@ -25,7 +24,7 @@ public abstract class SettingsData : ISettingsData } /// - /// 获取指定类型的默认值 + /// 获取指定类型的默认值 /// /// 要获取默认值的类型 /// 类型的默认值 diff --git a/GFramework.Game.Abstractions/storage/IFileStorage.cs b/GFramework.Game.Abstractions/storage/IFileStorage.cs index f8b17f4..4923c1a 100644 --- a/GFramework.Game.Abstractions/storage/IFileStorage.cs +++ b/GFramework.Game.Abstractions/storage/IFileStorage.cs @@ -3,7 +3,7 @@ namespace GFramework.Game.Abstractions.storage; /// -/// 文件存储接口,定义了文件存储操作的契约 -/// 继承自IStorage接口,提供专门针对文件的存储功能 +/// 文件存储接口,定义了文件存储操作的契约 +/// 继承自IStorage接口,提供专门针对文件的存储功能 /// public interface IFileStorage : IStorage; \ No newline at end of file diff --git a/GFramework.Game.Abstractions/storage/IScopedStorage.cs b/GFramework.Game.Abstractions/storage/IScopedStorage.cs index 148586f..b18248c 100644 --- a/GFramework.Game.Abstractions/storage/IScopedStorage.cs +++ b/GFramework.Game.Abstractions/storage/IScopedStorage.cs @@ -3,6 +3,6 @@ namespace GFramework.Game.Abstractions.storage; /// -/// 表示作用域存储接口,继承自基础存储接口 +/// 表示作用域存储接口,继承自基础存储接口 /// public interface IScopedStorage : IStorage; \ No newline at end of file diff --git a/GFramework.Game.Abstractions/ui/IAssetRegistry.cs b/GFramework.Game.Abstractions/ui/IAssetRegistry.cs index 048dc20..9cb2965 100644 --- a/GFramework.Game.Abstractions/ui/IAssetRegistry.cs +++ b/GFramework.Game.Abstractions/ui/IAssetRegistry.cs @@ -4,7 +4,7 @@ using GFramework.Game.Abstractions.registry; namespace GFramework.Game.Abstractions.ui; /// -/// 资源注册表接口,用于管理指定类型T的资源注册和查找 +/// 资源注册表接口,用于管理指定类型T的资源注册和查找 /// /// 资源的类型 public interface IAssetRegistry : IUtility, IRegistry; \ No newline at end of file diff --git a/GFramework.Game.Abstractions/ui/IUiCacheStatistics.cs b/GFramework.Game.Abstractions/ui/IUiCacheStatistics.cs index 54190d3..62364bb 100644 --- a/GFramework.Game.Abstractions/ui/IUiCacheStatistics.cs +++ b/GFramework.Game.Abstractions/ui/IUiCacheStatistics.cs @@ -1,34 +1,32 @@ -using System; - -namespace GFramework.Game.Abstractions.ui; +namespace GFramework.Game.Abstractions.ui; /// -/// UI缓存统计信息接口 +/// UI缓存统计信息接口 /// public interface IUiCacheStatistics { /// - /// 缓存总数 + /// 缓存总数 /// int CacheSize { get; } /// - /// 缓存命中次数 + /// 缓存命中次数 /// int HitCount { get; } /// - /// 缓存未命中次数 + /// 缓存未命中次数 /// int MissCount { get; } /// - /// 命中率 + /// 命中率 /// double HitRate { get; } /// - /// 最近访问时间 + /// 最近访问时间 /// DateTime? LastAccessTime { get; } } \ No newline at end of file diff --git a/GFramework.Game.Abstractions/ui/IUiFactory.cs b/GFramework.Game.Abstractions/ui/IUiFactory.cs index 20753dc..ad73996 100644 --- a/GFramework.Game.Abstractions/ui/IUiFactory.cs +++ b/GFramework.Game.Abstractions/ui/IUiFactory.cs @@ -1,84 +1,82 @@ -using System; -using System.Collections.Generic; using GFramework.Core.Abstractions.utility; namespace GFramework.Game.Abstractions.ui; /// -/// UI工厂接口,用于创建UI页面实例 +/// UI工厂接口,用于创建UI页面实例 /// public interface IUiFactory : IContextUtility { /// - /// 创建或获取UI页面实例 + /// 创建或获取UI页面实例 /// /// UI标识键 /// 实例管理策略 /// UI页面实例 IUiPageBehavior GetOrCreate(string uiKey, UiInstancePolicy policy = UiInstancePolicy.AlwaysCreate); - + /// - /// 仅创建新实例(不使用缓存) + /// 仅创建新实例(不使用缓存) /// IUiPageBehavior Create(string uiKey); - + /// - /// 预加载UI资源到缓存池 + /// 预加载UI资源到缓存池 /// /// UI标识键 /// 预加载数量,默认1个 void Preload(string uiKey, int count = 1); - + /// - /// 批量预加载 + /// 批量预加载 /// void PreloadBatch(params string[] uiKeys); - + /// - /// 回收实例到缓存池 + /// 回收实例到缓存池 /// /// 要回收的页面实例 void Recycle(IUiPageBehavior page); - + /// - /// 清理指定UI的缓存实例 + /// 清理指定UI的缓存实例 /// void ClearCache(string uiKey); - + /// - /// 清理所有缓存 + /// 清理所有缓存 /// void ClearAllCache(); - + /// - /// 检查是否有缓存的实例 + /// 检查是否有缓存的实例 /// bool HasCached(string uiKey); #region 缓存策略管理 /// - /// 获取UI的缓存配置 + /// 获取UI的缓存配置 /// /// UI标识符 /// 缓存配置,如果未设置则返回默认配置 UiCacheConfig GetCacheConfig(string uiKey); /// - /// 设置UI的缓存配置 + /// 设置UI的缓存配置 /// /// UI标识符 /// 缓存配置 void SetCacheConfig(string uiKey, UiCacheConfig config); /// - /// 移除UI的缓存配置,恢复默认配置 + /// 移除UI的缓存配置,恢复默认配置 /// /// UI标识符 void RemoveCacheConfig(string uiKey); /// - /// 获取所有UI的缓存统计信息 + /// 获取所有UI的缓存统计信息 /// /// 缓存统计字典 IDictionary GetCacheStatistics(); diff --git a/GFramework.Game.Abstractions/ui/IUiPage.cs b/GFramework.Game.Abstractions/ui/IUiPage.cs index 4a3d9c8..ce67157 100644 --- a/GFramework.Game.Abstractions/ui/IUiPage.cs +++ b/GFramework.Game.Abstractions/ui/IUiPage.cs @@ -1,39 +1,39 @@ namespace GFramework.Game.Abstractions.ui; /// -/// UI页面生命周期接口 -/// 定义了UI页面的各种状态转换方法,用于管理UI页面的进入、退出、暂停、恢复、显示和隐藏等生命周期事件 +/// UI页面生命周期接口 +/// 定义了UI页面的各种状态转换方法,用于管理UI页面的进入、退出、暂停、恢复、显示和隐藏等生命周期事件 /// public interface IUiPage { /// - /// 页面进入时调用的方法 + /// 页面进入时调用的方法 /// /// 页面进入参数,可能为空 void OnEnter(IUiPageEnterParam? param); /// - /// 页面退出时调用的方法 + /// 页面退出时调用的方法 /// void OnExit(); /// - /// 页面暂停时调用的方法 + /// 页面暂停时调用的方法 /// void OnPause(); /// - /// 页面恢复时调用的方法 + /// 页面恢复时调用的方法 /// void OnResume(); /// - /// 页面显示时调用的方法 + /// 页面显示时调用的方法 /// void OnShow(); /// - /// 页面隐藏时调用的方法 + /// 页面隐藏时调用的方法 /// void OnHide(); } \ No newline at end of file diff --git a/GFramework.Game.Abstractions/ui/IUiPageBehavior.cs b/GFramework.Game.Abstractions/ui/IUiPageBehavior.cs index ec5ea43..c5ab865 100644 --- a/GFramework.Game.Abstractions/ui/IUiPageBehavior.cs +++ b/GFramework.Game.Abstractions/ui/IUiPageBehavior.cs @@ -1,72 +1,71 @@ namespace GFramework.Game.Abstractions.ui; /// -/// UI页面行为接口,定义了UI页面的生命周期方法和状态管理 +/// UI页面行为接口,定义了UI页面的生命周期方法和状态管理 /// public interface IUiPageBehavior { /// - /// 获取页面视图对象 + /// 获取页面视图对象 /// /// 页面视图实例 object View { get; } /// - /// 获取键值 + /// 获取键值 /// /// 返回当前对象的键标识符 string Key { get; } /// - /// 获取页面是否处于活动状态 + /// 获取页面是否处于活动状态 /// bool IsAlive { get; } /// - /// 页面进入时调用的方法 + /// 获取页面是否为模态页面 + /// + bool IsModal { get; } + + /// + /// 获取页面是否阻断下层交互 + /// + bool BlocksInput { get; } + + /// + /// 获取页面是否需要蒙版 + /// + bool RequiresMask { get; } + + /// + /// 页面进入时调用的方法 /// /// 页面进入时传递的参数,可为空 void OnEnter(IUiPageEnterParam? param); /// - /// 页面退出时调用的方法 + /// 页面退出时调用的方法 /// void OnExit(); /// - /// 页面暂停时调用的方法 + /// 页面暂停时调用的方法 /// void OnPause(); /// - /// 页面恢复时调用的方法 + /// 页面恢复时调用的方法 /// void OnResume(); /// - /// 页面被覆盖时调用(不销毁) + /// 页面被覆盖时调用(不销毁) /// void OnHide(); /// - /// 页面重新显示时调用的方法 + /// 页面重新显示时调用的方法 /// void OnShow(); - - /// - /// 获取页面是否为模态页面 - /// - bool IsModal { get; } - - /// - /// 获取页面是否阻断下层交互 - /// - bool BlocksInput { get; } - - /// - /// 获取页面是否需要蒙版 - /// - bool RequiresMask { get; } - } \ No newline at end of file diff --git a/GFramework.Game.Abstractions/ui/IUiPageBehaviorProvider.cs b/GFramework.Game.Abstractions/ui/IUiPageBehaviorProvider.cs index 8bb5c15..64ec3e5 100644 --- a/GFramework.Game.Abstractions/ui/IUiPageBehaviorProvider.cs +++ b/GFramework.Game.Abstractions/ui/IUiPageBehaviorProvider.cs @@ -1,12 +1,12 @@ namespace GFramework.Game.Abstractions.ui; /// -/// UI页面行为提供者接口,用于获取页面行为实例 +/// UI页面行为提供者接口,用于获取页面行为实例 /// public interface IUiPageBehaviorProvider { /// - /// 获取页面行为实例 + /// 获取页面行为实例 /// /// 页面行为接口实例 IUiPageBehavior GetPage(); diff --git a/GFramework.Game.Abstractions/ui/IUiPageEnterParam.cs b/GFramework.Game.Abstractions/ui/IUiPageEnterParam.cs index 5b4a17d..4ae809a 100644 --- a/GFramework.Game.Abstractions/ui/IUiPageEnterParam.cs +++ b/GFramework.Game.Abstractions/ui/IUiPageEnterParam.cs @@ -1,7 +1,7 @@ namespace GFramework.Game.Abstractions.ui; /// -/// UI页面进入参数接口 -/// 该接口用于定义UI页面跳转时传递的参数数据结构 +/// UI页面进入参数接口 +/// 该接口用于定义UI页面跳转时传递的参数数据结构 /// public interface IUiPageEnterParam; \ No newline at end of file diff --git a/GFramework.Game.Abstractions/ui/IUiRoot.cs b/GFramework.Game.Abstractions/ui/IUiRoot.cs index ae0d84d..9f6d105 100644 --- a/GFramework.Game.Abstractions/ui/IUiRoot.cs +++ b/GFramework.Game.Abstractions/ui/IUiRoot.cs @@ -1,21 +1,20 @@ -using System.Collections.Generic; using GFramework.Game.Abstractions.enums; namespace GFramework.Game.Abstractions.ui; /// -/// UI根节点接口,定义了UI页面容器的基本操作 +/// UI根节点接口,定义了UI页面容器的基本操作 /// public interface IUiRoot { /// - /// 向UI根节点添加子页面 + /// 向UI根节点添加子页面 /// /// 要添加的UI页面子节点 void AddUiPage(IUiPageBehavior child); /// - /// 向UI根节点添加子页面到指定层级 + /// 向UI根节点添加子页面到指定层级 /// /// 要添加的UI页面子节点 /// 层级 @@ -23,20 +22,20 @@ public interface IUiRoot void AddUiPage(IUiPageBehavior child, UiLayer layer, int orderInLayer = 0); /// - /// 从UI根节点移除子页面 + /// 从UI根节点移除子页面 /// /// 要移除的UI页面子节点 void RemoveUiPage(IUiPageBehavior child); /// - /// 设置页面的Z-order(层级顺序) + /// 设置页面的Z-order(层级顺序) /// /// UI页面 /// Z-order值 void SetZOrder(IUiPageBehavior page, int zOrder); /// - /// 获取当前所有显示的页面 + /// 获取当前所有显示的页面 /// /// 所有显示的页面列表 IReadOnlyList GetVisiblePages(); diff --git a/GFramework.Game.Abstractions/ui/IUiRouteGuard.cs b/GFramework.Game.Abstractions/ui/IUiRouteGuard.cs index bdff7b8..6b8cf4b 100644 --- a/GFramework.Game.Abstractions/ui/IUiRouteGuard.cs +++ b/GFramework.Game.Abstractions/ui/IUiRouteGuard.cs @@ -1,26 +1,24 @@ -using System.Threading.Tasks; - namespace GFramework.Game.Abstractions.ui; /// -/// UI路由守卫接口 -/// 用于拦截和处理UI路由切换,实现业务逻辑解耦 +/// UI路由守卫接口 +/// 用于拦截和处理UI路由切换,实现业务逻辑解耦 /// public interface IUiRouteGuard { /// - /// 守卫优先级,数值越小越先执行 + /// 守卫优先级,数值越小越先执行 /// int Priority { get; } /// - /// 是否可中断后续守卫 - /// 如果返回 true,当该守卫返回 false 时,将停止执行后续守卫 + /// 是否可中断后续守卫 + /// 如果返回 true,当该守卫返回 false 时,将停止执行后续守卫 /// bool CanInterrupt { get; } /// - /// 进入UI前的检查 + /// 进入UI前的检查 /// /// 目标UI标识符 /// 进入参数 @@ -28,9 +26,9 @@ public interface IUiRouteGuard Task CanEnterAsync(string uiKey, IUiPageEnterParam? param); /// - /// 离开UI前的检查 + /// 离开UI前的检查 /// /// 当前UI标识符 /// true表示允许离开,false表示拦截 Task CanLeaveAsync(string uiKey); -} +} \ No newline at end of file diff --git a/GFramework.Game.Abstractions/ui/IUiRouter.cs b/GFramework.Game.Abstractions/ui/IUiRouter.cs index 5c3c250..d257ff2 100644 --- a/GFramework.Game.Abstractions/ui/IUiRouter.cs +++ b/GFramework.Game.Abstractions/ui/IUiRouter.cs @@ -4,23 +4,23 @@ using GFramework.Game.Abstractions.enums; namespace GFramework.Game.Abstractions.ui; /// -/// UI路由管理器接口,用于管理UI界面的导航和切换操作 +/// UI路由管理器接口,用于管理UI界面的导航和切换操作 /// public interface IUiRouter : ISystem { /// - /// 获取当前UI栈深度 + /// 获取当前UI栈深度 /// int Count { get; } /// - /// 绑定UI根节点 + /// 绑定UI根节点 /// /// UI根节点接口实例 void BindRoot(IUiRoot root); /// - /// 将指定的UI界面压入路由栈,显示新的UI界面 + /// 将指定的UI界面压入路由栈,显示新的UI界面 /// /// UI界面的唯一标识符 /// 进入界面的参数,可为空 @@ -31,8 +31,8 @@ public interface IUiRouter : ISystem /// - /// 将已存在的UI页面压入路由栈 - /// 用于预挂载节点或调试场景 + /// 将已存在的UI页面压入路由栈 + /// 用于预挂载节点或调试场景 /// /// 已创建的UI页面行为实例 /// 进入界面的参数,可为空 @@ -42,13 +42,13 @@ public interface IUiRouter : ISystem /// - /// 弹出路由栈顶的UI界面,返回到上一个界面 + /// 弹出路由栈顶的UI界面,返回到上一个界面 /// /// 界面弹出策略,默认为Destroy(销毁) void Pop(UiPopPolicy policy = UiPopPolicy.Destroy); /// - /// 替换当前所有页面为新页面(基于uiKey) + /// 替换当前所有页面为新页面(基于uiKey) /// /// 新UI页面标识符 /// 页面进入参数,可为空 @@ -63,7 +63,7 @@ public interface IUiRouter : ISystem UiInstancePolicy instancePolicy = UiInstancePolicy.Reuse); /// - /// 替换当前所有页面为已存在的页面(基于实例) + /// 替换当前所有页面为已存在的页面(基于实例) /// /// 已创建的UI页面行为实例 /// 页面进入参数,可为空 @@ -74,62 +74,64 @@ public interface IUiRouter : ISystem IUiPageEnterParam? param = null, UiPopPolicy popPolicy = UiPopPolicy.Destroy, UiTransitionPolicy pushPolicy = UiTransitionPolicy.Exclusive); + /// - /// 清空所有UI界面,重置路由状态 + /// 清空所有UI界面,重置路由状态 /// void Clear(); /// - /// 注册UI切换处理器 + /// 注册UI切换处理器 /// /// 处理器实例 /// 执行选项 void RegisterHandler(IUiTransitionHandler handler, UiTransitionHandlerOptions? options = null); /// - /// 注销UI切换处理器 + /// 注销UI切换处理器 /// /// 处理器实例 void UnregisterHandler(IUiTransitionHandler handler); /// - /// 获取当前栈顶UI的Key + /// 获取当前栈顶UI的Key /// /// 当前UI Key,如果栈为空返回空字符串 string PeekKey(); /// - /// 获取当前栈顶的UI页面行为对象 + /// 获取当前栈顶的UI页面行为对象 /// /// 栈顶的IUiPageBehavior对象,如果栈为空则返回null IUiPageBehavior Peek(); /// - /// 判断指定UI是否为当前栈顶UI + /// 判断指定UI是否为当前栈顶UI /// bool IsTop(string uiKey); /// - /// 判断指定UI是否存在于UI栈中 + /// 判断指定UI是否存在于UI栈中 /// bool Contains(string uiKey); #region 路由守卫 /// - /// 注册路由守卫 + /// 注册路由守卫 /// /// 守卫实例 void AddGuard(IUiRouteGuard guard); /// - /// 注册路由守卫(泛型方法) + /// 注册路由守卫(泛型方法) /// /// 守卫类型,必须实现 IUiRouteGuard 且有无参构造函数 void AddGuard() where T : IUiRouteGuard, new(); + /// - /// 移除路由守卫 + /// 移除路由守卫 /// /// 守卫实例 void RemoveGuard(IUiRouteGuard guard); diff --git a/GFramework.Game.Abstractions/ui/IUiTransition.cs b/GFramework.Game.Abstractions/ui/IUiTransition.cs index 1326171..417d1a8 100644 --- a/GFramework.Game.Abstractions/ui/IUiTransition.cs +++ b/GFramework.Game.Abstractions/ui/IUiTransition.cs @@ -1,24 +1,22 @@ -using System.Threading.Tasks; - namespace GFramework.Game.Abstractions.ui; /// -/// UI过渡动画接口 -/// 定义UI进入和退出时的动画效果 +/// UI过渡动画接口 +/// 定义UI进入和退出时的动画效果 /// public interface IUiTransition { /// - /// 播放进入动画 + /// 播放进入动画 /// /// UI页面 /// 异步任务,动画完成后完成 Task PlayEnterAsync(IUiPageBehavior page); /// - /// 播放退出动画 + /// 播放退出动画 /// /// UI页面 /// 异步任务,动画完成后完成 Task PlayExitAsync(IUiPageBehavior page); -} +} \ No newline at end of file diff --git a/GFramework.Game.Abstractions/ui/IUiTransitionHandler.cs b/GFramework.Game.Abstractions/ui/IUiTransitionHandler.cs index 393e021..69c0f3e 100644 --- a/GFramework.Game.Abstractions/ui/IUiTransitionHandler.cs +++ b/GFramework.Game.Abstractions/ui/IUiTransitionHandler.cs @@ -1,28 +1,26 @@ -using System.Threading; -using System.Threading.Tasks; using GFramework.Game.Abstractions.enums; namespace GFramework.Game.Abstractions.ui; /// -/// UI切换处理器接口,定义UI切换扩展点的处理逻辑 +/// UI切换处理器接口,定义UI切换扩展点的处理逻辑 /// public interface IUiTransitionHandler { /// - /// 处理器优先级,数值越小越先执行 + /// 处理器优先级,数值越小越先执行 /// int Priority { get; } /// - /// 处理器适用的阶段,默认为所有阶段 - /// 可以使用Flags枚举指定多个阶段 + /// 处理器适用的阶段,默认为所有阶段 + /// 可以使用Flags枚举指定多个阶段 /// UITransitionPhases Phases { get; } /// - /// 判断是否应该处理当前事件 - /// 可以根据事件类型、UI key等信息进行条件过滤 + /// 判断是否应该处理当前事件 + /// 可以根据事件类型、UI key等信息进行条件过滤 /// /// UI切换事件 /// 当前阶段 @@ -30,7 +28,7 @@ public interface IUiTransitionHandler bool ShouldHandle(UiTransitionEvent @event, UITransitionPhases phases); /// - /// 处理UI切换事件 + /// 处理UI切换事件 /// /// UI切换事件 /// 取消令牌 diff --git a/GFramework.Game.Abstractions/ui/UiCacheConfig.cs b/GFramework.Game.Abstractions/ui/UiCacheConfig.cs index e7d9687..9b5c482 100644 --- a/GFramework.Game.Abstractions/ui/UiCacheConfig.cs +++ b/GFramework.Game.Abstractions/ui/UiCacheConfig.cs @@ -1,31 +1,30 @@ -using System; using GFramework.Game.Abstractions.enums; namespace GFramework.Game.Abstractions.ui; /// -/// UI缓存配置 -/// 用于配置UI实例的缓存行为 +/// UI缓存配置 +/// 用于配置UI实例的缓存行为 /// public class UiCacheConfig { /// - /// 最大缓存数量 + /// 最大缓存数量 /// public int MaxCacheSize { get; set; } = 10; /// - /// 缓存淘汰策略 + /// 缓存淘汰策略 /// public CacheEvictionPolicy EvictionPolicy { get; set; } = CacheEvictionPolicy.Lru; /// - /// 访问后过期时间(可选,null 表示不启用) + /// 访问后过期时间(可选,null 表示不启用) /// public TimeSpan? ExpireAfterAccess { get; set; } /// - /// 创建默认配置(LRU 策略,最大 10 个实例) + /// 创建默认配置(LRU 策略,最大 10 个实例) /// public static UiCacheConfig Default => new() { @@ -35,28 +34,32 @@ public class UiCacheConfig }; /// - /// 创建 LRU 策略配置 + /// 创建 LRU 策略配置 /// /// 最大缓存数量 /// 访问后过期时间 public static UiCacheConfig Lru(int maxSize = 10, TimeSpan? expireAfter = null) - => new() + { + return new UiCacheConfig { MaxCacheSize = maxSize, EvictionPolicy = CacheEvictionPolicy.Lru, ExpireAfterAccess = expireAfter }; + } /// - /// 创建 LFU 策略配置 + /// 创建 LFU 策略配置 /// /// 最大缓存数量 /// 访问后过期时间 public static UiCacheConfig Lfu(int maxSize = 10, TimeSpan? expireAfter = null) - => new() + { + return new UiCacheConfig { MaxCacheSize = maxSize, EvictionPolicy = CacheEvictionPolicy.Lfu, ExpireAfterAccess = expireAfter }; + } } \ No newline at end of file diff --git a/GFramework.Game.Abstractions/ui/UiInstancePolicy.cs b/GFramework.Game.Abstractions/ui/UiInstancePolicy.cs index eab977c..1fbf7ff 100644 --- a/GFramework.Game.Abstractions/ui/UiInstancePolicy.cs +++ b/GFramework.Game.Abstractions/ui/UiInstancePolicy.cs @@ -1,23 +1,22 @@ - -namespace GFramework.Game.Abstractions.ui; +namespace GFramework.Game.Abstractions.ui; /// -/// UI页面实例管理策略(控制实例的生命周期) +/// UI页面实例管理策略(控制实例的生命周期) /// public enum UiInstancePolicy { /// - /// 总是创建新实例 + /// 总是创建新实例 /// AlwaysCreate, - + /// - /// 复用已存在的实例(如果有) + /// 复用已存在的实例(如果有) /// Reuse, - + /// - /// 从预加载池中获取或创建 + /// 从预加载池中获取或创建 /// Pooled } \ No newline at end of file diff --git a/GFramework.Game.Abstractions/ui/UiPopPolicy.cs b/GFramework.Game.Abstractions/ui/UiPopPolicy.cs index 3ac7bec..6ba7e8c 100644 --- a/GFramework.Game.Abstractions/ui/UiPopPolicy.cs +++ b/GFramework.Game.Abstractions/ui/UiPopPolicy.cs @@ -1,17 +1,17 @@ namespace GFramework.Game.Abstractions.ui; /// -/// 定义UI弹窗的关闭策略枚举 +/// 定义UI弹窗的关闭策略枚举 /// public enum UiPopPolicy { /// - /// 销毁实例 + /// 销毁实例 /// Destroy, - + /// - /// 隐藏但保留实例(下次Push可复用) + /// 隐藏但保留实例(下次Push可复用) /// Cache } \ No newline at end of file diff --git a/GFramework.Game.Abstractions/ui/UiTransitionEvent.cs b/GFramework.Game.Abstractions/ui/UiTransitionEvent.cs index d29969d..556b450 100644 --- a/GFramework.Game.Abstractions/ui/UiTransitionEvent.cs +++ b/GFramework.Game.Abstractions/ui/UiTransitionEvent.cs @@ -1,46 +1,44 @@ -using System; -using System.Collections.Generic; using GFramework.Game.Abstractions.enums; namespace GFramework.Game.Abstractions.ui; /// -/// UI切换事件,包含UI切换过程中的上下文信息 +/// UI切换事件,包含UI切换过程中的上下文信息 /// public sealed class UiTransitionEvent { /// - /// 用户自定义数据字典,用于Handler之间传递数据 + /// 用户自定义数据字典,用于Handler之间传递数据 /// private readonly Dictionary _context = new(StringComparer.Ordinal); /// - /// 源UI的标识符,切换前的UI key + /// 源UI的标识符,切换前的UI key /// public string FromUiKey { get; init; } = string.Empty; /// - /// 目标UI的标识符,切换后的UI key + /// 目标UI的标识符,切换后的UI key /// public string? ToUiKey { get; init; } = string.Empty; /// - /// UI切换类型 + /// UI切换类型 /// public UiTransitionType TransitionType { get; init; } /// - /// UI切换策略 + /// UI切换策略 /// public UiTransitionPolicy Policy { get; init; } /// - /// UI进入参数 + /// UI进入参数 /// public IUiPageEnterParam? EnterParam { get; init; } /// - /// 获取用户自定义数据 + /// 获取用户自定义数据 /// /// 数据类型 /// 数据键 @@ -54,7 +52,7 @@ public sealed class UiTransitionEvent } /// - /// 尝试获取用户自定义数据 + /// 尝试获取用户自定义数据 /// /// 数据类型 /// 数据键 @@ -73,7 +71,7 @@ public sealed class UiTransitionEvent } /// - /// 设置用户自定义数据 + /// 设置用户自定义数据 /// /// 数据类型 /// 数据键 @@ -84,7 +82,7 @@ public sealed class UiTransitionEvent } /// - /// 检查是否存在指定的用户数据键 + /// 检查是否存在指定的用户数据键 /// /// 数据键 /// 是否存在 @@ -94,7 +92,7 @@ public sealed class UiTransitionEvent } /// - /// 移除指定的用户数据 + /// 移除指定的用户数据 /// /// 数据键 /// 是否成功移除 diff --git a/GFramework.Game.Abstractions/ui/UiTransitionHandlerOptions.cs b/GFramework.Game.Abstractions/ui/UiTransitionHandlerOptions.cs index 058ebc6..c4c012e 100644 --- a/GFramework.Game.Abstractions/ui/UiTransitionHandlerOptions.cs +++ b/GFramework.Game.Abstractions/ui/UiTransitionHandlerOptions.cs @@ -1,6 +1,6 @@ namespace GFramework.Game.Abstractions.ui; /// -/// UI切换处理器执行选项 +/// UI切换处理器执行选项 /// public record UiTransitionHandlerOptions(int TimeoutMs = 0, bool ContinueOnError = true); \ No newline at end of file diff --git a/GFramework.Game/GFramework.Game.csproj b/GFramework.Game/GFramework.Game.csproj index 5890d47..5e56a18 100644 --- a/GFramework.Game/GFramework.Game.csproj +++ b/GFramework.Game/GFramework.Game.csproj @@ -7,10 +7,10 @@ enable - - + + - + diff --git a/GFramework.Game/README.md b/GFramework.Game/README.md index dca7bf1..218c2d6 100644 --- a/GFramework.Game/README.md +++ b/GFramework.Game/README.md @@ -30,24 +30,28 @@ GFramework.Game 为游戏开发提供了专门的功能模块,与 GFramework.C ## 核心特性 ### 🏗️ 模块化架构 + - **AbstractModule**:可重用的架构模块基类 - **生命周期管理**:与框架生命周期深度集成 - **依赖注入**:模块间的依赖自动管理 - **配置驱动**:灵活的模块配置系统 ### 📦 资产管理 + - **统一资源目录**:集中化的资源注册和查询 - **类型安全**:编译时类型检查和泛型支持 - **重复检测**:自动检测资源重复注册 - **映射支持**:灵活的资源映射和别名系统 ### 💾 存储系统 + - **分层存储**:命名空间支持的存储隔离 - **多格式支持**:JSON、二进制等多种存储格式 - **异步操作**:完整的异步存储 API - **版本兼容**:存档版本管理和迁移支持 ### 🔄 序列化系统 + - **JSON 集成**:基于 Newtonsoft.Json 的序列化 - **自定义序列化**:支持自定义序列化逻辑 - **性能优化**:序列化缓存和优化策略 diff --git a/GFramework.Game/serializer/JsonSerializer.cs b/GFramework.Game/serializer/JsonSerializer.cs index fa4de37..30aaafb 100644 --- a/GFramework.Game/serializer/JsonSerializer.cs +++ b/GFramework.Game/serializer/JsonSerializer.cs @@ -4,26 +4,30 @@ using Newtonsoft.Json; namespace GFramework.Game.serializer; /// -/// JSON序列化器实现类,用于将对象序列化为JSON字符串或将JSON字符串反序列化为对象 +/// JSON序列化器实现类,用于将对象序列化为JSON字符串或将JSON字符串反序列化为对象 /// public sealed class JsonSerializer : ISerializer { /// - /// 将指定的对象序列化为JSON字符串 + /// 将指定的对象序列化为JSON字符串 /// /// 要序列化的对象类型 /// 要序列化的对象实例 /// 序列化后的JSON字符串 public string Serialize(T value) - => JsonConvert.SerializeObject(value); + { + return JsonConvert.SerializeObject(value); + } /// - /// 将JSON字符串反序列化为指定类型的对象 + /// 将JSON字符串反序列化为指定类型的对象 /// /// 要反序列化的对象类型 /// 包含JSON数据的字符串 /// 反序列化后的对象实例 /// 当无法反序列化数据时抛出 public T Deserialize(string data) - => JsonConvert.DeserializeObject(data) ?? throw new ArgumentException("Cannot deserialize data"); + { + return JsonConvert.DeserializeObject(data) ?? throw new ArgumentException("Cannot deserialize data"); + } } \ No newline at end of file diff --git a/GFramework.Game/setting/SettingsModel.cs b/GFramework.Game/setting/SettingsModel.cs index b531ad8..64add79 100644 --- a/GFramework.Game/setting/SettingsModel.cs +++ b/GFramework.Game/setting/SettingsModel.cs @@ -4,7 +4,7 @@ using GFramework.Game.Abstractions.setting; namespace GFramework.Game.setting; /// -/// 设置模型类,用于管理不同类型的应用程序设置部分 +/// 设置模型类,用于管理不同类型的应用程序设置部分 /// public class SettingsModel : AbstractModel, ISettingsModel { @@ -12,7 +12,7 @@ public class SettingsModel : AbstractModel, ISettingsModel private readonly Dictionary _dataSettings = new(); /// - /// 获取或创建数据设置 + /// 获取或创建数据设置 /// /// 设置数据类型,必须实现ISettingsData接口并具有无参构造函数 /// 指定类型的设置数据实例 @@ -31,7 +31,7 @@ public class SettingsModel : AbstractModel, ISettingsModel } /// - /// 注册可应用设置(必须手动注册) + /// 注册可应用设置(必须手动注册) /// /// 可应用设置的类型,必须继承自class和IApplyAbleSettings /// 要注册的可应用设置实例 @@ -44,7 +44,7 @@ public class SettingsModel : AbstractModel, ISettingsModel } /// - /// 获取已注册的可应用设置 + /// 获取已注册的可应用设置 /// /// 可应用设置类型,必须实现IApplyAbleSettings接口 /// 找到的可应用设置实例,如果未找到则返回null @@ -57,7 +57,7 @@ public class SettingsModel : AbstractModel, ISettingsModel } /// - /// 尝试获取指定类型的设置节 + /// 尝试获取指定类型的设置节 /// /// 要查找的设置类型 /// 输出参数,找到的设置节实例 @@ -83,7 +83,7 @@ public class SettingsModel : AbstractModel, ISettingsModel } /// - /// 获取所有设置节的集合 + /// 获取所有设置节的集合 /// /// 包含所有设置节的可枚举集合 public IEnumerable All() @@ -95,7 +95,7 @@ public class SettingsModel : AbstractModel, ISettingsModel /// - /// 初始化方法,用于执行模型的初始化逻辑 + /// 初始化方法,用于执行模型的初始化逻辑 /// protected override void OnInit() { diff --git a/GFramework.Game/setting/SettingsPersistence.cs b/GFramework.Game/setting/SettingsPersistence.cs index e777185..7990082 100644 --- a/GFramework.Game/setting/SettingsPersistence.cs +++ b/GFramework.Game/setting/SettingsPersistence.cs @@ -7,14 +7,14 @@ using GFramework.Game.setting.events; namespace GFramework.Game.setting; /// -/// 设置持久化服务类,负责处理设置数据的加载、保存、删除等操作 +/// 设置持久化服务类,负责处理设置数据的加载、保存、删除等操作 /// public class SettingsPersistence : AbstractContextUtility, ISettingsPersistence { private IStorage _storage = null!; /// - /// 异步加载指定类型的设置数据 + /// 异步加载指定类型的设置数据 /// /// 设置数据类型,必须实现ISettingsData接口 /// 如果存在则返回存储的设置数据,否则返回新创建的实例 @@ -35,7 +35,7 @@ public class SettingsPersistence : AbstractContextUtility, ISettingsPersistence } /// - /// 异步保存设置数据到存储中 + /// 异步保存设置数据到存储中 /// /// 设置数据类型,必须实现ISettingsData接口 /// 要保存的设置数据实例 @@ -47,7 +47,7 @@ public class SettingsPersistence : AbstractContextUtility, ISettingsPersistence } /// - /// 检查指定类型的设置数据是否存在 + /// 检查指定类型的设置数据是否存在 /// /// 设置数据类型,必须实现ISettingsData接口 /// 如果存在返回true,否则返回false @@ -58,7 +58,7 @@ public class SettingsPersistence : AbstractContextUtility, ISettingsPersistence } /// - /// 异步删除指定类型的设置数据 + /// 异步删除指定类型的设置数据 /// /// 设置数据类型,必须实现ISettingsData接口 public async Task DeleteAsync() where T : class, ISettingsData @@ -70,7 +70,7 @@ public class SettingsPersistence : AbstractContextUtility, ISettingsPersistence } /// - /// 异步保存所有设置数据到存储中 + /// 异步保存所有设置数据到存储中 /// /// 包含所有设置数据的可枚举集合 public async Task SaveAllAsync(IEnumerable allData) @@ -87,7 +87,7 @@ public class SettingsPersistence : AbstractContextUtility, ISettingsPersistence } /// - /// 异步加载所有已知类型的设置数据 + /// 异步加载所有已知类型的设置数据 /// /// 已知设置数据类型的集合 /// 类型与对应设置数据的字典映射 @@ -124,18 +124,22 @@ public class SettingsPersistence : AbstractContextUtility, ISettingsPersistence } /// - /// 获取指定类型的存储键名 + /// 获取指定类型的存储键名 /// /// 设置数据类型 /// 格式为"Settings_类型名称"的键名 private static string GetKey() where T : ISettingsData - => GetKey(typeof(T)); + { + return GetKey(typeof(T)); + } /// - /// 获取指定类型的存储键名 + /// 获取指定类型的存储键名 /// /// 设置数据类型 /// 格式为"Settings_类型名称"的键名 private static string GetKey(Type type) - => $"Settings_{type.Name}"; + { + return $"Settings_{type.Name}"; + } } \ No newline at end of file diff --git a/GFramework.Game/setting/SettingsSystem.cs b/GFramework.Game/setting/SettingsSystem.cs index 0623360..fd2318c 100644 --- a/GFramework.Game/setting/SettingsSystem.cs +++ b/GFramework.Game/setting/SettingsSystem.cs @@ -6,37 +6,36 @@ using GFramework.Game.setting.events; namespace GFramework.Game.setting; /// -/// 设置系统,负责管理和应用各种设置配置 +/// 设置系统,负责管理和应用各种设置配置 /// public class SettingsSystem : AbstractSystem, ISettingsSystem { private ISettingsModel _model = null!; /// - /// 应用所有设置配置 + /// 应用所有设置配置 /// /// 完成的任务 public Task ApplyAll() { // 遍历所有设置配置并尝试应用 - foreach (var section in _model.All()) - { - TryApply(section); - } + foreach (var section in _model.All()) TryApply(section); return Task.CompletedTask; } /// - /// 应用指定类型的设置配置 + /// 应用指定类型的设置配置 /// /// 设置配置类型,必须是类且实现ISettingsSection接口 /// 完成的任务 public Task Apply() where T : class, ISettingsSection - => Apply(typeof(T)); + { + return Apply(typeof(T)); + } /// - /// 应用指定类型的设置配置 + /// 应用指定类型的设置配置 /// /// 设置配置类型 /// 完成的任务 @@ -50,7 +49,7 @@ public class SettingsSystem : AbstractSystem, ISettingsSystem } /// - /// 应用指定类型集合的设置配置 + /// 应用指定类型集合的设置配置 /// /// 设置配置类型集合 /// 完成的任务 @@ -58,18 +57,14 @@ public class SettingsSystem : AbstractSystem, ISettingsSystem { // 去重后遍历设置类型,获取并应用对应的设置配置 foreach (var type in settingsTypes.Distinct()) - { if (_model.TryGet(type, out var section)) - { TryApply(section); - } - } return Task.CompletedTask; } /// - /// 初始化设置系统,获取设置模型实例 + /// 初始化设置系统,获取设置模型实例 /// protected override void OnInit() { @@ -77,7 +72,7 @@ public class SettingsSystem : AbstractSystem, ISettingsSystem } /// - /// 尝试应用可应用的设置配置 + /// 尝试应用可应用的设置配置 /// /// 设置配置对象 private void TryApply(ISettingsSection section) diff --git a/GFramework.Game/setting/events/SettingsAllLoadedEvent.cs b/GFramework.Game/setting/events/SettingsAllLoadedEvent.cs index 6d81f35..3b480fa 100644 --- a/GFramework.Game/setting/events/SettingsAllLoadedEvent.cs +++ b/GFramework.Game/setting/events/SettingsAllLoadedEvent.cs @@ -3,28 +3,28 @@ namespace GFramework.Game.setting.events; /// -/// 表示所有设置已加载完成的事件 +/// 表示所有设置已加载完成的事件 /// /// 包含所有设置节的可枚举集合 public class SettingsAllLoadedEvent(IEnumerable all) : ISettingsChangedEvent { /// - /// 获取所有设置节的只读集合 + /// 获取所有设置节的只读集合 /// public IReadOnlyCollection AllSettings { get; } = all.ToList(); /// - /// 获取设置类型,始终返回 ISettingsSection 类型 + /// 获取设置类型,始终返回 ISettingsSection 类型 /// public Type SettingsType => typeof(ISettingsSection); /// - /// 获取具体的设置节,此事件中始终为 null + /// 获取具体的设置节,此事件中始终为 null /// public ISettingsSection Settings => null!; /// - /// 获取事件发生的时间(UTC时间) + /// 获取事件发生的时间(UTC时间) /// public DateTime ChangedAt { get; } = DateTime.UtcNow; } \ No newline at end of file diff --git a/GFramework.Game/setting/events/SettingsAppliedEvent.cs b/GFramework.Game/setting/events/SettingsAppliedEvent.cs index 59b2b8d..2399b21 100644 --- a/GFramework.Game/setting/events/SettingsAppliedEvent.cs +++ b/GFramework.Game/setting/events/SettingsAppliedEvent.cs @@ -3,39 +3,39 @@ namespace GFramework.Game.setting.events; /// -/// 表示设置应用完成事件 +/// 表示设置应用完成事件 /// /// 设置节类型,必须实现ISettingsSection接口 public class SettingsAppliedEvent(T settings, bool success, Exception? error = null) : ISettingsChangedEvent where T : ISettingsSection { /// - /// 获取类型化的设置节实例 + /// 获取类型化的设置节实例 /// public T TypedSettings => (T)Settings; /// - /// 获取设置应用是否成功的状态 + /// 获取设置应用是否成功的状态 /// public bool Success { get; } = success; /// - /// 获取设置应用过程中发生的错误异常(如果有的话) + /// 获取设置应用过程中发生的错误异常(如果有的话) /// public Exception? Error { get; } = error; /// - /// 获取设置类型的Type信息 + /// 获取设置类型的Type信息 /// public Type SettingsType => typeof(T); /// - /// 获取应用的设置节实例 + /// 获取应用的设置节实例 /// public ISettingsSection Settings { get; } = settings; /// - /// 获取设置变更的时间戳(UTC时间) + /// 获取设置变更的时间戳(UTC时间) /// public DateTime ChangedAt { get; } = DateTime.UtcNow; } \ No newline at end of file diff --git a/GFramework.Game/setting/events/SettingsApplyingEvent.cs b/GFramework.Game/setting/events/SettingsApplyingEvent.cs index a8745d2..0d7a5f1 100644 --- a/GFramework.Game/setting/events/SettingsApplyingEvent.cs +++ b/GFramework.Game/setting/events/SettingsApplyingEvent.cs @@ -3,29 +3,29 @@ namespace GFramework.Game.setting.events; /// -/// 表示设置应用事件的泛型类 +/// 表示设置应用事件的泛型类 /// /// 设置节类型,必须实现ISettingsSection接口 public class SettingsApplyingEvent(T settings) : ISettingsChangedEvent where T : ISettingsSection { /// - /// 获取类型化的设置对象 + /// 获取类型化的设置对象 /// public T TypedSettings { get; } = settings; /// - /// 获取设置类型的Type信息 + /// 获取设置类型的Type信息 /// public Type SettingsType => typeof(T); /// - /// 获取设置节基接口实例 + /// 获取设置节基接口实例 /// public ISettingsSection Settings => TypedSettings; /// - /// 获取设置变更的时间戳 + /// 获取设置变更的时间戳 /// public DateTime ChangedAt { get; } = DateTime.UtcNow; } \ No newline at end of file diff --git a/GFramework.Game/setting/events/SettingsBatchChangedEvent.cs b/GFramework.Game/setting/events/SettingsBatchChangedEvent.cs index f1dc043..1ac3bc8 100644 --- a/GFramework.Game/setting/events/SettingsBatchChangedEvent.cs +++ b/GFramework.Game/setting/events/SettingsBatchChangedEvent.cs @@ -3,29 +3,29 @@ namespace GFramework.Game.setting.events; /// -/// 批量设置变更事件 -/// 表示多个设置项同时发生变更的事件 +/// 批量设置变更事件 +/// 表示多个设置项同时发生变更的事件 /// /// 发生变更的设置数据集合 public class SettingsBatchChangedEvent(IEnumerable settings) : ISettingsChangedEvent { /// - /// 获取发生变更的具体设置数据列表 + /// 获取发生变更的具体设置数据列表 /// public IEnumerable ChangedSettings { get; } = settings.ToList(); /// - /// 获取设置类型,对于批量变更事件,固定返回ISettingsSection类型 + /// 获取设置类型,对于批量变更事件,固定返回ISettingsSection类型 /// public Type SettingsType => typeof(ISettingsSection); /// - /// 获取设置实例,批量变更事件中此属性返回null + /// 获取设置实例,批量变更事件中此属性返回null /// public ISettingsSection Settings => null!; /// - /// 获取变更发生的时间戳(UTC时间) + /// 获取变更发生的时间戳(UTC时间) /// public DateTime ChangedAt { get; } = DateTime.UtcNow; } \ No newline at end of file diff --git a/GFramework.Game/setting/events/SettingsBatchSavedEvent.cs b/GFramework.Game/setting/events/SettingsBatchSavedEvent.cs index 922782a..0e94952 100644 --- a/GFramework.Game/setting/events/SettingsBatchSavedEvent.cs +++ b/GFramework.Game/setting/events/SettingsBatchSavedEvent.cs @@ -3,28 +3,28 @@ namespace GFramework.Game.setting.events; /// -/// 表示设置批量保存事件 +/// 表示设置批量保存事件 /// /// 要保存的设置数据集合 public class SettingsBatchSavedEvent(IEnumerable settings) : ISettingsChangedEvent { /// - /// 获取已保存的设置数据只读集合 + /// 获取已保存的设置数据只读集合 /// public IReadOnlyCollection SavedSettings { get; } = settings.ToList(); /// - /// 获取设置类型(始终返回ISettingsSection类型) + /// 获取设置类型(始终返回ISettingsSection类型) /// public Type SettingsType => typeof(ISettingsSection); /// - /// 获取设置节(在此事件中始终为null) + /// 获取设置节(在此事件中始终为null) /// public ISettingsSection Settings => null!; /// - /// 获取更改发生的时间(UTC时间) + /// 获取更改发生的时间(UTC时间) /// public DateTime ChangedAt { get; } = DateTime.UtcNow; } \ No newline at end of file diff --git a/GFramework.Game/setting/events/SettingsChangedEvent.cs b/GFramework.Game/setting/events/SettingsChangedEvent.cs index 4eeaba1..e83fc74 100644 --- a/GFramework.Game/setting/events/SettingsChangedEvent.cs +++ b/GFramework.Game/setting/events/SettingsChangedEvent.cs @@ -3,7 +3,7 @@ namespace GFramework.Game.setting.events; /// -/// 泛型设置变更事件 +/// 泛型设置变更事件 /// /// 设置节类型,必须实现ISettingsSection接口 /// 设置实例 @@ -11,22 +11,22 @@ public class SettingsChangedEvent(T settings) : ISettingsChangedEvent where T : ISettingsSection { /// - /// 获取类型化的设置实例 + /// 获取类型化的设置实例 /// public T TypedSettings => (T)Settings; /// - /// 获取设置类型 + /// 获取设置类型 /// public Type SettingsType => typeof(T); /// - /// 获取设置实例 + /// 获取设置实例 /// public ISettingsSection Settings { get; } = settings; /// - /// 获取变更时间 + /// 获取变更时间 /// public DateTime ChangedAt { get; } = DateTime.UtcNow; } \ No newline at end of file diff --git a/GFramework.Game/setting/events/SettingsDeletedEvent.cs b/GFramework.Game/setting/events/SettingsDeletedEvent.cs index 8bde8be..923862e 100644 --- a/GFramework.Game/setting/events/SettingsDeletedEvent.cs +++ b/GFramework.Game/setting/events/SettingsDeletedEvent.cs @@ -3,22 +3,22 @@ using GFramework.Game.Abstractions.setting; namespace GFramework.Game.setting.events; /// -/// 表示设置删除事件 +/// 表示设置删除事件 /// public class SettingsDeletedEvent(Type settingsType) : ISettingsChangedEvent { /// - /// 获取被删除的设置类型 + /// 获取被删除的设置类型 /// public Type SettingsType { get; } = settingsType; /// - /// 获取设置实例,删除事件中返回 null + /// 获取设置实例,删除事件中返回 null /// public ISettingsSection Settings => null!; /// - /// 获取删除时间 + /// 获取删除时间 /// public DateTime ChangedAt { get; } = DateTime.UtcNow; } \ No newline at end of file diff --git a/GFramework.Game/setting/events/SettingsLoadedEvent.cs b/GFramework.Game/setting/events/SettingsLoadedEvent.cs index 349188a..094059c 100644 --- a/GFramework.Game/setting/events/SettingsLoadedEvent.cs +++ b/GFramework.Game/setting/events/SettingsLoadedEvent.cs @@ -3,29 +3,29 @@ namespace GFramework.Game.setting.events; /// -/// 表示设置加载完成事件的泛型类 +/// 表示设置加载完成事件的泛型类 /// /// 设置节类型,必须实现ISettingsSection接口 public class SettingsLoadedEvent(T settings) : ISettingsChangedEvent where T : ISettingsSection { /// - /// 获取类型化的设置对象 + /// 获取类型化的设置对象 /// public T TypedSettings { get; } = settings; /// - /// 获取设置类型的Type信息 + /// 获取设置类型的Type信息 /// public Type SettingsType => typeof(T); /// - /// 获取设置节基接口对象 + /// 获取设置节基接口对象 /// public ISettingsSection Settings => TypedSettings; /// - /// 获取事件发生的时间戳 + /// 获取事件发生的时间戳 /// public DateTime ChangedAt { get; } = DateTime.UtcNow; } \ No newline at end of file diff --git a/GFramework.Game/setting/events/SettingsResetAllEvent.cs b/GFramework.Game/setting/events/SettingsResetAllEvent.cs index 5d7e24a..8ab86a5 100644 --- a/GFramework.Game/setting/events/SettingsResetAllEvent.cs +++ b/GFramework.Game/setting/events/SettingsResetAllEvent.cs @@ -3,28 +3,28 @@ using GFramework.Game.Abstractions.setting; namespace GFramework.Game.setting.events; /// -/// 表示所有设置重置完成事件 +/// 表示所有设置重置完成事件 /// /// 重置后的所有设置 public class SettingsResetAllEvent(IEnumerable newSettings) : ISettingsChangedEvent { /// - /// 获取重置后的所有设置 + /// 获取重置后的所有设置 /// public IReadOnlyCollection NewSettings { get; } = newSettings.ToList(); /// - /// 获取设置类型,固定返回 ISettingsSection + /// 获取设置类型,固定返回 ISettingsSection /// public Type SettingsType => typeof(ISettingsSection); /// - /// 获取设置实例,批量事件中返回 null + /// 获取设置实例,批量事件中返回 null /// public ISettingsSection Settings => null!; /// - /// 获取重置时间 + /// 获取重置时间 /// public DateTime ChangedAt { get; } = DateTime.UtcNow; } \ No newline at end of file diff --git a/GFramework.Game/setting/events/SettingsResetEvent.cs b/GFramework.Game/setting/events/SettingsResetEvent.cs index be6755c..d70e38f 100644 --- a/GFramework.Game/setting/events/SettingsResetEvent.cs +++ b/GFramework.Game/setting/events/SettingsResetEvent.cs @@ -3,34 +3,34 @@ using GFramework.Game.Abstractions.setting; namespace GFramework.Game.setting.events; /// -/// 表示设置重置事件 +/// 表示设置重置事件 /// /// 设置节类型 public class SettingsResetEvent(T newSettings) : ISettingsChangedEvent where T : ISettingsSection { /// - /// 获取重置后的新设置 + /// 获取重置后的新设置 /// public T NewSettings { get; } = newSettings; /// - /// 获取类型化的设置实例(返回新设置) + /// 获取类型化的设置实例(返回新设置) /// public T TypedSettings => NewSettings; /// - /// 获取设置类型 + /// 获取设置类型 /// public Type SettingsType => typeof(T); /// - /// 获取设置实例 + /// 获取设置实例 /// public ISettingsSection Settings => NewSettings; /// - /// 获取重置时间 + /// 获取重置时间 /// public DateTime ChangedAt { get; } = DateTime.UtcNow; } \ No newline at end of file diff --git a/GFramework.Game/setting/events/SettingsSavedEvent.cs b/GFramework.Game/setting/events/SettingsSavedEvent.cs index 516bb02..e8a7005 100644 --- a/GFramework.Game/setting/events/SettingsSavedEvent.cs +++ b/GFramework.Game/setting/events/SettingsSavedEvent.cs @@ -3,29 +3,29 @@ namespace GFramework.Game.setting.events; /// -/// 表示设置保存事件的泛型类 +/// 表示设置保存事件的泛型类 /// /// 设置节类型,必须实现ISettingsSection接口 public class SettingsSavedEvent(T settings) : ISettingsChangedEvent where T : ISettingsSection { /// - /// 获取类型化的设置对象 + /// 获取类型化的设置对象 /// public T TypedSettings { get; } = settings; /// - /// 获取设置类型的Type信息 + /// 获取设置类型的Type信息 /// public Type SettingsType => typeof(T); /// - /// 获取设置节对象 + /// 获取设置节对象 /// public ISettingsSection Settings => TypedSettings; /// - /// 获取设置更改的时间戳 + /// 获取设置更改的时间戳 /// public DateTime ChangedAt { get; } = DateTime.UtcNow; } \ No newline at end of file diff --git a/GFramework.Game/state/GameStateMachineSystem.cs b/GFramework.Game/state/GameStateMachineSystem.cs index 42270fa..fdbeddd 100644 --- a/GFramework.Game/state/GameStateMachineSystem.cs +++ b/GFramework.Game/state/GameStateMachineSystem.cs @@ -4,23 +4,27 @@ using GFramework.Core.state; namespace GFramework.Game.state; /// -/// 游戏状态机类,继承自ContextAwareStateMachine,用于管理游戏中的各种状态 +/// 游戏状态机类,继承自ContextAwareStateMachine,用于管理游戏中的各种状态 /// public sealed class GameStateMachineSystem : StateMachineSystem { /// - /// 检查当前状态是否为指定类型的状态 + /// 检查当前状态是否为指定类型的状态 /// /// 要检查的状态类型,必须实现IState接口 /// 如果当前状态是指定类型则返回true,否则返回false public bool IsIn() where T : IState - => Current is T; + { + return Current is T; + } /// - /// 获取当前状态的实例,如果当前状态是指定类型则进行类型转换 + /// 获取当前状态的实例,如果当前状态是指定类型则进行类型转换 /// /// 要获取的状态类型,必须是引用类型并实现IState接口 /// 如果当前状态是指定类型则返回转换后的实例,否则返回null public T? Get() where T : class, IState - => Current as T; + { + return Current as T; + } } \ No newline at end of file diff --git a/GFramework.Game/storage/FileStorage.cs b/GFramework.Game/storage/FileStorage.cs index 1f34f6c..e740497 100644 --- a/GFramework.Game/storage/FileStorage.cs +++ b/GFramework.Game/storage/FileStorage.cs @@ -7,7 +7,7 @@ using GFramework.Game.Abstractions.storage; namespace GFramework.Game.storage; /// -/// 基于文件系统的存储实现,实现了IFileStorage接口,支持按key细粒度锁保证线程安全 +/// 基于文件系统的存储实现,实现了IFileStorage接口,支持按key细粒度锁保证线程安全 /// public sealed class FileStorage : IFileStorage { @@ -19,7 +19,7 @@ public sealed class FileStorage : IFileStorage private readonly ISerializer _serializer; /// - /// 初始化FileStorage实例 + /// 初始化FileStorage实例 /// /// 存储根目录路径 /// 序列化器实例 @@ -36,7 +36,7 @@ public sealed class FileStorage : IFileStorage #region Delete /// - /// 删除指定键的存储项 + /// 删除指定键的存储项 /// /// 存储键 public void Delete(string key) @@ -54,7 +54,7 @@ public sealed class FileStorage : IFileStorage #endregion /// - /// 清理文件段字符串,将其中的无效文件名字符替换为下划线 + /// 清理文件段字符串,将其中的无效文件名字符替换为下划线 /// /// 需要清理的文件段字符串 /// 清理后的字符串,其中所有无效文件名字符都被替换为下划线 @@ -66,7 +66,7 @@ public sealed class FileStorage : IFileStorage #region Helpers /// - /// 将存储键转换为文件路径 + /// 将存储键转换为文件路径 /// /// 存储键 /// 对应的文件路径 @@ -108,7 +108,7 @@ public sealed class FileStorage : IFileStorage #region Exists /// - /// 检查指定键的存储项是否存在 + /// 检查指定键的存储项是否存在 /// /// 存储键 /// 如果存储项存在则返回true,否则返回false @@ -124,19 +124,21 @@ public sealed class FileStorage : IFileStorage } /// - /// 异步检查指定键的存储项是否存在 + /// 异步检查指定键的存储项是否存在 /// /// 存储键 /// 如果存储项存在则返回true,否则返回false public Task ExistsAsync(string key) - => Task.FromResult(Exists(key)); + { + return Task.FromResult(Exists(key)); + } #endregion #region Read /// - /// 读取指定键的存储项 + /// 读取指定键的存储项 /// /// 要反序列化的类型 /// 存储键 @@ -158,7 +160,7 @@ public sealed class FileStorage : IFileStorage } /// - /// 读取指定键的存储项,如果不存在则返回默认值 + /// 读取指定键的存储项,如果不存在则返回默认值 /// /// 要反序列化的类型 /// 存储键 @@ -180,7 +182,7 @@ public sealed class FileStorage : IFileStorage } /// - /// 异步读取指定键的存储项 + /// 异步读取指定键的存储项 /// /// 要反序列化的类型 /// 存储键 @@ -214,7 +216,7 @@ public sealed class FileStorage : IFileStorage #region Write /// - /// 写入指定键的存储项 + /// 写入指定键的存储项 /// /// 要序列化的对象类型 /// 存储键 @@ -232,7 +234,7 @@ public sealed class FileStorage : IFileStorage } /// - /// 异步写入指定键的存储项 + /// 异步写入指定键的存储项 /// /// 要序列化的对象类型 /// 存储键 diff --git a/GFramework.Game/storage/ScopedStorage.cs b/GFramework.Game/storage/ScopedStorage.cs index 2f9ca5b..9498ac2 100644 --- a/GFramework.Game/storage/ScopedStorage.cs +++ b/GFramework.Game/storage/ScopedStorage.cs @@ -4,96 +4,116 @@ using GFramework.Game.Abstractions.storage; namespace GFramework.Game.storage; /// -/// 提供带有作用域前缀的存储包装器,将所有键都加上指定的前缀 +/// 提供带有作用域前缀的存储包装器,将所有键都加上指定的前缀 /// /// 内部的实际存储实现 /// 用于所有键的前缀字符串 public sealed class ScopedStorage(IStorage inner, string prefix) : IScopedStorage { /// - /// 检查指定键是否存在 + /// 检查指定键是否存在 /// /// 要检查的键 /// 如果键存在则返回true,否则返回false public bool Exists(string key) - => inner.Exists(Key(key)); + { + return inner.Exists(Key(key)); + } /// - /// 异步检查指定键是否存在 + /// 异步检查指定键是否存在 /// /// 要检查的键 /// 如果键存在则返回true,否则返回false public Task ExistsAsync(string key) - => inner.ExistsAsync(Key(key)); + { + return inner.ExistsAsync(Key(key)); + } /// - /// 读取指定键的值 + /// 读取指定键的值 /// /// 要读取的值的类型 /// 要读取的键 /// 键对应的值 public T Read(string key) - => inner.Read(Key(key)); + { + return inner.Read(Key(key)); + } /// - /// 读取指定键的值,如果键不存在则返回默认值 + /// 读取指定键的值,如果键不存在则返回默认值 /// /// 要读取的值的类型 /// 要读取的键 /// 当键不存在时返回的默认值 /// 键对应的值或默认值 public T Read(string key, T defaultValue) - => inner.Read(Key(key), defaultValue); + { + return inner.Read(Key(key), defaultValue); + } /// - /// 异步读取指定键的值 + /// 异步读取指定键的值 /// /// 要读取的值的类型 /// 要读取的键 /// 键对应的值的任务 public Task ReadAsync(string key) - => inner.ReadAsync(Key(key)); + { + return inner.ReadAsync(Key(key)); + } /// - /// 写入指定键值对 + /// 写入指定键值对 /// /// 要写入的值的类型 /// 要写入的键 /// 要写入的值 public void Write(string key, T value) - => inner.Write(Key(key), value); + { + inner.Write(Key(key), value); + } /// - /// 异步写入指定键值对 + /// 异步写入指定键值对 /// /// 要写入的值的类型 /// 要写入的键 /// 要写入的值 public Task WriteAsync(string key, T value) - => inner.WriteAsync(Key(key), value); + { + return inner.WriteAsync(Key(key), value); + } /// - /// 删除指定键 + /// 删除指定键 /// /// 要删除的键 public void Delete(string key) - => inner.Delete(Key(key)); + { + inner.Delete(Key(key)); + } /// - /// 为给定的键添加前缀 + /// 为给定的键添加前缀 /// /// 原始键 /// 添加前缀后的键 private string Key(string key) - => string.IsNullOrEmpty(prefix) + { + return string.IsNullOrEmpty(prefix) ? key : $"{prefix}/{key}"; + } /// - /// 创建一个新的作用域存储实例 + /// 创建一个新的作用域存储实例 /// /// 新的作用域名称 /// 新的作用域存储实例 public IStorage Scope(string scope) - => new ScopedStorage(inner, Key(scope)); + { + return new ScopedStorage(inner, Key(scope)); + } } \ No newline at end of file diff --git a/GFramework.Game/ui/UiRouterBase.cs b/GFramework.Game/ui/UiRouterBase.cs index f95197b..5f33f2d 100644 --- a/GFramework.Game/ui/UiRouterBase.cs +++ b/GFramework.Game/ui/UiRouterBase.cs @@ -8,41 +8,41 @@ using GFramework.Game.Abstractions.ui; namespace GFramework.Game.ui; /// -/// UI路由类,提供页面栈管理功能 +/// UI路由类,提供页面栈管理功能 /// public abstract class UiRouterBase : AbstractSystem, IUiRouter { private static readonly ILogger Log = LoggerFactoryResolver.Provider.CreateLogger("UiRouterBase"); /// - /// 路由守卫列表 + /// 路由守卫列表 /// private readonly List _guards = new(); /// - /// 层级管理(非栈层级),用于Overlay、Modal、Toast等浮层 + /// 层级管理(非栈层级),用于Overlay、Modal、Toast等浮层 /// private readonly Dictionary> _layers = new(); /// - /// UI切换处理器管道 + /// UI切换处理器管道 /// private readonly UiTransitionPipeline _pipeline = new(); /// - /// 页面栈,用于管理UI页面的显示顺序 + /// 页面栈,用于管理UI页面的显示顺序 /// private readonly Stack _stack = new(); /// - /// UI工厂实例,用于创建UI相关的对象 + /// UI工厂实例,用于创建UI相关的对象 /// private IUiFactory _factory = null!; private IUiRoot _uiRoot = null!; /// - /// 注册UI切换处理器 + /// 注册UI切换处理器 /// /// 处理器实例 /// 执行选项 @@ -52,7 +52,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter } /// - /// 注销UI切换处理器 + /// 注销UI切换处理器 /// /// 处理器实例 public void UnregisterHandler(IUiTransitionHandler handler) @@ -61,7 +61,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter } /// - /// 绑定UI根节点 + /// 绑定UI根节点 /// public void BindRoot(IUiRoot root) { @@ -71,7 +71,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter /// - /// 将指定的UI界面压入路由栈,显示新的UI界面 + /// 将指定的UI界面压入路由栈,显示新的UI界面 /// /// UI界面的唯一标识符 /// 进入界面的参数,可为空 @@ -100,7 +100,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter } /// - /// 将已存在的UI页面压入栈顶并显示 + /// 将已存在的UI页面压入栈顶并显示 /// /// 已创建的UI页面行为实例 /// 页面进入参数,可为空 @@ -132,7 +132,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter } /// - /// 弹出栈顶页面并根据策略处理页面 + /// 弹出栈顶页面并根据策略处理页面 /// /// 弹出策略,默认为销毁策略 public void Pop(UiPopPolicy policy = UiPopPolicy.Destroy) @@ -158,7 +158,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter var @event = CreateEvent( nextUiKey, - type: UiTransitionType.Pop + UiTransitionType.Pop ); BeforeChange(@event); @@ -170,7 +170,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter /// - /// 替换当前所有页面为新页面(基于uiKey) + /// 替换当前所有页面为新页面(基于uiKey) /// /// 新UI页面标识符 /// 页面进入参数,可为空 @@ -205,7 +205,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter } /// - /// 替换当前所有页面为已存在的页面(基于实例) + /// 替换当前所有页面为已存在的页面(基于实例) /// /// 已创建的UI页面行为实例 /// 页面进入参数,可为空 @@ -237,7 +237,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter } /// - /// 清空所有页面栈中的页面 + /// 清空所有页面栈中的页面 /// public void Clear() { @@ -255,7 +255,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter /// - /// 获取页面栈顶元素的键值,但不移除该元素 + /// 获取页面栈顶元素的键值,但不移除该元素 /// /// 如果页面栈为空则返回空字符串,否则返回栈顶元素的键值 public string PeekKey() @@ -264,7 +264,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter } /// - /// 获取页面栈顶元素,但不移除该元素 + /// 获取页面栈顶元素,但不移除该元素 /// /// 返回栈顶的IUiPageBehavior元素 public IUiPageBehavior Peek() @@ -274,7 +274,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter /// - /// 判断栈顶元素是否指定的UI类型 + /// 判断栈顶元素是否指定的UI类型 /// /// 要比较的UI类型名称 /// 如果栈为空或栈顶元素类型不匹配则返回false,否则返回true @@ -284,7 +284,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter } /// - /// 判断栈中是否包含指定类型的UI元素 + /// 判断栈中是否包含指定类型的UI元素 /// /// 要查找的UI类型名称 /// 如果栈中存在指定类型的UI元素则返回true,否则返回false @@ -294,12 +294,12 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter } /// - /// 获取栈中元素的数量 + /// 获取栈中元素的数量 /// public int Count => _stack.Count; /// - /// 初始化方法,在页面初始化时获取UI工厂实例 + /// 初始化方法,在页面初始化时获取UI工厂实例 /// protected override void OnInit() { @@ -309,12 +309,12 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter } /// - /// 注册默认的UI切换处理器 + /// 注册默认的UI切换处理器 /// protected abstract void RegisterHandlers(); /// - /// 创建UI切换事件 + /// 创建UI切换事件 /// private UiTransitionEvent CreateEvent( string? toUiKey, @@ -334,7 +334,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter } /// - /// 执行UI切换前的Handler(阻塞) + /// 执行UI切换前的Handler(阻塞) /// private void BeforeChange(UiTransitionEvent @event) { @@ -344,7 +344,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter } /// - /// 执行UI切换后的Handler(不阻塞) + /// 执行UI切换后的Handler(不阻塞) /// private void AfterChange(UiTransitionEvent @event) { @@ -364,7 +364,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter } /// - /// 执行Push页面的核心逻辑(基于 uiKey) + /// 执行Push页面的核心逻辑(基于 uiKey) /// private void DoPushPageInternal(string uiKey, IUiPageEnterParam? param, UiTransitionPolicy policy, UiInstancePolicy instancePolicy) @@ -384,7 +384,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter } /// - /// 执行Push页面的核心逻辑(基于 page) + /// 执行Push页面的核心逻辑(基于 page) /// private void DoPushPageInternal(IUiPageBehavior page, IUiPageEnterParam? param, UiTransitionPolicy policy) { @@ -420,7 +420,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter } /// - /// 执行Pop的核心逻辑(不触发Pipeline) + /// 执行Pop的核心逻辑(不触发Pipeline) /// private void DoPopInternal(UiPopPolicy policy) { @@ -462,7 +462,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter } /// - /// 执行Clear的核心逻辑(不触发Pipeline) + /// 执行Clear的核心逻辑(不触发Pipeline) /// /// UI弹出策略 private void DoClearInternal(UiPopPolicy policy) @@ -476,7 +476,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter #region 层级管理 /// - /// 在指定层级显示UI(非栈管理) + /// 在指定层级显示UI(非栈管理) /// public void Show( string uiKey, @@ -484,10 +484,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter IUiPageEnterParam? param = null, UiInstancePolicy instancePolicy = UiInstancePolicy.Reuse) { - if (layer == UiLayer.Page) - { - throw new ArgumentException("Use Push() for Page layer"); - } + if (layer == UiLayer.Page) throw new ArgumentException("Use Push() for Page layer"); // 初始化层级字典 if (!_layers.ContainsKey(layer)) @@ -518,7 +515,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter } /// - /// 在指定层级显示UI(基于实例) + /// 在指定层级显示UI(基于实例) /// public void Show(IUiPageBehavior page, UiLayer layer) { @@ -538,7 +535,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter } /// - /// 隐藏指定层级的UI + /// 隐藏指定层级的UI /// public void Hide(string uiKey, UiLayer layer, bool destroy = false) { @@ -567,7 +564,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter } /// - /// 清空指定层级的所有UI + /// 清空指定层级的所有UI /// public void ClearLayer(UiLayer layer, bool destroy = false) { @@ -575,16 +572,13 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter return; var keys = layerDict.Keys.ToArray(); - foreach (var key in keys) - { - Hide(key, layer, destroy); - } + foreach (var key in keys) Hide(key, layer, destroy); Log.Debug("Cleared layer: {0}, destroyed={1}", layer, destroy); } /// - /// 获取指定层级的UI实例 + /// 获取指定层级的UI实例 /// public IUiPageBehavior? GetFromLayer(string uiKey, UiLayer layer) { @@ -595,7 +589,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter } /// - /// 判断指定层级是否有UI显示 + /// 判断指定层级是否有UI显示 /// public bool HasVisibleInLayer(UiLayer layer) { @@ -607,7 +601,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter #region 路由守卫 /// - /// 注册路由守卫 + /// 注册路由守卫 /// public void AddGuard(IUiRouteGuard guard) { @@ -626,7 +620,7 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter } /// - /// 注册路由守卫(泛型方法) + /// 注册路由守卫(泛型方法) /// public void AddGuard() where T : IUiRouteGuard, new() { @@ -635,25 +629,21 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter } /// - /// 移除路由守卫 + /// 移除路由守卫 /// public void RemoveGuard(IUiRouteGuard guard) { ArgumentNullException.ThrowIfNull(guard); - if (_guards.Remove(guard)) - { - Log.Debug("Guard removed: {0}", guard.GetType().Name); - } + if (_guards.Remove(guard)) Log.Debug("Guard removed: {0}", guard.GetType().Name); } /// - /// 执行进入守卫 + /// 执行进入守卫 /// private async Task ExecuteEnterGuardsAsync(string uiKey, IUiPageEnterParam? param) { foreach (var guard in _guards) - { try { Log.Debug("Executing enter guard: {0} for {1}", guard.GetType().Name, uiKey); @@ -674,23 +664,18 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter catch (Exception ex) { Log.Error("Enter guard {0} failed: {1}", guard.GetType().Name, ex.Message); - if (guard.CanInterrupt) - { - return false; - } + if (guard.CanInterrupt) return false; } - } return true; } /// - /// 执行离开守卫 + /// 执行离开守卫 /// private async Task ExecuteLeaveGuardsAsync(string uiKey) { foreach (var guard in _guards) - { try { Log.Debug("Executing leave guard: {0} for {1}", guard.GetType().Name, uiKey); @@ -711,12 +696,8 @@ public abstract class UiRouterBase : AbstractSystem, IUiRouter catch (Exception ex) { Log.Error("Leave guard {0} failed: {1}", guard.GetType().Name, ex.Message); - if (guard.CanInterrupt) - { - return false; - } + if (guard.CanInterrupt) return false; } - } return true; } diff --git a/GFramework.Game/ui/UiTransitionPipeline.cs b/GFramework.Game/ui/UiTransitionPipeline.cs index f3ff741..2e2d459 100644 --- a/GFramework.Game/ui/UiTransitionPipeline.cs +++ b/GFramework.Game/ui/UiTransitionPipeline.cs @@ -6,7 +6,7 @@ using GFramework.Game.Abstractions.ui; namespace GFramework.Game.ui; /// -/// UI切换处理器管道,负责管理和执行UI切换扩展点 +/// UI切换处理器管道,负责管理和执行UI切换扩展点 /// public class UiTransitionPipeline { @@ -15,7 +15,7 @@ public class UiTransitionPipeline private readonly Dictionary _options = new(); /// - /// 注册UI切换处理器 + /// 注册UI切换处理器 /// /// 处理器实例 /// 执行选项 @@ -41,7 +41,7 @@ public class UiTransitionPipeline } /// - /// 注销UI切换处理器 + /// 注销UI切换处理器 /// /// 处理器实例 public void UnregisterHandler(IUiTransitionHandler handler) @@ -54,7 +54,7 @@ public class UiTransitionPipeline } /// - /// 执行指定阶段的所有Handler + /// 执行指定阶段的所有Handler /// /// UI切换事件 /// 执行阶段 diff --git a/GFramework.Game/ui/handler/LoggingTransitionHandler.cs b/GFramework.Game/ui/handler/LoggingTransitionHandler.cs index 9792b2a..e3f799e 100644 --- a/GFramework.Game/ui/handler/LoggingTransitionHandler.cs +++ b/GFramework.Game/ui/handler/LoggingTransitionHandler.cs @@ -6,27 +6,27 @@ using GFramework.Game.Abstractions.ui; namespace GFramework.Game.ui.handler; /// -/// 日志UI切换处理器,用于记录UI切换的详细信息 +/// 日志UI切换处理器,用于记录UI切换的详细信息 /// public sealed class LoggingTransitionHandler : UiTransitionHandlerBase { /// - /// 日志记录器实例,用于记录UI切换相关信息 + /// 日志记录器实例,用于记录UI切换相关信息 /// private static readonly ILogger Log = LoggerFactoryResolver.Provider.CreateLogger("LoggingTransitionHandler"); /// - /// 获取处理器优先级,数值越大优先级越高 + /// 获取处理器优先级,数值越大优先级越高 /// public override int Priority => 999; /// - /// 获取处理器处理的UI切换阶段,处理所有阶段 + /// 获取处理器处理的UI切换阶段,处理所有阶段 /// public override UITransitionPhases Phases => UITransitionPhases.All; /// - /// 处理UI切换事件的异步方法 + /// 处理UI切换事件的异步方法 /// /// UI切换事件对象,包含切换的相关信息 /// 取消令牌,用于控制异步操作的取消 diff --git a/GFramework.Game/ui/handler/UiTransitionHandlerBase.cs b/GFramework.Game/ui/handler/UiTransitionHandlerBase.cs index cf8be83..98394af 100644 --- a/GFramework.Game/ui/handler/UiTransitionHandlerBase.cs +++ b/GFramework.Game/ui/handler/UiTransitionHandlerBase.cs @@ -4,22 +4,22 @@ using GFramework.Game.Abstractions.ui; namespace GFramework.Game.ui.handler; /// -/// UI切换处理器抽象基类,提供一些默认实现 +/// UI切换处理器抽象基类,提供一些默认实现 /// public abstract class UiTransitionHandlerBase : IUiTransitionHandler { /// - /// 处理器适用的阶段,默认为所有阶段 + /// 处理器适用的阶段,默认为所有阶段 /// public virtual UITransitionPhases Phases => UITransitionPhases.All; /// - /// 优先级,需要在子类中实现 + /// 优先级,需要在子类中实现 /// public abstract int Priority { get; } /// - /// 判断是否应该处理当前事件,默认返回true + /// 判断是否应该处理当前事件,默认返回true /// public virtual bool ShouldHandle(UiTransitionEvent @event, UITransitionPhases phases) { @@ -27,7 +27,7 @@ public abstract class UiTransitionHandlerBase : IUiTransitionHandler } /// - /// 处理UI切换事件,需要在子类中实现 + /// 处理UI切换事件,需要在子类中实现 /// public abstract Task HandleAsync(UiTransitionEvent @event, CancellationToken cancellationToken); } \ No newline at end of file diff --git a/GFramework.Godot/GFramework.Godot.csproj b/GFramework.Godot/GFramework.Godot.csproj index 40cfc0a..ff471e8 100644 --- a/GFramework.Godot/GFramework.Godot.csproj +++ b/GFramework.Godot/GFramework.Godot.csproj @@ -14,8 +14,8 @@ - - - + + + diff --git a/GFramework.Godot/README.md b/GFramework.Godot/README.md index cfc48c5..d776d5f 100644 --- a/GFramework.Godot/README.md +++ b/GFramework.Godot/README.md @@ -20,7 +20,8 @@ GFramework.Godot 是 GFramework 框架的 Godot 特定实现,将框架的架 ## 概述 -GFramework.Godot 提供了与 Godot 引擎的深度集成,让开发者能够在保持 GFramework 架构优势的同时,充分利用 Godot 的节点系统、信号机制和场景管理功能。 +GFramework.Godot 提供了与 Godot 引擎的深度集成,让开发者能够在保持 GFramework 架构优势的同时,充分利用 Godot +的节点系统、信号机制和场景管理功能。 ### 核心设计理念 @@ -32,33 +33,39 @@ GFramework.Godot 提供了与 Godot 引擎的深度集成,让开发者能够 ## 核心特性 ### 🎯 架构生命周期绑定 + - 自动将框架初始化与 Godot 场景树绑定 - 支持节点销毁时的自动清理 - 阶段式架构初始化与 Godot `_Ready` 周期同步 ### 🔧 丰富的 Node 扩展方法 + - **50+** 个实用扩展方法 - 安全的节点操作和验证 - 流畅的场景树遍历和查找 - 简化的输入处理 ### 📡 流畅的信号 API + - 类型安全的信号连接 - 链式调用支持 - 自动生命周期管理 - Godot 信号与框架事件系统的桥接 ### 🏊‍♂️ 高效的节点池化 + - 专用的 Node 对象池 - 自动回收和重用机制 - 内存友好的高频节点创建/销毁 ### 📦 智能资源管理 + - 简化的 Godot 资源加载 - 类型安全的资源工厂 - 缓存和预加载支持 ### 📝 Godot 原生日志 + - 与 Godot 日志系统完全集成 - 框架日志自动输出到 Godot 控制台 - 可配置的日志级别 @@ -725,6 +732,7 @@ public partial class MainScene : Node2D ### 🏗️ 架构设计最佳实践 #### 1. 模块化设计 + ```csharp // 好的做法:按功能分组模块 public class AudioModule : AbstractGodotModule { } @@ -739,6 +747,7 @@ public class GameModule : AbstractGodotModule // ❌ 太大 ``` #### 2. 生命周期管理 + ```csharp // 好的做法:使用自动清理 this.RegisterEvent(OnGameEvent) @@ -763,6 +772,7 @@ public override void _ExitTree() ### 🎮 Godot 集成最佳实践 #### 1. 节点安全操作 + ```csharp // 好的做法:使用安全扩展 var player = GetNodeX("Player"); @@ -773,6 +783,7 @@ var player = GetNode("Player"); // 可能抛出异常 ``` #### 2. 信号连接模式 + ```csharp // 好的做法:使用 SignalBuilder this.CreateSignalBuilder(Button.SignalName.Pressed) @@ -786,6 +797,7 @@ Button.Pressed += OnButtonPressed; // 容易忘记清理 ### 🏊‍♂️ 性能优化最佳实践 #### 1. 节点池化策略 + ```csharp // 好的做法:高频创建对象使用池化 public class BulletPool : AbstractNodePoolSystem @@ -803,6 +815,7 @@ public void Shoot() ``` #### 2. 资源预加载 + ```csharp // 好的做法:预加载常用资源 public override void _Ready() @@ -816,6 +829,7 @@ public override void _Ready() ### 🔧 调试和错误处理 #### 1. 日志使用策略 + ```csharp // 好的做法:分级别记录 Logger.Debug($"Player position: {Position}"); // 调试信息 @@ -828,6 +842,7 @@ Logger.Debug($"Frame: {Engine.GetProcessFrames()}"); // 太频繁 ``` #### 2. 异常处理 + ```csharp // 好的做法:优雅的错误处理 public T LoadResource(string path) where T : Resource diff --git a/GFramework.Godot/coroutine/CoroutineExtensions.cs b/GFramework.Godot/coroutine/CoroutineExtensions.cs index 4728b47..7dfd6dd 100644 --- a/GFramework.Godot/coroutine/CoroutineExtensions.cs +++ b/GFramework.Godot/coroutine/CoroutineExtensions.cs @@ -7,7 +7,7 @@ namespace GFramework.Godot.coroutine; public static class CoroutineExtensions { /// - /// 启动协程的扩展方法 + /// 启动协程的扩展方法 /// public static CoroutineHandle RunCoroutine( this IEnumerator coroutine, @@ -18,7 +18,7 @@ public static class CoroutineExtensions } /// - /// 让协程在指定节点被销毁时自动取消 + /// 让协程在指定节点被销毁时自动取消 /// public static IEnumerator CancelWith( this IEnumerator coroutine, @@ -29,7 +29,7 @@ public static class CoroutineExtensions } /// - /// 让协程在任一节点被销毁时自动取消 + /// 让协程在任一节点被销毁时自动取消 /// public static IEnumerator CancelWith( this IEnumerator coroutine, @@ -43,7 +43,7 @@ public static class CoroutineExtensions } /// - /// 让协程在多个节点都被销毁时自动取消 + /// 让协程在多个节点都被销毁时自动取消 /// public static IEnumerator CancelWith( this IEnumerator coroutine, @@ -56,10 +56,8 @@ public static class CoroutineExtensions private static bool AllNodesAlive(Node[] nodes) { foreach (var node in nodes) - { if (!Timing.IsNodeAlive(node)) return false; - } return true; } diff --git a/GFramework.Godot/coroutine/GodotTimeSource.cs b/GFramework.Godot/coroutine/GodotTimeSource.cs index be3ce80..b08ba74 100644 --- a/GFramework.Godot/coroutine/GodotTimeSource.cs +++ b/GFramework.Godot/coroutine/GodotTimeSource.cs @@ -3,42 +3,40 @@ namespace GFramework.Godot.coroutine; /// -/// Godot时间源实现,用于提供基于Godot引擎的时间信息 +/// Godot时间源实现,用于提供基于Godot引擎的时间信息 /// /// 获取增量时间的函数委托 public class GodotTimeSource(Func getDeltaFunc) : ITimeSource { private readonly Func _getDeltaFunc = getDeltaFunc ?? throw new ArgumentNullException(nameof(getDeltaFunc)); - private double _currentTime; - private double _deltaTime; /// - /// 获取当前累计时间 + /// 获取当前累计时间 /// - public double CurrentTime => _currentTime; + public double CurrentTime { get; private set; } /// - /// 获取上一帧的时间增量 + /// 获取上一帧的时间增量 /// - public double DeltaTime => _deltaTime; + public double DeltaTime { get; private set; } /// - /// 更新时间源,计算新的增量时间和累计时间 + /// 更新时间源,计算新的增量时间和累计时间 /// public void Update() { // 调用外部提供的函数获取当前帧的时间增量 - _deltaTime = _getDeltaFunc(); + DeltaTime = _getDeltaFunc(); // 累加到总时间中 - _currentTime += _deltaTime; + CurrentTime += DeltaTime; } /// - /// 重置时间源到初始状态 + /// 重置时间源到初始状态 /// public void Reset() { - _currentTime = 0; - _deltaTime = 0; + CurrentTime = 0; + DeltaTime = 0; } } \ No newline at end of file diff --git a/GFramework.Godot/coroutine/Segment.cs b/GFramework.Godot/coroutine/Segment.cs index 0c13309..8ed2fb6 100644 --- a/GFramework.Godot/coroutine/Segment.cs +++ b/GFramework.Godot/coroutine/Segment.cs @@ -1,22 +1,22 @@ namespace GFramework.Godot.coroutine; /// -/// 定义协程执行的不同时间段枚举 +/// 定义协程执行的不同时间段枚举 /// public enum Segment { /// - /// 普通处理阶段,在每一帧的常规处理过程中执行 + /// 普通处理阶段,在每一帧的常规处理过程中执行 /// Process, /// - /// 物理处理阶段,在物理更新循环中执行,通常用于需要与物理引擎同步的操作 + /// 物理处理阶段,在物理更新循环中执行,通常用于需要与物理引擎同步的操作 /// PhysicsProcess, /// - /// 延迟处理阶段,在当前帧结束后延迟执行,通常用于需要等待当前帧完成后再执行的操作 + /// 延迟处理阶段,在当前帧结束后延迟执行,通常用于需要等待当前帧完成后再执行的操作 /// DeferredProcess } \ No newline at end of file diff --git a/GFramework.Godot/coroutine/Timing.cs b/GFramework.Godot/coroutine/Timing.cs index fd889a1..88ef374 100644 --- a/GFramework.Godot/coroutine/Timing.cs +++ b/GFramework.Godot/coroutine/Timing.cs @@ -7,8 +7,8 @@ using Godot; namespace GFramework.Godot.coroutine; /// -/// Godot协程管理器,提供基于不同更新循环的协程调度功能 -/// 支持Process、PhysicsProcess和DeferredProcess三种执行段的协程管理 +/// Godot协程管理器,提供基于不同更新循环的协程调度功能 +/// 支持Process、PhysicsProcess和DeferredProcess三种执行段的协程管理 /// public partial class Timing : Node { @@ -27,21 +27,21 @@ public partial class Timing : Node private GodotTimeSource? _processTimeSource; /// - /// 获取Process调度器,如果未初始化则抛出异常 + /// 获取Process调度器,如果未初始化则抛出异常 /// private CoroutineScheduler ProcessScheduler => _processScheduler ?? throw new InvalidOperationException( "Timing not yet initialized (_Ready not executed)"); /// - /// 获取Physics调度器,如果未初始化则抛出异常 + /// 获取Physics调度器,如果未初始化则抛出异常 /// private CoroutineScheduler PhysicsScheduler => _physicsScheduler ?? throw new InvalidOperationException( "Timing not yet initialized (_Ready not executed)"); /// - /// 获取Deferred调度器,如果未初始化则抛出异常 + /// 获取Deferred调度器,如果未初始化则抛出异常 /// private CoroutineScheduler DeferredScheduler => _deferredScheduler ?? throw new InvalidOperationException( @@ -50,8 +50,8 @@ public partial class Timing : Node #region 单例 /// - /// 获取Timing单例实例 - /// 如果实例不存在则自动创建并添加到场景树根节点 + /// 获取Timing单例实例 + /// 如果实例不存在则自动创建并添加到场景树根节点 /// public static Timing Instance { @@ -81,17 +81,17 @@ public partial class Timing : Node #region Debug 信息 /// - /// 获取Process段活跃协程数量 + /// 获取Process段活跃协程数量 /// public int ProcessCoroutines => _processScheduler?.ActiveCoroutineCount ?? 0; /// - /// 获取Physics段活跃协程数量 + /// 获取Physics段活跃协程数量 /// public int PhysicsCoroutines => _physicsScheduler?.ActiveCoroutineCount ?? 0; /// - /// 获取Deferred段活跃协程数量 + /// 获取Deferred段活跃协程数量 /// public int DeferredCoroutines => _deferredScheduler?.ActiveCoroutineCount ?? 0; @@ -100,8 +100,8 @@ public partial class Timing : Node #region 生命周期 /// - /// 节点就绪时的初始化方法 - /// 设置处理优先级,初始化调度器,并注册实例 + /// 节点就绪时的初始化方法 + /// 设置处理优先级,初始化调度器,并注册实例 /// public override void _Ready() { @@ -114,8 +114,8 @@ public partial class Timing : Node } /// - /// 节点退出场景树时的清理方法 - /// 从活动实例数组中移除当前实例并清理必要资源 + /// 节点退出场景树时的清理方法 + /// 从活动实例数组中移除当前实例并清理必要资源 /// public override void _ExitTree() { @@ -126,7 +126,7 @@ public partial class Timing : Node } /// - /// 清理实例引用 + /// 清理实例引用 /// private static void CleanupInstanceIfNecessary() { @@ -134,8 +134,8 @@ public partial class Timing : Node } /// - /// 每帧处理逻辑 - /// 更新Process调度器,增加帧计数器,并安排延迟处理 + /// 每帧处理逻辑 + /// 更新Process调度器,增加帧计数器,并安排延迟处理 /// /// 时间增量 public override void _Process(double delta) @@ -147,8 +147,8 @@ public partial class Timing : Node } /// - /// 物理处理逻辑 - /// 更新Physics调度器 + /// 物理处理逻辑 + /// 更新Physics调度器 /// /// 物理时间增量 public override void _PhysicsProcess(double delta) @@ -157,8 +157,8 @@ public partial class Timing : Node } /// - /// 延迟处理逻辑 - /// 更新Deferred调度器 + /// 延迟处理逻辑 + /// 更新Deferred调度器 /// private void ProcessDeferred() { @@ -170,8 +170,8 @@ public partial class Timing : Node #region 初始化 /// - /// 初始化所有调度器和时间源 - /// 创建Process、Physics和Deferred三个调度器实例 + /// 初始化所有调度器和时间源 + /// 创建Process、Physics和Deferred三个调度器实例 /// private void InitializeSchedulers() { @@ -182,25 +182,25 @@ public partial class Timing : Node _processScheduler = new CoroutineScheduler( _processTimeSource, _instanceId, - initialCapacity: 256 + 256 ); _physicsScheduler = new CoroutineScheduler( _physicsTimeSource, _instanceId, - initialCapacity: 128 + 128 ); _deferredScheduler = new CoroutineScheduler( _deferredTimeSource, _instanceId, - initialCapacity: 64 + 64 ); } /// - /// 注册当前实例到活动实例数组中 - /// 如果当前ID已被占用则寻找可用ID + /// 注册当前实例到活动实例数组中 + /// 如果当前ID已被占用则寻找可用ID /// private void RegisterInstance() { @@ -211,21 +211,19 @@ public partial class Timing : Node } for (byte i = 1; i < ActiveInstances.Length; i++) - { if (ActiveInstances[i] == null) { _instanceId = i; ActiveInstances[i] = this; return; } - } throw new OverflowException("最多只能存在 15 个 Timing 实例"); } /// - /// 尝试设置物理处理优先级 - /// 使用反射方式设置ProcessPhysicsPriority属性 + /// 尝试设置物理处理优先级 + /// 使用反射方式设置ProcessPhysicsPriority属性 /// /// 物理处理优先级 private static void TrySetPhysicsPriority(int priority) @@ -250,7 +248,7 @@ public partial class Timing : Node #region 协程启动 API /// - /// 在指定段运行协程 + /// 在指定段运行协程 /// /// 要运行的协程枚举器 /// 协程执行段(Process/PhysicsProcess/DeferredProcess) @@ -265,8 +263,8 @@ public partial class Timing : Node } /// - /// 在当前实例上运行协程 - /// 根据指定的段选择对应的调度器运行协程 + /// 在当前实例上运行协程 + /// 根据指定的段选择对应的调度器运行协程 /// /// 要运行的协程枚举器 /// 协程执行段 @@ -294,7 +292,7 @@ public partial class Timing : Node #region 协程控制 API /// - /// 暂停指定的协程 + /// 暂停指定的协程 /// /// 协程句柄 /// 是否成功暂停 @@ -304,7 +302,7 @@ public partial class Timing : Node } /// - /// 恢复指定的协程 + /// 恢复指定的协程 /// /// 协程句柄 /// 是否成功恢复 @@ -314,7 +312,7 @@ public partial class Timing : Node } /// - /// 终止指定的协程 + /// 终止指定的协程 /// /// 协程句柄 /// 是否成功终止 @@ -324,7 +322,7 @@ public partial class Timing : Node } /// - /// 终止所有具有指定标签的协程 + /// 终止所有具有指定标签的协程 /// /// 协程标签 /// 被终止的协程数量 @@ -334,7 +332,7 @@ public partial class Timing : Node } /// - /// 终止所有协程 + /// 终止所有协程 /// /// 被终止的协程总数 public static int KillAllCoroutines() @@ -343,8 +341,8 @@ public partial class Timing : Node } /// - /// 在当前实例上暂停协程 - /// 尝试在所有调度器中查找并暂停指定协程 + /// 在当前实例上暂停协程 + /// 尝试在所有调度器中查找并暂停指定协程 /// /// 协程句柄 /// 是否成功暂停 @@ -356,8 +354,8 @@ public partial class Timing : Node } /// - /// 在当前实例上恢复协程 - /// 尝试在所有调度器中查找并恢复指定协程 + /// 在当前实例上恢复协程 + /// 尝试在所有调度器中查找并恢复指定协程 /// /// 协程句柄 /// 是否成功恢复 @@ -369,8 +367,8 @@ public partial class Timing : Node } /// - /// 在当前实例上终止协程 - /// 尝试在所有调度器中查找并终止指定协程 + /// 在当前实例上终止协程 + /// 尝试在所有调度器中查找并终止指定协程 /// /// 协程句柄 /// 是否成功终止 @@ -382,14 +380,14 @@ public partial class Timing : Node } /// - /// 在当前实例上根据标签终止协程 - /// 在所有调度器中查找并终止具有指定标签的协程 + /// 在当前实例上根据标签终止协程 + /// 在所有调度器中查找并终止具有指定标签的协程 /// /// 协程标签 /// 被终止的协程数量 private int KillByTagOnInstance(string tag) { - int count = 0; + var count = 0; count += ProcessScheduler.KillByTag(tag); count += PhysicsScheduler.KillByTag(tag); count += DeferredScheduler.KillByTag(tag); @@ -397,13 +395,13 @@ public partial class Timing : Node } /// - /// 清空当前实例上的所有协程 - /// 从所有调度器中清除协程 + /// 清空当前实例上的所有协程 + /// 从所有调度器中清除协程 /// /// 被清除的协程总数 private int ClearOnInstance() { - int count = 0; + var count = 0; count += ProcessScheduler.Clear(); count += PhysicsScheduler.Clear(); count += DeferredScheduler.Clear(); @@ -415,7 +413,7 @@ public partial class Timing : Node #region 工具方法 /// - /// 根据ID获取Timing实例 + /// 根据ID获取Timing实例 /// /// 实例ID /// 对应的Timing实例或null @@ -426,7 +424,7 @@ public partial class Timing : Node /// - /// 检查节点是否处于有效状态 + /// 检查节点是否处于有效状态 /// /// 要检查的节点 /// 如果节点存在且有效则返回true,否则返回false @@ -444,7 +442,7 @@ public partial class Timing : Node #region 延迟调用 /// - /// 延迟调用指定动作 + /// 延迟调用指定动作 /// /// 延迟时间(秒) /// 要执行的动作 @@ -462,7 +460,7 @@ public partial class Timing : Node } /// - /// 延迟调用指定动作,支持取消条件 + /// 延迟调用指定动作,支持取消条件 /// /// 延迟时间(秒) /// 要执行的动作 @@ -484,7 +482,7 @@ public partial class Timing : Node } /// - /// 延迟调用协程实现 + /// 延迟调用协程实现 /// /// 延迟时间 /// 要执行的动作 @@ -498,7 +496,7 @@ public partial class Timing : Node } /// - /// 带取消条件的延迟调用协程实现 + /// 带取消条件的延迟调用协程实现 /// /// 延迟时间 /// 要执行的动作 diff --git a/GFramework.Godot/extensions/GodotPathExtensions.cs b/GFramework.Godot/extensions/GodotPathExtensions.cs index 97f0edf..755bf3f 100644 --- a/GFramework.Godot/extensions/GodotPathExtensions.cs +++ b/GFramework.Godot/extensions/GodotPathExtensions.cs @@ -3,20 +3,26 @@ public static class GodotPathExtensions { /// - /// 判断是否是 Godot 用户数据路径(user://) + /// 判断是否是 Godot 用户数据路径(user://) /// public static bool IsUserPath(this string path) - => !string.IsNullOrEmpty(path) && path.StartsWith("user://"); + { + return !string.IsNullOrEmpty(path) && path.StartsWith("user://"); + } /// - /// 判断是否是 Godot 资源路径(res://) + /// 判断是否是 Godot 资源路径(res://) /// public static bool IsResPath(this string path) - => !string.IsNullOrEmpty(path) && path.StartsWith("res://"); + { + return !string.IsNullOrEmpty(path) && path.StartsWith("res://"); + } /// - /// 判断是否是 Godot 特殊路径(user:// 或 res://) + /// 判断是否是 Godot 特殊路径(user:// 或 res://) /// public static bool IsGodotPath(this string path) - => path.IsUserPath() || path.IsResPath(); + { + return path.IsUserPath() || path.IsResPath(); + } } \ No newline at end of file diff --git a/GFramework.Godot/pool/AbstractNodePoolSystem.cs b/GFramework.Godot/pool/AbstractNodePoolSystem.cs index 1941993..8167bc0 100644 --- a/GFramework.Godot/pool/AbstractNodePoolSystem.cs +++ b/GFramework.Godot/pool/AbstractNodePoolSystem.cs @@ -4,7 +4,7 @@ using Godot; namespace GFramework.Godot.pool; /// -/// 抽象节点对象池系统,用于管理Godot节点类型的对象池 +/// 抽象节点对象池系统,用于管理Godot节点类型的对象池 /// /// 用作键的类型,必须不为null /// 节点类型,必须继承自Node并实现IPoolableNode接口 @@ -14,14 +14,14 @@ public abstract class AbstractNodePoolSystem where TNode : Node, IPoolableNode { /// - /// 加载场景的抽象方法 + /// 加载场景的抽象方法 /// /// 用于标识场景的键 /// 加载的PackedScene对象 protected abstract PackedScene LoadScene(TKey key); /// - /// 创建新节点实例的重写方法 + /// 创建新节点实例的重写方法 /// /// 用于创建节点的键 /// 创建的新节点实例 diff --git a/GFramework.Godot/pool/IPoolableNode.cs b/GFramework.Godot/pool/IPoolableNode.cs index e4a1282..d55dc13 100644 --- a/GFramework.Godot/pool/IPoolableNode.cs +++ b/GFramework.Godot/pool/IPoolableNode.cs @@ -4,13 +4,13 @@ using Godot; namespace GFramework.Godot.pool; /// -/// 可池化节点接口,继承自IPoolableObject接口 -/// 用于定义可以被对象池管理的Godot节点类型 +/// 可池化节点接口,继承自IPoolableObject接口 +/// 用于定义可以被对象池管理的Godot节点类型 /// public interface IPoolableNode : IPoolableObject { /// - /// 将当前对象转换为Node类型 + /// 将当前对象转换为Node类型 /// /// 返回当前对象对应的Node实例 Node AsNode(); diff --git a/GFramework.Godot/scene/GodotSceneRegistry.cs b/GFramework.Godot/scene/GodotSceneRegistry.cs index bd0e8a4..30c23c1 100644 --- a/GFramework.Godot/scene/GodotSceneRegistry.cs +++ b/GFramework.Godot/scene/GodotSceneRegistry.cs @@ -4,9 +4,9 @@ using Godot; namespace GFramework.Godot.scene; /// -/// Godot场景注册表类 -/// 继承自KeyValueRegistryBase,使用字符串作为键,PackedScene作为值进行存储 -/// 实现IUiRegistry接口,提供UI场景的注册和管理功能 +/// Godot场景注册表类 +/// 继承自KeyValueRegistryBase,使用字符串作为键,PackedScene作为值进行存储 +/// 实现IUiRegistry接口,提供UI场景的注册和管理功能 /// public class GodotSceneRegistry() : KeyValueRegistryBase(StringComparer.Ordinal), IGodotSceneRegistry; \ No newline at end of file diff --git a/GFramework.Godot/scene/IGodotSceneRegistry.cs b/GFramework.Godot/scene/IGodotSceneRegistry.cs index da527e2..760db28 100644 --- a/GFramework.Godot/scene/IGodotSceneRegistry.cs +++ b/GFramework.Godot/scene/IGodotSceneRegistry.cs @@ -4,6 +4,6 @@ using Godot; namespace GFramework.Godot.scene; /// -/// Godot场景注册表接口,用于管理PackedScene资源的注册和访问 +/// Godot场景注册表接口,用于管理PackedScene资源的注册和访问 /// public interface IGodotSceneRegistry : IAssetRegistry; \ No newline at end of file diff --git a/GFramework.Godot/setting/AudioBusMapSettings.cs b/GFramework.Godot/setting/AudioBusMapSettings.cs index 883325b..6ba4bb2 100644 --- a/GFramework.Godot/setting/AudioBusMapSettings.cs +++ b/GFramework.Godot/setting/AudioBusMapSettings.cs @@ -3,31 +3,31 @@ using GFramework.Game.Abstractions.setting; namespace GFramework.Godot.setting; /// -/// 音频总线映射设置 -/// 定义了游戏中不同音频类型的总线名称配置 +/// 音频总线映射设置 +/// 定义了游戏中不同音频类型的总线名称配置 /// public class AudioBusMapSettings : ISettingsData { /// - /// 主音频总线名称 - /// 默认值为"Master" + /// 主音频总线名称 + /// 默认值为"Master" /// public string Master { get; set; } = "Master"; /// - /// 背景音乐总线名称 - /// 默认值为"BGM" + /// 背景音乐总线名称 + /// 默认值为"BGM" /// public string Bgm { get; set; } = "BGM"; /// - /// 音效总线名称 - /// 默认值为"SFX" + /// 音效总线名称 + /// 默认值为"SFX" /// public string Sfx { get; set; } = "SFX"; /// - /// 重置音频总线映射设置为默认值 + /// 重置音频总线映射设置为默认值 /// public void Reset() { diff --git a/GFramework.Godot/setting/GodotAudioSettings.cs b/GFramework.Godot/setting/GodotAudioSettings.cs index 5dd13ce..b33aa4b 100644 --- a/GFramework.Godot/setting/GodotAudioSettings.cs +++ b/GFramework.Godot/setting/GodotAudioSettings.cs @@ -4,7 +4,7 @@ using Godot; namespace GFramework.Godot.setting; /// -/// Godot音频设置实现类,用于应用音频配置到Godot音频系统 +/// Godot音频设置实现类,用于应用音频配置到Godot音频系统 /// /// 音频设置对象,包含主音量、背景音乐音量和音效音量 /// 音频总线映射对象,定义了不同音频类型的总线名称 @@ -12,7 +12,7 @@ public class GodotAudioSettings(AudioSettings audioSettings, AudioBusMapSettings : IApplyAbleSettings { /// - /// 应用音频设置到Godot音频系统 + /// 应用音频设置到Godot音频系统 /// /// 表示异步操作的任务 public Task Apply() @@ -24,7 +24,7 @@ public class GodotAudioSettings(AudioSettings audioSettings, AudioBusMapSettings } /// - /// 设置指定音频总线的音量 + /// 设置指定音频总线的音量 /// /// 音频总线名称 /// 线性音量值(0-1之间) diff --git a/GFramework.Godot/setting/GodotGraphicsSettings.cs b/GFramework.Godot/setting/GodotGraphicsSettings.cs index eac439f..0e27c91 100644 --- a/GFramework.Godot/setting/GodotGraphicsSettings.cs +++ b/GFramework.Godot/setting/GodotGraphicsSettings.cs @@ -4,13 +4,13 @@ using Godot; namespace GFramework.Godot.setting; /// -/// Godot图形设置应用器 +/// Godot图形设置应用器 /// /// 图形设置配置对象 public class GodotGraphicsSettings(GraphicsSettings settings) : IApplyAbleSettings { /// - /// 应用图形设置到Godot引擎 + /// 应用图形设置到Godot引擎 /// /// 异步任务 public async Task Apply() diff --git a/GFramework.Godot/setting/README.md b/GFramework.Godot/setting/README.md index e028aa0..df978d9 100644 --- a/GFramework.Godot/setting/README.md +++ b/GFramework.Godot/setting/README.md @@ -229,8 +229,6 @@ public sealed class AudioBusMap - 提供合理的默认值 - 支持对象初始化语法 - - ### GodotAudioSettings ```csharp diff --git a/GFramework.Godot/storage/GodotFileStorage.cs b/GFramework.Godot/storage/GodotFileStorage.cs index fe79a7e..cff6d56 100644 --- a/GFramework.Godot/storage/GodotFileStorage.cs +++ b/GFramework.Godot/storage/GodotFileStorage.cs @@ -10,20 +10,20 @@ using FileAccess = Godot.FileAccess; namespace GFramework.Godot.storage; /// -/// Godot 特化的文件存储实现,支持 res://、user:// 和普通文件路径 -/// 支持按 key 细粒度锁保证线程安全 +/// Godot 特化的文件存储实现,支持 res://、user:// 和普通文件路径 +/// 支持按 key 细粒度锁保证线程安全 /// public sealed class GodotFileStorage : IStorage { /// - /// 每个 key 对应的锁对象 + /// 每个 key 对应的锁对象 /// private readonly ConcurrentDictionary _keyLocks = new(); private readonly ISerializer _serializer; /// - /// 初始化 Godot 文件存储 + /// 初始化 Godot 文件存储 /// /// 序列化器实例 public GodotFileStorage(ISerializer serializer) @@ -34,7 +34,7 @@ public sealed class GodotFileStorage : IStorage #region Delete /// - /// 删除指定键对应的文件 + /// 删除指定键对应的文件 /// /// 存储键 public void Delete(string key) @@ -55,10 +55,7 @@ public sealed class GodotFileStorage : IStorage } else { - if (File.Exists(path)) - { - File.Delete(path); - } + if (File.Exists(path)) File.Delete(path); } } @@ -71,15 +68,17 @@ public sealed class GodotFileStorage : IStorage #region Helpers /// - /// 清理路径段中的无效字符,将无效文件名字符替换为下划线 + /// 清理路径段中的无效字符,将无效文件名字符替换为下划线 /// /// 要清理的路径段 /// 清理后的路径段 private static string SanitizeSegment(string segment) - => Path.GetInvalidFileNameChars().Aggregate(segment, (current, c) => current.Replace(c, '_')); + { + return Path.GetInvalidFileNameChars().Aggregate(segment, (current, c) => current.Replace(c, '_')); + } /// - /// 将存储键转换为绝对路径,处理 Godot 虚拟路径和普通文件系统路径 + /// 将存储键转换为绝对路径,处理 Godot 虚拟路径和普通文件系统路径 /// /// 存储键 /// 绝对路径字符串 @@ -115,18 +114,21 @@ public sealed class GodotFileStorage : IStorage } /// - /// 获取指定路径对应的锁对象,如果不存在则创建新的锁对象 + /// 获取指定路径对应的锁对象,如果不存在则创建新的锁对象 /// /// 文件路径 /// 对应路径的锁对象 - private object GetLock(string path) => _keyLocks.GetOrAdd(path, _ => new object()); + private object GetLock(string path) + { + return _keyLocks.GetOrAdd(path, _ => new object()); + } #endregion #region Exists /// - /// 检查指定键对应的文件是否存在 + /// 检查指定键对应的文件是否存在 /// /// 存储键 /// 文件存在返回 true,否则返回 false @@ -144,19 +146,21 @@ public sealed class GodotFileStorage : IStorage } /// - /// 异步检查指定键对应的文件是否存在 + /// 异步检查指定键对应的文件是否存在 /// /// 存储键 /// 表示异步操作的任务,结果为布尔值表示文件是否存在 public Task ExistsAsync(string key) - => Task.FromResult(Exists(key)); + { + return Task.FromResult(Exists(key)); + } #endregion #region Read /// - /// 读取指定键对应的序列化数据并反序列化为指定类型 + /// 读取指定键对应的序列化数据并反序列化为指定类型 /// /// 要反序列化的类型 /// 存储键 @@ -189,7 +193,7 @@ public sealed class GodotFileStorage : IStorage } /// - /// 读取指定键对应的序列化数据,如果文件不存在则返回默认值 + /// 读取指定键对应的序列化数据,如果文件不存在则返回默认值 /// /// 要反序列化的类型 /// 存储键 @@ -202,7 +206,7 @@ public sealed class GodotFileStorage : IStorage lock (keyLock) { - if (path.IsGodotPath() && !FileAccess.FileExists(path) || !path.IsGodotPath() && !File.Exists(path)) + if ((path.IsGodotPath() && !FileAccess.FileExists(path)) || (!path.IsGodotPath() && !File.Exists(path))) return defaultValue; return Read(key); @@ -210,7 +214,7 @@ public sealed class GodotFileStorage : IStorage } /// - /// 异步读取指定键对应的序列化数据并反序列化为指定类型 + /// 异步读取指定键对应的序列化数据并反序列化为指定类型 /// /// 要反序列化的类型 /// 存储键 @@ -249,7 +253,7 @@ public sealed class GodotFileStorage : IStorage #region Write /// - /// 将指定对象序列化并写入到指定键对应的文件中 + /// 将指定对象序列化并写入到指定键对应的文件中 /// /// 要序列化的对象类型 /// 存储键 @@ -277,7 +281,7 @@ public sealed class GodotFileStorage : IStorage } /// - /// 异步将指定对象序列化并写入到指定键对应的文件中 + /// 异步将指定对象序列化并写入到指定键对应的文件中 /// /// 要序列化的对象类型 /// 存储键 diff --git a/GFramework.Godot/ui/CanvasItemUiPageBehavior.cs b/GFramework.Godot/ui/CanvasItemUiPageBehavior.cs index 9cf65aa..cc22bc3 100644 --- a/GFramework.Godot/ui/CanvasItemUiPageBehavior.cs +++ b/GFramework.Godot/ui/CanvasItemUiPageBehavior.cs @@ -5,8 +5,8 @@ using Godot; namespace GFramework.Godot.ui; /// -/// 控制 UI 页面行为的泛型行为类, -/// 支持所有继承自 CanvasItem 的节点 +/// 控制 UI 页面行为的泛型行为类, +/// 支持所有继承自 CanvasItem 的节点 /// /// CanvasItem 类型的视图节点 public class CanvasItemUiPageBehavior(T owner, string key) : IUiPageBehavior @@ -15,25 +15,25 @@ public class CanvasItemUiPageBehavior(T owner, string key) : IUiPageBehavior private readonly IUiPage? _page = owner as IUiPage; /// - /// 获取页面视图对象 + /// 获取页面视图对象 /// /// 返回与当前实例关联的视图对象 public object View => owner; /// - /// 获取当前实例的键值标识符 + /// 获取当前实例的键值标识符 /// /// 返回用于标识当前实例的键字符串 public string Key => key; /// - /// 获取页面是否存活状态 + /// 获取页面是否存活状态 /// public bool IsAlive => owner.IsValidNode(); /// - /// 页面进入时调用 + /// 页面进入时调用 /// /// 页面进入参数 public void OnEnter(IUiPageEnterParam? param) @@ -42,7 +42,7 @@ public class CanvasItemUiPageBehavior(T owner, string key) : IUiPageBehavior } /// - /// 页面退出时调用 + /// 页面退出时调用 /// public void OnExit() { @@ -51,7 +51,7 @@ public class CanvasItemUiPageBehavior(T owner, string key) : IUiPageBehavior } /// - /// 页面暂停时调用 + /// 页面暂停时调用 /// public void OnPause() { @@ -64,7 +64,7 @@ public class CanvasItemUiPageBehavior(T owner, string key) : IUiPageBehavior } /// - /// 页面恢复时调用 + /// 页面恢复时调用 /// public void OnResume() { @@ -77,7 +77,7 @@ public class CanvasItemUiPageBehavior(T owner, string key) : IUiPageBehavior } /// - /// 页面隐藏时调用 + /// 页面隐藏时调用 /// public void OnHide() { @@ -86,7 +86,7 @@ public class CanvasItemUiPageBehavior(T owner, string key) : IUiPageBehavior } /// - /// 页面显示时调用 + /// 页面显示时调用 /// public void OnShow() { @@ -96,18 +96,17 @@ public class CanvasItemUiPageBehavior(T owner, string key) : IUiPageBehavior } /// - /// 获取或设置页面是否为模态对话框 + /// 获取或设置页面是否为模态对话框 /// public bool IsModal { get; set; } /// - /// 获取或设置页面是否阻止输入 + /// 获取或设置页面是否阻止输入 /// public bool BlocksInput { get; set; } = true; - + /// - /// 获取或设置页面是否需要遮罩层 + /// 获取或设置页面是否需要遮罩层 /// public bool RequiresMask { get; set; } - } \ No newline at end of file diff --git a/GFramework.Godot/ui/GodotUiFactory.cs b/GFramework.Godot/ui/GodotUiFactory.cs index 365daab..5708532 100644 --- a/GFramework.Godot/ui/GodotUiFactory.cs +++ b/GFramework.Godot/ui/GodotUiFactory.cs @@ -10,59 +10,47 @@ using Godot; namespace GFramework.Godot.ui; /// -/// Godot UI工厂类,用于创建UI页面实例 -/// 继承自AbstractContextUtility并实现IUiFactory接口 +/// Godot UI工厂类,用于创建UI页面实例 +/// 继承自AbstractContextUtility并实现IUiFactory接口 /// public class GodotUiFactory : AbstractContextUtility, IUiFactory { - /// - /// 缓存统计信息实现类 - /// - private sealed class CacheStatisticsInfo : IUiCacheStatistics - { - public int CacheSize { get; set; } - public int HitCount { get; set; } - public int MissCount { get; set; } - public double HitRate => HitCount + MissCount > 0 ? (double)HitCount / (HitCount + MissCount) : 0; - public DateTime? LastAccessTime { get; set; } - } - private static readonly ILogger Log = LoggerFactoryResolver.Provider.CreateLogger("GodotUiFactory"); - - private IGodotUiRegistry _registry = null!; - + /// - /// 缓存池:uiKey -> 实例队列 - /// - private readonly Dictionary> _cachedInstances = new(); - - /// - /// 追踪所有创建的实例(用于清理) - /// - private readonly Dictionary> _allInstances = new(); - - /// - /// 缓存配置:uiKey -> 配置 - /// - private readonly Dictionary _cacheConfigs = new(); - - /// - /// 缓存统计:uiKey -> 统计信息 - /// - private readonly Dictionary _cacheStatistics = new(); - - /// - /// LRU访问时间队列:uiKey -> 按访问时间排序的实例列表 - /// - private readonly Dictionary> _accessTimeQueue = new(); - - /// - /// LFU访问计数:instance -> 访问次数 + /// LFU访问计数:instance -> 访问次数 /// private readonly Dictionary _accessCount = new(); /// - /// 创建或获取UI页面实例 + /// LRU访问时间队列:uiKey -> 按访问时间排序的实例列表 + /// + private readonly Dictionary> _accessTimeQueue = new(); + + /// + /// 追踪所有创建的实例(用于清理) + /// + private readonly Dictionary> _allInstances = new(); + + /// + /// 缓存配置:uiKey -> 配置 + /// + private readonly Dictionary _cacheConfigs = new(); + + /// + /// 缓存池:uiKey -> 实例队列 + /// + private readonly Dictionary> _cachedInstances = new(); + + /// + /// 缓存统计:uiKey -> 统计信息 + /// + private readonly Dictionary _cacheStatistics = new(); + + private IGodotUiRegistry _registry = null!; + + /// + /// 创建或获取UI页面实例 /// public IUiPageBehavior GetOrCreate(string uiKey, UiInstancePolicy policy = UiInstancePolicy.AlwaysCreate) { @@ -75,7 +63,7 @@ public class GodotUiFactory : AbstractContextUtility, IUiFactory } /// - /// 仅创建新实例 + /// 仅创建新实例 /// public IUiPageBehavior Create(string uiKey) { @@ -86,129 +74,121 @@ public class GodotUiFactory : AbstractContextUtility, IUiFactory throw new InvalidCastException($"UI scene {uiKey} must implement IUiPageBehaviorProvider"); var page = provider.GetPage(); - + // 追踪实例 if (!_allInstances.ContainsKey(uiKey)) _allInstances[uiKey] = new HashSet(); _allInstances[uiKey].Add(page); - + Log.Debug("Created new UI instance: {0}", uiKey); return page; } /// - /// 预加载UI资源 + /// 预加载UI资源 /// public void Preload(string uiKey, int count = 1) { Log.Debug("Preloading UI: {0}, count={1}", uiKey, count); - + if (!_cachedInstances.ContainsKey(uiKey)) _cachedInstances[uiKey] = new Queue(); var queue = _cachedInstances[uiKey]; - - for (int i = 0; i < count; i++) + + for (var i = 0; i < count; i++) { var instance = Create(uiKey); // 预加载的实例初始状态为隐藏 instance.OnHide(); queue.Enqueue(instance); } - + Log.Debug("Preloaded {0} instances of {1}", count, uiKey); } /// - /// 批量预加载 + /// 批量预加载 /// public void PreloadBatch(params string[] uiKeys) { - foreach (var uiKey in uiKeys) - { - Preload(uiKey); - } + foreach (var uiKey in uiKeys) Preload(uiKey); } /// - /// 回收实例到缓存池 + /// 回收实例到缓存池 /// public void Recycle(IUiPageBehavior page) { var uiKey = page.Key; - + if (!_cachedInstances.ContainsKey(uiKey)) _cachedInstances[uiKey] = new Queue(); // 确保实例处于隐藏状态 page.OnHide(); - + // 更新统计信息 UpdateStatisticsOnRecycle(uiKey); - + // 更新访问追踪 UpdateAccessTracking(uiKey, page); - + _cachedInstances[uiKey].Enqueue(page); Log.Debug("Recycled UI instance to pool: {0}, poolSize={1}", uiKey, _cachedInstances[uiKey].Count); - + // 检查是否需要淘汰 CheckAndEvict(uiKey); } /// - /// 获取UI的缓存配置 + /// 获取UI的缓存配置 /// public UiCacheConfig GetCacheConfig(string uiKey) { return _cacheConfigs.TryGetValue(uiKey, out var config) ? config : UiCacheConfig.Default; } - + /// - /// 设置UI的缓存配置 + /// 设置UI的缓存配置 /// public void SetCacheConfig(string uiKey, UiCacheConfig config) { _cacheConfigs[uiKey] = config; - Log.Debug("Set cache config for UI: {0}, MaxSize={1}, Policy={2}", uiKey, config.MaxCacheSize, config.EvictionPolicy); - + Log.Debug("Set cache config for UI: {0}, MaxSize={1}, Policy={2}", uiKey, config.MaxCacheSize, + config.EvictionPolicy); + // 检查是否需要淘汰 CheckAndEvict(uiKey); } - + /// - /// 移除UI的缓存配置 + /// 移除UI的缓存配置 /// public void RemoveCacheConfig(string uiKey) { - if (_cacheConfigs.Remove(uiKey)) - { - Log.Debug("Removed cache config for UI: {0}", uiKey); - } + if (_cacheConfigs.Remove(uiKey)) Log.Debug("Removed cache config for UI: {0}", uiKey); } - + /// - /// 获取所有UI的缓存统计信息 + /// 获取所有UI的缓存统计信息 /// public IDictionary GetCacheStatistics() { var result = new Dictionary(); - foreach (var kvp in _cacheStatistics) - { - result[kvp.Key] = kvp.Value; - } + foreach (var kvp in _cacheStatistics) result[kvp.Key] = kvp.Value; return result; } - + /// - /// 清理指定UI的缓存 + /// 清理指定UI的缓存 /// public void ClearCache(string uiKey) { if (!_cachedInstances.TryGetValue(uiKey, out var queue)) return; - int count = queue.Count; + var count = queue.Count; while (queue.Count > 0) { var instance = queue.Dequeue(); @@ -220,20 +200,17 @@ public class GodotUiFactory : AbstractContextUtility, IUiFactory } /// - /// 清理所有缓存 + /// 清理所有缓存 /// public void ClearAllCache() { - foreach (var uiKey in _cachedInstances.Keys) - { - ClearCache(uiKey); - } - + foreach (var uiKey in _cachedInstances.Keys) ClearCache(uiKey); + Log.Debug("Cleared all UI caches"); } /// - /// 检查是否有缓存的实例 + /// 检查是否有缓存的实例 /// public bool HasCached(string uiKey) { @@ -245,10 +222,22 @@ public class GodotUiFactory : AbstractContextUtility, IUiFactory _registry = this.GetUtility()!; } + /// + /// 缓存统计信息实现类 + /// + private sealed class CacheStatisticsInfo : IUiCacheStatistics + { + public int CacheSize { get; set; } + public int HitCount { get; set; } + public int MissCount { get; set; } + public double HitRate => HitCount + MissCount > 0 ? (double)HitCount / (HitCount + MissCount) : 0; + public DateTime? LastAccessTime { get; set; } + } + #region Private Methods /// - /// 获取缓存实例或创建新实例(Reuse策略) + /// 获取缓存实例或创建新实例(Reuse策略) /// private IUiPageBehavior GetCachedOrCreate(string uiKey) { @@ -256,13 +245,13 @@ public class GodotUiFactory : AbstractContextUtility, IUiFactory if (_cachedInstances.TryGetValue(uiKey, out var queue) && queue.Count > 0) { var cached = queue.Dequeue(); - + // 更新统计:缓存命中 UpdateStatisticsOnHit(uiKey); - + // 更新访问追踪 UpdateAccessTracking(uiKey, cached); - + Log.Debug("Reused cached UI instance: {0}, remainingInPool={1}", uiKey, queue.Count); return cached; } @@ -274,8 +263,8 @@ public class GodotUiFactory : AbstractContextUtility, IUiFactory } /// - /// 从池中获取或创建(Pooled策略) - /// 如果池为空,自动创建并填充 + /// 从池中获取或创建(Pooled策略) + /// 如果池为空,自动创建并填充 /// private IUiPageBehavior GetFromPoolOrCreate(string uiKey) { @@ -288,94 +277,85 @@ public class GodotUiFactory : AbstractContextUtility, IUiFactory } /// - /// 销毁实例 + /// 销毁实例 /// private void DestroyInstance(IUiPageBehavior page) { var uiKey = page.Key; - + // 从追踪列表移除 - if (_allInstances.TryGetValue(uiKey, out var set)) - { - set.Remove(page); - } - + if (_allInstances.TryGetValue(uiKey, out var set)) set.Remove(page); + // 从访问追踪移除 _accessCount.Remove(page); - if (_accessTimeQueue.TryGetValue(uiKey, out var queue)) - { - queue.RemoveAll(x => x.instance == page); - } + if (_accessTimeQueue.TryGetValue(uiKey, out var queue)) queue.RemoveAll(x => x.instance == page); // 销毁Godot节点 - if (page.View is Node node) - { - node.QueueFreeX(); - } + if (page.View is Node node) node.QueueFreeX(); } - + /// - /// 更新统计信息:回收 + /// 更新统计信息:回收 /// private void UpdateStatisticsOnRecycle(string uiKey) { if (!_cacheStatistics.ContainsKey(uiKey)) _cacheStatistics[uiKey] = new CacheStatisticsInfo(); - + var stats = _cacheStatistics[uiKey]; stats.CacheSize = _cachedInstances[uiKey].Count + 1; stats.LastAccessTime = DateTime.Now; } - + /// - /// 更新统计信息:命中 + /// 更新统计信息:命中 /// private void UpdateStatisticsOnHit(string uiKey) { if (!_cacheStatistics.ContainsKey(uiKey)) _cacheStatistics[uiKey] = new CacheStatisticsInfo(); - + var stats = _cacheStatistics[uiKey]; stats.HitCount++; stats.CacheSize = _cachedInstances[uiKey].Count; stats.LastAccessTime = DateTime.Now; } - + /// - /// 更新统计信息:未命中 + /// 更新统计信息:未命中 /// private void UpdateStatisticsOnMiss(string uiKey) { if (!_cacheStatistics.ContainsKey(uiKey)) _cacheStatistics[uiKey] = new CacheStatisticsInfo(); - + var stats = _cacheStatistics[uiKey]; stats.MissCount++; stats.CacheSize = _cachedInstances.TryGetValue(uiKey, out var queue) ? queue.Count : 0; } - + /// - /// 更新访问追踪 + /// 更新访问追踪 /// private void UpdateAccessTracking(string uiKey, IUiPageBehavior instance) { var now = DateTime.Now; - + // LRU: 更新访问时间队列 if (!_accessTimeQueue.ContainsKey(uiKey)) _accessTimeQueue[uiKey] = new List<(IUiPageBehavior, DateTime)>(); - + var timeQueue = _accessTimeQueue[uiKey]; timeQueue.RemoveAll(x => x.instance == instance); timeQueue.Add((instance, now)); - + // LFU: 更新访问计数 _accessCount.TryGetValue(instance, out var count); _accessCount[instance] = count + 1; } - + /// - /// 检查并执行淘汰 + /// 检查并执行淘汰 /// private void CheckAndEvict(string uiKey) { @@ -384,34 +364,32 @@ public class GodotUiFactory : AbstractContextUtility, IUiFactory if (currentSize <= config.MaxCacheSize) return; var toEvict = currentSize - config.MaxCacheSize; - + for (var i = 0; i < toEvict; i++) - { if (config.EvictionPolicy == CacheEvictionPolicy.Lru) EvictLru(uiKey); else EvictLfu(uiKey); - } - + Log.Debug("Evicted {0} instances for UI: {1}", toEvict, uiKey); } - + /// - /// LRU淘汰策略 + /// LRU淘汰策略 /// private void EvictLru(string uiKey) { if (!_accessTimeQueue.TryGetValue(uiKey, out var timeQueue) || timeQueue.Count == 0) return; - + var oldest = timeQueue.OrderBy(x => x.accessTime).First(); - + // 从队列中移除 if (_cachedInstances.TryGetValue(uiKey, out var queue)) { var tempQueue = new Queue(); var removed = false; - + while (queue.Count > 0) { var item = queue.Dequeue(); @@ -425,38 +403,33 @@ public class GodotUiFactory : AbstractContextUtility, IUiFactory tempQueue.Enqueue(item); } } - + // 重新填充队列 while (tempQueue.Count > 0) queue.Enqueue(tempQueue.Dequeue()); } } - + /// - /// LFU淘汰策略 + /// LFU淘汰策略 /// private void EvictLfu(string uiKey) { if (!_cachedInstances.TryGetValue(uiKey, out var queue) || queue.Count == 0) return; - + // 找到访问次数最少的实例 IUiPageBehavior? toRemove = null; var minCount = int.MaxValue; - + foreach (var instance in queue) - { if (_accessCount.TryGetValue(instance, out var count) && count < minCount) { minCount = count; toRemove = instance; } - } - - if (toRemove != null) - { - DestroyInstance(toRemove); - } + + if (toRemove != null) DestroyInstance(toRemove); } #endregion diff --git a/GFramework.Godot/ui/GodotUiRegistry.cs b/GFramework.Godot/ui/GodotUiRegistry.cs index 69d4ae8..2055083 100644 --- a/GFramework.Godot/ui/GodotUiRegistry.cs +++ b/GFramework.Godot/ui/GodotUiRegistry.cs @@ -4,9 +4,9 @@ using Godot; namespace GFramework.Godot.ui; /// -/// Godot UI注册表类,用于管理UI相关的PackedScene资源 -/// 继承自KeyValueRegistryBase,使用字符串作为键,PackedScene作为值进行存储 -/// 实现IUiRegistry接口,提供UI场景的注册和管理功能 +/// Godot UI注册表类,用于管理UI相关的PackedScene资源 +/// 继承自KeyValueRegistryBase,使用字符串作为键,PackedScene作为值进行存储 +/// 实现IUiRegistry接口,提供UI场景的注册和管理功能 /// public class GodotUiRegistry() : KeyValueRegistryBase(StringComparer.Ordinal), IGodotUiRegistry; \ No newline at end of file diff --git a/GFramework.Godot/ui/GodotUiRoot.cs b/GFramework.Godot/ui/GodotUiRoot.cs index 4e3a238..e6430b8 100644 --- a/GFramework.Godot/ui/GodotUiRoot.cs +++ b/GFramework.Godot/ui/GodotUiRoot.cs @@ -5,56 +5,44 @@ using Godot; namespace GFramework.Godot.ui; /// -/// Godot平台的UI根节点实现 -/// 用于管理UI页面的添加、移除和层级排序 +/// Godot平台的UI根节点实现 +/// 用于管理UI页面的添加、移除和层级排序 /// public partial class GodotUiRoot(IReadOnlyDictionary? layerZOrderMap) : Node, IUiRoot { /// - /// UI节点的父容器,所有UI页面都添加到这个节点下 + /// UI层级与Z轴顺序的映射表,定义了不同UI层的渲染优先级 + /// + /// + /// 默认层级映射关系: + /// - Page: 0 (基础页面层) + /// - Overlay: 100 (覆盖层) + /// - Modal: 200 (模态窗口层) + /// - Toast: 300 (提示消息层) + /// - Topmost: 400 (最顶层) + /// + private readonly IReadOnlyDictionary _layerZOrderMap = layerZOrderMap ?? + new Dictionary + { + { UiLayer.Page, 0 }, + { UiLayer.Overlay, 100 }, + { UiLayer.Modal, 200 }, + { UiLayer.Toast, 300 }, + { UiLayer.Topmost, 400 } + }; + + /// + /// UI页面的追踪字典,记录每个页面的节点 + /// + private readonly Dictionary _pageNodes = new(); + + /// + /// UI节点的父容器,所有UI页面都添加到这个节点下 /// private Node? _uiContainer; /// - /// UI页面的追踪字典,记录每个页面的节点 - /// - private readonly Dictionary _pageNodes = new(); - - /// - /// UI层级与Z轴顺序的映射表,定义了不同UI层的渲染优先级 - /// - /// - /// 默认层级映射关系: - /// - Page: 0 (基础页面层) - /// - Overlay: 100 (覆盖层) - /// - Modal: 200 (模态窗口层) - /// - Toast: 300 (提示消息层) - /// - Topmost: 400 (最顶层) - /// - private readonly IReadOnlyDictionary _layerZOrderMap =layerZOrderMap ?? - new Dictionary - { - { UiLayer.Page, 0 }, - { UiLayer.Overlay, 100 }, - { UiLayer.Modal, 200 }, - { UiLayer.Toast, 300 }, - { UiLayer.Topmost, 400 }, - }; - - - public override void _Ready() - { - // 创建UI容器节点 - _uiContainer = new Node - { - Name = "UiContainer" - }; - - AddChild(_uiContainer); - } - - /// - /// 向UI根节点添加子页面 + /// 向UI根节点添加子页面 /// public void AddUiPage(IUiPageBehavior child) { @@ -68,14 +56,11 @@ public partial class GodotUiRoot(IReadOnlyDictionary? layerZOrderM if (!_pageNodes.TryAdd(child, node)) return; - if (node.GetParent() != _uiContainer) - { - _uiContainer.AddChild(node); - } + if (node.GetParent() != _uiContainer) _uiContainer.AddChild(node); } /// - /// 向UI根节点添加子页面到指定层级 + /// 向UI根节点添加子页面到指定层级 /// public void AddUiPage( IUiPageBehavior child, @@ -90,52 +75,60 @@ public partial class GodotUiRoot(IReadOnlyDictionary? layerZOrderM /// - /// 从UI根节点移除子页面 + /// 从UI根节点移除子页面 /// public void RemoveUiPage(IUiPageBehavior child) { if (!_pageNodes.Remove(child, out var node)) return; - if (_uiContainer != null && node.GetParent() == _uiContainer) - { - _uiContainer.RemoveChild(node); - } + if (_uiContainer != null && node.GetParent() == _uiContainer) _uiContainer.RemoveChild(node); } /// - /// 设置页面的Z-order(层级顺序) + /// 设置页面的Z-order(层级顺序) /// public void SetZOrder(IUiPageBehavior page, int zOrder) { if (!_pageNodes.TryGetValue(page, out var node)) return; - if (node is CanvasItem canvasItem) - { - canvasItem.ZIndex = zOrder; - } + if (node is CanvasItem canvasItem) canvasItem.ZIndex = zOrder; } /// - /// 获取当前所有显示的页面 + /// 获取当前所有显示的页面 /// public IReadOnlyList GetVisiblePages() { return _pageNodes.Keys.ToList().AsReadOnly(); } - + + + public override void _Ready() + { + // 创建UI容器节点 + _uiContainer = new Node + { + Name = "UiContainer" + }; + + AddChild(_uiContainer); + } /// - /// 从页面行为获取对应的节点 + /// 从页面行为获取对应的节点 /// private static Node? GetNodeFromPage(IUiPageBehavior page) { return page.View as Node; } + private int GetBaseZOrder(UiLayer layer) { - return !_layerZOrderMap.TryGetValue(layer, out var z) ? throw new ArgumentOutOfRangeException(nameof(layer), layer, null) : z; + return !_layerZOrderMap.TryGetValue(layer, out var z) + ? throw new ArgumentOutOfRangeException(nameof(layer), layer, null) + : z; } -} +} \ No newline at end of file diff --git a/GFramework.Godot/ui/IGodotUiRegistry.cs b/GFramework.Godot/ui/IGodotUiRegistry.cs index a2758cc..3b90918 100644 --- a/GFramework.Godot/ui/IGodotUiRegistry.cs +++ b/GFramework.Godot/ui/IGodotUiRegistry.cs @@ -4,7 +4,7 @@ using Godot; namespace GFramework.Godot.ui; /// -/// Godot UI注册表接口,用于管理PackedScene类型的UI资源注册和管理 -/// 继承自通用UI注册表接口,专门针对Godot引擎的PackedScene资源类型 +/// Godot UI注册表接口,用于管理PackedScene类型的UI资源注册和管理 +/// 继承自通用UI注册表接口,专门针对Godot引擎的PackedScene资源类型 /// public interface IGodotUiRegistry : IAssetRegistry; \ No newline at end of file diff --git a/GFramework.SourceGenerators.Abstractions/enums/GenerateEnumExtensionsAttribute.cs b/GFramework.SourceGenerators.Abstractions/enums/GenerateEnumExtensionsAttribute.cs index 8c7a47f..447ff75 100644 --- a/GFramework.SourceGenerators.Abstractions/enums/GenerateEnumExtensionsAttribute.cs +++ b/GFramework.SourceGenerators.Abstractions/enums/GenerateEnumExtensionsAttribute.cs @@ -1,6 +1,4 @@ -using System; - -namespace GFramework.SourceGenerators.Abstractions.enums; +namespace GFramework.SourceGenerators.Abstractions.enums; /// /// 标注在 enum 上,Source Generator 会为该 enum 生成扩展方法。 diff --git a/GFramework.SourceGenerators.Abstractions/logging/LogAttribute.cs b/GFramework.SourceGenerators.Abstractions/logging/LogAttribute.cs index 52e7325..ba6004d 100644 --- a/GFramework.SourceGenerators.Abstractions/logging/LogAttribute.cs +++ b/GFramework.SourceGenerators.Abstractions/logging/LogAttribute.cs @@ -1,6 +1,4 @@ #nullable enable -using System; - namespace GFramework.SourceGenerators.Abstractions.logging; /// diff --git a/GFramework.SourceGenerators.Abstractions/rule/ContextAwareAttribute.cs b/GFramework.SourceGenerators.Abstractions/rule/ContextAwareAttribute.cs index 7ebbb93..0b9c7eb 100644 --- a/GFramework.SourceGenerators.Abstractions/rule/ContextAwareAttribute.cs +++ b/GFramework.SourceGenerators.Abstractions/rule/ContextAwareAttribute.cs @@ -1,6 +1,4 @@ -using System; - -namespace GFramework.SourceGenerators.Abstractions.rule; +namespace GFramework.SourceGenerators.Abstractions.rule; /// /// 标记该类需要自动实现 IContextAware diff --git a/GFramework.SourceGenerators.Common/extensions/AttributeDataExtensions.cs b/GFramework.SourceGenerators.Common/extensions/AttributeDataExtensions.cs index 6aaeece..e6d8b77 100644 --- a/GFramework.SourceGenerators.Common/extensions/AttributeDataExtensions.cs +++ b/GFramework.SourceGenerators.Common/extensions/AttributeDataExtensions.cs @@ -1,10 +1,9 @@ -using System; -using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis; namespace GFramework.SourceGenerators.Common.extensions; /// -/// 提供AttributeData的扩展方法 +/// 提供AttributeData的扩展方法 /// public static class AttributeDataExtensions { @@ -12,7 +11,7 @@ public static class AttributeDataExtensions extension(AttributeData attr) { /// - /// 从特性数据中获取指定名称的命名参数值 + /// 从特性数据中获取指定名称的命名参数值 /// /// 期望返回的参数类型 /// 要查找的命名参数名称 @@ -23,16 +22,14 @@ public static class AttributeDataExtensions { // 遍历所有命名参数以查找匹配的键值对 foreach (var kv in attr.NamedArguments) - { if (string.Equals(kv.Key, name, StringComparison.Ordinal) && kv.Value.Value is T t) return t; - } return defaultValue; } /// - /// 获取特性构造函数的第一个参数作为字符串值 + /// 获取特性构造函数的第一个参数作为字符串值 /// /// 当没有构造函数参数或第一个参数不是字符串时返回的默认值 /// 构造函数第一个参数的字符串值,如果不存在则返回默认值 diff --git a/GFramework.SourceGenerators.Common/extensions/INamedTypeSymbolExtensions.cs b/GFramework.SourceGenerators.Common/extensions/INamedTypeSymbolExtensions.cs index 291efb5..a41416d 100644 --- a/GFramework.SourceGenerators.Common/extensions/INamedTypeSymbolExtensions.cs +++ b/GFramework.SourceGenerators.Common/extensions/INamedTypeSymbolExtensions.cs @@ -1,17 +1,15 @@ -using System.Collections.Generic; -using System.Linq; -using GFramework.SourceGenerators.Common.info; +using GFramework.SourceGenerators.Common.info; using Microsoft.CodeAnalysis; namespace GFramework.SourceGenerators.Common.extensions; /// -/// 提供INamedTypeSymbol类型的扩展方法 +/// 提供INamedTypeSymbol类型的扩展方法 /// public static class INamedTypeSymbolExtensions { /// - /// 根据类型种类解析对应的类型关键字 + /// 根据类型种类解析对应的类型关键字 /// /// 要解析类型的命名类型符号 /// 对应类型的字符串表示,如"class"、"struct"或"record" @@ -24,12 +22,12 @@ public static class INamedTypeSymbolExtensions #if NET5_0_OR_GREATER || ROSLYN_3_7_OR_GREATER TypeKind.Record => "record", #endif - _ => "class", + _ => "class" }; } /// - /// 解析泛型信息,包括泛型参数和约束条件 + /// 解析泛型信息,包括泛型参数和约束条件 /// /// 要解析泛型信息的命名类型符号 /// 包含泛型参数和约束条件的GenericInfo对象 @@ -53,7 +51,7 @@ public static class INamedTypeSymbolExtensions } /// - /// 构建单个类型参数的约束条件字符串 + /// 构建单个类型参数的约束条件字符串 /// /// 类型参数符号 /// 约束条件的字符串表示,如果没有约束则返回null @@ -75,7 +73,7 @@ public static class INamedTypeSymbolExtensions extension(INamedTypeSymbol symbol) { /// - /// 获取命名类型符号的完整类名(包括嵌套类型名称) + /// 获取命名类型符号的完整类名(包括嵌套类型名称) /// /// 完整的类名,格式为"外层类名.内层类名.当前类名" public string GetFullClassName() @@ -95,7 +93,7 @@ public static class INamedTypeSymbolExtensions } /// - /// 获取命名类型符号的命名空间名称 + /// 获取命名类型符号的命名空间名称 /// /// 命名空间名称,如果是全局命名空间则返回null public string? GetNamespace() diff --git a/GFramework.SourceGenerators.Common/generator/AttributeClassGeneratorBase.cs b/GFramework.SourceGenerators.Common/generator/AttributeClassGeneratorBase.cs index 762c3b5..d950a97 100644 --- a/GFramework.SourceGenerators.Common/generator/AttributeClassGeneratorBase.cs +++ b/GFramework.SourceGenerators.Common/generator/AttributeClassGeneratorBase.cs @@ -1,5 +1,4 @@ -using System.Linq; -using GFramework.SourceGenerators.Common.diagnostics; +using GFramework.SourceGenerators.Common.diagnostics; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; diff --git a/GFramework.SourceGenerators.Common/generator/AttributeEnumGeneratorBase.cs b/GFramework.SourceGenerators.Common/generator/AttributeEnumGeneratorBase.cs index 76976a9..c184e7f 100644 --- a/GFramework.SourceGenerators.Common/generator/AttributeEnumGeneratorBase.cs +++ b/GFramework.SourceGenerators.Common/generator/AttributeEnumGeneratorBase.cs @@ -1,5 +1,4 @@ -using System.Linq; -using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp.Syntax; namespace GFramework.SourceGenerators.Common.generator; diff --git a/GFramework.SourceGenerators.Common/generator/MetadataAttributeClassGeneratorBase.cs b/GFramework.SourceGenerators.Common/generator/MetadataAttributeClassGeneratorBase.cs index 4992492..df4c060 100644 --- a/GFramework.SourceGenerators.Common/generator/MetadataAttributeClassGeneratorBase.cs +++ b/GFramework.SourceGenerators.Common/generator/MetadataAttributeClassGeneratorBase.cs @@ -1,5 +1,4 @@ -using System.Linq; -using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis; namespace GFramework.SourceGenerators.Common.generator; diff --git a/GFramework.SourceGenerators.Common/generator/TypeAttributeClassGeneratorBase.cs b/GFramework.SourceGenerators.Common/generator/TypeAttributeClassGeneratorBase.cs index 876161d..def0852 100644 --- a/GFramework.SourceGenerators.Common/generator/TypeAttributeClassGeneratorBase.cs +++ b/GFramework.SourceGenerators.Common/generator/TypeAttributeClassGeneratorBase.cs @@ -1,6 +1,4 @@ -using System; -using System.Linq; -using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis; namespace GFramework.SourceGenerators.Common.generator; diff --git a/GFramework.SourceGenerators.Common/info/GenericInfo.cs b/GFramework.SourceGenerators.Common/info/GenericInfo.cs index 05869cf..0ba609f 100644 --- a/GFramework.SourceGenerators.Common/info/GenericInfo.cs +++ b/GFramework.SourceGenerators.Common/info/GenericInfo.cs @@ -1,9 +1,7 @@ -using System.Collections.Generic; - -namespace GFramework.SourceGenerators.Common.info; +namespace GFramework.SourceGenerators.Common.info; /// -/// 表示泛型信息的数据结构 +/// 表示泛型信息的数据结构 /// /// 泛型参数字符串 /// 泛型约束列表 diff --git a/GFramework.SourceGenerators.Tests/GFramework.SourceGenerators.Tests.csproj b/GFramework.SourceGenerators.Tests/GFramework.SourceGenerators.Tests.csproj index 1ed47ce..e4fdf6a 100644 --- a/GFramework.SourceGenerators.Tests/GFramework.SourceGenerators.Tests.csproj +++ b/GFramework.SourceGenerators.Tests/GFramework.SourceGenerators.Tests.csproj @@ -8,22 +8,22 @@ - - - - - - - - + + + + + + + + - + - + diff --git a/GFramework.SourceGenerators/README.md b/GFramework.SourceGenerators/README.md index f59e262..a1180a4 100644 --- a/GFramework.SourceGenerators/README.md +++ b/GFramework.SourceGenerators/README.md @@ -138,13 +138,13 @@ public partial class CustomLoggerExample ### 配置选项说明 -| 参数 | 类型 | 默认值 | 说明 | -|------|------|--------|------| -| `fieldName` | string | "Logger" | 生成的日志字段名称 | -| `accessModifier` | AccessModifier | Private | 字段访问修饰符 | -| `isStatic` | bool | true | 是否生成静态字段 | -| `loggerName` | string | null | 自定义日志器名称,null 时使用类名 | -| `includeLoggerInterface` | bool | false | 是否包含 ILogger 接口实现 | +| 参数 | 类型 | 默认值 | 说明 | +|--------------------------|----------------|----------|---------------------| +| `fieldName` | string | "Logger" | 生成的日志字段名称 | +| `accessModifier` | AccessModifier | Private | 字段访问修饰符 | +| `isStatic` | bool | true | 是否生成静态字段 | +| `loggerName` | string | null | 自定义日志器名称,null 时使用类名 | +| `includeLoggerInterface` | bool | false | 是否包含 ILogger 接口实现 | ### 静态类支持 @@ -422,14 +422,14 @@ public static class PlayerAbilitiesExtensions ### 配置选项说明 -| 参数 | 类型 | 默认值 | 说明 | -|------|------|--------|------| -| `generateIsMethods` | bool | true | 是否生成 IsX() 方法 | -| `generateHasMethod` | bool | true | 是否生成 HasX() 方法 | -| `generateInMethod` | bool | true | 是否生成 In(params T[]) 方法 | -| `customPrefix` | string | "Is" | 方法名前缀 | -| `includeToString` | bool | false | 是否生成 ToString 扩展 | -| `namespace` | string | null | 生成扩展类的命名空间 | +| 参数 | 类型 | 默认值 | 说明 | +|---------------------|--------|-------|------------------------| +| `generateIsMethods` | bool | true | 是否生成 IsX() 方法 | +| `generateHasMethod` | bool | true | 是否生成 HasX() 方法 | +| `generateInMethod` | bool | true | 是否生成 In(params T[]) 方法 | +| `customPrefix` | string | "Is" | 方法名前缀 | +| `includeToString` | bool | false | 是否生成 ToString 扩展 | +| `namespace` | string | null | 生成扩展类的命名空间 | ## 诊断信息 @@ -515,13 +515,13 @@ public enum ConflictEnum ### 编译时 vs 运行时对比 -| 特性 | 手动实现 | 反射实现 | 源码生成器 | -|------|----------|----------|------------| -| **运行时性能** | 最优 | 最差 | 最优 | -| **内存开销** | 最小 | 最大 | 最小 | -| **类型安全** | 编译时 | 运行时 | 编译时 | -| **开发效率** | 低 | 中 | 高 | -| **调试友好** | 好 | 差 | 好 | +| 特性 | 手动实现 | 反射实现 | 源码生成器 | +|-----------|------|------|-------| +| **运行时性能** | 最优 | 最差 | 最优 | +| **内存开销** | 最小 | 最大 | 最小 | +| **类型安全** | 编译时 | 运行时 | 编译时 | +| **开发效率** | 低 | 中 | 高 | +| **调试友好** | 好 | 差 | 好 | ### 基准测试结果 diff --git a/GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs b/GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs index 53130ef..a70e841 100644 --- a/GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs +++ b/GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs @@ -1,5 +1,4 @@ -using System.Linq; -using System.Text; +using System.Text; using GFramework.SourceGenerators.Common.constants; using GFramework.SourceGenerators.Common.diagnostics; using GFramework.SourceGenerators.Common.generator; diff --git a/GFramework.SourceGenerators/logging/LoggerGenerator.cs b/GFramework.SourceGenerators/logging/LoggerGenerator.cs index 0ccb722..751cdf6 100644 --- a/GFramework.SourceGenerators/logging/LoggerGenerator.cs +++ b/GFramework.SourceGenerators/logging/LoggerGenerator.cs @@ -1,5 +1,4 @@ -using System; -using System.Text; +using System.Text; using GFramework.SourceGenerators.Abstractions.logging; using GFramework.SourceGenerators.Common.constants; using GFramework.SourceGenerators.Common.extensions; @@ -71,10 +70,8 @@ public sealed class LoggerGenerator : TypeAttributeClassGeneratorBase .AppendLine($"using {PathContests.CoreNamespace}.logging;"); if (ns is not null) - { sb.AppendLine() .AppendLine($"namespace {ns};"); - } sb.AppendLine() .AppendLine($"partial {typeKind} {className}{generics.Parameters}"); diff --git a/GFramework.SourceGenerators/rule/ContextAwareGenerator.cs b/GFramework.SourceGenerators/rule/ContextAwareGenerator.cs index 261ee8c..d45d436 100644 --- a/GFramework.SourceGenerators/rule/ContextAwareGenerator.cs +++ b/GFramework.SourceGenerators/rule/ContextAwareGenerator.cs @@ -1,5 +1,4 @@ -using System.Linq; -using System.Text; +using System.Text; using GFramework.SourceGenerators.Common.constants; using GFramework.SourceGenerators.Common.diagnostics; using GFramework.SourceGenerators.Common.generator; diff --git a/README.md b/README.md index 56669aa..e49fc74 100644 --- a/README.md +++ b/README.md @@ -15,22 +15,26 @@ ### 📚 学习路径 #### 🎯 新手入门 + 1. 📚 [从零开始教程](docs/tutorials/getting-started.md) - 完整的项目创建和开发指南 2. 📖 [基本概念](GFramework.Core/README.md#核心概念) - 理解核心概念 3. 💡 [快速示例](#快速开始-getting-started) - 5分钟上手体验 #### 🏗️ 进阶开发 + 4. 📖 [Godot 集成教程](docs/tutorials/godot-integration.md) - 深度 Godot 集成和最佳实践 5. ⚡ [高级模式教程](docs/tutorials/advanced-patterns.md) - CQRS、事件溯源、插件系统等 6. 🏗️ [架构模式最佳实践](docs/best-practices/architecture-patterns.md) - 推荐的架构设计模式 7. 🏗️ [性能优化技巧](docs/best-practices/performance-tips.md) - 内存和性能优化 #### 🏗️ 专家指南 + 8. 📊 [API 参考](docs/api-reference/) - 详细的类和接口说明 ### 📖 详细文档 #### 🏛️ 核心项目 Core Projects + - [📖 **GFramework.Core** - 核心框架功能,架构、事件、命令、查询等(平台无关)](GFramework.Core/README.md) - [📖 **GFramework.Core.Abstractions** - 核心接口定义 - [📖 **GFramework.Game** - 游戏特定抽象和系统 @@ -40,21 +44,25 @@ - [📖 **GFramework.Godot.SourceGenerators** - Godot 特定的代码生成器 #### 📖 源代码生成器 Source Generators + - [📖 **日志生成器** - 自动 ILogger 字段生成 - [📖 **上下文感知生成器** - 自动 IContextAware 实现 - [📖 **枚举扩展生成器** - 自动枚举扩展方法 #### 📖 API 参考 + - [📖 **Core API 参考** - 核心类和接口详细说明 - [📖 **Godot API 参考** - Godot 模块 API 详细说明 - [📖 **Source Generators API 参考** - 源码生成器 API 详细说明 - [📖 **Game API 参考** - Game 模块 API 详细说明 #### 🏗️ 教程和指南 + - [🏗️ **架构模式最佳实践** - 推荐的架构设计模式 - [🏗️ **性能优化技巧** - 内存和性能优化 #### 🏗️ 常见问题解决 + - [🏗️ **错误处理策略** - 异常处理和错误恢复 - [🏗️ **调试技巧** - 调试和测试指南 @@ -286,6 +294,7 @@ GFramework.Core 是纯 .NET 库,可以轻松移植到: ## 📖 版本历史 Version History ### v1.0.0 (2026-01-12) + - ✅ 完整的文档体系创建完成 - ✅ 核心项目文档完善 - ✅ 源码生成器文档完成 @@ -309,6 +318,7 @@ GFramework.Core 是纯 .NET 库,可以轻松移植到: --- **📚 文档统计** + - **新增文档**: 10+ 个文件 - **代码示例**: 150+ 个可直接使用的代码片段 - **文档总量**: 6000+ 行