GFramework/GFramework.SourceGenerators.Tests/Config/SchemaGeneratorTestDriver.cs
GeWuYou 91f0375461 refactor(tests): 更新测试驱动程序依赖
- 添加 Microsoft.CodeAnalysis.CSharp 命名空间引用
- 优化代码结构以支持 C# 语法分析功能
- 提升测试驱动程序的编译器集成能力
2026-03-30 18:41:52 +08:00

88 lines
3.2 KiB
C#

using System.Collections.Immutable;
using System.IO;
using GFramework.SourceGenerators.Config;
using Microsoft.CodeAnalysis.CSharp;
namespace GFramework.SourceGenerators.Tests.Config;
/// <summary>
/// 为 schema 配置生成器提供测试驱动。
/// 该驱动直接使用 Roslyn GeneratorDriver 运行 AdditionalFiles 场景,
/// 以便测试基于 schema 文件的代码生成行为。
/// </summary>
public static class SchemaGeneratorTestDriver
{
/// <summary>
/// 运行 schema 配置生成器,并返回生成结果。
/// </summary>
/// <param name="source">测试用源码。</param>
/// <param name="additionalFiles">AdditionalFiles 集合。</param>
/// <returns>生成器运行结果。</returns>
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();
}
/// <summary>
/// 获取测试编译所需的运行时元数据引用。
/// </summary>
/// <returns>元数据引用集合。</returns>
private static IEnumerable<MetadataReference> GetMetadataReferences()
{
var trustedPlatformAssemblies = ((string?)AppContext.GetData("TRUSTED_PLATFORM_ASSEMBLIES"))?
.Split(Path.PathSeparator, StringSplitOptions.RemoveEmptyEntries)
?? Array.Empty<string>();
return trustedPlatformAssemblies
.Select(static path => MetadataReference.CreateFromFile(path));
}
/// <summary>
/// 用于测试 AdditionalFiles 的内存实现。
/// </summary>
private sealed class InMemoryAdditionalText : AdditionalText
{
private readonly SourceText _text;
/// <summary>
/// 创建内存 AdditionalText。
/// </summary>
/// <param name="path">虚拟文件路径。</param>
/// <param name="content">文件内容。</param>
public InMemoryAdditionalText(
string path,
string content)
{
Path = path;
_text = SourceText.From(content);
}
/// <inheritdoc />
public override string Path { get; }
/// <inheritdoc />
public override SourceText GetText(CancellationToken cancellationToken = default)
{
return _text;
}
}
}