public void BeforeAddOrUpdate_WhenUnresolvedAndExistsResolvedInSnapshot_ShouldReturnNull() { var unresolvedDependency = new TestDependency { Id = "dependency", Resolved = false }; var resolvedDependency = new TestDependency { Id = "dependency", Resolved = true }; var dependencyById = new Dictionary <DependencyId, IDependency> { { resolvedDependency.GetDependencyId(), resolvedDependency } }; var context = new AddDependencyContext(dependencyById); var filter = new UnresolvedDependenciesSnapshotFilter(); filter.BeforeAddOrUpdate( unresolvedDependency, null !, null, context); // Dependency rejected Assert.Null(context.GetResult(filter)); // Nothing else changed Assert.False(context.Changed); }
public void BeforeAddOrUpdate_WhenNeedToApplyImplicit_ShouldSetProperties() { const string providerType = "providerType"; const string projectItemSpec = "projectItemSpec"; var implicitIcon = KnownMonikers.Abbreviation; var dependency = new TestDependency { Id = "dependency1", ProviderType = providerType, Implicit = false, Resolved = true, Flags = DependencyTreeFlags.ResolvedDependencyFlags, OriginalItemSpec = projectItemSpec, IconSet = new DependencyIconSet(KnownMonikers.Reference, KnownMonikers.Reference, KnownMonikers.Reference, KnownMonikers.Reference) }; var dependencyById = new Dictionary <DependencyId, IDependency> { { dependency.GetDependencyId(), dependency } }; var context = new AddDependencyContext(dependencyById); var filter = new ImplicitDependenciesSnapshotFilter(); var subTreeProvider = IProjectDependenciesSubTreeProviderFactory.ImplementInternal( providerType: providerType, implicitIcon: implicitIcon); filter.BeforeAddOrUpdate( dependency, new Dictionary <string, IProjectDependenciesSubTreeProvider> { { providerType, subTreeProvider } }, ImmutableHashSet <string> .Empty, context); var acceptedDependency = context.GetResult(filter); // Returns changed dependency Assert.NotNull(acceptedDependency); Assert.NotSame(dependency, acceptedDependency); DependencyAssert.Equal( new TestDependency { ClonePropertiesFrom = dependency, Implicit = true, IconSet = new DependencyIconSet( implicitIcon, implicitIcon, KnownMonikers.Reference, KnownMonikers.Reference), Flags = DependencyTreeFlags.ResolvedDependencyFlags.Except(DependencyTreeFlags.SupportsRemove) }, acceptedDependency !); // No other changes made Assert.False(context.Changed); }
public void BeforeAddOrUpdate_WhenThereIsMatchingDependencyWithAliasApplied_ShouldUpdateCaptionForCurrentDependency() { // Same provider type // Duplicate caption, though with parenthesized text after one instance // -> Changes caption of non-parenthesized const string providerType = "provider"; const string caption = "caption"; var dependency = new TestDependency { Id = "id1", OriginalItemSpec = "originalItemSpec1", ProviderType = providerType, Caption = caption }; var otherDependency = new TestDependency { ClonePropertiesFrom = dependency, Id = "id2", OriginalItemSpec = "originalItemSpec2", Caption = $"{caption} (originalItemSpec2)" // caption already includes alias }; var dependencyById = new IDependency[] { dependency, otherDependency }.ToDictionary(IDependencyExtensions.GetDependencyId); var context = new AddDependencyContext(dependencyById); var filter = new DeduplicateCaptionsSnapshotFilter(); filter.BeforeAddOrUpdate( dependency, null !, null, context); // The context was unchanged, beyond the filtered dependency Assert.False(context.Changed); // The filtered dependency had its caption changed to its alias var dependencyAfter = context.GetResult(filter); DependencyAssert.Equal(new TestDependency { ClonePropertiesFrom = dependency, Caption = "caption (originalItemSpec1)" }, dependencyAfter !); // The other dependency had its caption changed to its alias Assert.True(context.TryGetDependency(otherDependency.GetDependencyId(), out IDependency otherDependencyAfter)); DependencyAssert.Equal(new TestDependency { ClonePropertiesFrom = otherDependency, Caption = "caption (originalItemSpec2)" }, otherDependencyAfter); }
public void BeforeAddOrUpdate_WhenThereIsMatchingDependencies_ShouldUpdateCaptionForAll() { // Same provider type // Same captions // -> Changes caption for both to match alias const string providerType = "provider"; const string caption = "caption"; var dependency = new TestDependency { Id = "id1", OriginalItemSpec = "originalItemSpec1", ProviderType = providerType, Caption = caption }; var otherDependency = new TestDependency { ClonePropertiesFrom = dependency, // clone, with changes Id = "id2", OriginalItemSpec = "originalItemSpec2" }; var dependencyById = new IDependency[] { dependency, otherDependency }.ToDictionary(IDependencyExtensions.GetDependencyId); var context = new AddDependencyContext(dependencyById); var filter = new DeduplicateCaptionsSnapshotFilter(); filter.BeforeAddOrUpdate( dependency, null !, null, context); // The context changed, beyond just the filtered dependency Assert.True(context.Changed); // The filtered dependency had its caption changed to its alias var dependencyAfter = context.GetResult(filter); DependencyAssert.Equal(new TestDependency { ClonePropertiesFrom = dependency, Caption = "caption (originalItemSpec1)" }, dependencyAfter !); // The other dependency had its caption changed to its alias Assert.True(context.TryGetDependency(otherDependency.GetDependencyId(), out IDependency otherDependencyAfter)); DependencyAssert.Equal(new TestDependency { ClonePropertiesFrom = otherDependency, Caption = "caption (originalItemSpec2)" }, otherDependencyAfter); }
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_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); }