diff --git a/src/NuGetUtility/NuGetUtility.csproj b/src/NuGetUtility/NuGetUtility.csproj index 0f50f7f8..8917e923 100644 --- a/src/NuGetUtility/NuGetUtility.csproj +++ b/src/NuGetUtility/NuGetUtility.csproj @@ -35,13 +35,13 @@ - + - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/NuGetUtility/ReferencedPackagesReader/ReferencedPackageReader.cs b/src/NuGetUtility/ReferencedPackagesReader/ReferencedPackageReader.cs index 1da23f12..a1973bfe 100644 --- a/src/NuGetUtility/ReferencedPackagesReader/ReferencedPackageReader.cs +++ b/src/NuGetUtility/ReferencedPackagesReader/ReferencedPackageReader.cs @@ -69,87 +69,29 @@ private bool TryGetInstalledPackagesFromAssetsFile(bool includeTransitive, [NotNullWhen(true)] out IEnumerable? installedPackages) { installedPackages = null; - if (!TryLoadAssetsFile(project, out ILockFile? assetsFile, out string? assetsPath)) + if (!TryLoadAssetsFile(project, out ILockFile? assetsFile)) { return false; } - var referencedLibraries = new HashSet(); - List selectedTargets; string? normalizedRequestedTargetFramework = NormalizeTargetFrameworkOrNull(targetFramework); - Dictionary> publishFalsePackagesByFramework = new Dictionary>(StringComparer.OrdinalIgnoreCase); - Dictionary directDependenciesByFramework = new Dictionary(StringComparer.OrdinalIgnoreCase); - Dictionary>> packageDependenciesByFramework = new Dictionary>>(StringComparer.OrdinalIgnoreCase); - Dictionary> recursiveExclusionsByInput = new Dictionary>(StringComparer.Ordinal); + List selectedTargets = GetSelectedTargets(assetsFile, normalizedRequestedTargetFramework, targetFramework); - if (normalizedRequestedTargetFramework is not null) - { - selectedTargets = assetsFile.Targets! - .Where(t => _nuGetFrameworkUtility.IsEquivalent(normalizedRequestedTargetFramework, t.TargetFramework)) - .ToList(); - if (!selectedTargets.Any()) - { - throw new ReferencedPackageReaderException($"Target framework {targetFramework} not found."); - } - } - else - { - selectedTargets = assetsFile.Targets!.ToList(); - } + HashSet referencedLibraries = new HashSet(); + PublishExclusionContext publishExclusionContext = new PublishExclusionContext(normalizedRequestedTargetFramework); foreach (ILockFileTarget target in selectedTargets) { - HashSet targetReferencedLibraries = - new HashSet(GetReferencedLibrariesForTarget(includeTransitive, assetsFile, target)); + HashSet targetReferencedLibraries = [.. GetReferencedLibrariesForTarget(includeTransitive, assetsFile, target)]; if (excludePublishFalse) { - string targetFrameworkForPublishMetadata = normalizedRequestedTargetFramework ?? _nuGetFrameworkUtility.Normalize(target.TargetFramework); - string targetFrameworkCacheKey = targetFrameworkForPublishMetadata ?? string.Empty; - - // Remove packages with Publish=false metadata from the evaluated PackageReferences for this target only. - if (!publishFalsePackagesByFramework.TryGetValue(targetFrameworkCacheKey, out HashSet? cachedPublishFalsePackages)) - { - cachedPublishFalsePackages = GetPackagesExcludedFromPublish(project, targetFrameworkForPublishMetadata); - publishFalsePackagesByFramework[targetFrameworkCacheKey] = cachedPublishFalsePackages; - } - - HashSet excludedPackages = new HashSet(cachedPublishFalsePackages, StringComparer.OrdinalIgnoreCase); - if (includeTransitive && excludedPackages.Any()) - { - if (!directDependenciesByFramework.TryGetValue(targetFrameworkCacheKey, out string[]? directDependenciesForFramework)) - { - directDependenciesForFramework = GetDirectDependenciesForTargets(assetsFile, new[] { target }).ToArray(); - directDependenciesByFramework[targetFrameworkCacheKey] = directDependenciesForFramework; - } - - if (!packageDependenciesByFramework.TryGetValue(targetFrameworkCacheKey, out Dictionary>? packageDependencies)) - { - packageDependencies = _assetsPackageDependencyReader.GetPackageDependenciesForTargetFramework( - assetsPath!, - targetFrameworkCacheKey); - packageDependenciesByFramework[targetFrameworkCacheKey] = packageDependencies; - } - - if (packageDependencies.Count > 0) - { - string recursiveExclusionCacheKey = BuildExclusionCacheKey( - targetFrameworkCacheKey, - directDependenciesForFramework, - excludedPackages); - - if (!recursiveExclusionsByInput.TryGetValue(recursiveExclusionCacheKey, out HashSet? recursivelyExcludedPackages)) - { - recursivelyExcludedPackages = GetPackagesExcludedFromPublishDependencyPaths( - packageDependencies, - directDependenciesForFramework, - excludedPackages); - recursiveExclusionsByInput[recursiveExclusionCacheKey] = recursivelyExcludedPackages; - } - - excludedPackages.UnionWith(recursivelyExcludedPackages); - } - } + HashSet excludedPackages = GetExcludedPackagesForTarget( + project, + assetsFile, + target, + includeTransitive, + publishExclusionContext); targetReferencedLibraries.RemoveWhere(library => excludedPackages.Contains(library.Name)); } @@ -161,6 +103,85 @@ private bool TryGetInstalledPackagesFromAssetsFile(bool includeTransitive, return true; } + private List GetSelectedTargets(ILockFile assetsFile, + string? normalizedRequestedTargetFramework, + string? targetFramework) + { + if (normalizedRequestedTargetFramework is null) + { + return assetsFile.Targets.ToList(); + } + + List selectedTargets = assetsFile.Targets + .Where(t => _nuGetFrameworkUtility.IsEquivalent(normalizedRequestedTargetFramework, t.TargetFramework)) + .ToList(); + if (!selectedTargets.Any()) + { + throw new ReferencedPackageReaderException($"Target framework {targetFramework} not found."); + } + + return selectedTargets; + } + + private HashSet GetExcludedPackagesForTarget(IProject project, + ILockFile assetsFile, + ILockFileTarget target, + bool includeTransitive, + PublishExclusionContext context) + { + string targetFrameworkForPublishMetadata = context.NormalizedRequestedTargetFramework ?? _nuGetFrameworkUtility.Normalize(target.TargetFramework); + string targetFrameworkCacheKey = targetFrameworkForPublishMetadata ?? string.Empty; + + // Remove packages with Publish=false metadata from the evaluated PackageReferences for this target only. + if (!context.PublishFalsePackagesByFramework.TryGetValue(targetFrameworkCacheKey, out HashSet? cachedPublishFalsePackages)) + { + cachedPublishFalsePackages = GetPackagesExcludedFromPublish(project, targetFrameworkForPublishMetadata); + context.PublishFalsePackagesByFramework[targetFrameworkCacheKey] = cachedPublishFalsePackages; + } + + HashSet excludedPackages = new HashSet(cachedPublishFalsePackages, StringComparer.OrdinalIgnoreCase); + if (!includeTransitive || !excludedPackages.Any()) + { + return excludedPackages; + } + + if (!context.DirectDependenciesByFramework.TryGetValue(targetFrameworkCacheKey, out HashSet? directDependenciesForFramework)) + { + directDependenciesForFramework = GetDirectDependenciesForTargets(assetsFile, [target]); + context.DirectDependenciesByFramework[targetFrameworkCacheKey] = directDependenciesForFramework; + } + + if (!context.PackageDependenciesByFramework.TryGetValue(targetFrameworkCacheKey, out Dictionary>? packageDependencies)) + { + packageDependencies = _assetsPackageDependencyReader.GetPackageDependenciesForTargetFramework( + assetsFile, + targetFrameworkCacheKey); + context.PackageDependenciesByFramework[targetFrameworkCacheKey] = packageDependencies; + } + + if (packageDependencies.Count == 0) + { + return excludedPackages; + } + + string recursiveExclusionCacheKey = BuildExclusionCacheKey( + targetFrameworkCacheKey, + directDependenciesForFramework, + excludedPackages); + + if (!context.RecursiveExclusionsByInput.TryGetValue(recursiveExclusionCacheKey, out HashSet? recursivelyExcludedPackages)) + { + recursivelyExcludedPackages = GetPackagesExcludedFromPublishDependencyPaths( + packageDependencies, + directDependenciesForFramework, + excludedPackages); + context.RecursiveExclusionsByInput[recursiveExclusionCacheKey] = recursivelyExcludedPackages; + } + + excludedPackages.UnionWith(recursivelyExcludedPackages); + return excludedPackages; + } + private static IEnumerable GetReferencedLibrariesForTarget(bool includeTransitive, ILockFile assetsFile, ILockFileTarget target) @@ -191,7 +212,7 @@ private static ITargetFrameworkInformation GetTargetFrameworkInformation(ILockFi } } - private static IEnumerable GetDirectDependenciesForTargets(ILockFile assetsFile, + private static HashSet GetDirectDependenciesForTargets(ILockFile assetsFile, IEnumerable selectedTargets) { HashSet directDependencies = new HashSet(StringComparer.OrdinalIgnoreCase); @@ -288,13 +309,11 @@ private static HashSet GetReachablePackages(Dictionary GetPackagesExcludedFromPublish(IProject project, return excludedPackages; } + + private sealed record PublishExclusionContext(string? NormalizedRequestedTargetFramework) + { + public Dictionary> PublishFalsePackagesByFramework { get; } = new Dictionary>(StringComparer.OrdinalIgnoreCase); + + public Dictionary> DirectDependenciesByFramework { get; } = new Dictionary>(StringComparer.OrdinalIgnoreCase); + + public Dictionary>> PackageDependenciesByFramework { get; } = new Dictionary>>(StringComparer.OrdinalIgnoreCase); + + public Dictionary> RecursiveExclusionsByInput { get; } = new Dictionary>(StringComparer.Ordinal); + } } } diff --git a/src/NuGetUtility/Wrapper/NuGetWrapper/Packaging/Core/IPackageDependency.cs b/src/NuGetUtility/Wrapper/NuGetWrapper/Packaging/Core/IPackageDependency.cs new file mode 100644 index 00000000..9c02aaa1 --- /dev/null +++ b/src/NuGetUtility/Wrapper/NuGetWrapper/Packaging/Core/IPackageDependency.cs @@ -0,0 +1,10 @@ +// Licensed to the projects contributors. +// The license conditions are provided in the LICENSE file located in the project root + +namespace NuGetUtility.Wrapper.NuGetWrapper.Packaging.Core +{ + public interface IPackageDependency + { + string Id { get; } + } +} diff --git a/src/NuGetUtility/Wrapper/NuGetWrapper/Packaging/Core/WrappedPackageDependency.cs b/src/NuGetUtility/Wrapper/NuGetWrapper/Packaging/Core/WrappedPackageDependency.cs new file mode 100644 index 00000000..a67c4b73 --- /dev/null +++ b/src/NuGetUtility/Wrapper/NuGetWrapper/Packaging/Core/WrappedPackageDependency.cs @@ -0,0 +1,17 @@ +// Licensed to the projects contributors. +// The license conditions are provided in the LICENSE file located in the project root + +using NuGet.Packaging.Core; + +namespace NuGetUtility.Wrapper.NuGetWrapper.Packaging.Core +{ + internal class WrappedPackageDependency : IPackageDependency + { + public WrappedPackageDependency(PackageDependency dependency) + { + Id = dependency.Id; + } + public string Id { get; } + } +} + diff --git a/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/AssetsPackageDependencyReader.cs b/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/AssetsPackageDependencyReader.cs index 0a75b644..b3ce76a6 100644 --- a/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/AssetsPackageDependencyReader.cs +++ b/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/AssetsPackageDependencyReader.cs @@ -2,7 +2,6 @@ // The license conditions are provided in the LICENSE file located in the project root using System.Diagnostics; -using NuGet.ProjectModel; using NuGetUtility.Wrapper.NuGetWrapper.Frameworks; namespace NuGetUtility.Wrapper.NuGetWrapper.ProjectModel @@ -42,33 +41,22 @@ public AssetsPackageDependencyReader(INuGetFrameworkUtility nuGetFrameworkUtilit /// /// Thrown when or is . /// - public Dictionary> GetPackageDependenciesForTargetFramework(string assetsPath, string normalizedTargetFramework) + public Dictionary> GetPackageDependenciesForTargetFramework(ILockFile lockFile, string normalizedTargetFramework) { - if (assetsPath is null) - { - throw new ArgumentNullException(nameof(assetsPath)); - } - if (normalizedTargetFramework is null) { throw new ArgumentNullException(nameof(normalizedTargetFramework)); } - if (!File.Exists(assetsPath)) - { - return new Dictionary>(StringComparer.OrdinalIgnoreCase); - } - try { - LockFile lockFile = new LockFileFormat().Read(assetsPath); return BuildDependencyMapFromAssetsFile(lockFile, normalizedTargetFramework); } catch (IOException exception) { Trace.TraceWarning( "Failed to analyze transitive Publish=false exclusions due to I/O error. AssetsPath={0}, TargetFramework={1}, Exception={2}", - assetsPath, + lockFile.Path, normalizedTargetFramework, exception); return new Dictionary>(StringComparer.OrdinalIgnoreCase); @@ -77,25 +65,25 @@ public Dictionary> GetPackageDependenciesForTargetFramew { Trace.TraceWarning( "Failed to analyze transitive Publish=false exclusions due to invalid assets data. AssetsPath={0}, TargetFramework={1}, Exception={2}", - assetsPath, + lockFile.Path, normalizedTargetFramework, exception); return new Dictionary>(StringComparer.OrdinalIgnoreCase); } } - private Dictionary> BuildDependencyMapFromAssetsFile(LockFile lockFile, string requestedTargetFramework) + private Dictionary> BuildDependencyMapFromAssetsFile(ILockFile lockFile, string requestedTargetFramework) { Dictionary> packageDependencies = new Dictionary>(StringComparer.OrdinalIgnoreCase); - foreach (LockFileTarget target in lockFile.Targets) + foreach (ILockFileTarget target in lockFile.Targets) { - if (!_nuGetFrameworkUtility.IsEquivalent(requestedTargetFramework, new WrappedNuGetFramework(target.TargetFramework))) + if (!_nuGetFrameworkUtility.IsEquivalent(requestedTargetFramework, target.TargetFramework)) { continue; } - foreach (LockFileTargetLibrary library in target.Libraries) + foreach (ILockFileTargetLibrary library in target.Libraries) { if (!string.Equals(library.Type, PackageTypeIdentifier, StringComparison.OrdinalIgnoreCase)) { @@ -120,9 +108,8 @@ private Dictionary> BuildDependencyMapFromAssetsFile(Loc packageDependencies[packageNameValue] = dependencies; } - foreach (NuGet.Packaging.Core.PackageDependency dependency in library.Dependencies) + foreach (string dependencyName in library.Dependencies.Select(d => d.Id)) { - string dependencyName = dependency.Id; dependencies.Add(dependencyName); if (!packageDependencies.ContainsKey(dependencyName)) { diff --git a/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/IAssetsPackageDependencyReader.cs b/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/IAssetsPackageDependencyReader.cs index fe617695..3a3c6825 100644 --- a/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/IAssetsPackageDependencyReader.cs +++ b/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/IAssetsPackageDependencyReader.cs @@ -5,6 +5,6 @@ namespace NuGetUtility.Wrapper.NuGetWrapper.ProjectModel { public interface IAssetsPackageDependencyReader { - Dictionary> GetPackageDependenciesForTargetFramework(string assetsPath, string normalizedTargetFramework); + Dictionary> GetPackageDependenciesForTargetFramework(ILockFile lockFile, string normalizedTargetFramework); } } diff --git a/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/ILockFile.cs b/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/ILockFile.cs index 50f582ed..18a03797 100644 --- a/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/ILockFile.cs +++ b/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/ILockFile.cs @@ -7,6 +7,7 @@ public interface ILockFile { bool TryGetErrors(out string[] errors); IPackageSpec PackageSpec { get; } - IEnumerable? Targets { get; } + IEnumerable Targets { get; } + string Path { get; } } } diff --git a/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/ILockFileTarget.cs b/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/ILockFileTarget.cs index 4492d129..0c162678 100644 --- a/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/ILockFileTarget.cs +++ b/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/ILockFileTarget.cs @@ -8,6 +8,6 @@ namespace NuGetUtility.Wrapper.NuGetWrapper.ProjectModel public interface ILockFileTarget { INuGetFramework TargetFramework { get; } - IEnumerable Libraries { get; } + IEnumerable Libraries { get; } } } diff --git a/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/ILockFileTargetLibrary.cs b/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/ILockFileTargetLibrary.cs new file mode 100644 index 00000000..76c1f016 --- /dev/null +++ b/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/ILockFileTargetLibrary.cs @@ -0,0 +1,13 @@ +// Licensed to the projects contributors. +// The license conditions are provided in the LICENSE file located in the project root + +using NuGetUtility.Wrapper.NuGetWrapper.Packaging.Core; +using NuGetUtility.Wrapper.NuGetWrapper.Versioning; + +namespace NuGetUtility.Wrapper.NuGetWrapper.ProjectModel +{ + public interface ILockFileTargetLibrary : ILockFileLibrary + { + IReadOnlyList Dependencies { get; } + } +} diff --git a/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/WrappedLockFile.cs b/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/WrappedLockFile.cs index b1d06559..6e70795c 100644 --- a/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/WrappedLockFile.cs +++ b/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/WrappedLockFile.cs @@ -17,7 +17,8 @@ public WrappedLockFile(LockFile file) public IEnumerable Libraries => _file.Libraries.Select(l => new WrappedLockFileLibrary(l)); public IPackageSpec PackageSpec => new WrappedPackageSpec(_file.PackageSpec); - public IEnumerable? Targets => _file.Targets?.Select(t => new WrappedLockFileTarget(t)); + public IEnumerable Targets => _file.Targets.Select(t => new WrappedLockFileTarget(t)); + public string Path => _file.Path; public bool TryGetErrors(out string[] errors) { diff --git a/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/WrappedLockFileTarget.cs b/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/WrappedLockFileTarget.cs index 02544c7f..b42def18 100644 --- a/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/WrappedLockFileTarget.cs +++ b/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/WrappedLockFileTarget.cs @@ -17,6 +17,6 @@ public WrappedLockFileTarget(LockFileTarget target) public INuGetFramework TargetFramework => new WrappedNuGetFramework(_target.TargetFramework); - public IEnumerable Libraries => _target.Libraries.Select(l => new WrappedLockFileTargetLibrary(l)); + public IEnumerable Libraries => _target.Libraries.Select(l => new WrappedLockFileTargetLibrary(l)); } } diff --git a/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/WrappedLockFileTargetLibrary.cs b/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/WrappedLockFileTargetLibrary.cs index 65e06ce2..a1043364 100644 --- a/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/WrappedLockFileTargetLibrary.cs +++ b/src/NuGetUtility/Wrapper/NuGetWrapper/ProjectModel/WrappedLockFileTargetLibrary.cs @@ -2,17 +2,19 @@ // The license conditions are provided in the LICENSE file located in the project root using NuGet.ProjectModel; +using NuGetUtility.Wrapper.NuGetWrapper.Packaging.Core; using NuGetUtility.Wrapper.NuGetWrapper.Versioning; namespace NuGetUtility.Wrapper.NuGetWrapper.ProjectModel { - internal class WrappedLockFileTargetLibrary : ILockFileLibrary + internal class WrappedLockFileTargetLibrary : ILockFileTargetLibrary { public WrappedLockFileTargetLibrary(LockFileTargetLibrary library) { Type = library.Type ?? throw new ArgumentNullException(nameof(library), $"The field {nameof(library.Type)} on {nameof(library)} must not be null"); Name = library.Name ?? throw new ArgumentNullException(nameof(library), $"The field {nameof(library.Name)} on {nameof(library)} must not be null"); Version = new WrappedNuGetVersion(library.Version ?? throw new ArgumentNullException(nameof(library), $"The field {nameof(library.Version)} on {nameof(library)} must not be null")); + Dependencies = library.Dependencies.Select(d => new WrappedPackageDependency(d)).ToArray(); } public string Type { get; } @@ -20,5 +22,6 @@ public WrappedLockFileTargetLibrary(LockFileTargetLibrary library) public string Name { get; } public INuGetVersion Version { get; } + public IReadOnlyList Dependencies { get; } } } diff --git a/tests/FileLicenseMatcher.Test/FileLicenseMatcher.Test.csproj b/tests/FileLicenseMatcher.Test/FileLicenseMatcher.Test.csproj index 9ac4703c..90589cc0 100644 --- a/tests/FileLicenseMatcher.Test/FileLicenseMatcher.Test.csproj +++ b/tests/FileLicenseMatcher.Test/FileLicenseMatcher.Test.csproj @@ -16,7 +16,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/tests/NuGetUtility.Test/Extensions/StringExtensionsTest.cs b/tests/NuGetUtility.Test/Extensions/StringExtensionsTest.cs index 24f35c5f..610dc038 100644 --- a/tests/NuGetUtility.Test/Extensions/StringExtensionsTest.cs +++ b/tests/NuGetUtility.Test/Extensions/StringExtensionsTest.cs @@ -41,13 +41,13 @@ internal class PathLikeTests { [TestCase("test", "test", true)] [TestCase("test", "TEST", true)] - [TestCase("C:\\Projects\\MyProject\\MyProject.csproj", "*.csproj", true)] - [TestCase("C:\\Projects\\MyProject\\MyProject.csproj", "MyProject.csproj", true)] - [TestCase("C:\\Projects\\MyProject\\MyProject.csproj", "MyProject.*", true)] - [TestCase("C:\\Projects\\MyProject\\MyProject.csproj", "*MyProject.csproj", true)] - [TestCase("C:\\Projects\\MyProject\\MyProject.csproj", "C:\\Projects\\*\\*.csproj", true)] - [TestCase("C:\\Projects\\MyProject\\MyProject.csproj", "*.vbproj", false)] - [TestCase("C:\\Projects\\MyProject\\MyProject.csproj", "OtherProject.csproj", false)] + [TestCase("C:\\Projects\\MyProject\\MyProject.csproj", "*.csproj", true, TestName = "PathLike_Windows_MyProject_ExtensionMatch")] + [TestCase("C:\\Projects\\MyProject\\MyProject.csproj", "MyProject.csproj", true, TestName = "PathLike_Windows_MyProject_ExactFileNameMatch")] + [TestCase("C:\\Projects\\MyProject\\MyProject.csproj", "MyProject.*", true, TestName = "PathLike_Windows_MyProject_WildcardFileNameMatch")] + [TestCase("C:\\Projects\\MyProject\\MyProject.csproj", "*MyProject.csproj", true, TestName = "PathLike_Windows_MyProject_SuffixFileNameMatch")] + [TestCase("C:\\Projects\\MyProject\\MyProject.csproj", "C:\\Projects\\*\\*.csproj", true, TestName = "PathLike_Windows_MyProject_FullPathPatternMatch")] + [TestCase("C:\\Projects\\MyProject\\MyProject.csproj", "*.vbproj", false, TestName = "PathLike_Windows_MyProject_NonMatchingExtension")] + [TestCase("C:\\Projects\\MyProject\\MyProject.csproj", "OtherProject.csproj", false, TestName = "PathLike_Windows_MyProject_NonMatchingFileName")] [TestCase("/home/user/projects/MyProject/MyProject.csproj", "*.csproj", true)] [TestCase("/home/user/projects/MyProject/MyProject.csproj", "MyProject.csproj", true)] [TestCase("/home/user/projects/MyProject/MyProject.csproj", "MyProject.*", true)] @@ -55,13 +55,13 @@ internal class PathLikeTests [TestCase("/home/user/projects/MyProject/MyProject.csproj", "/home/user/*/MyProject/*.csproj", true)] [TestCase("/home/user/projects/MyProject/MyProject.csproj", "*.vbproj", false)] [TestCase("/home/user/projects/MyProject/MyProject.csproj", "OtherProject.csproj", false)] - [TestCase("C:\\Projects\\Testing\\Test.pyproj", "*.pyproj", true)] - [TestCase("C:\\Projects\\Testing\\Test.pyproj", "Test.pyproj", true)] - [TestCase("C:\\Projects\\Testing\\Test.pyproj", "*Testing*", true)] - [TestCase("C:\\Projects\\Mosaik.Testing.Something\\Project.csproj", "*Mosaik.Testing*", true)] - [TestCase("C:\\Projects\\Mosaik.Testing.Something\\Project.csproj", "Project.csproj", true)] + [TestCase("C:\\Projects\\Testing\\Test.pyproj", "*.pyproj", true, TestName = "PathLike_Windows_Testing_PythonProjectExtensionMatch")] + [TestCase("C:\\Projects\\Testing\\Test.pyproj", "Test.pyproj", true, TestName = "PathLike_Windows_Testing_PythonProjectFileNameMatch")] + [TestCase("C:\\Projects\\Testing\\Test.pyproj", "*Testing*", true, TestName = "PathLike_Windows_Testing_FolderPatternMatch")] + [TestCase("C:\\Projects\\Mosaik.Testing.Something\\Project.csproj", "*Mosaik.Testing*", true, TestName = "PathLike_Windows_MosaikTesting_FolderPatternMatch")] + [TestCase("C:\\Projects\\Mosaik.Testing.Something\\Project.csproj", "Project.csproj", true, TestName = "PathLike_Windows_MosaikTesting_FileNameMatch")] [TestCase("Project.Name.Test", "Project.Name*", true)] - [TestCase("Some\\Path\\Project.Name.Test", "Project.Name*", true)] + [TestCase("Some\\Path\\Project.Name.Test", "Project.Name*", true, TestName = "PathLike_Windows_RelativePath_FileNamePatternMatch")] public void PathLike_Should_MatchPattern_AgainstFullPathOrFileName(string path, string pattern, bool expected) { Assert.That(path.PathLike(pattern), Is.EqualTo(expected)); diff --git a/tests/NuGetUtility.Test/ReferencedPackagesReader/ReferencedPackageReaderTest.cs b/tests/NuGetUtility.Test/ReferencedPackagesReader/ReferencedPackageReaderTest.cs index 71be9d76..fcce84ed 100644 --- a/tests/NuGetUtility.Test/ReferencedPackagesReader/ReferencedPackageReaderTest.cs +++ b/tests/NuGetUtility.Test/ReferencedPackagesReader/ReferencedPackageReaderTest.cs @@ -1,8 +1,6 @@ // Licensed to the projects contributors. // The license conditions are provided in the LICENSE file located in the project root -using System.Collections.Generic; -using System.IO; using AutoFixture; using AutoFixture.AutoNSubstitute; using NSubstitute; @@ -32,7 +30,7 @@ public void SetUp() _packageSpecMock = Substitute.For(); _packagesConfigReader = Substitute.For(); _lockFileTargets = _fixture.CreateMany(TargetFrameworkCount).ToArray(); - _lockFileLibraries = _fixture.CreateMany(50).ToArray(); + _lockFileLibraries = _fixture.CreateMany(50).ToArray(); _packageSpecTargetFrameworks = _fixture.CreateMany(TargetFrameworkCount).ToArray(); _targetFrameworks = _fixture.CreateMany(TargetFrameworkCount).ToArray(); @@ -74,7 +72,7 @@ public void SetUp() targetFrameworksIterator.MoveNext(); lockFileTarget.TargetFramework.Returns(targetFrameworksIterator.Current); - ILockFileLibrary[] referencedLibraries = _lockFileLibraries.Shuffle(rnd) + ILockFileTargetLibrary[] referencedLibraries = _lockFileLibraries.Shuffle(rnd) .Take(5) .ToArray(); _referencedPackagesForFramework[targetFrameworksIterator.Current] = referencedLibraries.Select(l => new PackageIdentity(l.Name, l.Version!)).ToArray(); @@ -122,7 +120,7 @@ public void SetUp() private ILockFile _lockFileMock = null!; private IPackageSpec _packageSpecMock = null!; private IEnumerable _lockFileTargets = null!; - private IEnumerable _lockFileLibraries = null!; + private IEnumerable _lockFileLibraries = null!; private IEnumerable _packageSpecTargetFrameworks = null!; private IEnumerable _targetFrameworks = null!; private IFixture _fixture = null!; @@ -209,15 +207,15 @@ public void INuGetFramework frameworkNet80 = Substitute.For(); frameworkNet80.ToString().Returns("net8.0"); targetNet80.TargetFramework.Returns(frameworkNet80); - targetNet80.Libraries.Returns(Array.Empty()); + targetNet80.Libraries.Returns(Array.Empty()); ILockFileTarget targetNet90 = Substitute.For(); INuGetFramework frameworkNet90 = Substitute.For(); frameworkNet90.ToString().Returns("net9.0"); targetNet90.TargetFramework.Returns(frameworkNet90); - targetNet90.Libraries.Returns(Array.Empty()); + targetNet90.Libraries.Returns(Array.Empty()); - _lockFileMock.Targets.Returns(new[] { targetNet80, targetNet90 }); + _lockFileMock.Targets.Returns([targetNet80, targetNet90]); ReferencedPackageReaderException? exception = Assert.Throws(() => _uut.GetInstalledPackages(_projectPath, false, targetFramework)); @@ -263,26 +261,26 @@ public void GetInstalledPackages_Should_OnlyReturnPackages_For_TargetFramework() { const string requestedTargetFramework = "net8.0"; - ILockFileLibrary net80Library = CreateLibrary("PackageNet80"); - ILockFileLibrary net90Library = CreateLibrary("PackageNet90"); + ILockFileTargetLibrary net80Library = CreateLibrary("PackageNet80"); + ILockFileTargetLibrary net90Library = CreateLibrary("PackageNet90"); ILockFileTarget targetNet80 = Substitute.For(); INuGetFramework frameworkNet80 = Substitute.For(); frameworkNet80.ToString().Returns("net8.0"); targetNet80.TargetFramework.Returns(frameworkNet80); - targetNet80.Libraries.Returns(new[] { net80Library }); + targetNet80.Libraries.Returns([net80Library]); ILockFileTarget targetNet90 = Substitute.For(); INuGetFramework frameworkNet90 = Substitute.For(); frameworkNet90.ToString().Returns("net9.0"); targetNet90.TargetFramework.Returns(frameworkNet90); - targetNet90.Libraries.Returns(new[] { net90Library }); + targetNet90.Libraries.Returns([net90Library]); - _lockFileMock.Targets.Returns(new[] { targetNet80, targetNet90 }); + _lockFileMock.Targets.Returns([targetNet80, targetNet90]); IEnumerable result = _uut.GetInstalledPackages(_projectPath, true, requestedTargetFramework); - Assert.That(result.Select(package => package.Id), Is.EquivalentTo(new[] { "PackageNet80" })); + Assert.That(result.Select(package => package.Id), Is.EquivalentTo(["PackageNet80"])); Assert.That(result.Select(package => package.Id), Does.Not.Contain("PackageNet90")); } @@ -291,26 +289,26 @@ public void GetInstalledPackages_Should_OnlyReturnPackages_For_Equivalent_Target { const string requestedTargetFramework = "net8.0"; - ILockFileLibrary equivalentTargetLibrary = CreateLibrary("PackageEquivalent"); - ILockFileLibrary otherTargetLibrary = CreateLibrary("PackageOther"); + ILockFileTargetLibrary equivalentTargetLibrary = CreateLibrary("PackageEquivalent"); + ILockFileTargetLibrary otherTargetLibrary = CreateLibrary("PackageOther"); ILockFileTarget targetEquivalent = Substitute.For(); INuGetFramework frameworkEquivalent = Substitute.For(); frameworkEquivalent.ToString().Returns(".NETCoreApp,Version=v8.0"); targetEquivalent.TargetFramework.Returns(frameworkEquivalent); - targetEquivalent.Libraries.Returns(new[] { equivalentTargetLibrary }); + targetEquivalent.Libraries.Returns([equivalentTargetLibrary]); ILockFileTarget targetOther = Substitute.For(); INuGetFramework frameworkOther = Substitute.For(); frameworkOther.ToString().Returns("net9.0"); targetOther.TargetFramework.Returns(frameworkOther); - targetOther.Libraries.Returns(new[] { otherTargetLibrary }); + targetOther.Libraries.Returns([otherTargetLibrary]); - _lockFileMock.Targets.Returns(new[] { targetEquivalent, targetOther }); + _lockFileMock.Targets.Returns([targetEquivalent, targetOther]); IEnumerable result = _uut.GetInstalledPackages(_projectPath, true, requestedTargetFramework); - Assert.That(result.Select(package => package.Id), Is.EquivalentTo(new[] { "PackageEquivalent" })); + Assert.That(result.Select(package => package.Id), Is.EquivalentTo(["PackageEquivalent"])); Assert.That(result.Select(package => package.Id), Does.Not.Contain("PackageOther")); } @@ -320,26 +318,26 @@ public void GetInstalledPackages_Should_OnlyReturnPackages_For_Equivalent_Target [TestCase(".NETCoreApp,Version=v8.0")] public void GetInstalledPackages_Should_OnlyReturnPackages_For_TargetFramework_Variants(string requestedTargetFramework) { - ILockFileLibrary variantTargetLibrary = CreateLibrary("PackageVariant"); - ILockFileLibrary otherTargetLibrary = CreateLibrary("PackageOther"); + ILockFileTargetLibrary variantTargetLibrary = CreateLibrary("PackageVariant"); + ILockFileTargetLibrary otherTargetLibrary = CreateLibrary("PackageOther"); ILockFileTarget targetVariant = Substitute.For(); INuGetFramework frameworkVariant = Substitute.For(); frameworkVariant.ToString().Returns("net8.0"); targetVariant.TargetFramework.Returns(frameworkVariant); - targetVariant.Libraries.Returns(new[] { variantTargetLibrary }); + targetVariant.Libraries.Returns([variantTargetLibrary]); ILockFileTarget targetOther = Substitute.For(); INuGetFramework frameworkOther = Substitute.For(); frameworkOther.ToString().Returns("net9.0"); targetOther.TargetFramework.Returns(frameworkOther); - targetOther.Libraries.Returns(new[] { otherTargetLibrary }); + targetOther.Libraries.Returns([otherTargetLibrary]); - _lockFileMock.Targets.Returns(new[] { targetVariant, targetOther }); + _lockFileMock.Targets.Returns([targetVariant, targetOther]); IEnumerable result = _uut.GetInstalledPackages(_projectPath, true, requestedTargetFramework); - Assert.That(result.Select(package => package.Id), Is.EquivalentTo(new[] { "PackageVariant" })); + Assert.That(result.Select(package => package.Id), Is.EquivalentTo(["PackageVariant"])); Assert.That(result.Select(package => package.Id), Does.Not.Contain("PackageOther")); } @@ -404,44 +402,44 @@ public void GetInstalledPackages_Should_ExcludePackages_With_PublishFalse_Metada string excludedPackage = _fixture.Create(); string includedPackage = _fixture.Create(); - ILockFileLibrary excludedLibrary = Substitute.For(); + ILockFileTargetLibrary excludedLibrary = Substitute.For(); excludedLibrary.Name.Returns(excludedPackage); excludedLibrary.Version.Returns(Substitute.For()); - ILockFileLibrary includedLibrary = Substitute.For(); + ILockFileTargetLibrary includedLibrary = Substitute.For(); includedLibrary.Name.Returns(includedPackage); includedLibrary.Version.Returns(Substitute.For()); ILockFileTarget target = Substitute.For(); - target.Libraries.Returns(new[] { excludedLibrary, includedLibrary }); + target.Libraries.Returns([excludedLibrary, includedLibrary]); INuGetFramework targetFramework = Substitute.For(); targetFramework.ToString().Returns("net8.0"); target.TargetFramework.Returns(targetFramework); - _lockFileMock.Targets.Returns(new[] { target }); + _lockFileMock.Targets.Returns([target]); - _projectMock.GetPackageReferences().Returns(new[] - { + _projectMock.GetPackageReferences().Returns( + [ new PackageReferenceMetadata(excludedPackage, new Dictionary(StringComparer.OrdinalIgnoreCase) { ["Publish"] = "false" }), new PackageReferenceMetadata(includedPackage, new Dictionary()) - }); - _projectMock.GetPackageReferencesForTarget("net8.0").Returns(new[] - { + ]); + _projectMock.GetPackageReferencesForTarget("net8.0").Returns( + [ new PackageReferenceMetadata(excludedPackage, new Dictionary(StringComparer.OrdinalIgnoreCase) { ["Publish"] = "false" }), new PackageReferenceMetadata(includedPackage, new Dictionary()) - }); + ]); ITargetFrameworkInformation targetFrameworkInformation = Substitute.For(); targetFrameworkInformation.FrameworkName.Returns(targetFramework); ILibraryDependency excludedDependency = CreateDependency(excludedPackage); ILibraryDependency includedDependency = CreateDependency(includedPackage); - targetFrameworkInformation.Dependencies.Returns(new[] { excludedDependency, includedDependency }); - _packageSpecMock.TargetFrameworks.Returns(new[] { targetFrameworkInformation }); + targetFrameworkInformation.Dependencies.Returns([excludedDependency, includedDependency]); + _packageSpecMock.TargetFrameworks.Returns([targetFrameworkInformation]); IEnumerable result = _uut.GetInstalledPackages(_projectPath, true, null, true); @@ -462,43 +460,43 @@ public void GetInstalledPackages_Should_Apply_PublishFalse_PerTarget_When_Target ILockFileTarget targetNet80 = Substitute.For(); targetNet80.TargetFramework.Returns(net80); - ILockFileLibrary net80Library = CreateLibrary(packageName); - targetNet80.Libraries.Returns(new[] { net80Library }); + ILockFileTargetLibrary net80Library = CreateLibrary(packageName); + targetNet80.Libraries.Returns([net80Library]); ILockFileTarget targetNet90 = Substitute.For(); targetNet90.TargetFramework.Returns(net90); - ILockFileLibrary net90Library = CreateLibrary(packageName); - targetNet90.Libraries.Returns(new[] { net90Library }); + ILockFileTargetLibrary net90Library = CreateLibrary(packageName); + targetNet90.Libraries.Returns([net90Library]); - _lockFileMock.Targets.Returns(new[] { targetNet80, targetNet90 }); + _lockFileMock.Targets.Returns([targetNet80, targetNet90]); ITargetFrameworkInformation net80Info = Substitute.For(); net80Info.FrameworkName.Returns(net80); ILibraryDependency net80Dependency = CreateDependency(packageName); - net80Info.Dependencies.Returns(new[] { net80Dependency }); + net80Info.Dependencies.Returns([net80Dependency]); ITargetFrameworkInformation net90Info = Substitute.For(); net90Info.FrameworkName.Returns(net90); ILibraryDependency net90Dependency = CreateDependency(packageName); - net90Info.Dependencies.Returns(new[] { net90Dependency }); + net90Info.Dependencies.Returns([net90Dependency]); - _packageSpecMock.TargetFrameworks.Returns(new[] { net80Info, net90Info }); + _packageSpecMock.TargetFrameworks.Returns([net80Info, net90Info]); - _projectMock.GetPackageReferences().Returns(new[] - { + _projectMock.GetPackageReferences().Returns( + [ new PackageReferenceMetadata(packageName, new Dictionary(StringComparer.OrdinalIgnoreCase) { ["Publish"] = "false" }) - }); + ]); - _projectMock.GetPackageReferencesForTarget("net8.0").Returns(new[] - { + _projectMock.GetPackageReferencesForTarget("net8.0").Returns( + [ new PackageReferenceMetadata(packageName, new Dictionary(StringComparer.OrdinalIgnoreCase) { ["Publish"] = "false" }) - }); + ]); _projectMock.GetPackageReferencesForTarget("net9.0").Returns(Array.Empty()); @@ -513,262 +511,103 @@ public void GetInstalledPackages_Should_Apply_PublishFalse_PerTarget_When_Target [Test] public void GetInstalledPackages_Should_Keep_SharedTransitiveDependency_If_ReachableFrom_PublishableRoot() { - string tempAssetsPath = Path.GetTempFileName(); - try - { - _assetsFilePath = tempAssetsPath; - _lockFileFactory.GetFromFile(tempAssetsPath).Returns(_lockFileMock); - File.WriteAllText(tempAssetsPath, - """ - { - "targets": { - "net10.0": { - "PackageA/1.0.0": { - "type": "package", - "dependencies": { - "PackageC": "1.0.0" - } - }, - "PackageB/1.0.0": { - "type": "package", - "dependencies": { - "PackageC": "1.0.0" - } - }, - "PackageC/1.0.0": { - "type": "package" - } - } - } - } - """); - - INuGetFramework targetFramework = Substitute.For(); - targetFramework.ToString().Returns("net10.0"); - - ILockFileTarget target = Substitute.For(); - target.TargetFramework.Returns(targetFramework); - ILockFileLibrary[] targetLibraries = - { - CreateLibrary("PackageA"), - CreateLibrary("PackageB"), - CreateLibrary("PackageC") - }; - target.Libraries.Returns(targetLibraries); - _lockFileMock.Targets.Returns(new[] { target }); - - ITargetFrameworkInformation targetFrameworkInformation = Substitute.For(); - targetFrameworkInformation.FrameworkName.Returns(targetFramework); - ILibraryDependency[] directDependencies = - { - CreateDependency("PackageA"), - CreateDependency("PackageB") - }; - targetFrameworkInformation.Dependencies.Returns(directDependencies); - _packageSpecMock.TargetFrameworks.Returns(new[] { targetFrameworkInformation }); + INuGetFramework targetFramework = Substitute.For(); + targetFramework.ToString().Returns("net10.0"); - _projectMock.GetPackageReferences().Returns(new[] - { - new PackageReferenceMetadata("PackageA", new Dictionary()), + ILockFileTarget target = Substitute.For(); + target.TargetFramework.Returns(targetFramework); + ILockFileTargetLibrary[] targetLibraries = + [ + CreateLibrary("PackageA", "PackageC"), + CreateLibrary("PackageB", "PackageC"), + CreateLibrary("PackageC") + ]; + target.Libraries.Returns(targetLibraries); + _lockFileMock.Targets.Returns([target]); + + ITargetFrameworkInformation targetFrameworkInformation = Substitute.For(); + targetFrameworkInformation.FrameworkName.Returns(targetFramework); + ILibraryDependency[] directDependencies = + [ + CreateDependency("PackageA"), + CreateDependency("PackageB") + ]; + targetFrameworkInformation.Dependencies.Returns(directDependencies); + _packageSpecMock.TargetFrameworks.Returns([targetFrameworkInformation]); + + _projectMock.GetPackageReferences().Returns( + [ + new PackageReferenceMetadata("PackageA", new Dictionary()), new PackageReferenceMetadata("PackageB", new Dictionary { ["Publish"] = "false" }) - }); - _projectMock.GetPackageReferencesForTarget("net10.0").Returns(new[] - { - new PackageReferenceMetadata("PackageA", new Dictionary()), + ]); + _projectMock.GetPackageReferencesForTarget("net10.0").Returns( + [ + new PackageReferenceMetadata("PackageA", new Dictionary()), new PackageReferenceMetadata("PackageB", new Dictionary { ["Publish"] = "false" }) - }); + ]); - IEnumerable result = _uut.GetInstalledPackages(_projectPath, true, null, true); + IEnumerable result = _uut.GetInstalledPackages(_projectPath, true, null, true); - Assert.That(result.Select(p => p.Id), Does.Contain("PackageA")); - Assert.That(result.Select(p => p.Id), Does.Not.Contain("PackageB")); - Assert.That(result.Select(p => p.Id), Does.Contain("PackageC")); - } - finally - { - if (File.Exists(tempAssetsPath)) - { - File.Delete(tempAssetsPath); - } - } + Assert.That(result.Select(p => p.Id), Does.Contain("PackageA")); + Assert.That(result.Select(p => p.Id), Does.Not.Contain("PackageB")); + Assert.That(result.Select(p => p.Id), Does.Contain("PackageC")); } [Test] public void GetInstalledPackages_Should_Exclude_TransitiveDependency_If_OnlyReachableFrom_PublishFalseRoot() { - string tempAssetsPath = Path.GetTempFileName(); - try - { - _assetsFilePath = tempAssetsPath; - _lockFileFactory.GetFromFile(tempAssetsPath).Returns(_lockFileMock); - File.WriteAllText(tempAssetsPath, - """ - { - "targets": { - "net10.0": { - "PackageA/1.0.0": { - "type": "package" - }, - "PackageB/1.0.0": { - "type": "package", - "dependencies": { - "PackageC": "1.0.0" - } - }, - "PackageC/1.0.0": { - "type": "package" - } - } - } - } - """); - - INuGetFramework targetFramework = Substitute.For(); - targetFramework.ToString().Returns("net10.0"); - - ILockFileTarget target = Substitute.For(); - target.TargetFramework.Returns(targetFramework); - ILockFileLibrary[] targetLibraries = - { - CreateLibrary("PackageA"), - CreateLibrary("PackageB"), - CreateLibrary("PackageC") - }; - target.Libraries.Returns(targetLibraries); - _lockFileMock.Targets.Returns(new[] { target }); - - ITargetFrameworkInformation targetFrameworkInformation = Substitute.For(); - targetFrameworkInformation.FrameworkName.Returns(targetFramework); - ILibraryDependency[] directDependencies = - { - CreateDependency("PackageA"), - CreateDependency("PackageB") - }; - targetFrameworkInformation.Dependencies.Returns(directDependencies); - _packageSpecMock.TargetFrameworks.Returns(new[] { targetFrameworkInformation }); - - _projectMock.GetPackageReferences().Returns(new[] - { - new PackageReferenceMetadata("PackageA", new Dictionary()), - new PackageReferenceMetadata("PackageB", new Dictionary - { - ["Publish"] = "false" - }) - }); - _projectMock.GetPackageReferencesForTarget("net10.0").Returns(new[] - { - new PackageReferenceMetadata("PackageA", new Dictionary()), - new PackageReferenceMetadata("PackageB", new Dictionary - { - ["Publish"] = "false" - }) - }); - - IEnumerable result = _uut.GetInstalledPackages(_projectPath, true, null, true); - - Assert.That(result.Select(p => p.Id), Does.Contain("PackageA")); - Assert.That(result.Select(p => p.Id), Does.Not.Contain("PackageB")); - Assert.That(result.Select(p => p.Id), Does.Not.Contain("PackageC")); - } - finally - { - if (File.Exists(tempAssetsPath)) - { - File.Delete(tempAssetsPath); - } - } - } + INuGetFramework targetFramework = Substitute.For(); + targetFramework.ToString().Returns("net10.0"); - [Test] - public void GetInstalledPackages_Should_Exclude_TransitiveDependency_For_RidQualified_TargetKey() - { - string tempAssetsPath = Path.GetTempFileName(); - try - { - _assetsFilePath = tempAssetsPath; - _lockFileFactory.GetFromFile(tempAssetsPath).Returns(_lockFileMock); - File.WriteAllText(tempAssetsPath, - """ - { - "targets": { - "net10.0/win-x64": { - "PackageA/1.0.0": { - "type": "package" - }, - "PackageB/1.0.0": { - "type": "package", - "dependencies": { - "PackageC": "1.0.0" - } - }, - "PackageC/1.0.0": { - "type": "package" - } - } - } - } - """); - - INuGetFramework targetFramework = Substitute.For(); - targetFramework.ToString().Returns("net10.0"); - - ILockFileTarget target = Substitute.For(); - target.TargetFramework.Returns(targetFramework); - ILockFileLibrary[] targetLibraries = - { - CreateLibrary("PackageA"), - CreateLibrary("PackageB"), - CreateLibrary("PackageC") - }; - target.Libraries.Returns(targetLibraries); - _lockFileMock.Targets.Returns(new[] { target }); - - ITargetFrameworkInformation targetFrameworkInformation = Substitute.For(); - targetFrameworkInformation.FrameworkName.Returns(targetFramework); - ILibraryDependency[] directDependencies = - { - CreateDependency("PackageA"), - CreateDependency("PackageB") - }; - targetFrameworkInformation.Dependencies.Returns(directDependencies); - _packageSpecMock.TargetFrameworks.Returns(new[] { targetFrameworkInformation }); + ILockFileTarget target = Substitute.For(); + target.TargetFramework.Returns(targetFramework); + ILockFileTargetLibrary[] targetLibraries = + [ + CreateLibrary("PackageA"), + CreateLibrary("PackageB", "PackageC"), + CreateLibrary("PackageC") + ]; + target.Libraries.Returns(targetLibraries); + _lockFileMock.Targets.Returns([target]); - _projectMock.GetPackageReferences().Returns(new[] - { - new PackageReferenceMetadata("PackageA", new Dictionary()), + ITargetFrameworkInformation targetFrameworkInformation = Substitute.For(); + targetFrameworkInformation.FrameworkName.Returns(targetFramework); + ILibraryDependency[] directDependencies = + [ + CreateDependency("PackageA"), + CreateDependency("PackageB") + ]; + targetFrameworkInformation.Dependencies.Returns(directDependencies); + _packageSpecMock.TargetFrameworks.Returns([targetFrameworkInformation]); + + _projectMock.GetPackageReferences().Returns( + [ + new PackageReferenceMetadata("PackageA", new Dictionary()), new PackageReferenceMetadata("PackageB", new Dictionary { ["Publish"] = "false" }) - }); - _projectMock.GetPackageReferencesForTarget("net10.0").Returns(new[] - { - new PackageReferenceMetadata("PackageA", new Dictionary()), + ]); + _projectMock.GetPackageReferencesForTarget("net10.0").Returns( + [ + new PackageReferenceMetadata("PackageA", new Dictionary()), new PackageReferenceMetadata("PackageB", new Dictionary { ["Publish"] = "false" }) - }); + ]); - IEnumerable result = _uut.GetInstalledPackages(_projectPath, true, null, true); + IEnumerable result = _uut.GetInstalledPackages(_projectPath, true, null, true); - Assert.That(result.Select(p => p.Id), Does.Contain("PackageA")); - Assert.That(result.Select(p => p.Id), Does.Not.Contain("PackageB")); - Assert.That(result.Select(p => p.Id), Does.Not.Contain("PackageC")); - } - finally - { - if (File.Exists(tempAssetsPath)) - { - File.Delete(tempAssetsPath); - } - } + Assert.That(result.Select(p => p.Id), Does.Contain("PackageA")); + Assert.That(result.Select(p => p.Id), Does.Not.Contain("PackageB")); + Assert.That(result.Select(p => p.Id), Does.Not.Contain("PackageC")); } private static ILibraryDependency CreateDependency(string packageName) @@ -778,13 +617,22 @@ private static ILibraryDependency CreateDependency(string packageName) return dependency; } - private static ILockFileLibrary CreateLibrary(string packageName) + private static ILockFileTargetLibrary CreateLibrary(string packageName, params string[] dependencyNames) { - ILockFileLibrary library = Substitute.For(); + ILockFileTargetLibrary library = Substitute.For(); library.Name.Returns(packageName); library.Type.Returns("package"); library.Version.Returns(Substitute.For()); + IPackageDependency[] dependencies = dependencyNames.Select(CreatePackageDependency).ToArray(); + library.Dependencies.Returns(dependencies); return library; } + + private static IPackageDependency CreatePackageDependency(string dependencyName) + { + IPackageDependency packageDependency = Substitute.For(); + packageDependency.Id.Returns(dependencyName); + return packageDependency; + } } } diff --git a/tests/NuGetUtility.UrlToLicenseMapping.Test/NuGetUtility.UrlToLicenseMapping.Test.csproj b/tests/NuGetUtility.UrlToLicenseMapping.Test/NuGetUtility.UrlToLicenseMapping.Test.csproj index 70da25c5..bd1ae994 100644 --- a/tests/NuGetUtility.UrlToLicenseMapping.Test/NuGetUtility.UrlToLicenseMapping.Test.csproj +++ b/tests/NuGetUtility.UrlToLicenseMapping.Test/NuGetUtility.UrlToLicenseMapping.Test.csproj @@ -16,7 +16,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/tests/targets/PackagesConfigProject/PackagesConfigProject.csproj b/tests/targets/PackagesConfigProject/PackagesConfigProject.csproj index 17255b38..e607cb2c 100644 --- a/tests/targets/PackagesConfigProject/PackagesConfigProject.csproj +++ b/tests/targets/PackagesConfigProject/PackagesConfigProject.csproj @@ -47,8 +47,8 @@ - - ..\..\..\packages\TinyCsvParser.2.7.2\lib\netstandard2.0\TinyCsvParser.dll + + ..\..\..\packages\TinyCsvParser.3.0.1\lib\netstandard2.0\TinyCsvParser.dll diff --git a/tests/targets/PackagesConfigProject/packages.config b/tests/targets/PackagesConfigProject/packages.config index fedabdab..a0309e0b 100644 --- a/tests/targets/PackagesConfigProject/packages.config +++ b/tests/targets/PackagesConfigProject/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file