using GFramework.SourceGenerators.rule; using GFramework.SourceGenerators.Tests.core; using NUnit.Framework; namespace GFramework.SourceGenerators.Tests.rule; /// /// 测试ContextAwareGenerator源代码生成器的功能 /// [TestFixture] public class ContextAwareGeneratorTests { /// /// 测试ContextAware代码生成功能 /// 验证当使用[ContextAware]特性标记的类能够正确生成上下文感知的相关代码 /// /// 异步任务 [Test] public async Task Generates_ContextAware_Code() { // 定义输入源代码,包含使用[ContextAware]特性的部分类 const string source = """ using System; namespace GFramework.SourceGenerators.Attributes.rule { [AttributeUsage(AttributeTargets.Class)] public sealed class ContextAwareAttribute : Attribute { } } namespace TestApp { using GFramework.SourceGenerators.Attributes.rule; [ContextAware] public partial class MyRule: GFramework.Core.rule.IContextAware { } } """; const string frameworkStub = """ namespace GFramework.Core.rule { public interface IContextAware { void SetContext(GFramework.Core.architecture.IArchitectureContext context); } } namespace GFramework.Core.architecture { public interface IArchitectureContext {} } """; // 定义期望的生成结果代码 const string expected = """ // #nullable enable namespace TestApp; partial class MyRule { protected GFramework.Core.architecture.IArchitectureContext Context { get; private set; } = null!; void GFramework.Core.rule.IContextAware.SetContext( GFramework.Core.architecture.IArchitectureContext context) { Context = context; } } """; // 执行源代码生成器测试 await GeneratorTest.RunAsync( source + "\n" + frameworkStub, ("MyRule.ContextAware.g.cs", expected) ); } [Test] public async Task Generates_ContextAware_Code_When_Interface_Inherits_IContextAware() { const string source = """ using System; namespace GFramework.SourceGenerators.Attributes.rule { [AttributeUsage(AttributeTargets.Class)] public sealed class ContextAwareAttribute : Attribute { } } namespace TestApp { using GFramework.SourceGenerators.Attributes.rule; using GFramework.Core.rule; // 间接接口:继承自 IContextAware public interface IMyRuleContextAware : IContextAware { } [ContextAware] public partial class MyRule : IMyRuleContextAware { } } """; const string frameworkStub = """ namespace GFramework.Core.rule { public interface IContextAware { void SetContext(GFramework.Core.architecture.IArchitectureContext context); } } namespace GFramework.Core.architecture { public interface IArchitectureContext {} } """; const string expected = """ // #nullable enable namespace TestApp; partial class MyRule { protected GFramework.Core.architecture.IArchitectureContext Context { get; private set; } = null!; void GFramework.Core.rule.IContextAware.SetContext( GFramework.Core.architecture.IArchitectureContext context) { Context = context; } } """; await GeneratorTest.RunAsync( source + "\n" + frameworkStub, ("MyRule.ContextAware.g.cs", expected) ); } }