Skip to content

Commit d75378c

Browse files
authored
Interface Generics and Constraints (#91)
* - Update testing to use TestLibrary project pattern. - Update unit tests project to .NET 10. * Delete SampleLibrary2 project. * Update SampleApp project to .NET 10. * Add TestLibrary assembly to all tests. * Implement support for generic types and constraints on interface. * Migrate to .slnx solution file format. * Update PR workflow to use .NET 10 instead of 8.
1 parent 79478a9 commit d75378c

25 files changed

+155
-172
lines changed

.github/workflows/pull-request.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ jobs:
77
runs-on: ubuntu-latest
88
strategy:
99
matrix:
10-
dotnet-version: ["8.0.x"]
10+
dotnet-version: ["10.0.x"]
1111

1212
steps:
1313
- uses: actions/checkout@v4

DecoratorGenerator.UnitTests/DecoratorGenerator.UnitTests.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>net8.0</TargetFramework>
4+
<TargetFramework>net10.0</TargetFramework>
55
<ImplicitUsings>enable</ImplicitUsings>
66
<Nullable>enable</Nullable>
77

@@ -10,7 +10,6 @@
1010
</PropertyGroup>
1111

1212
<ItemGroup>
13-
<PackageReference Include="AWSSDK.DynamoDBv2" Version="3.7.103.8" />
1413
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="5.0.0" />
1514
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing" Version="1.1.2" />
1615
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="5.0.0" />
@@ -29,6 +28,7 @@
2928

3029
<ItemGroup>
3130
<ProjectReference Include="..\DecoratorGenerator\DecoratorGenerator.csproj" />
31+
<ProjectReference Include="..\TestLibrary\TestLibrary.csproj" />
3232
</ItemGroup>
3333

3434
</Project>

DecoratorGenerator.UnitTests/ITigerConstraints.cs

Lines changed: 0 additions & 11 deletions
This file was deleted.

DecoratorGenerator.UnitTests/Tests.cs

Lines changed: 53 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,17 @@ public void Setup() {
2020

2121
[Test]
2222
public async Task OneInterface() {
23-
var source = await ReadCSharpFile<IBird>();
24-
var generated = await ReadCSharpFile<BirdDecorator>();
23+
var source = await ReadCSharpFile<IBird>(true);
24+
var generated = await ReadCSharpFile<BirdDecorator>(true);
2525

2626
await new VerifyCS.Test
2727
{
2828
TestState = {
29-
ReferenceAssemblies = ReferenceAssemblies.Net.Net60,
29+
ReferenceAssemblies = ReferenceAssemblies.Net.Net90,
3030
AdditionalReferences =
3131
{
3232
implementationAssembly,
33+
GetAssembly("TestLibrary")
3334
},
3435
Sources = { source },
3536
GeneratedSources =
@@ -42,16 +43,17 @@ public async Task OneInterface() {
4243

4344
[Test]
4445
public async Task OneInterface_Properties() {
45-
var source = await ReadCSharpFile<ILionProperties>();
46-
var generated = await ReadCSharpFile<LionPropertiesDecorator>();
46+
var source = await ReadCSharpFile<ILionProperties>(true);
47+
var generated = await ReadCSharpFile<LionPropertiesDecorator>(true);
4748

4849
await new VerifyCS.Test
4950
{
5051
TestState = {
51-
ReferenceAssemblies = ReferenceAssemblies.Net.Net60,
52+
ReferenceAssemblies = ReferenceAssemblies.Net.Net90,
5253
AdditionalReferences =
5354
{
5455
implementationAssembly,
56+
GetAssembly("TestLibrary")
5557
},
5658
Sources = { source },
5759
GeneratedSources =
@@ -64,17 +66,17 @@ public async Task OneInterface_Properties() {
6466

6567
[Test]
6668
public async Task OneInterface_Constraints() {
67-
var source = await ReadCSharpFile<ITigerConstraints>();
68-
var generated = await ReadCSharpFile<TigerConstraintsDecorator>();
69+
var source = await ReadCSharpFileByName(true, "ITigerConstraints");
70+
var generated = await ReadCSharpFileByName(true, "TigerConstraintsDecorator.generated");
6971

7072
await new VerifyCS.Test
7173
{
7274
TestState = {
73-
ReferenceAssemblies = ReferenceAssemblies.Net.Net60,
75+
ReferenceAssemblies = ReferenceAssemblies.Net.Net90,
7476
AdditionalReferences =
7577
{
7678
implementationAssembly,
77-
Assembly.GetExecutingAssembly()
79+
GetAssembly("TestLibrary")
7880
},
7981
Sources = { source },
8082
GeneratedSources =
@@ -87,16 +89,17 @@ public async Task OneInterface_Constraints() {
8789

8890
[Test]
8991
public async Task OneInterface_NestedNamespace() {
90-
var source = await ReadCSharpFile<INested>();
91-
var generated = await ReadCSharpFile<NestedDecorator>();
92+
var source = await ReadCSharpFile<INested>(true);
93+
var generated = await ReadCSharpFile<NestedDecorator>(true);
9294

9395
await new VerifyCS.Test
9496
{
9597
TestState = {
96-
ReferenceAssemblies = ReferenceAssemblies.Net.Net60,
98+
ReferenceAssemblies = ReferenceAssemblies.Net.Net90,
9799
AdditionalReferences =
98100
{
99101
implementationAssembly,
102+
GetAssembly("TestLibrary")
100103
},
101104
Sources = { source },
102105
GeneratedSources =
@@ -109,19 +112,20 @@ public async Task OneInterface_NestedNamespace() {
109112

110113
[Test]
111114
public async Task TwoInterfaces() {
112-
var sourceOne = await ReadCSharpFile<IBird>();
113-
var sourceTwo = await ReadCSharpFile<ICat>();
115+
var sourceOne = await ReadCSharpFile<IBird>(true);
116+
var sourceTwo = await ReadCSharpFile<ICat>(true);
114117

115-
var generatedOne = await ReadCSharpFile<BirdDecorator>();
116-
var generatedTwo = await ReadCSharpFile<CatDecorator>();
118+
var generatedOne = await ReadCSharpFile<BirdDecorator>(true);
119+
var generatedTwo = await ReadCSharpFile<CatDecorator>(true);
117120

118121
await new VerifyCS.Test
119122
{
120123
TestState = {
121-
ReferenceAssemblies = ReferenceAssemblies.Net.Net60,
124+
ReferenceAssemblies = ReferenceAssemblies.Net.Net90,
122125
AdditionalReferences =
123126
{
124127
implementationAssembly,
128+
GetAssembly("TestLibrary")
125129
},
126130
Sources = { sourceOne, sourceTwo },
127131
GeneratedSources =
@@ -135,19 +139,20 @@ public async Task TwoInterfaces() {
135139

136140
[Test]
137141
public async Task WrapperList() {
138-
var source = await ReadCSharpFile<IBird>();
139-
var wrapperList = await ReadCSharpFile<WrapperList>();
140-
var generated = await ReadCSharpFile<BirdDecorator>();
141-
var generatedThirdParty = await ReadCSharpFile<DynamoDBContextDecorator>();
142+
var source = await ReadCSharpFile<IBird>(true);
143+
var wrapperList = await ReadCSharpFile<WrapperList>(true);
144+
var generated = await ReadCSharpFile<BirdDecorator>(true);
145+
var generatedThirdParty = await ReadCSharpFileByName(true, "DynamoDBContextDecorator.generated");
142146

143147
await new VerifyCS.Test
144148
{
145149
TestState = {
146-
ReferenceAssemblies = ReferenceAssemblies.Net.Net60,
150+
ReferenceAssemblies = ReferenceAssemblies.Net.Net90,
147151
AdditionalReferences =
148152
{
149153
implementationAssembly,
150-
GetAssembly("AWSSDK.DynamoDBv2")
154+
GetAssembly("TestLibrary"),
155+
Assembly.GetAssembly(typeof(DynamoDBContext)),
151156
},
152157
Sources = { wrapperList, source },
153158
GeneratedSources =
@@ -164,13 +169,32 @@ private static Assembly GetAssembly(string name) {
164169
return Assembly.Load(implementationAssemblyName);
165170
}
166171

167-
private static async Task<string> ReadCSharpFile<T>() {
168-
var currentDirectory = Directory.GetParent(Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory).Parent.Parent.FullName);
172+
private static async Task<string> ReadCSharpFile<T>(bool isTestLibrary) {
173+
var filenameWithoutExtension = typeof(T).Name;
174+
return await ReadCSharpFileByName(isTestLibrary, filenameWithoutExtension);
175+
}
176+
177+
private static async Task<string> ReadCSharpFileByName(bool isTestLibrary, string filenameWithoutExtension) {
178+
var searchPattern = $"{filenameWithoutExtension}*.cs";
179+
return await ReadFile(isTestLibrary, searchPattern);
180+
}
181+
182+
private static async Task<string> ReadFile(bool isTestLibrary, string searchPattern) {
183+
var currentDirectory = GetCurrentDirectory();
184+
185+
var targetDirectory = isTestLibrary ? GetTestLibraryDirectory(currentDirectory) : currentDirectory;
169186

170-
var searchPattern = $"{typeof(T).Name}*.cs";
171-
var file = currentDirectory.GetFiles(searchPattern).First();
187+
var file = targetDirectory.GetFiles(searchPattern).First();
172188

173189
using var fileReader = new StreamReader(file.OpenRead());
174190
return await fileReader.ReadToEndAsync();
175191
}
176-
}
192+
193+
private static DirectoryInfo? GetCurrentDirectory() {
194+
return Directory.GetParent(Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory).Parent.Parent.FullName);
195+
}
196+
197+
private static DirectoryInfo GetTestLibraryDirectory(DirectoryInfo currentDirectory) {
198+
return currentDirectory.Parent.GetDirectories("TestLibrary").First();
199+
}
200+
}

DecoratorGenerator.UnitTests/TigerConstraintsDecorator.generated.cs

Lines changed: 0 additions & 22 deletions
This file was deleted.

DecoratorGenerator.sln

Lines changed: 0 additions & 54 deletions
This file was deleted.

DecoratorGenerator.slnx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<Solution>
2+
<Folder Name="/SolutionItems/">
3+
<File Path=".editorconfig" />
4+
</Folder>
5+
<Project Path="DecoratorGenerator.UnitTests/DecoratorGenerator.UnitTests.csproj" />
6+
<Project Path="DecoratorGenerator/DecoratorGenerator.csproj" />
7+
<Project Path="SampleApp/SampleApp.csproj" />
8+
<Project Path="SampleLibrary/SampleLibrary.csproj" />
9+
<Project Path="TestLibrary/TestLibrary.csproj" />
10+
</Solution>

0 commit comments

Comments
 (0)