From b8ed3cc7828d7dbc232d2b1ad510d2de4d117bf1 Mon Sep 17 00:00:00 2001
From: Copilot <198982749+Copilot@users.noreply.github.com>
Date: Thu, 4 Dec 2025 15:34:51 +0100
Subject: [PATCH] Fix BaseEventState.MemberwiseClone() to pass Parent to
Activator.CreateInstance (#3361)
* Fix BaseEventState.MemberwiseClone() to pass Parent to Activator.CreateInstance
Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>
---
.../Opc.Ua.Core/Stack/State/BaseEventState.cs | 2 +-
.../Stack/State/NodeStateTests.cs | 55 +++++++++++++++++++
2 files changed, 56 insertions(+), 1 deletion(-)
diff --git a/Stack/Opc.Ua.Core/Stack/State/BaseEventState.cs b/Stack/Opc.Ua.Core/Stack/State/BaseEventState.cs
index 9cbf864376..547797d749 100644
--- a/Stack/Opc.Ua.Core/Stack/State/BaseEventState.cs
+++ b/Stack/Opc.Ua.Core/Stack/State/BaseEventState.cs
@@ -83,7 +83,7 @@ namespace Opc.Ua
///
public new object MemberwiseClone()
{
- var clone = (BaseEventState)Activator.CreateInstance(GetType());
+ var clone = (BaseEventState)Activator.CreateInstance(GetType(), Parent);
return CloneChildren(clone);
}
}
diff --git a/Tests/Opc.Ua.Core.Tests/Stack/State/NodeStateTests.cs b/Tests/Opc.Ua.Core.Tests/Stack/State/NodeStateTests.cs
index e0e46b5dee..24b5722c40 100644
--- a/Tests/Opc.Ua.Core.Tests/Stack/State/NodeStateTests.cs
+++ b/Tests/Opc.Ua.Core.Tests/Stack/State/NodeStateTests.cs
@@ -139,4 +139,59 @@ namespace Opc.Ua.Core.Tests.Stack.State
return CreateDefaultNodeStateType(systemType) is NodeState;
}
}
+
+ ///
+ /// Tests for BaseEventState.MemberwiseClone.
+ ///
+ [TestFixture]
+ [Category("BaseEventState")]
+ [SetCulture("en-us")]
+ [SetUICulture("en-us")]
+ [Parallelizable]
+ public class BaseEventStateTests
+ {
+ ///
+ /// Verify that MemberwiseClone works correctly for BaseEventState.
+ ///
+ [Test]
+ public void MemberwiseCloneBaseEventStateSucceeds()
+ {
+ var parent = new BaseObjectState(null);
+ var eventState = new BaseEventState(parent);
+
+ var clone = (BaseEventState)eventState.MemberwiseClone();
+
+ Assert.That(clone, Is.Not.Null);
+ Assert.That(clone.Parent, Is.SameAs(parent));
+ }
+
+ ///
+ /// Verify that MemberwiseClone works correctly for BaseEventState with null parent.
+ ///
+ [Test]
+ public void MemberwiseCloneBaseEventStateWithNullParentSucceeds()
+ {
+ var eventState = new BaseEventState(null);
+
+ var clone = (BaseEventState)eventState.MemberwiseClone();
+
+ Assert.That(clone, Is.Not.Null);
+ Assert.That(clone.Parent, Is.Null);
+ }
+
+ ///
+ /// Verify that Clone works correctly for derived event types.
+ ///
+ [Test]
+ public void CloneNonExclusiveLimitAlarmStateSucceeds()
+ {
+ var parent = new BaseObjectState(null);
+ var alarmState = new NonExclusiveLimitAlarmState(parent);
+
+ var clone = (NonExclusiveLimitAlarmState)alarmState.Clone();
+
+ Assert.That(clone, Is.Not.Null);
+ Assert.That(clone.Parent, Is.SameAs(parent));
+ }
+ }
}