Skip to content

Commit 59c8f2d

Browse files
authored
Introduction for test context to test solution files (Buildalyzer#316)
1 parent 5d453fc commit 59c8f2d

File tree

7 files changed

+215
-227
lines changed

7 files changed

+215
-227
lines changed

src/Buildalyzer/IO/IOPath.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ namespace Buildalyzer.IO;
2121

2222
private IOPath(string path) => _path = path;
2323

24-
/// <summary>Indicates that the path has been set.</summary>
25-
public bool HasValue => _path is not null;
24+
/// <summary>Returns true if the path is not empty.</summary>
25+
public bool HasValue => _path is { Length: > 0 };
2626

2727
/// <summary>Creates a <see cref="DirectoryInfo"/> based on the path.</summary>
2828
[Pure]

tests/Buildalyzer.Tests/Integration/SimpleProjectsFixture.cs

Lines changed: 1 addition & 133 deletions
Original file line numberDiff line numberDiff line change
@@ -443,74 +443,6 @@ public void LegacyFrameworkProjectWithProjectReferenceGetsReferences()
443443
references.ShouldContain(x => x.EndsWith("LegacyFrameworkProjectWithPackageReference.csproj"), log.ToString());
444444
}
445445

446-
[Test]
447-
public void GetsProjectsInSolution()
448-
{
449-
// Given
450-
StringWriter log = new StringWriter();
451-
452-
// When
453-
AnalyzerManager manager = new AnalyzerManager(
454-
GetProjectPath("TestProjects.sln"),
455-
new AnalyzerManagerOptions
456-
{
457-
LogWriter = log
458-
});
459-
460-
// Then
461-
ProjectFiles.Select(x => GetProjectPath(x)).ShouldBeSubsetOf(manager.Projects.Keys, log.ToString());
462-
}
463-
464-
[Test]
465-
public void FiltersProjectsInSolution()
466-
{
467-
// Given
468-
StringWriter log = new StringWriter();
469-
470-
// When
471-
AnalyzerManager manager = new AnalyzerManager(
472-
GetProjectPath("TestProjects.sln"),
473-
new AnalyzerManagerOptions
474-
{
475-
LogWriter = log,
476-
ProjectFilter = x => x.AbsolutePath.Contains("Core")
477-
});
478-
479-
// Then
480-
ProjectFiles.Select(x => GetProjectPath(x)).Where(x => x.Contains("Core")).ShouldBe(manager.Projects.Keys, true, log.ToString());
481-
}
482-
483-
[Test]
484-
public void IgnoreSolutionItemsThatAreNotProjects()
485-
{
486-
// Given / When
487-
AnalyzerManager manager = new AnalyzerManager(GetProjectPath("TestProjects.sln"));
488-
489-
// Then
490-
manager.Projects.Any(x => x.Value.ProjectFile.Path.Contains("TestEmptySolutionFolder")).ShouldBeFalse();
491-
}
492-
493-
[Test]
494-
public void GetsProjectGuidFromSolution([ValueSource(nameof(Preferences))] EnvironmentPreference preference)
495-
{
496-
// Given
497-
AnalyzerManager manager = new AnalyzerManager(
498-
GetProjectPath("TestProjects.sln"));
499-
IProjectAnalyzer analyzer = manager.Projects.First(x => x.Key.EndsWith("SdkNetStandardProject.csproj")).Value;
500-
EnvironmentOptions options = new EnvironmentOptions
501-
{
502-
Preference = preference
503-
};
504-
505-
// When
506-
DeleteProjectDirectory(analyzer.ProjectFile.Path, "obj");
507-
DeleteProjectDirectory(analyzer.ProjectFile.Path, "bin");
508-
IAnalyzerResults results = analyzer.Build(options);
509-
510-
// Then
511-
results.First().ProjectGuid.ToString().ShouldBe("016713d9-b665-4272-9980-148801a9b88f");
512-
}
513-
514446
[Test]
515447
public void GetsProjectGuidFromProject([ValueSource(nameof(Preferences))] EnvironmentPreference preference)
516448
{
@@ -604,29 +536,6 @@ public void BuildsVisualBasicProject()
604536
result.References.ShouldContain(x => x.Contains("BouncyCastle.Crypto.dll"));
605537
}
606538

607-
[Test]
608-
public void BuildsLotsOfProjects()
609-
{
610-
// Given
611-
StringWriter log = new StringWriter();
612-
AnalyzerManager manager = new AnalyzerManager(
613-
GetProjectPath(@"LotsOfProjects\LotsOfProjects.sln"),
614-
new AnalyzerManagerOptions
615-
{
616-
LogWriter = log
617-
});
618-
List<IProjectAnalyzer> projects = [.. manager.Projects.Values];
619-
620-
// When
621-
List<IAnalyzerResults> analyzerResults = projects
622-
.AsParallel()
623-
.Select(x => x.Build())
624-
.ToList();
625-
626-
// Then
627-
analyzerResults.Count.ShouldBe(50);
628-
}
629-
630539
// To produce different versions, create a global.json and then run `dotnet clean` and `dotnet build -bl:SdkNetCore31Project-vX.binlog` from the source project folder
631540
[TestCase("SdkNetCore31Project-v9.binlog", 9)]
632541
[TestCase("SdkNetCore31Project-v14.binlog", 14)]
@@ -677,47 +586,6 @@ public void GetsSourceFilesFromBinLogFile(string path, int expectedVersion)
677586
}.ShouldBeSubsetOf(sourceFiles.Select(x => Path.GetFileName(x).Split('.').TakeLast(2).First()), log.ToString());
678587
}
679588

