Skip to content

Commit

Permalink
feat: added heuristics to find out if an application is actually a pl…
Browse files Browse the repository at this point in the history
…c that contains unittests
  • Loading branch information
Donkey committed Jan 24, 2024
1 parent e71039d commit 08aafb2
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 7 deletions.
22 changes: 15 additions & 7 deletions TwinpackShared/Models/ConfigFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -302,27 +302,35 @@ public static async Task<ConfigPlcProject> CreateAsync(string plcProjFilepath, T
plc.Version = plc.Version ?? xdoc.Elements(TcNs + "Project").Elements(TcNs + "PropertyGroup").Elements(TcNs + "ProjectVersion").FirstOrDefault()?.Value;
plc.Version = plc.Version ?? "1.0.0.0";

await SetLibraryReferencesAsync (plc, xdoc, twinpackServer);
plc.Type = GuessPlcType(plc).ToString();

return plc;
}

public static ConfigPlcProject.PlcProjectType GuessPlcType(ConfigPlcProject plc)
{
// heuristics to find the plc type, if there is a task in the plc it is most likely an application, if not it is a library. Library that are coming from
// Zeugwerk are most likely Framework Libraries
XDocument xdoc = XDocument.Load(GuessFilePath(plc));
var company = xdoc.Elements(TcNs + "Project").Elements(TcNs + "PropertyGroup").Elements(TcNs + "Company").FirstOrDefault()?.Value;
var tasks = xdoc.Elements(TcNs + "Project").Elements(TcNs + "ItemGroup").Elements(TcNs + "Compile")
.Where(x => x.Attribute("Include") != null && x.Attribute("Include").Value.EndsWith("TcTTO"));

if (tasks.Count() > 0)
{
plc.Type = ConfigPlcProject.PlcProjectType.Application.ToString();
return (plc.Packages.Any(x => x.Name == "TcUnit") || plc.References["*"].Any(x => x.StartsWith("TcUnit=")))
? ConfigPlcProject.PlcProjectType.UnitTestApplication
: ConfigPlcProject.PlcProjectType.Application;
}
else if (company == "Zeugwerk GmbH")
{
plc.Type = ConfigPlcProject.PlcProjectType.FrameworkLibrary.ToString();
return ConfigPlcProject.PlcProjectType.FrameworkLibrary;
}
else
{
plc.Type = ConfigPlcProject.PlcProjectType.Library.ToString();
return ConfigPlcProject.PlcProjectType.Library;
}

await SetLibraryReferencesAsync (plc, xdoc, twinpackServer);

return plc;
}

public static async Task UpdateLibraryReferencesAsync(ConfigPlcProject plc, TwinpackServer twinpackServer, CancellationToken cancellationToken = default)
Expand Down
26 changes: 26 additions & 0 deletions TwinpackTests/ConfigFactoryTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,5 +56,31 @@ public async Task CreateFromSolutionFileWithFilterAsync()
Assert.AreEqual(@"TestProject", project?.Name);
Assert.AreEqual(0, project?.Plcs.Count);
}

[TestMethod]
public async Task GuessPlcTypeAsyncWithPackageAsync()
{
var config = await ConfigFactory.CreateFromSolutionFileAsync(@"assets\TestSolution");
var plc = config.Projects.FirstOrDefault().Plcs.FirstOrDefault();

Assert.AreEqual(ConfigPlcProject.PlcProjectType.Application, ConfigPlcProjectFactory.GuessPlcType(plc));

plc.Packages = plc.Packages.ToList().Append(new ConfigPlcPackage { Name = "TcUnit" });
Assert.AreEqual(ConfigPlcProject.PlcProjectType.UnitTestApplication, ConfigPlcProjectFactory.GuessPlcType(plc));

}

[TestMethod]
public async Task GuessPlcTypeAsyncWithReferenceAsync()
{
var config = await ConfigFactory.CreateFromSolutionFileAsync(@"assets\TestSolution");
var plc = config.Projects.FirstOrDefault().Plcs.FirstOrDefault();

Assert.AreEqual(ConfigPlcProject.PlcProjectType.Application, ConfigPlcProjectFactory.GuessPlcType(plc));

plc.References["*"] = plc.References["*"].Append("TcUnit=*").ToList();
Assert.AreEqual(ConfigPlcProject.PlcProjectType.UnitTestApplication, ConfigPlcProjectFactory.GuessPlcType(plc));

}
}
}

0 comments on commit 08aafb2

Please sign in to comment.