File: UnusedReferences\ProjectAssets\ProjectAssetsReaderTests.cs
Web Access
Project: src\src\EditorFeatures\Test\Microsoft.CodeAnalysis.EditorFeatures.UnitTests.csproj (Microsoft.CodeAnalysis.EditorFeatures.UnitTests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
using System.Collections.Immutable;
using System.IO;
using Microsoft.CodeAnalysis.Test.Utilities;
using Microsoft.CodeAnalysis.UnusedReferences;
using Microsoft.CodeAnalysis.UnusedReferences.ProjectAssets;
using Xunit;
 
namespace Microsoft.CodeAnalysis.Editor.UnitTests.UnusedReferences.ProjectAssets;
 
[Trait(Traits.Feature, Traits.Features.Packaging)]
public partial class ProjectAssetsReaderTests
{
    private const string TargetFramework = ".NETCoreApp,Version=v3.1";
    private const int Version3 = 3;
 
    [Theory]
    [InlineData(0)]
    [InlineData(1)]
    [InlineData(2)]
    [InlineData(4)]
    [InlineData(5)]
    public void NoReferencesReadWhenProjectAssetsVersionNot3(int version)
    {
        var myPackage = PackageReference("MyPackage.dll");
        var references = ImmutableArray.Create(myPackage);
        var projectAssets = TestProjectAssetsFile.Create(version, TargetFramework, references);
        var realizedReferences = ProjectAssetsReader.AddDependencyHierarchies(references, projectAssets);
        Assert.Empty(realizedReferences);
    }
 
    [Fact]
    public void ReferencesReadWhenProjectAssetsVersionIs3()
    {
        var myPackage = PackageReference("MyPackage.dll");
        var references = ImmutableArray.Create(myPackage);
        var projectAssets = TestProjectAssetsFile.Create(Version3, TargetFramework, references);
        var realizedReferences = ProjectAssetsReader.AddDependencyHierarchies(references, projectAssets);
        var realizedReference = Assert.Single(realizedReferences);
        Assert.Equal(myPackage.ItemSpecification, realizedReference.ItemSpecification);
    }
 
    [Fact]
    public void ReferenceNotReadWhenReferenceNotPresent()
    {
        var references = ImmutableArray.Create(PackageReference("MyPackage.dll"));
        var projectAssets = TestProjectAssetsFile.Create(Version3, TargetFramework, references);
        var differentReference = ImmutableArray.Create(ProjectReference("MyProject.csproj"));
        var realizedReferences = ProjectAssetsReader.AddDependencyHierarchies(differentReference, projectAssets);
        Assert.Empty(realizedReferences);
    }
 
    [Fact]
    public void ProjectReferencesReadHaveTheirPathAsTheItemSpecification()
    {
        const string mylibraryPath = @".\Library\MyLibrary.csproj";
        var references = ImmutableArray.Create(ProjectReference(mylibraryPath));
        var projectAssets = TestProjectAssetsFile.Create(Version3, TargetFramework, references);
        var realizedReferences = ProjectAssetsReader.AddDependencyHierarchies(references, projectAssets);
        var realizedReference = Assert.Single(realizedReferences);
        Assert.Equal(mylibraryPath, realizedReference.ItemSpecification);
    }
 
    private static ReferenceInfo ProjectReference(string projectPath, params ReferenceInfo[] dependencies) => ProjectReference(projectPath, false, dependencies);
    private static ReferenceInfo ProjectReference(string projectPath, bool treatAsUsed, params ReferenceInfo[] dependencies)
        => new(ReferenceType.Project, projectPath, treatAsUsed, ImmutableArray.Create(Path.ChangeExtension(projectPath, "dll")), dependencies.ToImmutableArray());
 
    private static ReferenceInfo PackageReference(string assemblyPath, params ReferenceInfo[] dependencies) => PackageReference(assemblyPath, false, dependencies);
    private static ReferenceInfo PackageReference(string assemblyPath, bool treatAsUsed, params ReferenceInfo[] dependencies)
        => new(ReferenceType.Package, Path.GetFileNameWithoutExtension(assemblyPath), treatAsUsed, ImmutableArray.Create(assemblyPath), dependencies.ToImmutableArray());
}