680-
[Test]
681-
public static void DuplicateProjectReferences()
682-
{
683-
// Given
684-
StringWriter log = new StringWriter();
685-
AnalyzerManager manager = new AnalyzerManager(
686-
GetProjectPath(@"DuplicateProjectReferences\MainProject\MainProject.sln"),
687-
new AnalyzerManagerOptions
688-
{
689-
LogWriter = log
690-
});
691-
List<IProjectAnalyzer> projects = [.. manager.Projects.Values];
692-
693-
// When
694-
List<IAnalyzerResults> analyzerResults = projects
695-
.AsParallel()
696-
.Select(x => x.Build())
697-
.ToList();
698-
699-
// Then
700-
analyzerResults.ForEach(v =>
701-
{
702-
IAnalyzerResult result = v.Results.FirstOrDefault();
703-
result.ProjectReferences.Count().ShouldBeLessThanOrEqualTo(1);
704-
});
705-
}
706-
707-
[Test]
708-
public void Resolves_additional_files_for_Razor_project()
709-
{
710-
// Given
711-
StringWriter log = new StringWriter();
712-
IProjectAnalyzer analyzer = GetProjectAnalyzer(@"RazorClassLibraryTest\RazorClassLibraryTest.csproj", log);
713-
714-
// When + then
715-
analyzer.Build().First().AdditionalFiles.Select(Path.GetFileName)
716-
.Should().BeEquivalentTo(
717-
"_Imports.razor",
718-
"Component1.razor");
719-
}
720-
721589
[Test]
722590
public void Resolves_additional_files()
723591
{
@@ -772,4 +640,4 @@ private static void DeleteProjectDirectory(string projectFile, string directory)
772640
Directory.Delete(path, true);
773641
}
774642
}
775-
}
643+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
using Buildalyzer.Environment;
2+
using Buildalyzer.TestTools;
3+
4+
namespace Solution_specs;
5+
6+
public class Resolves
7+
{
8+
[Test]
9+
public void Project_GUID_from_SLN([ValueSource(nameof(Preferences))] EnvironmentPreference preference)
10+
{
11+
using var ctx = Context.ForSolution("TestProjects.sln");
12+
13+
ctx.Manager.Projects.Should().HaveCount(30);
14+
15+
var analyzer = ctx.Manager.Projects.First(x => x.Key.EndsWith("SdkNetStandardProject.csproj")).Value;
16+
17+
var results = analyzer.Build(new EnvironmentOptions { Preference = preference });
18+
19+
results.Single().ProjectGuid.Should().Be("016713d9-b665-4272-9980-148801a9b88f");
20+
}
21+
22+
/// <remarks>
23+
/// Builds a lot of projects that should all succeed.
24+
/// </remarks>
25+
[Test]
26+
public void Project_builds()
27+
{
28+
using var ctx = Context.ForSolution("LotsOfProjects/LotsOfProjects.sln");
29+
30+
var builds = ctx.Manager.Projects.Values
31+
.AsParallel()
32+
.Select(x => x.Build())
33+
.ToArray();
34+
35+
builds.Should().HaveCount(50);
36+
builds.Should().AllSatisfy(b => b.OverallSuccess.Should().BeTrue());
37+
}
38+
39+
private static readonly EnvironmentPreference[] Preferences =
40+
[
41+
#if Is_Windows
42+
EnvironmentPreference.Framework,
43+
#endif
44+
EnvironmentPreference.Core
45+
];
46+
}
47+
48+
public class Filters
49+
{
50+
[Test]
51+
public void Projects()
52+
{
53+
using var ctx = Context.ForSolution(
54+
"TestProjects.sln",
55+
o => o.ProjectFilter = x => x.AbsolutePath.Contains("Core"));
56+
57+
ctx.Manager.Projects.Should().HaveCount(6);
58+
}
59+
}
60+
61+
public class Handles
62+
{
63+
64+
[Test]
65+
public static void Duplicate_project_references()
66+
{
67+
using var ctx = Context.ForSolution("DuplicateProjectReferences/MainProject/MainProject.sln");
68+
69+
var results = ctx.Manager.Projects.Values
70+
.AsParallel()
71+
.Select(x => x.Build().Single())
72+
.ToList();
73+
74+
results.Should().AllSatisfy(
75+
res => res.ProjectReferences.Should().HaveCountLessThanOrEqualTo(1));
76+
}
77+
78+
[Test]
79+
public void Project_files_only()
80+
{
81+
using var ctx = Context.ForSolution("TestProjects.sln");
82+
83+
ctx.Manager.Projects.Keys.Should().AllSatisfy(
84+
path => path.Should().NotContain("TestEmptySolutionFolder"));
85+
}
86+
}

tests/Buildalyzer.Tests/TestTools/BuildalyzerTestContext.cs

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

0 commit comments

Comments
 (0)