Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
namespace GFramework.Core.Abstractions.architecture;

/// <summary>
/// 架构上下文提供者接口,用于解耦上下文获取逻辑
/// </summary>
public interface IArchitectureContextProvider
{
/// <summary>
/// 获取当前的架构上下文
/// </summary>
/// <returns>架构上下文实例</returns>
IArchitectureContext GetContext();

/// <summary>
/// 尝试获取指定类型的架构上下文
/// </summary>
/// <typeparam name="T">架构上下文类型</typeparam>
/// <param name="context">输出的上下文实例</param>
/// <returns>如果成功获取则返回true,否则返回false</returns>
bool TryGetContext<T>(out T? context) where T : class, IArchitectureContext;
}
157 changes: 157 additions & 0 deletions GFramework.Core.Tests/architecture/ContextProviderTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
using GFramework.Core.Abstractions.architecture;
using GFramework.Core.architecture;
using NUnit.Framework;

namespace GFramework.Core.Tests.architecture;

/// <summary>
/// ContextProvider 相关类的单元测试
/// 测试内容包括:
/// - GameContextProvider 获取第一个架构上下文
/// - GameContextProvider 尝试获取指定类型的上下文
/// - ScopedContextProvider 获取绑定的上下文
/// - ScopedContextProvider 尝试获取指定类型的上下文
/// - ScopedContextProvider 类型不匹配时返回 false
/// </summary>
[TestFixture]
public class ContextProviderTests
{
/// <summary>
/// 测试初始化方法,在每个测试方法执行前清空 GameContext
/// </summary>
[SetUp]
public void SetUp()
{
GameContext.Clear();
}

/// <summary>
/// 测试清理方法,在每个测试方法执行后清空 GameContext
/// </summary>
[TearDown]
public void TearDown()
{
GameContext.Clear();
}

/// <summary>
/// 测试 GameContextProvider 是否能正确获取第一个架构上下文
/// </summary>
[Test]
public void GameContextProvider_GetContext_Should_Return_First_Context()
{
var context = new TestArchitectureContext();
GameContext.Bind(typeof(TestArchitecture), context);

var provider = new GameContextProvider();
var result = provider.GetContext();

Assert.That(result, Is.SameAs(context));
}

/// <summary>
/// 测试 GameContextProvider 在没有上下文时是否抛出异常
/// </summary>
[Test]
public void GameContextProvider_GetContext_Should_Throw_When_Empty()
{
var provider = new GameContextProvider();

Assert.Throws<InvalidOperationException>(() => provider.GetContext());
}

/// <summary>
/// 测试 GameContextProvider 的 TryGetContext 方法在找到上下文时返回 true
/// </summary>
[Test]
public void GameContextProvider_TryGetContext_Should_Return_True_When_Found()
{
var context = new TestArchitectureContext();
GameContext.Bind(typeof(TestArchitectureContext), context);

var provider = new GameContextProvider();
var result = provider.TryGetContext<TestArchitectureContext>(out var foundContext);

Assert.That(result, Is.True);
Assert.That(foundContext, Is.SameAs(context));
}

/// <summary>
/// 测试 GameContextProvider 的 TryGetContext 方法在未找到上下文时返回 false
/// </summary>
[Test]
public void GameContextProvider_TryGetContext_Should_Return_False_When_Not_Found()
{
var provider = new GameContextProvider();
var result = provider.TryGetContext<TestArchitectureContext>(out var foundContext);

Assert.That(result, Is.False);
Assert.That(foundContext, Is.Null);
}

/// <summary>
/// 测试 ScopedContextProvider 是否能正确返回绑定的上下文
/// </summary>
[Test]
public void ScopedContextProvider_GetContext_Should_Return_Bound_Context()
{
var context = new TestArchitectureContext();
var provider = new ScopedContextProvider(context);

var result = provider.GetContext();

Assert.That(result, Is.SameAs(context));
}

/// <summary>
/// 测试 ScopedContextProvider 的 TryGetContext 方法在类型匹配时返回 true
/// </summary>
[Test]
public void ScopedContextProvider_TryGetContext_Should_Return_True_When_Type_Matches()
{
var context = new TestArchitectureContext();
var provider = new ScopedContextProvider(context);

var result = provider.TryGetContext<TestArchitectureContext>(out var foundContext);

Assert.That(result, Is.True);
Assert.That(foundContext, Is.SameAs(context));
}

/// <summary>
/// 测试 ScopedContextProvider 的 TryGetContext 方法在类型不匹配时返回 false
/// </summary>
[Test]
public void ScopedContextProvider_TryGetContext_Should_Return_False_When_Type_Does_Not_Match()
{
var context = new TestArchitectureContext();
var provider = new ScopedContextProvider(context);

var result = provider.TryGetContext<AnotherTestArchitectureContext>(out var foundContext);

Assert.That(result, Is.False);
Assert.That(foundContext, Is.Null);
}

/// <summary>
/// 测试 ScopedContextProvider 的 TryGetContext 方法支持接口类型查询
/// </summary>
[Test]
public void ScopedContextProvider_TryGetContext_Should_Support_Interface_Type()
{
var context = new TestArchitectureContext();
var provider = new ScopedContextProvider(context);

var result = provider.TryGetContext<IArchitectureContext>(out var foundContext);

Assert.That(result, Is.True);
Assert.That(foundContext, Is.SameAs(context));
}
}

/// <summary>
/// 另一个测试用的架构上下文类,用于测试类型不匹配的情况
/// </summary>
public class AnotherTestArchitectureContext : TestArchitectureContext
{
}
2 changes: 1 addition & 1 deletion GFramework.Core.Tests/architecture/GameContextTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,7 @@ public class TestArchitectureContext : IArchitectureContext
/// </summary>
/// <typeparam name="TUtility">工具类型</typeparam>
/// <returns>工具实例或null</returns>
public TUtility? GetUtility<TUtility>() where TUtility : class, IUtility
public virtual TUtility? GetUtility<TUtility>() where TUtility : class, IUtility
{
return _container.Get<TUtility>();
}
Expand Down
Loading
Loading