public void ExtractPackageSpecificNoWarnForFramework_InputWithProperties()
        {
            // Arrange

            var packageId1 = "test_id1";
            var packageId2 = "test_id2";
            var net461     = NuGetFramework.Parse("net461");
            var netcoreapp = NuGetFramework.Parse("netcoreapp2.0");
            var input      = new PackageSpecificWarningProperties();

            input.AddRangeOfCodes(
                new List <NuGetLogCode> {
                NuGetLogCode.NU1601, NuGetLogCode.NU1605
            },
                packageId1,
                net461);
            input.AddRangeOfFrameworks(
                NuGetLogCode.NU1701,
                packageId2,
                new List <NuGetFramework> {
                net461, netcoreapp
            });
            input.AddRangeOfFrameworks(
                NuGetLogCode.NU1701,
                packageId1,
                new List <NuGetFramework> {
                net461, netcoreapp
            });
            input.AddRangeOfFrameworks(
                NuGetLogCode.NU1701,
                packageId2,
                new List <NuGetFramework> {
                net461, netcoreapp
            });
            input.AddRangeOfFrameworks(
                NuGetLogCode.NU1604,
                packageId1,
                new List <NuGetFramework> {
                net461
            });

            var expected = new Dictionary <NuGetFramework, Dictionary <string, HashSet <NuGetLogCode> > >
            {
                [net461] = new Dictionary <string, HashSet <NuGetLogCode> >(StringComparer.OrdinalIgnoreCase)
                {
                    [packageId1.ToUpper()] = new HashSet <NuGetLogCode>
                    {
                        NuGetLogCode.NU1601,
                        NuGetLogCode.NU1604,
                        NuGetLogCode.NU1605,
                        NuGetLogCode.NU1701,
                    },
                    [packageId2.ToUpper()] = new HashSet <NuGetLogCode>
                    {
                        NuGetLogCode.NU1701
                    }
                },
                [netcoreapp] = new Dictionary <string, HashSet <NuGetLogCode> >(StringComparer.OrdinalIgnoreCase)
                {
                    [packageId1.ToLower()] = new HashSet <NuGetLogCode>
                    {
                        NuGetLogCode.NU1701,
                    },
                    [packageId2.ToLower()] = new HashSet <NuGetLogCode>
                    {
                        NuGetLogCode.NU1701
                    }
                }
            };

            // Act
            var resultNet461     = TransitiveNoWarnUtils.ExtractPackageSpecificNoWarnForFramework(input, net461);
            var resultNetcoreapp = TransitiveNoWarnUtils.ExtractPackageSpecificNoWarnForFramework(input, netcoreapp);

            // Assert
            resultNet461.Should().NotBeNull();
            resultNet461.Should().BeEquivalentTo(expected[net461]);
            resultNetcoreapp.Should().NotBeNull();
            resultNetcoreapp.Should().BeEquivalentTo(expected[netcoreapp]);
        }
        public void MergePackageSpecificWarningProperties_MergesNonEmptyCollections()
        {
            // Arrange
            var packageId1     = "test_id1";
            var packageId2     = "test_id2";
            var net461         = NuGetFramework.Parse("net461");
            var netcoreapp     = NuGetFramework.Parse("netcoreapp2.0");
            var expectedResult = new PackageSpecificWarningProperties();

            expectedResult.AddRangeOfCodes(
                new List <NuGetLogCode> {
                NuGetLogCode.NU1601, NuGetLogCode.NU1605
            },
                packageId1,
                net461);
            expectedResult.AddRangeOfFrameworks(
                NuGetLogCode.NU1701,
                packageId2,
                new List <NuGetFramework> {
                net461, netcoreapp
            });
            expectedResult.AddRangeOfFrameworks(
                NuGetLogCode.NU1701,
                packageId1,
                new List <NuGetFramework> {
                net461, netcoreapp
            });
            expectedResult.AddRangeOfFrameworks(
                NuGetLogCode.NU1701,
                packageId2,
                new List <NuGetFramework> {
                net461, netcoreapp
            });
            expectedResult.AddRangeOfFrameworks(
                NuGetLogCode.NU1604,
                packageId1,
                new List <NuGetFramework> {
                net461, netcoreapp
            });


            var first = new PackageSpecificWarningProperties();

            first.AddRangeOfCodes(
                new List <NuGetLogCode> {
                NuGetLogCode.NU1601, NuGetLogCode.NU1605
            },
                packageId1,
                net461);
            first.AddRangeOfFrameworks(
                NuGetLogCode.NU1701,
                packageId2,
                new List <NuGetFramework> {
                net461, netcoreapp
            });
            first.AddRangeOfFrameworks(
                NuGetLogCode.NU1701,
                packageId1,
                new List <NuGetFramework> {
                netcoreapp
            });

            var second = new PackageSpecificWarningProperties();

            second.AddRangeOfFrameworks(
                NuGetLogCode.NU1701,
                packageId2,
                new List <NuGetFramework> {
                net461, netcoreapp
            });
            second.AddRangeOfFrameworks(
                NuGetLogCode.NU1604,
                packageId1,
                new List <NuGetFramework> {
                net461, netcoreapp
            });
            second.AddRangeOfFrameworks(
                NuGetLogCode.NU1701,
                packageId1,
                new List <NuGetFramework> {
                net461
            });


            var expectedNoWarnForNet461     = TransitiveNoWarnUtils.ExtractPackageSpecificNoWarnForFramework(expectedResult, net461);
            var expectedNoWarnForNetcoreapp = TransitiveNoWarnUtils.ExtractPackageSpecificNoWarnForFramework(expectedResult, netcoreapp);

            var firstNoWarnForNet461     = TransitiveNoWarnUtils.ExtractPackageSpecificNoWarnForFramework(first, net461);
            var firstNoWarnForNetcoreapp = TransitiveNoWarnUtils.ExtractPackageSpecificNoWarnForFramework(first, netcoreapp);

            var secondNoWarnForNet461     = TransitiveNoWarnUtils.ExtractPackageSpecificNoWarnForFramework(second, net461);
            var secondNoWarnForNetcoreapp = TransitiveNoWarnUtils.ExtractPackageSpecificNoWarnForFramework(second, netcoreapp);

            // Act
            var mergedNoWarnForNet461     = TransitiveNoWarnUtils.MergePackageSpecificNoWarn(firstNoWarnForNet461, secondNoWarnForNet461);
            var mergedNoWarnForNetcoreapp = TransitiveNoWarnUtils.MergePackageSpecificNoWarn(firstNoWarnForNetcoreapp, secondNoWarnForNetcoreapp);

            // Assert
            mergedNoWarnForNet461.Should().NotBeNull();
            mergedNoWarnForNet461.Should().BeEquivalentTo(expectedNoWarnForNet461);

            mergedNoWarnForNetcoreapp.Should().NotBeNull();
            mergedNoWarnForNetcoreapp.Should().BeEquivalentTo(expectedNoWarnForNetcoreapp);
        }