private static Dictionary <string, NamedTest> GetConvertedNamedFacts <TTargetCompiler>(List <NamedTest> runnableTestsInSource, ConversionResult convertedText)
        where TTargetCompiler : ICompiler, new()
    {
        string code                  = convertedText.ConvertedCode;
        var    targetCompiler        = new TTargetCompiler();
        var    compiledTarget        = targetCompiler.AssemblyFromCode(targetCompiler.CreateTree(code), AdditionalReferences);
        var    runnableTestsInTarget = XUnitFactDiscoverer.GetNamedFacts(compiledTarget).ToDictionary(f => f.Name);

        Assert.Equal(runnableTestsInSource.Select(f => f.Name), runnableTestsInTarget.Keys);
        return(runnableTestsInTarget);
    }
    /// <summary>
    /// Returns facts which when executed, ensure the source Fact succeeds, then convert it, and ensure the target Fact succeeds too.
    /// </summary>
    public static IEnumerable <NamedTest> GetSelfVerifyingFacts <TSourceCompiler, TTargetCompiler, TLanguageConversion>(string testFilepath)
        where TSourceCompiler : ICompiler, new() where TTargetCompiler : ICompiler, new() where TLanguageConversion : ILanguageConversion, new()
    {
        var sourceFileText        = File.ReadAllText(testFilepath, Encoding.UTF8);
        var sourceCompiler        = new TSourceCompiler();
        var syntaxTree            = sourceCompiler.CreateTree(sourceFileText).WithFilePath(Path.GetFullPath(testFilepath));
        var compiledSource        = sourceCompiler.AssemblyFromCode(syntaxTree, AdditionalReferences);
        var runnableTestsInSource = XUnitFactDiscoverer.GetNamedFacts(compiledSource).ToList();

        Assert.NotEmpty(runnableTestsInSource);

        return(GetSelfVerifyingFacts <TTargetCompiler, TLanguageConversion>(sourceFileText, runnableTestsInSource));
    }