Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -53,15 +53,15 @@ protected internal override void ClearChildren(WorkflowMarkupSerializationManage
obj.GetType().InvokeMember("Clear", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Instance, null, obj, [], CultureInfo.InvariantCulture);
}

protected internal override void AddChild(WorkflowMarkupSerializationManager serializationManager, object parentObj, object childObj)
protected internal override void AddChild(WorkflowMarkupSerializationManager serializationManager, object parentObject, object childObj)
{
if (parentObj == null)
throw new ArgumentNullException("parentObj");
if (parentObject == null)
throw new ArgumentNullException(nameof(parentObject));

if (!IsValidCollectionType(parentObj.GetType()))
throw new Exception(SR.GetString(SR.Error_SerializerTypeRequirement, parentObj.GetType().FullName, typeof(ICollection).FullName, typeof(ICollection<>).FullName));
if (!IsValidCollectionType(parentObject.GetType()))
throw new Exception(SR.GetString(SR.Error_SerializerTypeRequirement, parentObject.GetType().FullName, typeof(ICollection).FullName, typeof(ICollection<>).FullName));

parentObj.GetType().InvokeMember("Add", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Instance, null, parentObj, [childObj], CultureInfo.InvariantCulture);
parentObject.GetType().InvokeMember("Add", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Instance, null, parentObject, [childObj], CultureInfo.InvariantCulture);
}

internal static bool IsValidCollectionType(Type collectionType)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,24 +40,24 @@ protected internal override bool ShouldSerializeValue(WorkflowMarkupSerializatio
return (((IDictionary)value).Count > 0);
}

protected internal override void ClearChildren(WorkflowMarkupSerializationManager serializationManager, object deserializedObject)
protected internal override void ClearChildren(WorkflowMarkupSerializationManager serializationManager, object obj)
{
if (deserializedObject == null)
throw new ArgumentNullException("deserializedObject");
if (obj == null)
throw new ArgumentNullException(nameof(obj));

IDictionary dictionary = deserializedObject as IDictionary ?? throw new InvalidOperationException(SR.GetString(SR.Error_DictionarySerializerNonDictionaryObject));
IDictionary dictionary = obj as IDictionary ?? throw new InvalidOperationException(SR.GetString(SR.Error_DictionarySerializerNonDictionaryObject));
dictionary.Clear();
}

