public void GetTargetFrameworkInfos_WithUAPProject_InfersUAPTargetFramework()
        {
            // Arrange
            string key = string.Empty;
            var    runtimeIdentifierGraphPath = Path.Combine(Path.GetTempPath(), "runtime.json");

            var project = new MockMSBuildProject("Project-core",
                                                 new Dictionary <string, string>
            {
                { "AssetTargetFallback", "" },
                { "PackageTargetFallback", "" },
                { "TargetFramework", key },
                { "TargetFrameworkIdentifier", FrameworkConstants.FrameworkIdentifiers.NetCore },
                { "TargetFrameworkVersion", "v5.0" },
                { "TargetFrameworkMoniker", $"{FrameworkConstants.FrameworkIdentifiers.NetCore},Version=5.0" },
                { "TargetPlatformIdentifier", "UAP" },
                { "TargetPlatformVersion", "10.1608.1" },
                { "TargetPlatformMoniker", "UAP,Version=10.1608.1" }
            },
                                                 new Dictionary <string, IList <IMSBuildItem> >
            {
                ["PackageReference"] = new List <IMSBuildItem>
                {
                    new MSBuildItem("PackageA", new Dictionary <string, string> {
                        ["Version"] = "2.0.0"
                    }),
                }
            });

            // Act
            List <TargetFrameworkInformation> targetFrameworkInfos = MSBuildStaticGraphRestore.GetTargetFrameworkInfos(
                new Dictionary <string, IMSBuildProject>()
            {
                { string.Empty, project }
            },
                isCpvmEnabled: false);

            // Assert
            targetFrameworkInfos.Should().HaveCount(1);
            TargetFrameworkInformation targetFrameworkInformation = targetFrameworkInfos.Single(f => f.TargetAlias == key);

            targetFrameworkInformation.Dependencies.Should().HaveCount(1);
            targetFrameworkInformation.Dependencies.Single().Name.Should().Be("PackageA");
            targetFrameworkInformation.Dependencies.Single().LibraryRange.VersionRange.OriginalString.Should().Be("2.0.0");
            targetFrameworkInformation.FrameworkName.GetShortFolderName().Should().Be("uap10.1608.1");
            targetFrameworkInformation.AssetTargetFallback.Should().BeFalse();
        }
        public void GetTargetFrameworkInfos_WithCustomAliases_InfersCorrectTargetFramework()
        {
            // Arrange
            string latestNet  = "latestNet";
            string latestCore = "latestCore";
            var    atf        = "net472";
            var    runtimeIdentifierGraphPath = Path.Combine(Path.GetTempPath(), "runtime.json");

            var innerNodes = new Dictionary <string, IMSBuildProject>
            {
                [latestCore] = new MockMSBuildProject("Project-core",
                                                      new Dictionary <string, string>
                {
                    { "AssetTargetFallback", atf },
                    { "PackageTargetFallback", "" },
                    { "TargetFramework", latestCore },
                    { "TargetFrameworkIdentifier", FrameworkConstants.FrameworkIdentifiers.NetCoreApp },
                    { "TargetFrameworkVersion", "v5.0" },
                    { "TargetFrameworkMoniker", $"{FrameworkConstants.FrameworkIdentifiers.NetCoreApp},Version=5.0" },
                    { "TargetPlatformIdentifier", "android" },
                    { "TargetPlatformVersion", "21.0" },
                    { "TargetPlatformMoniker", "android,Version=21.0" },
                    { "RuntimeIdentifierGraphPath", runtimeIdentifierGraphPath }
                },
                                                      new Dictionary <string, IList <IMSBuildItem> >
                {
                    ["PackageReference"] = new List <IMSBuildItem>
                    {
                        new MSBuildItem("PackageA", new Dictionary <string, string> {
                            ["Version"] = "2.0.0"
                        }),
                    }
                }),
                [latestNet] = new MockMSBuildProject("Project-net",
                                                     new Dictionary <string, string>
                {
                    { "AssetTargetFallback", "" },
                    { "PackageTargetFallback", "" },
                    { "TargetFramework", latestNet },
                    { "TargetFrameworkIdentifier", FrameworkConstants.FrameworkIdentifiers.Net },
                    { "TargetFrameworkVersion", "v4.6.1" },
                    { "TargetFrameworkMoniker", $"{FrameworkConstants.FrameworkIdentifiers.Net},Version=4.6.1" },
                    { "TargetPlatformIdentifier", "" },
                    { "TargetPlatformVersion", "" },
                    { "TargetPlatformMoniker", "" },
                    { "RuntimeIdentifierGraphPath", runtimeIdentifierGraphPath }
                },
                                                     new Dictionary <string, IList <IMSBuildItem> >
                {
                    ["PackageReference"] = new List <IMSBuildItem>
                    {
                        new MSBuildItem("PackageB", new Dictionary <string, string> {
                            ["Version"] = "2.1.0"
                        }),
                    },
                }),
            };

            // Act
            List <TargetFrameworkInformation> targetFrameworkInfos = MSBuildStaticGraphRestore.GetTargetFrameworkInfos(innerNodes, isCpvmEnabled: false);

            // Assert
            targetFrameworkInfos.Should().HaveCount(2);
            TargetFrameworkInformation coreTFI = targetFrameworkInfos.Single(f => f.TargetAlias == latestCore);
            TargetFrameworkInformation netTFI  = targetFrameworkInfos.Single(f => f.TargetAlias == latestNet);

            coreTFI.Dependencies.Should().HaveCount(1);
            coreTFI.Dependencies.Single().Name.Should().Be("PackageA");
            coreTFI.Dependencies.Single().LibraryRange.VersionRange.OriginalString.Should().Be("2.0.0");
            coreTFI.RuntimeIdentifierGraphPath.Should().Be(runtimeIdentifierGraphPath);
            coreTFI.FrameworkName.GetShortFolderName().Should().Be("net5.0-android21.0");
            coreTFI.AssetTargetFallback.Should().BeTrue();
            AssetTargetFallbackFramework assetTargetFallbackFramework = (AssetTargetFallbackFramework)coreTFI.FrameworkName;

            assetTargetFallbackFramework.Fallback.Should().HaveCount(1);
            assetTargetFallbackFramework.Fallback.Single().GetShortFolderName().Should().Be("net472");

            netTFI.Dependencies.Should().HaveCount(1);
            netTFI.Dependencies.Single().Name.Should().Be("PackageB");
            netTFI.Dependencies.Single().LibraryRange.VersionRange.OriginalString.Should().Be("2.1.0");
            netTFI.RuntimeIdentifierGraphPath.Should().Be(runtimeIdentifierGraphPath);
            netTFI.FrameworkName.Should().Be(FrameworkConstants.CommonFrameworks.Net461);
            netTFI.AssetTargetFallback.Should().BeFalse();
        }
        public void GetTargetFrameworkInfos_TheCentralVersionInformationIsAdded()
        {
            // Arrange
            string netstandard22 = "netstandard2.2";
            string netstandard20 = "netstandard2.0";
            string netstandard23 = "netstandard2.3";

            var innerNodes = new Dictionary <string, IMSBuildProject>
            {
                [netstandard20] = new MockMSBuildProject("Project-netstandard2.0",
                                                         new Dictionary <string, string>(),
                                                         new Dictionary <string, IList <IMSBuildItem> >
                {
                    ["PackageReference"] = new List <IMSBuildItem>
                    {
                        new MSBuildItem("PackageA", new Dictionary <string, string> {
                            ["IsImplicitlyDefined"] = bool.TrueString
                        }),
                    },
                    ["PackageVersion"] = new List <IMSBuildItem>
                    {
                        new MSBuildItem("PackageA", new Dictionary <string, string> {
                            ["Version"] = "2.0.0"
                        }),
                        new MSBuildItem("PackageB", new Dictionary <string, string> {
                            ["Version"] = "3.0.0"
                        }),
                    },
                }),
                [netstandard22] = new MockMSBuildProject("Project-netstandard2.2",
                                                         new Dictionary <string, string>(),
                                                         new Dictionary <string, IList <IMSBuildItem> >
                {
                    ["PackageReference"] = new List <IMSBuildItem>
                    {
                        new MSBuildItem("PackageA", new Dictionary <string, string> {
                            ["Version"] = "11.0.0", ["IsImplicitlyDefined"] = bool.FalseString
                        }),
                    },
                    ["PackageVersion"] = new List <IMSBuildItem>
                    {
                        new MSBuildItem("PackageA", new Dictionary <string, string> {
                            ["Version"] = "2.2.2"
                        }),
                        new MSBuildItem("PackageB", new Dictionary <string, string> {
                            ["Version"] = "3.2.0"
                        }),
                    },
                }),
                [netstandard23] = new MockMSBuildProject("Project-netstandard2.3",
                                                         new Dictionary <string, string>(),
                                                         new Dictionary <string, IList <IMSBuildItem> >
                {
                    ["PackageReference"] = new List <IMSBuildItem>
                    {
                        new MSBuildItem("PackageA", new Dictionary <string, string> {
                            ["IsImplicitlyDefined"] = bool.FalseString
                        }),
                    },
                    ["PackageVersion"] = new List <IMSBuildItem>
                    {
                        new MSBuildItem("PackageA", new Dictionary <string, string> {
                            ["Version"] = "2.0.0"
                        }),
                        new MSBuildItem("PackageB", new Dictionary <string, string> {
                            ["Version"] = "3.0.0"
                        }),
                    },
                }),
            };

            var targetFrameworkInfos = MSBuildStaticGraphRestore.GetTargetFrameworkInfos(innerNodes, isCpvmEnabled: true);

            // Assert
            Assert.Equal(3, targetFrameworkInfos.Count);
            var framework20 = targetFrameworkInfos.Single(f => f.TargetAlias == netstandard20);
            var framework22 = targetFrameworkInfos.Single(f => f.TargetAlias == netstandard22);
            var framework23 = targetFrameworkInfos.Single(f => f.TargetAlias == netstandard23);

            Assert.Equal(1, framework20.Dependencies.Count);
            Assert.Equal("PackageA", framework20.Dependencies.First().Name);
            Assert.Null(framework20.Dependencies.First().LibraryRange.VersionRange);

            Assert.Equal(2, framework20.CentralPackageVersions.Count);
            Assert.Equal("2.0.0", framework20.CentralPackageVersions["PackageA"].VersionRange.OriginalString);
            Assert.Equal("3.0.0", framework20.CentralPackageVersions["PackageB"].VersionRange.OriginalString);

            Assert.Equal(1, framework22.Dependencies.Count);
            Assert.Equal("PackageA", framework22.Dependencies.First().Name);
            Assert.Equal("11.0.0", framework22.Dependencies.First().LibraryRange.VersionRange.OriginalString);

            Assert.Equal(2, framework22.CentralPackageVersions.Count);
            Assert.Equal("2.2.2", framework22.CentralPackageVersions["PackageA"].VersionRange.OriginalString);
            Assert.Equal("3.2.0", framework22.CentralPackageVersions["PackageB"].VersionRange.OriginalString);

            Assert.Equal(1, framework23.Dependencies.Count);
            Assert.Equal("PackageA", framework23.Dependencies.First().Name);
            Assert.Equal("2.0.0", framework23.Dependencies.First().LibraryRange.VersionRange.OriginalString);
        }