using Xunit; using System; using System.Collections.Generic; using Semmle.Extraction.CSharp.DependencyFetching; namespace Semmle.Extraction.Tests { internal class UnsafeFileReaderStub : IUnsafeFileReader { private readonly IEnumerable lines; public UnsafeFileReaderStub(IEnumerable lines) { this.lines = lines; } public IEnumerable ReadLines(string file) { foreach (var line in lines) { yield return line; } } } internal class TestFileContent : FileContent { public TestFileContent(IEnumerable lines) : base(new LoggerStub(), new List() { "test1.cs" }, new UnsafeFileReaderStub(lines)) { } } public class FileContentTests { [Fact] public void TestFileContent1() { // Setup var lines = new List() { "", "", "", "", "", "" }; var fileContent = new TestFileContent(lines); // Execute var allPackages = fileContent.AllPackages; var useAspNetDlls = fileContent.UseAspNetCoreDlls; // Verify Assert.False(useAspNetDlls); Assert.Equal(3, allPackages.Count); Assert.Contains(new PackageReference("DotNetAnalyzers.DocumentationAnalyzers".ToLowerInvariant(), PackageReferenceSource.SdkCsProj), allPackages); Assert.Contains(new PackageReference("Microsoft.CodeAnalysis.NetAnalyzers".ToLowerInvariant(), PackageReferenceSource.SdkCsProj), allPackages); Assert.Contains(new PackageReference("StyleCop.Analyzers".ToLowerInvariant(), PackageReferenceSource.SdkCsProj), allPackages); } [Fact] public void TestFileContent2() { // Setup var lines = new List() { "", "", "", "" }; var fileContent = new TestFileContent(lines); // Execute var useAspNetDlls = fileContent.UseAspNetCoreDlls; var allPackages = fileContent.AllPackages; // Verify Assert.True(useAspNetDlls); Assert.Equal(2, allPackages.Count); Assert.Contains(new PackageReference("Microsoft.CodeAnalysis.NetAnalyzers".ToLowerInvariant(), PackageReferenceSource.SdkCsProj), allPackages); Assert.Contains(new PackageReference("StyleCop.Analyzers".ToLowerInvariant(), PackageReferenceSource.SdkCsProj), allPackages); } private static void CsProjSettingsTest(string line, bool expected, Func func) { // Setup var lines = new List() { line }; var fileContent = new TestFileContent(lines); // Execute var actual = func(fileContent); // Verify Assert.Equal(expected, actual); } [Fact] public void TestFileContent_ImplicitUsings0() { CsProjSettingsTest("false", false, fc => fc.UseImplicitUsings); } [Fact] public void TestFileContent_ImplicitUsings1() { CsProjSettingsTest("true", true, fc => fc.UseImplicitUsings); } [Fact] public void TestFileContent_ImplicitUsings2() { CsProjSettingsTest("enable", true, fc => fc.UseImplicitUsings); } [Fact] public void TestFileContent_UseWpf0() { CsProjSettingsTest("false", false, fc => fc.UseWpf); } [Fact] public void TestFileContent_UseWpf1() { CsProjSettingsTest("true", true, fc => fc.UseWpf); } [Fact] public void TestFileContent_UseWindowsForms0() { CsProjSettingsTest("false", false, fc => fc.UseWindowsForms); } [Fact] public void TestFileContent_UseWindowsForms1() { CsProjSettingsTest("true", true, fc => fc.UseWindowsForms); } [Fact] public void TestFileContent_ImplicitUsingsAdditional() { // Setup var lines = new List() { "", "", "", }; var fileContent = new TestFileContent(lines); // Execute var customImplicitUsings = fileContent.CustomImplicitUsings; // Verify Assert.Equal(2, customImplicitUsings.Count); Assert.Contains("Ns0.Ns1", customImplicitUsings); Assert.Contains("Ns2", customImplicitUsings); } [Fact] public void TestFileContent_LegacyProjectStructure() { // Setup var input = """ """; var lines = input.Split(Environment.NewLine); var fileContent = new TestFileContent(lines); // Execute var isLegacy = fileContent.IsLegacyProjectStructureUsed; var isNew = fileContent.IsNewProjectStructureUsed; // Verify Assert.True(isLegacy); Assert.False(isNew); } [Fact] public void TestFileContent_NewProjectStructure() { // Setup var input = """ net461;net70 """; var lines = input.Split(Environment.NewLine); var fileContent = new TestFileContent(lines); // Execute var isLegacy = fileContent.IsLegacyProjectStructureUsed; var isNew = fileContent.IsNewProjectStructureUsed; // Verify Assert.True(isNew); Assert.False(isLegacy); } } }