using GFramework.SourceGenerators.rule; using GFramework.SourceGenerators.Tests.core; using NUnit.Framework; namespace GFramework.SourceGenerators.Tests.rule; [TestFixture] public class ContextAwareGeneratorTests { [Test] public async Task Generates_ContextAware_Code() { const string source = """ using System; namespace GFramework.SourceGenerators.Abstractions.rule { [AttributeUsage(AttributeTargets.Class)] public sealed class ContextAwareAttribute : Attribute { } } namespace TestApp { using GFramework.SourceGenerators.Abstractions.rule; [ContextAware] public partial class MyRule : GFramework.Core.Abstractions.rule.IContextAware { } } """; const string frameworkStub = """ namespace GFramework.Core.Abstractions.rule { public interface IContextAware { void SetContext( GFramework.Core.Abstractions.architecture.IArchitectureContext context); GFramework.Core.Abstractions.architecture.IArchitectureContext GetContext(); } } namespace GFramework.Core.Abstractions.architecture { public interface IArchitectureContext {} } """; const string expected = """ // #nullable enable namespace TestApp; partial class MyRule { /// /// 自动注入的架构上下文 /// protected GFramework.Core.Abstractions.architecture.IArchitectureContext Context { get; private set; } = null!; void global::GFramework.Core.Abstractions.rule.IContextAware.SetContext( global::GFramework.Core.Abstractions.architecture.IArchitectureContext context) { Context = context; } global::GFramework.Core.Abstractions.architecture.IArchitectureContext global::GFramework.Core.Abstractions.rule.IContextAware.GetContext() { return 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.Abstractions.rule { [AttributeUsage(AttributeTargets.Class)] public sealed class ContextAwareAttribute : Attribute { } } namespace TestApp { using GFramework.SourceGenerators.Abstractions.rule; using GFramework.Core.Abstractions.rule; public interface IMyRuleContextAware : IContextAware { } [ContextAware] public partial class MyRule : IMyRuleContextAware { } } """; const string frameworkStub = """ namespace GFramework.Core.Abstractions.rule { public interface IContextAware { void SetContext( GFramework.Core.Abstractions.architecture.IArchitectureContext context); GFramework.Core.Abstractions.architecture.IArchitectureContext GetContext(); } } namespace GFramework.Core.Abstractions.architecture { public interface IArchitectureContext {} } """; const string expected = """ // #nullable enable namespace TestApp; partial class MyRule { /// /// 自动注入的架构上下文 /// protected GFramework.Core.Abstractions.architecture.IArchitectureContext Context { get; private set; } = null!; void GFramework.Core.Abstractions.rule.IContextAware.SetContext( GFramework.Core.Abstractions.architecture.IArchitectureContext context) { Context = context; } GFramework.Core.Abstractions.architecture.IArchitectureContext GFramework.Core.Abstractions.rule.IContextAware.GetContext() { return Context; } } """; await GeneratorTest.RunAsync( source + "\n" + frameworkStub, ("MyRule.ContextAware.g.cs", expected) ); } }