From 351376980c4741e2a189ef306169a80657df2a52 Mon Sep 17 00:00:00 2001 From: Blaise Taylor Date: Mon, 16 Feb 2026 07:03:05 -0500 Subject: [PATCH 1/3] AB#43 SonarCloud reported blockers. --- .../DesignerSerializationManagerTests.cs | 557 ++++++++++++++++++ ...entModel.Design.Serialization.Tests.csproj | 1 + .../DesignerSerializationManager.cs | 8 +- 3 files changed, 562 insertions(+), 4 deletions(-) diff --git a/LogicBuilder.ComponentModel.Design.Serialization.Tests/DesignerSerializationManagerTests.cs b/LogicBuilder.ComponentModel.Design.Serialization.Tests/DesignerSerializationManagerTests.cs index 24a11b4..318776c 100644 --- a/LogicBuilder.ComponentModel.Design.Serialization.Tests/DesignerSerializationManagerTests.cs +++ b/LogicBuilder.ComponentModel.Design.Serialization.Tests/DesignerSerializationManagerTests.cs @@ -1,5 +1,7 @@ using System.ComponentModel; +using System.ComponentModel.Design; using System.ComponentModel.Design.Serialization; +using Moq; namespace LogicBuilder.ComponentModel.Design.Serialization.Tests { @@ -151,6 +153,26 @@ public void Container_ThrowsExceptionDuringSession() } } + [Fact] + public void Container_GetsFromDesignerHostWhenNull() + { + // Arrange + var container = new Container(); + var mockHost = new Mock(); + mockHost.Setup(h => h.Container).Returns(container); + + var mockProvider = new Mock(); + mockProvider.Setup(p => p.GetService(typeof(IDesignerHost))).Returns(mockHost.Object); + + var manager = new DesignerSerializationManager(mockProvider.Object); + + // Act + var result = manager.Container; + + // Assert + Assert.Same(container, result); + } + [Fact] public void PropertyProvider_CanSetAndGet() { @@ -165,6 +187,25 @@ public void PropertyProvider_CanSetAndGet() Assert.Same(provider, manager.PropertyProvider); } + [Fact] + public void PropertyProvider_ClearsPropertiesWhenChanged() + { + // Arrange + var manager = (IDesignerSerializationManager)new DesignerSerializationManager(); + var provider1 = new TestPropertyProvider(); + var provider2 = new TestPropertyProvider(); + + ((DesignerSerializationManager)manager).PropertyProvider = provider1; + var props1 = manager.Properties; + + // Act + ((DesignerSerializationManager)manager).PropertyProvider = provider2; + var props2 = manager.Properties; + + // Assert + Assert.NotSame(props1, props2); + } + [Fact] public void Errors_ThrowsExceptionOutsideSession() { @@ -294,6 +335,21 @@ public void Properties_ReturnsEmptyCollectionWhenNoProvider() Assert.Empty(properties); } + [Fact] + public void Properties_ReturnsWrappedPropertiesFromProvider() + { + // Arrange + var manager = (IDesignerSerializationManager)new DesignerSerializationManager(); + ((DesignerSerializationManager)manager).PropertyProvider = new TestPropertyProvider(); + + // Act + var properties = manager.Properties; + + // Assert + Assert.NotNull(properties); + Assert.True(properties.Count > 0); + } + [Fact] public void AddSerializationProvider_AddsProvider() { @@ -366,6 +422,203 @@ public void CreateInstance_ThrowsExceptionForDuplicateName() } } + [Fact] + public void CreateInstance_RecyclesInstanceWhenRecycleInstancesIsTrue() + { + // Arrange + var manager = (IDesignerSerializationManager)new DesignerSerializationManager + { + RecycleInstances = true + }; + + // Act & Assert + using (((DesignerSerializationManager)manager).CreateSession()) + { + var instance1 = manager.CreateInstance(typeof(TestClass), null, "test", false); + Assert.Same(instance1, instance1); + } + } + + [Fact] + public void CreateInstance_DoesNotRecycleInstanceWhenTypeMismatchAndValidateRecycledTypesIsTrue() + { + // Arrange + var manager = (IDesignerSerializationManager)new DesignerSerializationManager + { + RecycleInstances = true, + ValidateRecycledTypes = true + }; + + // Act & Assert + using (((DesignerSerializationManager)manager).CreateSession()) + { + var instance1 = manager.CreateInstance(typeof(TestClass), null, "test1", false); + var instance2 = manager.CreateInstance(typeof(TestClass2), null, "test2", false); + Assert.NotSame(instance1, instance2); + } + } + + [Fact] + public void CreateInstance_RecyclesFromContainerWhenAvailable() + { + // Arrange + var container = new Container(); + var existingComponent = new TestComponent(); + container.Add(existingComponent, "test"); + + var manager = (IDesignerSerializationManager)new DesignerSerializationManager + { + RecycleInstances = true, + Container = container + }; + + // Act & Assert + using (((DesignerSerializationManager)manager).CreateSession()) + { + var instance = manager.CreateInstance(typeof(TestComponent), null, "test", true); + Assert.Same(existingComponent, instance); + } + } + + [Fact] + public void CreateInstance_UsesDesignerHostToCreateComponent() + { + // Arrange + var container = new Container(); + var mockHost = new Mock(); + mockHost.Setup(h => h.Container).Returns(container); + mockHost.Setup(h => h.CreateComponent(typeof(TestComponent), "test")) + .Returns(new TestComponent()); + + var mockProvider = new Mock(); + mockProvider.Setup(p => p.GetService(typeof(IDesignerHost))).Returns(mockHost.Object); + + var manager = (IDesignerSerializationManager)new DesignerSerializationManager(mockProvider.Object) + { + Container = container + }; + + // Act + using (((DesignerSerializationManager)manager).CreateSession()) + { + var instance = manager.CreateInstance(typeof(TestComponent), null, "test", true); + + // Assert + Assert.NotNull(instance); + mockHost.Verify(h => h.CreateComponent(typeof(TestComponent), "test"), Times.Once); + } + } + + [Fact] + public void CreateInstance_UsesDesignerHostWithoutNameWhenPreserveNamesIsFalseAndNameExists() + { + // Arrange + var container = new Container(); + container.Add(new TestComponent(), "test"); + + var mockHost = new Mock(); + mockHost.Setup(h => h.Container).Returns(container); + mockHost.Setup(h => h.CreateComponent(typeof(TestComponent))) + .Returns(new TestComponent()); + + var mockProvider = new Mock(); + mockProvider.Setup(p => p.GetService(typeof(IDesignerHost))).Returns(mockHost.Object); + + var manager = (IDesignerSerializationManager)new DesignerSerializationManager(mockProvider.Object) + { + Container = container, + PreserveNames = false + }; + + // Act + using (((DesignerSerializationManager)manager).CreateSession()) + { + var instance = manager.CreateInstance(typeof(TestComponent), null, "test", true); + + // Assert + Assert.NotNull(instance); + mockHost.Verify(h => h.CreateComponent(typeof(TestComponent)), Times.Once); + } + } + + [Fact] + public void CreateInstance_AddsComponentToContainerWhenNotCreatedByHost() + { + // Arrange + var container = new Container(); + var manager = (IDesignerSerializationManager)new DesignerSerializationManager + { + Container = container + }; + + // Act + using (((DesignerSerializationManager)manager).CreateSession()) + { + manager.CreateInstance(typeof(TestComponent), null, "test", true); + + // Assert + Assert.NotNull(container.Components["test"]); + } + } + + [Fact] + public void CreateInstance_AddsComponentWithoutNameWhenPreserveNamesIsFalseAndNameExists() + { + // Arrange + var container = new Container(); + container.Add(new TestComponent(), "test"); + + var manager = (IDesignerSerializationManager)new DesignerSerializationManager + { + Container = container, + PreserveNames = false + }; + + // Act + using (((DesignerSerializationManager)manager).CreateSession()) + { + var instance = manager.CreateInstance(typeof(TestComponent), null, "test", true); + + // Assert + Assert.NotNull(instance); + Assert.True(container.Components.Count >= 2); + } + } + + [Fact] + public void CreateInstance_ThrowsSerializationExceptionForMissingConstructor() + { + // Arrange + var manager = (IDesignerSerializationManager)new DesignerSerializationManager(); + + // Act & Assert + using (((DesignerSerializationManager)manager).CreateSession()) + { + var exception = Assert.Throws(() => + manager.CreateInstance(typeof(TestClass), new object[] { "arg1", 123, true }, "test", false)); + + Assert.Contains("TestClass", exception.Message); + } + } + + [Fact] + public void CreateInstance_ConvertsParametersForConstructor() + { + // Arrange + var manager = (IDesignerSerializationManager)new DesignerSerializationManager(); + + // Act + using (((DesignerSerializationManager)manager).CreateSession()) + { + var instance = manager.CreateInstance(typeof(TestClassWithConstructor), new object[] { 42 }, "test", false); + + // Assert + Assert.NotNull(instance); + var testInstance = instance as TestClassWithConstructor; + Assert.Equal("42", testInstance?.Value); + } + } + [Fact] public void GetInstance_ReturnsInstanceByName() { @@ -404,6 +657,28 @@ public void GetInstance_ThrowsExceptionForNullName() } } + [Fact] + public void GetInstance_ReturnsFromContainerWhenPreserveNamesIsTrue() + { + // Arrange + var container = new Container(); + var component = new TestComponent(); + container.Add(component, "test"); + + var manager = (IDesignerSerializationManager)new DesignerSerializationManager + { + Container = container, + PreserveNames = true + }; + + // Act & Assert + using (((DesignerSerializationManager)manager).CreateSession()) + { + var retrieved = manager.GetInstance("test"); + Assert.Same(component, retrieved); + } + } + [Fact] public void GetName_ReturnsNameForInstance() { @@ -442,6 +717,44 @@ public void GetName_ThrowsExceptionForNullValue() } } + [Fact] + public void GetName_ReturnsNameFromComponentSite() + { + // Arrange + var container = new Container(); + var component = new TestComponent(); + container.Add(component, "test"); + + var manager = (IDesignerSerializationManager)new DesignerSerializationManager(); + + // Act & Assert + using (((DesignerSerializationManager)manager).CreateSession()) + { + var name = manager.GetName(component); + Assert.Equal("test", name); + } + } + + [Fact] + public void GetName_ReturnsFullNameFromNestedSite() + { + // Arrange + var mockSite = new Mock(); + mockSite.Setup(s => s.FullName).Returns("parent.child"); + + var component = new TestComponent(); + typeof(Component).GetProperty("Site")!.SetValue(component, mockSite.Object); + + var manager = (IDesignerSerializationManager)new DesignerSerializationManager(); + + // Act & Assert + using (((DesignerSerializationManager)manager).CreateSession()) + { + var name = manager.GetName(component); + Assert.Equal("parent.child", name); + } + } + [Fact] public void SetName_SetsNameForInstance() { @@ -552,6 +865,20 @@ public void ReportError_ThrowsExceptionOutsideSession() Assert.Throws(() => manager.ReportError("error")); } + [Fact] + public void ReportError_DoesNothingForNullError() + { + // Arrange + var manager = (IDesignerSerializationManager)new DesignerSerializationManager(); + + // Act & Assert + using (((DesignerSerializationManager)manager).CreateSession()) + { + manager.ReportError(null!); + Assert.Empty(((DesignerSerializationManager)manager).Errors); + } + } + [Fact] public void GetType_ThrowsExceptionOutsideSession() { @@ -576,6 +903,76 @@ public void GetType_ReturnsTypeDuringSession() } } + [Fact] + public void GetType_HandlesPlusSignAsNestedType() + { + // Arrange + var manager = (IDesignerSerializationManager)new DesignerSerializationManager(); + + // Act & Assert + using (((DesignerSerializationManager)manager).CreateSession()) + { + var type = manager.GetType("LogicBuilder.ComponentModel.Design.Serialization.Tests.DesignerSerializationManagerTests+TestClass, LogicBuilder.ComponentModel.Design.Serialization.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=646893bec0268535"); + Assert.Equal(typeof(TestClass), type); + } + } + + [Fact] + public void GetType_ReturnsNullForUnsupportedType() + { + // Arrange + var mockProvider = new Mock(); + mockProvider.Setup(p => p.IsSupportedType(It.IsAny())).Returns(false); + + var mockProviderService = new Mock(); + mockProviderService.Setup(s => s.GetProvider(It.IsAny())).Returns(mockProvider.Object); + + var mockServiceProvider = new Mock(); + mockServiceProvider.Setup(p => p.GetService(typeof(TypeDescriptionProviderService))) + .Returns(mockProviderService.Object); + + var manager = (IDesignerSerializationManager)new DesignerSerializationManager(mockServiceProvider.Object); + + // Act & Assert + using (((DesignerSerializationManager)manager).CreateSession()) + { + var type = manager.GetType("System.String"); + Assert.Null(type); + } + } + + [Fact] + public void GetRuntimeType_UsesTypeResolutionService() + { + // Arrange + var mockTypeResolver = new Mock(); + mockTypeResolver.Setup(t => t.GetType("CustomType")).Returns(typeof(TestClass)); + + var mockProvider = new Mock(); + mockProvider.Setup(p => p.GetService(typeof(ITypeResolutionService))).Returns(mockTypeResolver.Object); + + var manager = new DesignerSerializationManager(mockProvider.Object); + + // Act + var type = manager.GetRuntimeType("CustomType"); + + // Assert + Assert.Equal(typeof(TestClass), type); + } + + [Fact] + public void GetRuntimeType_FallsBackToTypeGetType() + { + // Arrange + var manager = new DesignerSerializationManager(); + + // Act + var type = manager.GetRuntimeType("System.String"); + + // Assert + Assert.Equal(typeof(string), type); + } + [Fact] public void GetSerializer_ReturnsNullForNullObjectType() { @@ -600,6 +997,75 @@ public void GetSerializer_ThrowsExceptionForNullSerializerType() manager.GetSerializer(typeof(TestClass), null)); } + [Fact] + public void GetSerializer_ReturnsSerializerFromAttribute() + { + // Arrange + var manager = new DesignerSerializationManager(); + + // Act + using (manager.CreateSession()) + { + var serializer = manager.GetSerializer(typeof(TestClassWithSerializer), typeof(TestSerializer)); + + // Assert + Assert.NotNull(serializer); + Assert.IsType(serializer); + } + } + + [Fact] + public void GetSerializer_CachesSerializerDuringSession() + { + // Arrange + var manager = new DesignerSerializationManager(); + + // Act + using (manager.CreateSession()) + { + var serializer1 = manager.GetSerializer(typeof(TestClassWithSerializer), typeof(TestSerializer)); + var serializer2 = manager.GetSerializer(typeof(TestClassWithSerializer), typeof(TestSerializer)); + + // Assert + Assert.Same(serializer1, serializer2); + } + } + + [Fact] + public void GetSerializer_UsesCustomSerializationProvider() + { + // Arrange + var manager = (IDesignerSerializationManager)new DesignerSerializationManager(); + var customSerializer = new TestSerializer(); + var provider = new CustomSerializationProvider(customSerializer); + manager.AddSerializationProvider(provider); + + // Act + using (((DesignerSerializationManager)manager).CreateSession()) + { + var serializer = manager.GetSerializer(typeof(TestClass), typeof(TestSerializer)); + + // Assert + Assert.Same(customSerializer, serializer); + } + } + + [Fact] + public void GetSerializer_UsesDefaultSerializationProvider() + { + // Arrange + var manager = new DesignerSerializationManager(); + + // Act + using (manager.CreateSession()) + { + var serializer = manager.GetSerializer(typeof(TestClassWithDefaultProvider), typeof(TestSerializerWithDefaultProvider)); + + // Assert + Assert.NotNull(serializer); + } + } + [Fact] public void ResolveName_EventRaisedWhenInstanceNotFound() { @@ -639,6 +1105,40 @@ public void SerializationComplete_EventRaisedAfterSessionDisposed() Assert.True(eventRaised); } + [Fact] + public void IServiceProvider_GetService_ReturnsContainer() + { + // Arrange + var container = new Container(); + var manager = (IServiceProvider)new DesignerSerializationManager + { + Container = container + }; + + // Act + var service = manager.GetService(typeof(IContainer)); + + // Assert + Assert.Same(container, service); + } + + [Fact] + public void IServiceProvider_GetService_DelegatesToProvider() + { + // Arrange + var mockService = new object(); + var mockProvider = new Mock(); + mockProvider.Setup(p => p.GetService(typeof(object))).Returns(mockService); + + var manager = (IServiceProvider)new DesignerSerializationManager(mockProvider.Object); + + // Act + var service = manager.GetService(typeof(object)); + + // Assert + Assert.Same(mockService, service); + } + #endregion #region Helper Classes @@ -648,6 +1148,63 @@ private class TestClass public string Name { get; set; } = string.Empty; } + private class TestClass2 + { + public string Name { get; set; } = string.Empty; + } + + private class TestClassWithConstructor(string value) + { + public string Value { get; } = value; + } + + private class TestComponent : Component + { + } + + private class TestPropertyProvider + { + public string TestProperty { get; set; } = "test"; + } + + [DesignerSerializer(typeof(TestSerializer), typeof(TestSerializer))] + private class TestClassWithSerializer + { + } + + [DefaultSerializationProvider(typeof(TestDefaultSerializationProvider))] + private class TestSerializerWithDefaultProvider + { + } + + private class TestClassWithDefaultProvider + { + } + + private class TestSerializer + { + } + + private class TestDefaultSerializationProvider : IDesignerSerializationProvider + { + public object? GetSerializer(IDesignerSerializationManager manager, object? currentSerializer, Type? objectType, Type serializerType) + { + if (serializerType == typeof(TestSerializerWithDefaultProvider)) + return new TestSerializerWithDefaultProvider(); + return null; + } + } + + private class CustomSerializationProvider(object serializer) : IDesignerSerializationProvider + { + private readonly object serializer = serializer; + + public object? GetSerializer(IDesignerSerializationManager manager, object? currentSerializer, Type? objectType, Type serializerType) + { + return serializer; + } + } + private class MockServiceProvider : IServiceProvider { public object? GetService(Type serviceType) diff --git a/LogicBuilder.ComponentModel.Design.Serialization.Tests/LogicBuilder.ComponentModel.Design.Serialization.Tests.csproj b/LogicBuilder.ComponentModel.Design.Serialization.Tests/LogicBuilder.ComponentModel.Design.Serialization.Tests.csproj index 109544f..2821455 100644 --- a/LogicBuilder.ComponentModel.Design.Serialization.Tests/LogicBuilder.ComponentModel.Design.Serialization.Tests.csproj +++ b/LogicBuilder.ComponentModel.Design.Serialization.Tests/LogicBuilder.ComponentModel.Design.Serialization.Tests.csproj @@ -15,6 +15,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/LogicBuilder.ComponentModel.Design.Serialization/DesignerSerializationManager.cs b/LogicBuilder.ComponentModel.Design.Serialization/DesignerSerializationManager.cs index f48fd2b..368b11e 100644 --- a/LogicBuilder.ComponentModel.Design.Serialization/DesignerSerializationManager.cs +++ b/LogicBuilder.ComponentModel.Design.Serialization/DesignerSerializationManager.cs @@ -433,7 +433,7 @@ protected virtual object CreateInstance(Type type, ICollection arguments, string { obj = this.instancesByName[name]; } - if ((obj == null & addToContainer) && this.Container != null) + if (obj == null && addToContainer && this.Container != null) { obj = this.Container.Components[name]; } @@ -442,7 +442,7 @@ protected virtual object CreateInstance(Type type, ICollection arguments, string obj = null; } } - if ((obj == null & addToContainer) + if (obj == null && addToContainer && typeof(IComponent).IsAssignableFrom(type) && (array == null || array.Length == 0 || (array.Length == 1 && array[0] == this.Container)) && this.GetService(typeof(IDesignerHost)) is IDesignerHost designerHost && designerHost.Container == this.Container) @@ -453,7 +453,7 @@ protected virtual object CreateInstance(Type type, ICollection arguments, string flag = true; } - obj = (name == null | flag) + obj = (name == null || flag) ? designerHost.CreateComponent(type) : designerHost.CreateComponent(type, name); } @@ -559,7 +559,7 @@ protected virtual object CreateInstance(Type type, ICollection arguments, string { flag3 = true; } - if (name == null | flag3) + if (name == null || flag3) { this.Container.Add(component); } From a045bb0b5d7c41233d99c271ad1057a1691ff8a3 Mon Sep 17 00:00:00 2001 From: Blaise Taylor Date: Mon, 16 Feb 2026 08:09:19 -0500 Subject: [PATCH 2/3] AB#43 Fix SonarCloud high severity issues (minus complexity) --- ...entModel.Design.Serialization.Tests.csproj | 2 +- .../DesignerSerializationManager.cs | 32 +++++++++---------- ...ComponentModel.Design.Serialization.csproj | 4 +-- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/LogicBuilder.ComponentModel.Design.Serialization.Tests/LogicBuilder.ComponentModel.Design.Serialization.Tests.csproj b/LogicBuilder.ComponentModel.Design.Serialization.Tests/LogicBuilder.ComponentModel.Design.Serialization.Tests.csproj index 2821455..8de956a 100644 --- a/LogicBuilder.ComponentModel.Design.Serialization.Tests/LogicBuilder.ComponentModel.Design.Serialization.Tests.csproj +++ b/LogicBuilder.ComponentModel.Design.Serialization.Tests/LogicBuilder.ComponentModel.Design.Serialization.Tests.csproj @@ -10,7 +10,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/LogicBuilder.ComponentModel.Design.Serialization/DesignerSerializationManager.cs b/LogicBuilder.ComponentModel.Design.Serialization/DesignerSerializationManager.cs index 368b11e..9d6b7c0 100644 --- a/LogicBuilder.ComponentModel.Design.Serialization/DesignerSerializationManager.cs +++ b/LogicBuilder.ComponentModel.Design.Serialization/DesignerSerializationManager.cs @@ -40,11 +40,11 @@ bool IEqualityComparer.Equals(object x, object y) return x == y; } - int IEqualityComparer.GetHashCode(object x) + int IEqualityComparer.GetHashCode(object obj) { - if (x != null) + if (obj != null) { - return x.GetHashCode(); + return obj.GetHashCode(); } return 0; } @@ -121,7 +121,7 @@ public override bool ShouldSerializeValue(object component) } } - private readonly IServiceProvider provider; + private readonly IServiceProvider serviceProvider; private ITypeResolutionService typeResolver; @@ -389,7 +389,7 @@ public DesignerSerializationManager() /// is null. public DesignerSerializationManager(IServiceProvider provider) { - this.provider = provider ?? throw new ArgumentNullException("provider"); + this.serviceProvider = provider ?? throw new ArgumentNullException("provider"); this.preserveNames = true; this.validateRecycledTypes = true; } @@ -463,7 +463,7 @@ protected virtual object CreateInstance(Type type, ICollection arguments, string { try { - obj = TypeDescriptor.CreateInstance(this.provider, type, null, array); + obj = TypeDescriptor.CreateInstance(this.serviceProvider, type, null, array); } catch (MissingMethodException) { @@ -512,7 +512,7 @@ protected virtual object CreateInstance(Type type, ICollection arguments, string } if (flag2) { - obj = TypeDescriptor.CreateInstance(this.provider, type, null, array3); + obj = TypeDescriptor.CreateInstance(this.serviceProvider, type, null, array3); break; } } @@ -686,9 +686,9 @@ protected virtual object GetService(Type serviceType) { return this.Container; } - if (this.provider != null) + if (this.serviceProvider != null) { - return this.provider.GetService(serviceType); + return this.serviceProvider.GetService(serviceType); } return null; } @@ -778,13 +778,13 @@ private PropertyDescriptor WrapProperty(PropertyDescriptor property, object owne } /// Adds a custom serialization provider to the serialization manager. - /// The serialization provider to add. - void IDesignerSerializationManager.AddSerializationProvider(IDesignerSerializationProvider serializationProvider) + /// The serialization provider to add. + void IDesignerSerializationManager.AddSerializationProvider(IDesignerSerializationProvider provider) { this.designerSerializationProviders ??= []; - if (!this.designerSerializationProviders.Contains(serializationProvider)) + if (!this.designerSerializationProviders.Contains(provider)) { - this.designerSerializationProviders.Add(serializationProvider); + this.designerSerializationProviders.Add(provider); } } @@ -917,10 +917,10 @@ Type IDesignerSerializationManager.GetType(string typeName) } /// Removes a previously added serialization provider. - /// The to remove. - void IDesignerSerializationManager.RemoveSerializationProvider(IDesignerSerializationProvider serializationProvider) + /// The to remove. + void IDesignerSerializationManager.RemoveSerializationProvider(IDesignerSerializationProvider provider) { - this.designerSerializationProviders?.Remove(serializationProvider); + this.designerSerializationProviders?.Remove(provider); } /// Used to report a recoverable error in serialization. diff --git a/LogicBuilder.ComponentModel.Design.Serialization/LogicBuilder.ComponentModel.Design.Serialization.csproj b/LogicBuilder.ComponentModel.Design.Serialization/LogicBuilder.ComponentModel.Design.Serialization.csproj index 15124f5..0cd1f18 100644 --- a/LogicBuilder.ComponentModel.Design.Serialization/LogicBuilder.ComponentModel.Design.Serialization.csproj +++ b/LogicBuilder.ComponentModel.Design.Serialization/LogicBuilder.ComponentModel.Design.Serialization.csproj @@ -31,7 +31,7 @@ - + @@ -39,7 +39,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + From 39b6fa94cb3fd36ef7379028b04a1980d3c19be7 Mon Sep 17 00:00:00 2001 From: Blaise Taylor Date: Mon, 16 Feb 2026 09:06:17 -0500 Subject: [PATCH 3/3] AB#43 Coverage for CreateInstance where ValidateRecycledTypes is true. --- .../DesignerSerializationManagerTests.cs | 44 ++++++++++++++----- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/LogicBuilder.ComponentModel.Design.Serialization.Tests/DesignerSerializationManagerTests.cs b/LogicBuilder.ComponentModel.Design.Serialization.Tests/DesignerSerializationManagerTests.cs index 318776c..b5d5d57 100644 --- a/LogicBuilder.ComponentModel.Design.Serialization.Tests/DesignerSerializationManagerTests.cs +++ b/LogicBuilder.ComponentModel.Design.Serialization.Tests/DesignerSerializationManagerTests.cs @@ -131,7 +131,7 @@ public void Container_CanSetAndGet() { // Arrange var manager = new DesignerSerializationManager(); - var container = new Container(); + using var container = new Container(); // Act manager.Container = container; @@ -145,7 +145,7 @@ public void Container_ThrowsExceptionDuringSession() { // Arrange var manager = new DesignerSerializationManager(); - var container = new Container(); + using var container = new Container(); using (manager.CreateSession()) { // Act & Assert @@ -157,7 +157,7 @@ public void Container_ThrowsExceptionDuringSession() public void Container_GetsFromDesignerHostWhenNull() { // Arrange - var container = new Container(); + using var container = new Container(); var mockHost = new Mock(); mockHost.Setup(h => h.Container).Returns(container); @@ -462,7 +462,7 @@ public void CreateInstance_DoesNotRecycleInstanceWhenTypeMismatchAndValidateRecy public void CreateInstance_RecyclesFromContainerWhenAvailable() { // Arrange - var container = new Container(); + using var container = new Container(); var existingComponent = new TestComponent(); container.Add(existingComponent, "test"); @@ -480,11 +480,33 @@ public void CreateInstance_RecyclesFromContainerWhenAvailable() } } + [Fact] + public void CreateInstance_RecyclesFromContainerWhenAvailable_ObjectTypeDoesNotMatch() + { + // Arrange + using var container = new Container(); + var existingComponent = new TestComponent(); + container.Add(existingComponent, "test"); + + var manager = (IDesignerSerializationManager)new DesignerSerializationManager + { + RecycleInstances = true, + Container = container + }; + + // Act & Assert + using (((DesignerSerializationManager)manager).CreateSession()) + { + var instance = manager.CreateInstance(typeof(TestClass), null, "test", true); + Assert.NotSame(existingComponent, instance); + } + } + [Fact] public void CreateInstance_UsesDesignerHostToCreateComponent() { // Arrange - var container = new Container(); + using var container = new Container(); var mockHost = new Mock(); mockHost.Setup(h => h.Container).Returns(container); mockHost.Setup(h => h.CreateComponent(typeof(TestComponent), "test")) @@ -513,7 +535,7 @@ public void CreateInstance_UsesDesignerHostToCreateComponent() public void CreateInstance_UsesDesignerHostWithoutNameWhenPreserveNamesIsFalseAndNameExists() { // Arrange - var container = new Container(); + using var container = new Container(); container.Add(new TestComponent(), "test"); var mockHost = new Mock(); @@ -545,7 +567,7 @@ public void CreateInstance_UsesDesignerHostWithoutNameWhenPreserveNamesIsFalseAn public void CreateInstance_AddsComponentToContainerWhenNotCreatedByHost() { // Arrange - var container = new Container(); + using var container = new Container(); var manager = (IDesignerSerializationManager)new DesignerSerializationManager { Container = container @@ -565,7 +587,7 @@ public void CreateInstance_AddsComponentToContainerWhenNotCreatedByHost() public void CreateInstance_AddsComponentWithoutNameWhenPreserveNamesIsFalseAndNameExists() { // Arrange - var container = new Container(); + using var container = new Container(); container.Add(new TestComponent(), "test"); var manager = (IDesignerSerializationManager)new DesignerSerializationManager @@ -661,7 +683,7 @@ public void GetInstance_ThrowsExceptionForNullName() public void GetInstance_ReturnsFromContainerWhenPreserveNamesIsTrue() { // Arrange - var container = new Container(); + using var container = new Container(); var component = new TestComponent(); container.Add(component, "test"); @@ -721,7 +743,7 @@ public void GetName_ThrowsExceptionForNullValue() public void GetName_ReturnsNameFromComponentSite() { // Arrange - var container = new Container(); + using var container = new Container(); var component = new TestComponent(); container.Add(component, "test"); @@ -1109,7 +1131,7 @@ public void SerializationComplete_EventRaisedAfterSessionDisposed() public void IServiceProvider_GetService_ReturnsContainer() { // Arrange - var container = new Container(); + using var container = new Container(); var manager = (IServiceProvider)new DesignerSerializationManager { Container = container