Skip to content

Commit 42e3b2c

Browse files
committed
test: More tests
1 parent 54b0a1c commit 42e3b2c

File tree

243 files changed

+2458
-25
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

243 files changed

+2458
-25
lines changed

src/NetEvolve.ProjectBuilders/ProjectFactory.cs

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -175,24 +175,7 @@ public async ValueTask<OutputFile> BuildAsync(string[]? args = null, Cancellatio
175175
// Create temporary directory for testing
176176
await _tempDirectory.CreateAsync(cancellationToken).ConfigureAwait(false);
177177

178-
if (_testPackageBuilder is not null)
179-
{
180-
var lookupPaths = ObjectBuilders
181-
.OfType<ProjectBuilder>()
182-
.Select(x => x.ItemGroup.Items)
183-
.OfType<IReference>()
184-
.SelectMany(x => x.LookUpPaths)
185-
.Distinct()
186-
.ToArray();
187-
188-
if (lookupPaths.Length > 0)
189-
{
190-
_testPackageBuilder.SetPackagePaths(lookupPaths);
191-
192-
// Prepare nuget packages for testings
193-
await _testPackageBuilder.CreateAsync(cancellationToken).ConfigureAwait(false);
194-
}
195-
}
178+
await PrepareNuGetPackagesAsync(cancellationToken).ConfigureAwait(false);
196179

197180
await Parallel
198181
.ForEachAsync(
@@ -230,6 +213,30 @@ await Parallel
230213
return sarif;
231214
}
232215

216+
private async Task PrepareNuGetPackagesAsync(CancellationToken cancellationToken)
217+
{
218+
if (_testPackageBuilder is null)
219+
{
220+
return;
221+
}
222+
223+
var lookupPaths = ObjectBuilders
224+
.OfType<ProjectBuilder>()
225+
.Select(x => x.ItemGroup.Items)
226+
.OfType<IReference>()
227+
.SelectMany(x => x.LookUpPaths)
228+
.Distinct()
229+
.ToArray();
230+
231+
if (lookupPaths.Length > 0)
232+
{
233+
_testPackageBuilder.SetPackagePaths(lookupPaths);
234+
235+
// Prepare nuget packages for testings
236+
await _testPackageBuilder.CreateAsync(cancellationToken).ConfigureAwait(false);
237+
}
238+
}
239+
233240
private async Task<CommandResult> ExecuteDotNetCommandAsync(
234241
IEnumerable<string> args,
235242
CancellationToken cancellationToken

tests/NetEvolve.ProjectBuilders.XUnit.Tests.Integration/Builders/GlobalJsonBuilderTests.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,16 @@ public class GlobalJsonBuilderTests(TemporaryDirectoryFixture directory) : IClas
99
{
1010
[Theory]
1111
[MemberData(nameof(GetTheoryData))]
12-
public async Task CreateAsync_Theory_Expected(
13-
string runtimeVersion,
14-
bool allowPrerelease,
15-
RollForward rollForward
16-
)
12+
public async Task CreateAsync_Theory_Expected(string runtimeVersion, bool allowPrerelease, RollForward rollForward)
1713
{
18-
var subdirectory = directory.CreateDirectory($"{nameof(CreateAsync_Theory_Expected)}{runtimeVersion}{allowPrerelease}{rollForward}");
14+
var subdirectory = directory.CreateDirectory(
15+
$"{nameof(CreateAsync_Theory_Expected)}{runtimeVersion}{allowPrerelease}{rollForward}"
16+
);
1917
await using var builder = new GlobalJsonBuilder(subdirectory, runtimeVersion);
20-
await builder.SetAllowPrerelease(allowPrerelease).SetRollForward(rollForward).CreateAsync(cancellationToken: TestContext.Current.CancellationToken);
18+
await builder
19+
.SetAllowPrerelease(allowPrerelease)
20+
.SetRollForward(rollForward)
21+
.CreateAsync(cancellationToken: TestContext.Current.CancellationToken);
2122
_ = await VerifyFile(builder.FullPath)
2223
.UseParameters(allowPrerelease, rollForward, runtimeVersion)
2324
.HashParameters();
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
namespace NetEvolve.ProjectBuilders.XUnit.Tests.Integration.Builders;
2+
3+
using System.Linq;
4+
using System.Threading.Tasks;
5+
using NetEvolve.ProjectBuilders;
6+
using NetEvolve.ProjectBuilders.Builders;
7+
using NetEvolve.ProjectBuilders.Models;
8+
9+
public class ProjectBuilderTests(TemporaryDirectoryFixture directory) : IClassFixture<TemporaryDirectoryFixture>
10+
{
11+
[Theory]
12+
[MemberData(nameof(GetTargetFrameworkValues))]
13+
public async ValueTask CreateAsync_TargetFrameworkTheory_Expected(
14+
string? sdk,
15+
NullableOptions nullable,
16+
TargetFramework targetFramework
17+
)
18+
{
19+
var subdirectory = directory.CreateDirectory(
20+
$"{nameof(CreateAsync_TargetFrameworkTheory_Expected)}{Guid.NewGuid()}"
21+
);
22+
await using var builder = new ProjectBuilder(subdirectory, Constants.CSharpProjectFileName);
23+
24+
await builder
25+
.WithNullable(nullable)
26+
.WithTargetFramework(targetFramework)
27+
.SetProjectSdk(sdk)
28+
.CreateAsync(TestContext.Current.CancellationToken);
29+
30+
_ = await VerifyFile(builder.FullPath, extension: "xml")
31+
.UseParameters(nullable, targetFramework, sdk)
32+
.HashParameters();
33+
}
34+
35+
[Theory]
36+
[MemberData(nameof(GetTargetFrameworkValues))]
37+
public async ValueTask CreateAsync_TargetFrameworksTheory_Expected(
38+
string? sdk,
39+
NullableOptions nullable,
40+
TargetFramework targetFramework
41+
)
42+
{
43+
var subdirectory = directory.CreateDirectory(
44+
$"{nameof(CreateAsync_TargetFrameworksTheory_Expected)}{Guid.NewGuid()}"
45+
);
46+
await using var builder = new ProjectBuilder(subdirectory, Constants.CSharpProjectFileName);
47+
48+
await builder
49+
.WithNullable(nullable)
50+
.WithTargetFrameworks(TargetFramework.NetStandard2_0, targetFramework)
51+
.SetProjectSdk(sdk)
52+
.CreateAsync(TestContext.Current.CancellationToken);
53+
54+
_ = await VerifyFile(builder.FullPath, extension: "xml")
55+
.UseParameters(nullable, targetFramework, sdk)
56+
.HashParameters();
57+
}
58+
59+
public static TheoryData<string?, NullableOptions, TargetFramework> GetTargetFrameworkValues()
60+
{
61+
var data = new TheoryData<string?, NullableOptions, TargetFramework>();
62+
var sdks = new string?[] { null, "Microsoft.NET.Sdk", "Microsoft.NET.Sdk.Web" };
63+
var nullableOptions = Enum.GetValues<NullableOptions>();
64+
var targetFrameworks = new TargetFramework[]
65+
{
66+
TargetFramework.NetStandard2_0,
67+
TargetFramework.Net10Windows,
68+
TargetFramework.NetFramework4_8_1,
69+
};
70+
foreach (
71+
var c in from sdk in sdks
72+
from nullable in nullableOptions
73+
from targetFramework in targetFrameworks
74+
select (sdk, nullable, targetFramework)
75+
)
76+
{
77+
data.Add(c.sdk, c.nullable, c.targetFramework);
78+
}
79+
80+
return data;
81+
}
82+
83+
[Theory]
84+
[MemberData(nameof(AddPackageReference_Newtonsoft_Expected_Data))]
85+
public async ValueTask AddPackageReference_Newtonsoft_Expected(
86+
string? version,
87+
string? versionOverride,
88+
bool generatePathProperty,
89+
string? aliases,
90+
ReferenceAssets? includeAssets,
91+
ReferenceAssets? excludeAssets,
92+
ReferenceAssets? privateAssets
93+
)
94+
{
95+
var subdirectory = directory.CreateDirectory(
96+
$"{nameof(AddPackageReference_Newtonsoft_Expected)}{Guid.NewGuid()}"
97+
);
98+
await using var builder = new ProjectBuilder(subdirectory, Constants.CSharpProjectFileName);
99+
await builder
100+
.AddPackageReference(
101+
"Newtonsoft.Json",
102+
version,
103+
versionOverride,
104+
generatePathProperty,
105+
aliases,
106+
includeAssets,
107+
excludeAssets,
108+
privateAssets
109+
)
110+
.CreateAsync(TestContext.Current.CancellationToken);
111+
112+
_ = await VerifyFile(builder.FullPath, extension: "xml")
113+
.UseParameters(
114+
version,
115+
versionOverride,
116+
generatePathProperty,
117+
aliases,
118+
includeAssets,
119+
excludeAssets,
120+
privateAssets
121+
)
122+
.HashParameters();
123+
}
124+
125+
public static TheoryData<
126+
string?,
127+
string?,
128+
bool,
129+
string?,
130+
ReferenceAssets?,
131+
ReferenceAssets?,
132+
ReferenceAssets?
133+
> AddPackageReference_Newtonsoft_Expected_Data()
134+
{
135+
var data =
136+
new TheoryData<string?, string?, bool, string?, ReferenceAssets?, ReferenceAssets?, ReferenceAssets?>();
137+
var versions = new string?[] { "13.0.1", null };
138+
var versionOverrides = new string?[] { "13.0.1", null };
139+
var aliasesOptions = new string?[] { "NJson", "" };
140+
ReferenceAssets?[] includeAssetsOptions = [ReferenceAssets.All, null];
141+
ReferenceAssets?[] exlcudeAssetsOptions = [ReferenceAssets.None, ReferenceAssets.Runtime];
142+
ReferenceAssets?[] privateAssetsOptions = [ReferenceAssets.Build | ReferenceAssets.ContentFiles, null];
143+
144+
foreach (
145+
var c in from version in versions
146+
from versionOverride in versionOverrides
147+
from aliases in aliasesOptions
148+
from includeAssets in includeAssetsOptions
149+
from excludeAssets in exlcudeAssetsOptions
150+
from privateAssets in privateAssetsOptions
151+
select (version, versionOverride, aliases, includeAssets, excludeAssets, privateAssets)
152+
)
153+
{
154+
data.Add(c.version, c.versionOverride, true, c.aliases, c.includeAssets, c.excludeAssets, c.privateAssets);
155+
data.Add(c.version, c.versionOverride, false, c.aliases, c.includeAssets, c.excludeAssets, c.privateAssets);
156+
}
157+
158+
return data;
159+
}
160+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
namespace NetEvolve.ProjectBuilders.XUnit.Tests.Integration;
2+
3+
using System;
4+
using System.Threading.Tasks;
5+
using NetEvolve.ProjectBuilders;
6+
using NetEvolve.ProjectBuilders.Builders;
7+
8+
public class CSharpProjectTests(TemporaryDirectoryFixture directory) : IClassFixture<TemporaryDirectoryFixture>
9+
{
10+
[Theory]
11+
[MemberData(nameof(AddCSharpFileData))]
12+
public async Task BuildAsync_CSharp_Theory(bool expectedErrors, bool expectedWarnings, string content)
13+
{
14+
var projectDirectory = directory.CreateDirectory($"{nameof(BuildAsync_CSharp_Theory)}{Guid.NewGuid()}");
15+
var nugetDirectory = directory.CreateDirectory($"{nameof(BuildAsync_CSharp_Theory)}{Guid.NewGuid()}");
16+
17+
await using var nugetFactory = new TestPackageBuilder(nugetDirectory);
18+
await using var factory = ProjectFactory.Create(nugetFactory, projectDirectory);
19+
20+
var result = await factory
21+
.AddCSharpProject(builder => builder.WithDefaults().AddCSharpFile("main.cs", content))
22+
.AddGlobalJson(configure: projectBuilder => projectBuilder.WithDefaults())
23+
.BuildAsync(cancellationToken: TestContext.Current.CancellationToken);
24+
25+
Assert.Equal(result.HasErrors(), expectedErrors);
26+
Assert.Equal(result.HasWarnings(), expectedWarnings);
27+
}
28+
29+
[Theory]
30+
[MemberData(nameof(AddCSharpFileData))]
31+
public async Task BuildAsync_CSharp_VerifyDirectory(bool expectedErrors, bool expectedWarnings, string content)
32+
{
33+
var projectDirectory = directory.CreateDirectory(
34+
$"{nameof(BuildAsync_CSharp_VerifyDirectory)}{Guid.NewGuid()}"
35+
);
36+
var nugetDirectory = directory.CreateDirectory($"{nameof(BuildAsync_CSharp_VerifyDirectory)}{Guid.NewGuid()}");
37+
38+
await using var nugetFactory = new TestPackageBuilder(nugetDirectory);
39+
await using var factory = ProjectFactory.Create(nugetFactory, projectDirectory);
40+
41+
_ = await factory
42+
.AddCSharpProject(builder => builder.WithDefaults().AddCSharpFile("main.cs", content))
43+
.AddGlobalJson(configure: projectBuilder => projectBuilder.WithDefaults())
44+
.BuildAsync(cancellationToken: TestContext.Current.CancellationToken);
45+
46+
_ = await VerifyDirectory(projectDirectory.FullPath, include: ProjectHelpers.DirectoryFilter)
47+
.UseParameters(expectedErrors, expectedWarnings, content)
48+
.HashParameters();
49+
}
50+
51+
public static TheoryData<bool, bool, string> AddCSharpFileData =>
52+
new TheoryData<bool, bool, string>
53+
{
54+
{ false, false, "class Program { static void Main() { System.Console.WriteLine(\"Hello, World!\"); } }" },
55+
{ true, false, "class Program { static void Main() { WriteLine(\"Hello, World!\"); } }" },
56+
{
57+
false,
58+
true,
59+
"class Program { static async void Main() { System.Console.WriteLine(\"Hello, World!\"); } }"
60+
},
61+
};
62+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
namespace NetEvolve.ProjectBuilders.XUnit.Tests.Integration;
2+
3+
using System.Threading.Tasks;
4+
using NetEvolve.ProjectBuilders;
5+
using NetEvolve.ProjectBuilders.Builders;
6+
using NetEvolve.ProjectBuilders.Models;
7+
8+
public class ProjectFactoryTests(TemporaryDirectoryFixture directory) : IClassFixture<TemporaryDirectoryFixture>
9+
{
10+
[Fact]
11+
public async Task BuildAsync_CSharpProject_Expected()
12+
{
13+
var subdirectory = directory.CreateDirectory(nameof(BuildAsync_CSharpProject_Expected));
14+
await using var factory = ProjectFactory.Create(directory: subdirectory);
15+
16+
var result = await factory
17+
.AddCSharpProject(projectBuilder => projectBuilder.WithTargetFramework(TargetFramework.Net8))
18+
.AddGlobalJson(
19+
Constants.RuntimeSdkDefault,
20+
jsonBuilder => jsonBuilder.SetRollForward(RollForward.LatestMinor)
21+
)
22+
.BuildAsync(cancellationToken: TestContext.Current.CancellationToken);
23+
24+
Assert.True(result.HasNoErrorsOrWarnings());
25+
}
26+
27+
[Fact]
28+
public async Task BuildAsync_VBProject_Expected()
29+
{
30+
var subdirectory = directory.CreateDirectory(nameof(BuildAsync_VBProject_Expected));
31+
await using var factory = ProjectFactory.Create(directory: subdirectory);
32+
33+
var result = await factory
34+
.AddVBProject(projectBuilder => projectBuilder.WithTargetFramework(TargetFramework.Net8))
35+
.AddGlobalJson(
36+
Constants.RuntimeSdkDefault,
37+
jsonBuilder => jsonBuilder.SetRollForward(RollForward.LatestMinor)
38+
)
39+
.BuildAsync(cancellationToken: TestContext.Current.CancellationToken);
40+
41+
Assert.True(result.HasNoErrorsOrWarnings());
42+
}
43+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
namespace NetEvolve.ProjectBuilders.XUnit.Tests.Integration;
2+
3+
using System;
4+
5+
internal static class ProjectHelpers
6+
{
7+
public static bool DirectoryFilter(string path)
8+
{
9+
// Path contains `obj/` or `bin/` folders are ignored
10+
if (
11+
path.Contains(
12+
$"{Path.DirectorySeparatorChar}obj{Path.DirectorySeparatorChar}",
13+
StringComparison.OrdinalIgnoreCase
14+
)
15+
|| path.Contains(
16+
$"{Path.DirectorySeparatorChar}bin{Path.DirectorySeparatorChar}",
17+
StringComparison.OrdinalIgnoreCase
18+
)
19+
)
20+
{
21+
return false;
22+
}
23+
24+
// Path ends with `.sarif` files are ignored
25+
if (path.EndsWith(".sarif", StringComparison.OrdinalIgnoreCase))
26+
{
27+
return false;
28+
}
29+
30+
return true;
31+
}
32+
}

0 commit comments

Comments
 (0)