Skip to content

Commit 29a5397

Browse files
committed
add tests for ApiListWriter.WriteReferencedAssemblies
1 parent e31db48 commit 29a5397

File tree

4 files changed

+183
-0
lines changed

4 files changed

+183
-0
lines changed

tests/Smdn.Reflection.ReverseGenerating.ListApi.Core/Smdn.Reflection.ReverseGenerating.ListApi.Core.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ SPDX-License-Identifier: MIT
3030
<ItemGroup>
3131
<TestProjects Include="$(TestAssemblyRootDirectory)\LibA\LibA.csproj" />
3232
<TestProjects Include="$(TestAssemblyRootDirectory)\LibB\LibB.csproj" />
33+
<TestProjects Include="$(TestAssemblyRootDirectory)\LibReferencedAssemblies1\LibReferencedAssemblies1.csproj" />
3334
</ItemGroup>
3435

3536
<!--

tests/Smdn.Reflection.ReverseGenerating.ListApi.Core/Smdn.Reflection.ReverseGenerating.ListApi/ApiListWriter.cs

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
using Microsoft.Extensions.Logging.Console;
1818
using NUnit.Framework;
1919
using Smdn.IO;
20+
using Smdn.Reflection.ReverseGenerating.ListApi.Core; // TestAssemblyInfo
2021

2122
namespace Smdn.Reflection.ReverseGenerating.ListApi;
2223

