Skip to content

Commit f3e6bf8

Browse files
committed
Add references of 'step projects' to test projects
1 parent a17990a commit f3e6bf8

File tree

2 files changed

+92
-3
lines changed

2 files changed

+92
-3
lines changed

src/Moryx.Cli.Commands/AddStep.cs

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
using Moryx.Cli.Commands.Extensions;
1+
using Moryx.Cli.Commands.Components;
2+
using Moryx.Cli.Commands.Extensions;
23
using Moryx.Cli.Templates;
4+
using Moryx.Cli.Templates.Models;
35

46
namespace Moryx.Cli.Commands
57
{
@@ -20,23 +22,48 @@ public static CommandResult Exec(Template template, string step)
2022

2123
{ $"{Template.AppPlaceholder}.Resources", $"{template.AppName}.Resources.{step}" },
2224
{ $"{template.AppName}.Resources", $"{template.AppName}.Resources.{step}" }
23-
};
25+
};
2426
var replacements = new StringReplacements(addConfig)
2527
.AddFileNamePatterns(namespacePlaceholder)
2628
.AddContentPatterns(namespacePlaceholder)
2729
;
28-
30+
2931
return AddThing.Exec(
3032
template,
3133
addConfig,
3234
template.Step(step),
3335
(createdFiles) =>
3436
{
3537
createdFiles.AddProjectsToSolution(template.Settings);
38+
AddProjectsTests(createdFiles, template.Settings);
3639
},
3740
replacements
3841
);
3942
});
4043
}
44+
45+
private static void AddProjectsTests(IEnumerable<string> createdFiles, TemplateSettings settings)
46+
{
47+
var projectFiles = createdFiles
48+
.Where(f => f.EndsWith(".csproj"))
49+
.ToList();
50+
var testFiles = createdFiles
51+
.Where(f => f.ToLower().EndsWith("tests.cs") || f.ToLower().EndsWith("test.cs"))
52+
.Select(Path.GetFullPath)
53+
.Distinct()
54+
.Select(p => Directory.GetFiles(Path.Combine(Path.GetDirectoryName(p) ?? "")))
55+
.SelectMany(p => p)
56+
.Where(f => f.EndsWith(".csproj"))
57+
.ToList()
58+
?? [];
59+
60+
foreach (var testFile in testFiles)
61+
{
62+
foreach (var project in projectFiles)
63+
{
64+
ProjectFileManipulation.AddProjectReference(testFile, project);
65+
}
66+
}
67+
}
4168
}
4269
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
using Castle.MicroKernel.Registration;
2+
using Microsoft.AspNetCore.Routing.Constraints;
3+
using Moryx.Container;
4+
using System.Xml;
5+
using System.Xml.Linq;
6+
7+
namespace Moryx.Cli.Commands.Components
8+
{
9+
internal class ProjectFileManipulation
10+
{
11+
private const string ProjectReference = "ProjectReference";
12+
private const string ItemGroup = "ItemGroup";
13+
14+
public static void AddProjectReference(string targetProjectFileName, string referenceProjectFileName)
15+
{
16+
17+
var referencePath = Path.GetRelativePath(targetProjectFileName, referenceProjectFileName);
18+
19+
var projectFile = LoadXml(targetProjectFileName);
20+
21+
if (projectFile.Root == null)
22+
return;
23+
24+
var itemGroup = projectFile.Root
25+
.Elements(ItemGroup)
26+
.FirstOrDefault(i => i.Elements(ProjectReference).Any())
27+
;
28+
29+
if (itemGroup == null)
30+
{
31+
itemGroup = new XElement(ItemGroup);
32+
projectFile.Root.Add(itemGroup);
33+
}
34+
35+
var nodes = itemGroup.Nodes().Where(n => n.NodeType == XmlNodeType.Element).ToList();
36+
37+
var projectReference = new XElement(ProjectReference, new XAttribute("Include", referencePath));
38+
nodes.Add(projectReference);
39+
40+
itemGroup.RemoveAll();
41+
foreach (var node in nodes)
42+
{
43+
itemGroup.Add(node);
44+
node.AddBeforeSelf(new XText($"{Environment.NewLine} "));
45+
}
46+
itemGroup.LastNode?.AddAfterSelf(new XText($"{Environment.NewLine} "));
47+
48+
SaveXml(projectFile, targetProjectFileName);
49+
}
50+
51+
private static XDocument LoadXml(string fileName)
52+
{
53+
using var reader = XmlReader.Create(fileName);
54+
return XDocument.Load(reader, LoadOptions.PreserveWhitespace);
55+
}
56+
57+
private static void SaveXml(XDocument xmlDocument, string fileName)
58+
{
59+
xmlDocument.Save(fileName);
60+
}
61+
}
62+
}

0 commit comments

Comments
 (0)