public void BeforeRemove_WhenPackageRemoving_ShouldCleanupSdk()
        {
            const string packageName = "packageName";

            var sdkDependency = new TestDependency
            {
                Id           = packageName,
                ProviderType = SdkRuleHandler.ProviderTypeString,
                Resolved     = true,
                Flags        = DependencyTreeFlags.SdkDependency.Union(ProjectTreeFlags.ResolvedReference)
            };

            var packageDependency = new TestDependency
            {
                Id           = packageName,
                ProviderType = PackageRuleHandler.ProviderTypeString,
                Flags        = DependencyTreeFlags.PackageDependency,
                Resolved     = true
            };

            var builder = new IDependency[] { packageDependency, sdkDependency }.ToDictionary(IDependencyExtensions.GetDependencyId);

            var context = new RemoveDependencyContext(builder);

            var filter = new SdkAndPackagesDependenciesSnapshotFilter();

            filter.BeforeRemove(
                dependency: packageDependency,
                context);

            // Accepts removal
            Assert.True(context.GetResult(filter));

            // Makes other changes too
            Assert.True(context.Changed);

            Assert.True(builder.TryGetValue(packageDependency.GetDependencyId(), out var afterPackageDependency));
            Assert.Same(packageDependency, afterPackageDependency);

            Assert.True(builder.TryGetValue(sdkDependency.GetDependencyId(), out var afterSdkDependency));
            DependencyAssert.Equal(
                afterSdkDependency.ToUnresolved(SdkReference.SchemaName),
                afterSdkDependency);
        }
        public void BeforeAddOrUpdate_WhenSdk_ShouldFindMatchingPackageAndSetProperties()
        {
            const string sdkName = "sdkName";

            var sdkDependency = new TestDependency
            {
                Id           = sdkName,
                ProviderType = SdkRuleHandler.ProviderTypeString,
                Resolved     = false,
                Flags        = DependencyTreeFlags.SdkDependency
            };

            var packageDependency = new TestDependency
            {
                Id           = sdkName,
                ProviderType = PackageRuleHandler.ProviderTypeString,
                Resolved     = true,
                Flags        = DependencyTreeFlags.PackageDependency
            };

            var builder = new IDependency[] { sdkDependency, packageDependency }.ToDictionary(IDependencyExtensions.GetDependencyId);

            var context = new AddDependencyContext(builder);

            var filter = new SdkAndPackagesDependenciesSnapshotFilter();

            filter.BeforeAddOrUpdate(
                sdkDependency,
                null !,
                null,
                context);

            var acceptedDependency = context.GetResult(filter);

            // Dependency should be accepted, but converted to resolved state
            Assert.NotNull(acceptedDependency);
            Assert.NotSame(sdkDependency, acceptedDependency);
            DependencyAssert.Equal(
                sdkDependency.ToResolved(schemaName: ResolvedSdkReference.SchemaName, diagnosticLevel: DiagnosticLevel.None),
                acceptedDependency !);

            // No changes other than the filtered dependency
            Assert.False(context.Changed);
        }
        public void BeforeAddOrUpdate_WhenPackage_ShouldFindMatchingSdkAndSetProperties()
        {
            const string packageName = "packageName";

            var sdkDependency = new TestDependency
            {
                Id           = packageName,
                ProviderType = SdkRuleHandler.ProviderTypeString,
                Resolved     = true,
                Flags        = DependencyTreeFlags.PackageDependency.Union(ProjectTreeFlags.BrokenReference) // to see if unresolved is fixed
            };

            var packageDependency = new TestDependency
            {
                Id           = packageName,
                ProviderType = PackageRuleHandler.ProviderTypeString,
                Flags        = DependencyTreeFlags.PackageDependency,
                Resolved     = true
            };

            var builder = new IDependency[] { packageDependency, sdkDependency }.ToDictionary(IDependencyExtensions.GetDependencyId);

            var context = new AddDependencyContext(builder);

            var filter = new SdkAndPackagesDependenciesSnapshotFilter();

            filter.BeforeAddOrUpdate(
                packageDependency,
                null !,
                null,
                context);

            // Accepts unchanged dependency
            Assert.Same(packageDependency, context.GetResult(filter));

            // Other changes made
            Assert.True(context.Changed);

            Assert.True(context.TryGetDependency(sdkDependency.GetDependencyId(), out IDependency sdkDependencyAfter));
            DependencyAssert.Equal(
                sdkDependency.ToResolved(schemaName: ResolvedSdkReference.SchemaName, diagnosticLevel: DiagnosticLevel.None),
                sdkDependencyAfter);
        }