@@ -526,4 +527,172 @@ public void WriteEmbeddedResources_HasNoEmbeddedResources(
526527
)
527528
);
528529
}
530+
531+
private static System.Collections.IEnumerable YieldTestCases_WriteReferencedAssemblies()
532+
{
533+
foreach (var writeReferencedAssemblies in new[] { true, false }) {
534+
#if NETCOREAPP3_1_OR_GREATER || NET6_0_OR_GREATER
535+
yield return new object[] {
536+
"Lib",
537+
"netstandard2.1",
538+
writeReferencedAssemblies,
539+
new[] {
540+
"netstandard, Version=2.1.",
541+
}
542+
};
543+
#endif
544+
#if NET6_0_OR_GREATER
545+
yield return new object[] {
546+
"Lib",
547+
"net6.0",
548+
writeReferencedAssemblies,
549+
new[] {
550+
"System.Runtime, Version=6.0.",
551+
}
552+
};
553+
#endif
554+
#if NET7_0_OR_GREATER
555+
yield return new object[] {
556+
"Lib",
557+
"net7.0",
558+
writeReferencedAssemblies,
559+
new[] {
560+
"System.Runtime, Version=7.0.",
561+
}
562+
};
563+
#endif
564+
#if NETCOREAPP3_1_OR_GREATER || NET6_0_OR_GREATER
565+
yield return new object[] {
566+
"LibB",
567+
"netstandard2.1",
568+
writeReferencedAssemblies,
569+
new[] {
570+
"netstandard, Version=2.1.",
571+
"LibA, Version=",
572+
}
573+
};
574+
#endif
575+
#if NET6_0_OR_GREATER
576+
yield return new object[] {
577+
"LibB",
578+
"net6.0",
579+
writeReferencedAssemblies,
580+
new[] {
581+
"System.Runtime, Version=6.0.",
582+
"LibA, Version=",
583+
}
584+
};
585+
#endif
586+
#if NETCOREAPP3_1_OR_GREATER || NET6_0_OR_GREATER
587+
yield return new object[] {
588+
"LibReferencedAssemblies1",
589+
"netstandard2.1",
590+
writeReferencedAssemblies,
591+
new[] {
592+
"netstandard, Version=2.1.",
593+
}
594+
};
595+
#endif
596+
#if NET6_0_OR_GREATER
597+
yield return new object[] {
598+
"LibReferencedAssemblies1",
599+
"net6.0",
600+
writeReferencedAssemblies,
601+
new[] {
602+
"System.Runtime, Version=6.0.",
603+
"System.Threading, Version=6.0.",
604+
"System.Xml.ReaderWriter, Version=6.0.",
605+
}
606+
};
607+
#endif
608+
#if NET7_0_OR_GREATER
609+
yield return new object[] {
610+
"LibReferencedAssemblies1",
611+
"net7.0",
612+
writeReferencedAssemblies,
613+
new[] {
614+
"System.Runtime, Version=7.0.",
615+
"System.Threading, Version=7.0.",
616+
"System.Xml.ReaderWriter, Version=7.0.",
617+
}
618+
};
619+
#endif
620+
}
621+
}
622+
623+
// Cannot use `WriteApiListFromSourceCode` for testing WriteReferencedAssemblies.
624+
// The type of the assembly generated by CSharpCompilation.Emit and loaded by AssemblyLoader, will be System.Reflection.TypeLoading.Ecma.EcmaAssembly.
625+
// And Assembly.TryGetRawMetadata returns false if the type of input assembl is System.Reflection.TypeLoading.Ecma.EcmaAssembly.
626+
// Therefore, the referenced assemblies cannot be read from the assembly generated and loaded with WriteApiListFromSourceCode.
627+
[TestCaseSource(nameof(YieldTestCases_WriteReferencedAssemblies))]
628+
public void WriteReferencedAssemblies(
629+
string assemblyFileName,
630+
string targetFrameworkMoniker,
631+
bool writeReferencedAssemblies,
632+
string[] expectedReferencedAssemblies
633+
)
634+
{
635+
var assemblyFile = new FileInfo(
636+
TestAssemblyInfo.TestAssemblyPaths.First(f => f.Contains(targetFrameworkMoniker) && f.Contains(assemblyFileName))
637+
);
638+
639+
var options = new ApiListWriterOptions();
640+
641+
options.Writer.WriteNullableAnnotationDirective = false;
642+
options.Writer.WriteEmbeddedResources = false;
643+
options.Writer.WriteReferencedAssemblies = writeReferencedAssemblies;
644+
645+
var generated = GenerateApiListFrom(assemblyFile, options);
646+
647+
if (writeReferencedAssemblies) {
648+
StringAssert.Contains(
649+
"// Referenced assemblies:",
650+
generated
651+
);
652+
653+
foreach (var expectedReferencedAssembly in expectedReferencedAssemblies) {
654+
StringAssert.Contains(
655+
$"// {expectedReferencedAssembly}",
656+
generated
657+
);
658+
}
659+
}
660+
else {
661+
StringAssert.DoesNotContain(
662+
"// Referenced assemblies:",
663+
generated
664+
);
665+
}
666+
667+
string GenerateApiListFrom(FileInfo assemblyFile, ApiListWriterOptions options)
668+
{
669+
var ret = AssemblyLoader.UsingAssembly(
670+
assemblyFile,
671+
loadIntoReflectionOnlyContext: false,
672+
arg: options,
673+
logger: logger,
674+
actionWithLoadedAssembly: static (assm, options) => {
675+
var sb = new StringBuilder();
676+
var writer = new ApiListWriter(new StringWriter(sb), assm, options);
677+
678+
writer.WriteAssemblyInfoHeader();
679+
writer.WriteExportedTypes();
680+
681+
return sb.ToString();
682+
},
683+
context: out var context
684+
);
685+
686+
// wait for the context to be collected
687+
if (context is null)
688+
return ret ?? string.Empty;
689+
690+
while (context.IsAlive) {
691+
GC.Collect();
692+
GC.WaitForPendingFinalizers();
693+
}
694+
695+
return ret ?? string.Empty;
696+
}
697+
}
529698
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
public static class C {
2+
public static void M(int p) { }
3+
public static void M(System.Uri p) { }
4+
public static void M(System.Threading.Mutex p) { }
5+
public static void M(System.Xml.XmlDocument p) { }
6+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
<PropertyGroup>
3+
<TargetFrameworks>net6.0;netstandard2.1</TargetFrameworks>
4+
</PropertyGroup>
5+
6+
<Import Project="..\..\..\src\Sdk.net7.0-preview.props" />
7+
</Project>

0 commit comments

Comments
 (0)