protected internal override void AddChild(WorkflowMarkupSerializationManager serializationManager, object parentObj, object childObj)
protected internal override void AddChild(WorkflowMarkupSerializationManager serializationManager, object parentObject, object childObj)
{
if (parentObj == null)
throw new ArgumentNullException("parentObj");
if (parentObject == null)
throw new ArgumentNullException(nameof(parentObject));

if (childObj == null)
throw new ArgumentNullException("childObj");

IDictionary dictionary = parentObj as IDictionary ?? throw new InvalidOperationException(SR.GetString(SR.Error_DictionarySerializerNonDictionaryObject));
IDictionary dictionary = parentObject as IDictionary ?? throw new InvalidOperationException(SR.GetString(SR.Error_DictionarySerializerNonDictionaryObject));
object key = null;
foreach (DictionaryEntry entry in keylookupDictionary)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

internal sealed class StringCollectionMarkupSerializer : WorkflowMarkupSerializer
{
protected internal override PropertyInfo[] GetProperties(WorkflowMarkupSerializationManager manager, object obj)
protected internal override PropertyInfo[] GetProperties(WorkflowMarkupSerializationManager serializationManager, object obj)
{
return new PropertyInfo[] { };
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,9 @@ public WorkflowMarkupSerializerMapping(string prefix, string xmlNamespace, strin
this.unifiedAssemblyName = unifiedAssemblyName ?? throw new ArgumentNullException("unifiedAssemblyName");
}

public override bool Equals(object value)
public override bool Equals(object obj)
{
if (value is not WorkflowMarkupSerializerMapping mapping)
if (obj is not WorkflowMarkupSerializerMapping mapping)
{
return false;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ public abstract class MarkupExtension
internal sealed class NullExtension : MarkupExtension
{
public NullExtension() { }
public override object ProvideValue(IServiceProvider serviceProvider)
public override object ProvideValue(IServiceProvider provider)
{
return null;
}
Expand Down
4 changes: 0 additions & 4 deletions LogicBuilder.Workflow.ComponentModel.Serialization/SR.cs
Original file line number Diff line number Diff line change
Expand Up @@ -106,8 +106,6 @@ internal static string GetString(string name, params object[] args)
internal static string GetString(CultureInfo culture, string name, params object[] args)
{
SR sys = GetLoader();
if (sys == null)
return null;
string res = sys.resources.GetString(name, culture);
System.Diagnostics.Debug.Assert(res != null, string.Format(CultureInfo.CurrentCulture, "String resource {0} not found.", new object[] { name }));
return args != null && args.Length > 0
Expand All @@ -123,8 +121,6 @@ internal static string GetString(string name)
internal static string GetString(CultureInfo culture, string name)
{
SR sys = GetLoader();
if (sys == null)
return null;
string res = sys.resources.GetString(name, culture);
System.Diagnostics.Debug.Assert(res != null, string.Format(CultureInfo.CurrentCulture, "String resource {0} not found.", new object[] { name }));
return res;
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
[![Build Status](https://github.com/BpsLogicBuilder/LogicBuilder.Workflow.ComponentModel.Serialization/actions/workflows/ci.yml/badge.svg)](https://github.com/BpsLogicBuilder/LogicBuilder.Workflow.ComponentModel.Serialization/actions/workflows/ci.yml)
[![CodeQL](https://github.com/BpsLogicBuilder/LogicBuilder.Workflow.ComponentModel.Serialization/actions/workflows/github-code-scanning/codeql/badge.svg)](https://github.com/BpsLogicBuilder/LogicBuilder.Workflow.ComponentModel.Serialization/actions/workflows/github-code-scanning/codeql)
[![codecov](https://codecov.io/gh/BpsLogicBuilder/LogicBuilder.Workflow.ComponentModel.Serialization/graph/badge.svg?token=CTUXSQYTCV)](https://codecov.io/gh/BpsLogicBuilder/LogicBuilder.Workflow.ComponentModel.Serialization)
[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=BpsLogicBuilder_LogicBuilder.Workflow.ComponentModel.Serialization&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=BpsLogicBuilder_LogicBuilder.Workflow.ComponentModel.Serialization)
[![NuGet](https://img.shields.io/nuget/v/LogicBuilder.Workflow.ComponentModel.Serialization.svg)](https://www.nuget.org/packages/LogicBuilder.Workflow.ComponentModel.Serialization)

## Integration with LogicBuilder.Rules
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -295,7 +295,7 @@ public void UserData_CanStoreMultipleValues()
// Assert
Assert.Equal("Value1", error.UserData["Key1"]);
Assert.Equal(42, error.UserData["Key2"]);
Assert.Equal(true, error.UserData["Key3"]);
Assert.True((bool)error.UserData["Key3"]!);
Assert.Equal(3, error.UserData.Count);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,15 @@ namespace LogicBuilder.Workflow.Tests.ComponentModel.Serialization
{
public class ExtendedPropertyInfoTest
{
internal class MockWorkflowMarkupSerializer : WorkflowMarkupSerializer
{
public ExtendedPropertyInfo[] ExtendedPropertyInfos { get; set; } = [];
internal override ExtendedPropertyInfo[] GetExtendedProperties(WorkflowMarkupSerializationManager manager, object extendee)
{
return ExtendedPropertyInfos;
}
}

private readonly WorkflowMarkupSerializationManager _serializationManager;
private readonly PropertyInfo _testPropertyInfo;

Expand Down Expand Up @@ -387,7 +396,149 @@ public void IsDefined_ReturnsRealPropertyInfoIsDefined()

#endregion

#region IsExtendedProperty Tests
#region IsExtendedProperty Tests - Manager Overload

[Fact]
public void IsExtendedProperty_WithManager_ReturnsTrue_WhenMatchingPropertyExists()
{
// Arrange
var manager = new DesignerSerializationManager();
var mockManager = new WorkflowMarkupSerializationManager(manager);
var testObject = new TestClass();
var qualifiedName = new XmlQualifiedName("TestProperty", "http://test.namespace");

XmlQualifiedName qualifiedNameHandler(ExtendedPropertyInfo prop, WorkflowMarkupSerializationManager mgr, out string prefix)
{
prefix = "test";
return qualifiedName;
}

var extendedPropertyInfo = new ExtendedPropertyInfo(_testPropertyInfo, null, null, qualifiedNameHandler);
var extendedProperties = new ExtendedPropertyInfo[] { extendedPropertyInfo };
FieldInfo fieldInfo = typeof(WorkflowMarkupSerializationManager).GetField("extendedPropertiesProviders", BindingFlags.NonPublic | BindingFlags.Instance)!;
fieldInfo.SetValue(mockManager, new List<WorkflowMarkupSerializer> { new MockWorkflowMarkupSerializer() { ExtendedPropertyInfos = extendedProperties } });
using (manager.CreateSession())
{
mockManager.Context.Append(testObject);

// Act
bool result = ExtendedPropertyInfo.IsExtendedProperty(mockManager, qualifiedName);

// Assert
Assert.True(result);
}
}

[Fact]
public void IsExtendedProperty_WithManager_ReturnsFalse_WhenNoMatchingPropertyExists()
{
// Arrange
var manager = new DesignerSerializationManager();
var mockManager = new WorkflowMarkupSerializationManager(manager);
var testObject = new TestClass();
var searchQualifiedName = new XmlQualifiedName("DifferentProperty", "http://test.namespace");
var propertyQualifiedName = new XmlQualifiedName("TestProperty", "http://test.namespace");

XmlQualifiedName qualifiedNameHandler(ExtendedPropertyInfo prop, WorkflowMarkupSerializationManager mgr, out string prefix)
{
prefix = "test";
return propertyQualifiedName;
}

var extendedPropertyInfo = new ExtendedPropertyInfo(_testPropertyInfo, null, null, qualifiedNameHandler);
FieldInfo fieldInfo = typeof(WorkflowMarkupSerializationManager).GetField("extendedPropertiesProviders", BindingFlags.NonPublic | BindingFlags.Instance)!;
fieldInfo.SetValue(mockManager, new List<WorkflowMarkupSerializer> { new MockWorkflowMarkupSerializer() { ExtendedPropertyInfos = [extendedPropertyInfo] } });

using (manager.CreateSession())
{
mockManager.Context.Append(testObject);

// Act
bool result = ExtendedPropertyInfo.IsExtendedProperty(mockManager, searchQualifiedName);

// Assert
Assert.False(result);
}
}

[Fact]
public void IsExtendedProperty_WithManager_ReturnsFalse_WhenNameMatchesButNamespaceDoesNot()
{
// Arrange
var manager = new DesignerSerializationManager();
var mockManager = new WorkflowMarkupSerializationManager(manager);
var testObject = new TestClass();
var searchQualifiedName = new XmlQualifiedName("TestProperty", "http://different.namespace");
var propertyQualifiedName = new XmlQualifiedName("TestProperty", "http://test.namespace");

XmlQualifiedName qualifiedNameHandler(ExtendedPropertyInfo prop, WorkflowMarkupSerializationManager mgr, out string prefix)
{
prefix = "test";
return propertyQualifiedName;
}

var extendedPropertyInfo = new ExtendedPropertyInfo(_testPropertyInfo, null, null, qualifiedNameHandler);
var extendedProperties = new ExtendedPropertyInfo[] { extendedPropertyInfo };
FieldInfo fieldInfo = typeof(WorkflowMarkupSerializationManager).GetField("extendedPropertiesProviders", BindingFlags.NonPublic | BindingFlags.Instance)!;
fieldInfo.SetValue(mockManager, new List<WorkflowMarkupSerializer> { new MockWorkflowMarkupSerializer() { ExtendedPropertyInfos = extendedProperties } });

using (manager.CreateSession())
{
mockManager.Context.Append(testObject);

// Act
bool result = ExtendedPropertyInfo.IsExtendedProperty(mockManager, searchQualifiedName);

// Assert
Assert.False(result);
}
}

[Fact]
public void IsExtendedProperty_WithManager_ReturnsFalse_WhenCurrentContextIsNull()
{
// Arrange
var manager = new DesignerSerializationManager();
var mockManager = new WorkflowMarkupSerializationManager(manager);
var qualifiedName = new XmlQualifiedName("TestProperty", "http://test.namespace");

using (manager.CreateSession())
{
// Act
bool result = ExtendedPropertyInfo.IsExtendedProperty(mockManager, qualifiedName);

// Assert
Assert.False(result);
}
}

[Fact]
public void IsExtendedProperty_WithManager_ReturnsFalse_WhenExtendedPropertiesIsEmpty()
{
// Arrange
var manager = new DesignerSerializationManager();
var mockManager = new WorkflowMarkupSerializationManager(manager);
var testObject = new TestClass();
var qualifiedName = new XmlQualifiedName("TestProperty", "http://test.namespace");
var extendedProperties = Array.Empty<ExtendedPropertyInfo>();
FieldInfo fieldInfo = typeof(WorkflowMarkupSerializationManager).GetField("extendedPropertiesProviders", BindingFlags.NonPublic | BindingFlags.Instance)!;
fieldInfo.SetValue(mockManager, new List<WorkflowMarkupSerializer> { new MockWorkflowMarkupSerializer() { ExtendedPropertyInfos = extendedProperties } });

using (manager.CreateSession())
{
mockManager.Context.Append(testObject);

// Act
bool result = ExtendedPropertyInfo.IsExtendedProperty(mockManager, qualifiedName);

// Assert
Assert.False(result);
}
}

#endregion

#region IsExtendedProperty Tests - PropertyList Overload

[Fact]
public void IsExtendedProperty_WithPropertyList_ReturnsTrue_WhenMatchingPropertyExists()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1516,6 +1516,7 @@ public void Serialize_WithCircularReference_ThrowsException()
{
// This would test circular reference detection
// The implementation should detect and prevent infinite loops
Assert.True(true, "Circular reference test placeholder - implement circular reference detection in the serializer to pass this test.");
}

#endregion
Expand Down