using System.Collections.Immutable; using System.IO; using GFramework.SourceGenerators.Config; namespace GFramework.SourceGenerators.Tests.Config; /// /// 为 schema 配置生成器提供测试驱动。 /// 该驱动直接使用 Roslyn GeneratorDriver 运行 AdditionalFiles 场景, /// 以便测试基于 schema 文件的代码生成行为。 /// public static class SchemaGeneratorTestDriver { /// /// 运行 schema 配置生成器,并返回生成结果。 /// /// 测试用源码。 /// AdditionalFiles 集合。 /// 生成器运行结果。 public static GeneratorDriverRunResult Run( string source, params (string path, string content)[] additionalFiles) { var syntaxTree = CSharpSyntaxTree.ParseText(source); var compilation = CSharpCompilation.Create( "SchemaConfigGeneratorTests", new[] { syntaxTree }, GetMetadataReferences(), new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); var additionalTexts = additionalFiles .Select(static item => (AdditionalText)new InMemoryAdditionalText(item.path, item.content)) .ToImmutableArray(); GeneratorDriver driver = CSharpGeneratorDriver.Create( generators: new[] { new SchemaConfigGenerator().AsSourceGenerator() }, additionalTexts: additionalTexts, parseOptions: (CSharpParseOptions)syntaxTree.Options); driver = driver.RunGenerators(compilation); return driver.GetRunResult(); } /// /// 获取测试编译所需的运行时元数据引用。 /// /// 元数据引用集合。 private static IEnumerable GetMetadataReferences() { var trustedPlatformAssemblies = ((string?)AppContext.GetData("TRUSTED_PLATFORM_ASSEMBLIES"))? .Split(Path.PathSeparator, StringSplitOptions.RemoveEmptyEntries) ?? Array.Empty(); return trustedPlatformAssemblies .Select(static path => MetadataReference.CreateFromFile(path)); } /// /// 用于测试 AdditionalFiles 的内存实现。 /// private sealed class InMemoryAdditionalText : AdditionalText { private readonly SourceText _text; /// /// 创建内存 AdditionalText。 /// /// 虚拟文件路径。 /// 文件内容。 public InMemoryAdditionalText( string path, string content) { Path = path; _text = SourceText.From(content); } /// public override string Path { get; } /// public override SourceText GetText(CancellationToken cancellationToken = default) { return _text; } } }