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;
}
}
}