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)); + } + } }