using System.Collections.Generic; using System.IO; using System.Linq; using CTA.Rules.Models; using NUnit.Framework; namespace CTA.Rules.Test { /// /// This class is exclusively for testing RuleContributions.sln, /// a solution with a .NET Framework project containing all supported /// rules contributed by third parties. /// [TestFixture] class RuleContributionTests : AwsRulesBaseTest { private const string RuleContributionsSolutionFileName = "RuleContributions.sln"; private const string RuleContributionsProjectFileName = "RuleContributions.csproj"; private string _ctaTestProjectsDir = ""; private Dictionary _resultsDict; private static IEnumerable TestCases = SupportedFrameworks.GetSupportedFrameworksList(); [OneTimeSetUp] public void Setup() { _ctaTestProjectsDir = SetupTests.CtaTestProjectsDir; var net31Results = CopySolutionToUniqueTempDirAndAnalyze(RuleContributionsSolutionFileName, _ctaTestProjectsDir, SupportedFrameworks.Netcore31); var net50Results = CopySolutionToUniqueTempDirAndAnalyze(RuleContributionsSolutionFileName, _ctaTestProjectsDir, SupportedFrameworks.Net5); var net60Results = CopySolutionToUniqueTempDirAndAnalyze(RuleContributionsSolutionFileName, _ctaTestProjectsDir, SupportedFrameworks.Net6); var net70Results = CopySolutionToUniqueTempDirAndAnalyze(RuleContributionsSolutionFileName, _ctaTestProjectsDir, SupportedFrameworks.Net7); _resultsDict = new Dictionary { {SupportedFrameworks.Netcore31, net31Results}, {SupportedFrameworks.Net5, net50Results}, {SupportedFrameworks.Net6, net60Results}, {SupportedFrameworks.Net7, net70Results} }; } [Test, TestCaseSource("TestCases")] public void Porting_With_All_Contributed_Rules_Results_In_Zero_Build_Errors(string version) { var solutionPortingResult = _resultsDict[version]; CollectionAssert.IsEmpty(solutionPortingResult.SolutionRunResult.BuildErrors); } [Test, TestCaseSource("TestCases")] public void DynamicQuery_Package_Is_Added_And_Namespaces_Are_Replaced(string version) { var csFileName = "System.Linq.Dynamic.cs"; var solutionPortingResult = _resultsDict[version]; var ruleContributionsResult = solutionPortingResult.ProjectResults.First(proj => proj.CsProjectPath.EndsWith(RuleContributionsProjectFileName)); var ruleContributionsFile = Directory.EnumerateFiles(ruleContributionsResult.ProjectDirectory, "*.cs", SearchOption.AllDirectories) .First(file => file.EndsWith(csFileName)); var ruleContributionsFileContent = File.ReadAllText(ruleContributionsFile); // Verify expected package is in .csproj StringAssert.Contains(@"PackageReference Include=""System.Linq.Dynamic.Core""", ruleContributionsResult.CsProjectContent); // Verify namespaces were updated StringAssert.Contains("using System.Linq.Dynamic.Core;", ruleContributionsFileContent); StringAssert.DoesNotContain("using System.Linq.Dynamic;", ruleContributionsFileContent); } [Test, TestCaseSource("TestCases")] public void BouncyCastleNetCore_Package_Is_Added(string version) { var solutionPortingResult = _resultsDict[version]; var ruleContributionsResult = solutionPortingResult.ProjectResults.First(proj => proj.CsProjectPath.EndsWith(RuleContributionsProjectFileName)); // Verify expected package is in .csproj StringAssert.Contains(@"PackageReference Include=""BouncyCastle.NetCore""", ruleContributionsResult.CsProjectContent); } [Test, TestCaseSource("TestCases")] public void NPOI_Package_Is_Added(string version) { var solutionPortingResult = _resultsDict[version]; var ruleContributionsResult = solutionPortingResult.ProjectResults.First(proj => proj.CsProjectPath.EndsWith(RuleContributionsProjectFileName)); // Verify expected package is in .csproj StringAssert.Contains(@"PackageReference Include=""NPOI""", ruleContributionsResult.CsProjectContent); } [Test, TestCaseSource("TestCases")] public void OracleManagedDataAccess_Package_Is_Added(string version) { var solutionPortingResult = _resultsDict[version]; var ruleContributionsResult = solutionPortingResult.ProjectResults.First(proj => proj.CsProjectPath.EndsWith(RuleContributionsProjectFileName)); // Verify expected package is in .csproj StringAssert.Contains(@"PackageReference Include=""Oracle.ManagedDataAccess.Core""", ruleContributionsResult.CsProjectContent); } } }