diff --git a/LogicBuilder.Workflow.ComponentModel.Serialization/ComponentModel/ExceptionUtility.cs b/LogicBuilder.Workflow.ComponentModel.Serialization/ComponentModel/ExceptionUtility.cs new file mode 100644 index 0000000..2deb1bb --- /dev/null +++ b/LogicBuilder.Workflow.ComponentModel.Serialization/ComponentModel/ExceptionUtility.cs @@ -0,0 +1,16 @@ +using System; +using System.Threading; + +namespace LogicBuilder.Workflow.ComponentModel +{ + internal static class ExceptionUtility + { + internal static bool IsCriticalException(Exception ex) + { + return ex is OutOfMemoryException + or ThreadAbortException + or StackOverflowException + or ThreadInterruptedException; + } + } +} diff --git a/LogicBuilder.Workflow.ComponentModel.Serialization/ComponentModel/Serialization/CodeTypeReferenceSerializer.cs b/LogicBuilder.Workflow.ComponentModel.Serialization/ComponentModel/Serialization/CodeTypeReferenceSerializer.cs index d283eb1..e3a3282 100644 --- a/LogicBuilder.Workflow.ComponentModel.Serialization/ComponentModel/Serialization/CodeTypeReferenceSerializer.cs +++ b/LogicBuilder.Workflow.ComponentModel.Serialization/ComponentModel/Serialization/CodeTypeReferenceSerializer.cs @@ -1,6 +1,5 @@ -using System.CodeDom; -using System; -using System.Collections.Generic; +using System; +using System.CodeDom; using System.Globalization; using System.Text; @@ -83,7 +82,7 @@ protected internal override object DeserializeFromString(WorkflowMarkupSerializa return result; } } - catch (Exception) + catch (Exception ex) when (!ExceptionUtility.IsCriticalException(ex)) { // something went wrong getting the type, so simply pass in the string and // let CodeTypeReference figure it out. Note that CodeTypeReference has a method diff --git a/LogicBuilder.Workflow.ComponentModel.Serialization/ComponentModel/Serialization/MarkupExtensionSerializer.cs b/LogicBuilder.Workflow.ComponentModel.Serialization/ComponentModel/Serialization/MarkupExtensionSerializer.cs index abcc234..123278e 100644 --- a/LogicBuilder.Workflow.ComponentModel.Serialization/ComponentModel/Serialization/MarkupExtensionSerializer.cs +++ b/LogicBuilder.Workflow.ComponentModel.Serialization/ComponentModel/Serialization/MarkupExtensionSerializer.cs @@ -152,7 +152,7 @@ PropertyInfo serializableProperty in properties.Where } } } - catch (Exception ex) + catch (Exception ex) when (!ExceptionUtility.IsCriticalException(ex)) { serializationManager.ReportError(new WorkflowMarkupSerializationException(SR.GetString(SR.Error_SerializerNoSerializeLogic, [serializableProperty.Name, value.GetType().FullName]), ex)); continue; diff --git a/LogicBuilder.Workflow.ComponentModel.Serialization/ComponentModel/Serialization/WorkflowMarkupSerializationManager.cs b/LogicBuilder.Workflow.ComponentModel.Serialization/ComponentModel/Serialization/WorkflowMarkupSerializationManager.cs index 783c864..00a6700 100644 --- a/LogicBuilder.Workflow.ComponentModel.Serialization/ComponentModel/Serialization/WorkflowMarkupSerializationManager.cs +++ b/LogicBuilder.Workflow.ComponentModel.Serialization/ComponentModel/Serialization/WorkflowMarkupSerializationManager.cs @@ -17,19 +17,19 @@ public class WorkflowMarkupSerializationManager : IDesignerSerializationManager { private Assembly localAssembly = null; private int writerDepth = 0; - private readonly ContextStack workflowMarkupStack = new ContextStack(); + private readonly ContextStack workflowMarkupStack = new(); // Stack to keep a list of objects being serialized, to avoid stack overflow - private readonly Stack serializationStack = new Stack(); + private readonly Stack serializationStack = new(); private IDesignerSerializationManager serializationManager; private readonly bool designMode = false; internal event EventHandler FoundDefTag; //These are temporary variables for speedy lookup - private readonly Dictionary clrNamespaceBasedMappings = new Dictionary(); - private readonly Dictionary> xmlNamespaceBasedMappings = new Dictionary>(); - private readonly Dictionary> prefixBasedMappings = new Dictionary>(); + private readonly Dictionary clrNamespaceBasedMappings = []; + private readonly Dictionary> xmlNamespaceBasedMappings = []; + private readonly Dictionary> prefixBasedMappings = []; private List extendedPropertiesProviders; - private readonly Dictionary cachedXmlQualifiedNameTypes = new Dictionary(); + private readonly Dictionary cachedXmlQualifiedNameTypes = []; public WorkflowMarkupSerializationManager(IDesignerSerializationManager manager) { @@ -122,7 +122,7 @@ public virtual XmlQualifiedName GetXmlQualifiedName(Type type, out string prefix if (!this.clrNamespaceBasedMappings.TryGetValue(key, out WorkflowMarkupSerializerMapping mappingForType)) { WorkflowMarkupSerializerMapping.GetMappingFromType(this, type, out mappingForType, out IList collectedMappings); - AddMappings(new List(new WorkflowMarkupSerializerMapping[] { mappingForType })); + AddMappings(new List([mappingForType])); AddMappings(collectedMappings); } @@ -160,7 +160,7 @@ public virtual Type GetType(XmlQualifiedName xmlQualifiedName) AddMappings(matchingMappings); AddMappings(collectedMappings); - xmlnsMappings = new List(matchingMappings); + xmlnsMappings = [.. matchingMappings]; } foreach (WorkflowMarkupSerializerMapping xmlnsMapping in xmlnsMappings) @@ -194,12 +194,8 @@ public virtual Type GetType(XmlQualifiedName xmlQualifiedName) { resolvedType = GetType(assemblyQualifiedName); } - catch + catch (Exception ex) when (!ExceptionUtility.IsCriticalException(ex)) { - // - - - } if (resolvedType == null) @@ -246,9 +242,8 @@ public virtual Type GetType(string typeName) { type = this.serializationManager.GetType(typeName); } - catch + catch (Exception ex) when (!ExceptionUtility.IsCriticalException(ex)) { - //Debug.Assert(false, "VSIP framwork threw exception on resolving type." + e.ToString()); } } @@ -276,11 +271,8 @@ public virtual Type GetType(string typeName) { assembly = Assembly.Load(assemblyName); } - catch + catch (Exception ex) when (!ExceptionUtility.IsCriticalException(ex)) { - // - - } } @@ -352,14 +344,14 @@ internal void AddMappings(IList mappingsToAdd) if (!this.xmlNamespaceBasedMappings.TryGetValue(mapping.XmlNamespace, out List xmlnsMappings)) { - xmlnsMappings = new List(); + xmlnsMappings = []; this.xmlNamespaceBasedMappings.Add(mapping.XmlNamespace, xmlnsMappings); } xmlnsMappings.Add(mapping); if (!this.prefixBasedMappings.TryGetValue(mapping.Prefix, out List prefixMappings)) { - prefixMappings = new List(); + prefixMappings = []; this.prefixBasedMappings.Add(mapping.Prefix, prefixMappings); } prefixMappings.Add(mapping); @@ -370,18 +362,17 @@ internal IList ExtendedPropertiesProviders { get { - if (this.extendedPropertiesProviders == null) - this.extendedPropertiesProviders = new List(); + this.extendedPropertiesProviders ??= []; return this.extendedPropertiesProviders; } } internal ExtendedPropertyInfo[] GetExtendedProperties(object extendee) { - List extendedProperties = new List(); + List extendedProperties = []; foreach (WorkflowMarkupSerializer markupSerializer in ExtendedPropertiesProviders) extendedProperties.AddRange(markupSerializer.GetExtendedProperties(this, extendee)); - return extendedProperties.ToArray(); + return [.. extendedProperties]; } #endregion diff --git a/LogicBuilder.Workflow.ComponentModel.Serialization/ComponentModel/Serialization/WorkflowMarkupSerializer.cs b/LogicBuilder.Workflow.ComponentModel.Serialization/ComponentModel/Serialization/WorkflowMarkupSerializer.cs index 7f87cd2..149f212 100644 --- a/LogicBuilder.Workflow.ComponentModel.Serialization/ComponentModel/Serialization/WorkflowMarkupSerializer.cs +++ b/LogicBuilder.Workflow.ComponentModel.Serialization/ComponentModel/Serialization/WorkflowMarkupSerializer.cs @@ -77,7 +77,7 @@ private object DeserializeXoml(WorkflowMarkupSerializationManager serializationM { throw new WorkflowMarkupSerializationException(xmlException.Message, xmlException, xmlException.LineNumber, xmlException.LinePosition); } - catch (Exception e) + catch (Exception e) when (!ExceptionUtility.IsCriticalException(e)) { throw CreateSerializationError(e, xmlReader); } @@ -218,7 +218,7 @@ private void DeserializeContents(WorkflowMarkupSerializationManager serializatio { serializer.OnBeforeDeserialize(serializationManager, obj); } - catch (Exception e) + catch (Exception e) when (!ExceptionUtility.IsCriticalException(e)) { serializationManager.ReportError(new WorkflowMarkupSerializationException(SR.GetString(SR.Error_SerializerThrewException, obj.GetType().FullName, e.Message), e)); return; @@ -244,7 +244,7 @@ private void DeserializeContents(WorkflowMarkupSerializationManager serializatio props.AddRange(serializationManager.GetExtendedProperties(obj)); events.AddRange(serializer.GetEvents(serializationManager, obj)); } - catch (Exception e) + catch (Exception e) when (!ExceptionUtility.IsCriticalException(e)) { serializationManager.ReportError(CreateSerializationError(SR.GetString(SR.Error_SerializerThrewException, obj.GetType(), e.Message), e, reader)); return; @@ -298,7 +298,7 @@ private void DeserializeContents(WorkflowMarkupSerializationManager serializatio { serializer.OnBeforeDeserializeContents(serializationManager, obj); } - catch (Exception e) + catch (Exception e) when (!ExceptionUtility.IsCriticalException(e)) { serializationManager.ReportError(new WorkflowMarkupSerializationException(SR.GetString(SR.Error_SerializerThrewException, obj.GetType().FullName, e.Message), e)); return; @@ -309,7 +309,7 @@ private void DeserializeContents(WorkflowMarkupSerializationManager serializatio { serializer.ClearChildren(serializationManager, obj); } - catch (Exception e) + catch (Exception e) when (!ExceptionUtility.IsCriticalException(e)) { serializationManager.ReportError(CreateSerializationError(SR.GetString(SR.Error_SerializerThrewException, obj.GetType(), e.Message), e, reader)); return; @@ -416,7 +416,7 @@ private void DeserializeContents(WorkflowMarkupSerializationManager serializatio { serializer.OnAfterDeserialize(serializationManager, obj); } - catch (Exception e) + catch (Exception e) when (!ExceptionUtility.IsCriticalException(e)) { serializationManager.ReportError(new WorkflowMarkupSerializationException(SR.GetString(SR.Error_SerializerThrewException, obj.GetType().FullName, e.Message), e)); return; @@ -486,7 +486,7 @@ internal void SerializeContents(WorkflowMarkupSerializationManager serialization serializer = serializationManager.GetSerializer(obj.GetType(), typeof(WorkflowMarkupSerializer)) as WorkflowMarkupSerializer; } - catch (Exception e) + catch (Exception e) when (!ExceptionUtility.IsCriticalException(e)) { serializationManager.ReportError(new WorkflowMarkupSerializationException(SR.GetString(SR.Error_SerializerThrewException, obj.GetType().FullName, e.Message), e)); return; @@ -503,7 +503,7 @@ internal void SerializeContents(WorkflowMarkupSerializationManager serialization { serializer.OnBeforeSerialize(serializationManager, obj); } - catch (Exception e) + catch (Exception e) when (!ExceptionUtility.IsCriticalException(e)) { serializationManager.ReportError(new WorkflowMarkupSerializationException(SR.GetString(SR.Error_SerializerThrewException, obj.GetType().FullName, e.Message), e)); return; @@ -580,7 +580,7 @@ internal void SerializeContents(WorkflowMarkupSerializationManager serialization properties.AddRange(serializationManager.GetExtendedProperties(obj)); events.AddRange(serializer.GetEvents(serializationManager, obj)); } - catch (Exception e) + catch (Exception e) when (!ExceptionUtility.IsCriticalException(e)) { serializationManager.ReportError(new WorkflowMarkupSerializationException(SR.GetString(SR.Error_SerializerThrewException, obj.GetType().FullName, e.Message), e)); return; @@ -625,7 +625,7 @@ internal void SerializeContents(WorkflowMarkupSerializationManager serialization propertyInfoType = property.PropertyType; } } - catch (Exception e) + catch (Exception e) when (!ExceptionUtility.IsCriticalException(e)) { while (e is TargetInvocationException && e.InnerException != null) e = e.InnerException; @@ -665,7 +665,7 @@ internal void SerializeContents(WorkflowMarkupSerializationManager serialization { propValueSerializer = serializationManager.GetSerializer(propertyValueType, typeof(WorkflowMarkupSerializer)) as WorkflowMarkupSerializer; } - catch (Exception e) + catch (Exception e) when (!ExceptionUtility.IsCriticalException(e)) { serializationManager.ReportError(new WorkflowMarkupSerializationException(SR.GetString(SR.Error_SerializerThrewException, obj.GetType().FullName, e.Message), e)); serializationManager.Context.Pop(); @@ -715,7 +715,7 @@ internal void SerializeContents(WorkflowMarkupSerializationManager serialization } } } - catch (Exception e) + catch (Exception e) when (!ExceptionUtility.IsCriticalException(e)) { serializationManager.ReportError(new WorkflowMarkupSerializationException(SR.GetString(SR.Error_SerializerNoSerializeLogic, [propertyName, obj.GetType().FullName]), e)); } @@ -730,7 +730,7 @@ internal void SerializeContents(WorkflowMarkupSerializationManager serialization { serializer.OnBeforeSerializeContents(serializationManager, obj); } - catch (Exception e) + catch (Exception e) when (!ExceptionUtility.IsCriticalException(e)) { serializationManager.ReportError(new WorkflowMarkupSerializationException(SR.GetString(SR.Error_SerializerThrewException, obj.GetType().FullName, e.Message), e)); return; @@ -755,7 +755,7 @@ internal void SerializeContents(WorkflowMarkupSerializationManager serialization isReadOnly = (!property.CanWrite); } } - catch (Exception e) + catch (Exception e) when (!ExceptionUtility.IsCriticalException(e)) { while (e is TargetInvocationException && e.InnerException != null) e = e.InnerException; @@ -870,7 +870,7 @@ internal void SerializeContents(WorkflowMarkupSerializationManager serialization } } } - catch (Exception e) + catch (Exception e) when (!ExceptionUtility.IsCriticalException(e)) { serializationManager.ReportError(new WorkflowMarkupSerializationException(SR.GetString(SR.Error_SerializerThrewException, obj.GetType().FullName, e.Message), e)); return; @@ -881,7 +881,7 @@ internal void SerializeContents(WorkflowMarkupSerializationManager serialization { serializer.OnAfterSerialize(serializationManager, obj); } - catch (Exception e) + catch (Exception e) when (!ExceptionUtility.IsCriticalException(e)) { serializationManager.ReportError(new WorkflowMarkupSerializationException(SR.GetString(SR.Error_SerializerThrewException, obj.GetType().FullName, e.Message), e)); return; @@ -937,7 +937,7 @@ protected internal virtual bool ShouldSerializeValue(WorkflowMarkupSerialization } } } - catch + catch (Exception ex) when (!ExceptionUtility.IsCriticalException(ex)) { //We purposely eat all the exceptions as Convert.ChangeType can throw but in that case //we continue with serialization @@ -1248,7 +1248,7 @@ private object CreateInstance(WorkflowMarkupSerializationManager serializationMa { type = serializationManager.GetType(xmlQualifiedName); } - catch (Exception e) + catch (Exception e) when (!ExceptionUtility.IsCriticalException(e)) { serializationManager.ReportError(CreateSerializationError(SR.GetString(SR.Error_SerializerTypeNotResolvedWithInnerError, [GetClrFullName(serializationManager, xmlQualifiedName), e.Message]), e, reader)); return null; @@ -1260,7 +1260,7 @@ private object CreateInstance(WorkflowMarkupSerializationManager serializationMa { type = serializationManager.GetType(new XmlQualifiedName(typename, xmlQualifiedName.Namespace)); } - catch (Exception e) + catch (Exception e) when (!ExceptionUtility.IsCriticalException(e)) { serializationManager.ReportError(CreateSerializationError(SR.GetString(SR.Error_SerializerTypeNotResolvedWithInnerError, [GetClrFullName(serializationManager, xmlQualifiedName), e.Message]), e, reader)); return null; @@ -1297,7 +1297,7 @@ private object CreateInstance(WorkflowMarkupSerializationManager serializationMa obj = stringValue; } } - catch (Exception e) + catch (Exception e) when (!ExceptionUtility.IsCriticalException(e)) { serializationManager.ReportError(CreateSerializationError(SR.GetString(SR.Error_SerializerCreateInstanceFailed, e.Message), reader)); return null; @@ -1317,7 +1317,7 @@ private object CreateInstance(WorkflowMarkupSerializationManager serializationMa { obj = serializer.CreateInstance(serializationManager, type); } - catch (Exception e) + catch (Exception e) when (!ExceptionUtility.IsCriticalException(e)) { serializationManager.ReportError(CreateSerializationError(SR.GetString(SR.Error_SerializerCreateInstanceFailed, type.FullName, e.Message), reader)); return null; @@ -1460,7 +1460,7 @@ private void DeserializeSimpleMember(WorkflowMarkupSerializationManager serializ propVal.Add(content); } } - catch (Exception e) + catch (Exception e) when (!ExceptionUtility.IsCriticalException(e)) { while (e is TargetInvocationException && e.InnerException != null) e = e.InnerException; @@ -1468,7 +1468,7 @@ private void DeserializeSimpleMember(WorkflowMarkupSerializationManager serializ } } } - catch (Exception e) + catch (Exception e) when (!ExceptionUtility.IsCriticalException(e)) { while (e is TargetInvocationException && e.InnerException != null) e = e.InnerException; @@ -1633,7 +1633,7 @@ internal object DeserializeFromCompactFormat(WorkflowMarkupSerializationManager { argTokens = TokenizeAttributes(arguments); } - catch (Exception error) + catch (Exception error) when (!ExceptionUtility.IsCriticalException(error)) { serializationManager.ReportError(CreateSerializationError(SR.GetString(SR.Error_MarkupExtensionDeserializeFailed, attrValue, error.Message), reader)); return null; @@ -1716,7 +1716,7 @@ internal object DeserializeFromCompactFormat(WorkflowMarkupSerializationManager properties.AddRange(serializer.GetProperties(serializationManager, obj)); properties.AddRange(serializationManager.GetExtendedProperties(obj)); } - catch (Exception e) + catch (Exception e) when (!ExceptionUtility.IsCriticalException(e)) { serializationManager.ReportError(CreateSerializationError(SR.GetString(SR.Error_SerializerThrewException, obj.GetType().FullName, e.Message), e, reader)); return obj; @@ -2016,7 +2016,7 @@ public ContentProperty(WorkflowMarkupSerializationManager serializationManager, { contentPropertyValue = serializer.CreateInstance(serializationManager, this.contentProperty.PropertyType); } - catch (Exception e) + catch (Exception e) when (!ExceptionUtility.IsCriticalException(e)) { serializationManager.ReportError(CreateSerializationError(SR.GetString(SR.Error_SerializerCreateInstanceFailed, this.contentProperty.PropertyType.FullName, e.Message), reader)); return; @@ -2030,7 +2030,7 @@ public ContentProperty(WorkflowMarkupSerializationManager serializationManager, this.contentPropertySerializer.OnBeforeDeserializeContents(this.serializationManager, contentPropertyValue); } } - catch (Exception e) + catch (Exception e) when (!ExceptionUtility.IsCriticalException(e)) { this.serializationManager.ReportError(new WorkflowMarkupSerializationException(SR.GetString(SR.Error_SerializerThrewException, this.parentObject.GetType(), e.Message), e)); } @@ -2052,7 +2052,7 @@ void IDisposable.Dispose() if (contentPropertyValue != null) this.contentPropertySerializer.OnAfterDeserialize(this.serializationManager, contentPropertyValue); } - catch (Exception e) + catch (Exception e) when (!ExceptionUtility.IsCriticalException(e)) { this.serializationManager.ReportError(new WorkflowMarkupSerializationException(SR.GetString(SR.Error_SerializerThrewException, this.parentObject.GetType(), e.Message), e)); } @@ -2090,7 +2090,7 @@ internal void SetContents(IList contents) i += 1; } } - catch (Exception e) + catch (Exception e) when (!ExceptionUtility.IsCriticalException(e)) { this.serializationManager.ReportError(new WorkflowMarkupSerializationException(SR.GetString(SR.Error_SerializerThrewException, this.parentObject.GetType(), e.Message), e, contents[i].LineNumber, contents[i].LinePosition)); } @@ -2116,7 +2116,7 @@ internal void SetContents(IList contents) i++; } } - catch (Exception e) + catch (Exception e) when (!ExceptionUtility.IsCriticalException(e)) { this.serializationManager.ReportError(new WorkflowMarkupSerializationException(SR.GetString(SR.Error_SerializerThrewException, this.parentObject.GetType(), e.Message), e, contents[i].LineNumber, contents[i].LinePosition)); } @@ -2140,7 +2140,7 @@ internal void SetContents(IList contents) content = this.contentPropertySerializer.DeserializeFromString(this.serializationManager, this.contentProperty.PropertyType, content as string); content = WorkflowMarkupSerializer.GetValueFromMarkupExtension(this.serializationManager, content); } - catch (Exception e) + catch (Exception e) when (!ExceptionUtility.IsCriticalException(e)) { this.serializationManager.ReportError(new WorkflowMarkupSerializationException(SR.GetString(SR.Error_SerializerThrewException, this.parentObject.GetType(), e.Message), e, contents[0].LineNumber, contents[0].LinePosition)); return; @@ -2166,7 +2166,7 @@ internal void SetContents(IList contents) } this.contentProperty.SetValue(this.parentObject, content, null); } - catch (Exception e) + catch (Exception e) when (!ExceptionUtility.IsCriticalException(e)) { this.serializationManager.ReportError(new WorkflowMarkupSerializationException(SR.GetString(SR.Error_SerializerThrewException, this.parentObject.GetType(), e.Message), e, contents[0].LineNumber, contents[0].LinePosition)); } @@ -2195,7 +2195,7 @@ private PropertyInfo GetContentProperty(WorkflowMarkupSerializationManager seria } } - private struct ContentInfo(object content, int lineNumber, int linePosition) + private readonly struct ContentInfo(object content, int lineNumber, int linePosition) { public readonly int LineNumber = lineNumber; public readonly int LinePosition = linePosition; diff --git a/LogicBuilder.Workflow.ComponentModel.Serialization/ComponentModel/Serialization/XamlInterfaces.cs b/LogicBuilder.Workflow.ComponentModel.Serialization/ComponentModel/Serialization/XamlInterfaces.cs index 0104271..91345c6 100644 --- a/LogicBuilder.Workflow.ComponentModel.Serialization/ComponentModel/Serialization/XamlInterfaces.cs +++ b/LogicBuilder.Workflow.ComponentModel.Serialization/ComponentModel/Serialization/XamlInterfaces.cs @@ -12,13 +12,8 @@ namespace LogicBuilder.Workflow.ComponentModel.Serialization { [ExcludeFromCodeCoverage] [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] - public sealed class XmlnsDefinitionAttribute : Attribute + public sealed class XmlnsDefinitionAttribute(string xmlNamespace, string clrNamespace) : Attribute { - public XmlnsDefinitionAttribute(string xmlNamespace, string clrNamespace) - { - this.xmlNamespace = xmlNamespace ?? throw new ArgumentNullException("xmlNamespace"); - this.clrNamespace = clrNamespace ?? throw new ArgumentNullException("clrNamespace"); - } public string XmlNamespace { get { return this.xmlNamespace; } @@ -33,23 +28,18 @@ public string AssemblyName set { this.assemblyName = value; } } - private readonly string xmlNamespace; - private readonly string clrNamespace; + private readonly string xmlNamespace = xmlNamespace ?? throw new ArgumentNullException("xmlNamespace"); + private readonly string clrNamespace = clrNamespace ?? throw new ArgumentNullException("clrNamespace"); private string assemblyName; } [ExcludeFromCodeCoverage] [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] - public sealed class XmlnsPrefixAttribute : Attribute + public sealed class XmlnsPrefixAttribute(string xmlNamespace, string prefix) : Attribute { - private readonly string xmlNamespace; - private readonly string prefix; + private readonly string xmlNamespace = xmlNamespace ?? throw new ArgumentNullException("xmlNamespace"); + private readonly string prefix = prefix ?? throw new ArgumentNullException("prefix"); - public XmlnsPrefixAttribute(string xmlNamespace, string prefix) - { - this.xmlNamespace = xmlNamespace ?? throw new ArgumentNullException("xmlNamespace"); - this.prefix = prefix ?? throw new ArgumentNullException("prefix"); - } public string XmlNamespace { get { return this.xmlNamespace; } @@ -62,13 +52,10 @@ public string Prefix [ExcludeFromCodeCoverage] [AttributeUsage(AttributeTargets.Class)] - public sealed class RuntimeNamePropertyAttribute : Attribute + public sealed class RuntimeNamePropertyAttribute(string name) : Attribute { - private readonly string name = null; - public RuntimeNamePropertyAttribute(string name) - { - this.name = name; - } + private readonly string name = name; + public string Name { get @@ -96,14 +83,10 @@ public string Name [ExcludeFromCodeCoverage] [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)] - public sealed class ConstructorArgumentAttribute : Attribute + public sealed class ConstructorArgumentAttribute(string argumentName) : Attribute { - private readonly string argumentName; + private readonly string argumentName = argumentName; - public ConstructorArgumentAttribute(string argumentName) - { - this.argumentName = argumentName; - } public string ArgumentName { get { return this.argumentName; } @@ -156,7 +139,7 @@ public override object ProvideValue(IServiceProvider provider) throw new InvalidOperationException("typename"); WorkflowMarkupSerializationManager manager = provider as WorkflowMarkupSerializationManager ?? throw new ArgumentNullException("provider"); - if (!(manager.WorkflowMarkupStack[typeof(XmlReader)] is XmlReader reader)) + if (manager.WorkflowMarkupStack[typeof(XmlReader)] is not XmlReader reader) { Debug.Assert(false); return this.typeName; @@ -219,7 +202,7 @@ internal Type Type [ContentProperty("Items")] internal sealed class ArrayExtension : MarkupExtension { - private readonly ArrayList arrayElementList = new ArrayList(); + private readonly ArrayList arrayElementList = []; private Type arrayType; public ArrayExtension() diff --git a/Workflow.ComponentModel.Serialization.Tests/ComponentModel/ExceptionUtilityTest.cs b/Workflow.ComponentModel.Serialization.Tests/ComponentModel/ExceptionUtilityTest.cs new file mode 100644 index 0000000..7f430a3 --- /dev/null +++ b/Workflow.ComponentModel.Serialization.Tests/ComponentModel/ExceptionUtilityTest.cs @@ -0,0 +1,188 @@ +using LogicBuilder.Workflow.ComponentModel; +using System; +using System.Threading; +using Xunit; + +namespace LogicBuilder.Workflow.Tests.ComponentModel +{ + public class ExceptionUtilityTest + { + #region IsCriticalException Tests + + [Fact] + public void IsCriticalException_WithOutOfMemoryException_ReturnsTrue() + { + // Arrange + var exception = new OutOfMemoryException(); + + // Act + var result = ExceptionUtility.IsCriticalException(exception); + + // Assert + Assert.True(result); + } + + [Fact] + public void IsCriticalException_WithStackOverflowException_ReturnsTrue() + { + // Arrange + var exception = new StackOverflowException(); + + // Act + var result = ExceptionUtility.IsCriticalException(exception); + + // Assert + Assert.True(result); + } + + [Fact] + public void IsCriticalException_WithThreadInterruptedException_ReturnsTrue() + { + // Arrange + var exception = new ThreadInterruptedException(); + + // Act + var result = ExceptionUtility.IsCriticalException(exception); + + // Assert + Assert.True(result); + } + + [Fact] + public void IsCriticalException_WithArgumentNullException_ReturnsFalse() + { + // Arrange + var exception = new ArgumentNullException(); + + // Act + var result = ExceptionUtility.IsCriticalException(exception); + + // Assert + Assert.False(result); + } + + [Fact] + public void IsCriticalException_WithInvalidOperationException_ReturnsFalse() + { + // Arrange + var exception = new InvalidOperationException(); + + // Act + var result = ExceptionUtility.IsCriticalException(exception); + + // Assert + Assert.False(result); + } + + [Fact] + public void IsCriticalException_WithArgumentException_ReturnsFalse() + { + // Arrange + var exception = new ArgumentException(); + + // Act + var result = ExceptionUtility.IsCriticalException(exception); + + // Assert + Assert.False(result); + } + + [Fact] + public void IsCriticalException_WithNotSupportedException_ReturnsFalse() + { + // Arrange + var exception = new NotSupportedException(); + + // Act + var result = ExceptionUtility.IsCriticalException(exception); + + // Assert + Assert.False(result); + } + + [Fact] + public void IsCriticalException_WithNullReferenceException_ReturnsFalse() + { + // Arrange + var exception = new NullReferenceException(); + + // Act + var result = ExceptionUtility.IsCriticalException(exception); + + // Assert + Assert.False(result); + } + + [Fact] + public void IsCriticalException_WithIOException_ReturnsFalse() + { + // Arrange + var exception = new System.IO.IOException(); + + // Act + var result = ExceptionUtility.IsCriticalException(exception); + + // Assert + Assert.False(result); + } + + [Fact] + public void IsCriticalException_WithGenericException_ReturnsFalse() + { + // Arrange + var exception = new Exception(); + + // Act + var result = ExceptionUtility.IsCriticalException(exception); + + // Assert + Assert.False(result); + } + + [Fact] + public void IsCriticalException_WithCustomException_ReturnsFalse() + { + // Arrange + var exception = new CustomTestException(); + + // Act + var result = ExceptionUtility.IsCriticalException(exception); + + // Assert + Assert.False(result); + } + + [Fact] + public void IsCriticalException_WithDerivedFromOutOfMemoryException_ReturnsTrue() + { + // Arrange + var exception = new InsufficientMemoryException(); + + // Act + var result = ExceptionUtility.IsCriticalException(exception); + + // Assert + Assert.True(result); + } + + #endregion + + #region Helper Classes + + private class CustomTestException : Exception + { + public CustomTestException() : base("Custom test exception") + { + } + } + + private class InsufficientMemoryException : OutOfMemoryException + { + public InsufficientMemoryException() : base("Insufficient memory") + { + } + } + + #endregion + } +} \ No newline at end of file