From 5cf8c6b48cb8d537e48b9562a0be8862c9b09a18 Mon Sep 17 00:00:00 2001 From: mpostol Date: Sat, 20 Mar 2021 22:15:12 +0100 Subject: [PATCH] UAReferenceContext - causes circular references #558 - Added UT - UT +1: --- SemanticData.playlist | 2 +- .../UAReferenceContextTestClass.cs | 136 +++++++++++++++++- .../UANodeSetValidation/UAReferenceContext.cs | 34 +++-- 3 files changed, 158 insertions(+), 14 deletions(-) diff --git a/SemanticData.playlist b/SemanticData.playlist index 14c9fa1e..15401084 100644 --- a/SemanticData.playlist +++ b/SemanticData.playlist @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/SemanticData/Tests/USNodeSetValidationUnitTestProject/UAReferenceContextTestClass.cs b/SemanticData/Tests/USNodeSetValidationUnitTestProject/UAReferenceContextTestClass.cs index ad858ef6..7aec164c 100644 --- a/SemanticData/Tests/USNodeSetValidationUnitTestProject/UAReferenceContextTestClass.cs +++ b/SemanticData/Tests/USNodeSetValidationUnitTestProject/UAReferenceContextTestClass.cs @@ -8,6 +8,8 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using System; +using System.Collections.Generic; +using System.Xml; using UAOOI.SemanticData.UANodeSetValidation.DataSerialization; using UAOOI.SemanticData.UANodeSetValidation.UAInformationModel; @@ -25,6 +27,7 @@ public void NullArgumentConstructorTest() Assert.ThrowsException(() => new UAReferenceContext(new XML.Reference(), null, nodeMock.Object)); Assert.ThrowsException(() => new UAReferenceContext(new XML.Reference(), asMock.Object, null)); } + [TestMethod] public void ConstructorTest() { @@ -49,9 +52,9 @@ public void ConstructorTest() Assert.AreEqual("ns=1;i=1:i=10:ns=1;i=12", instance2Test.Key); Assert.AreSame(typeMock.Object, instance2Test.TypeNode); Assert.AreSame(sourceMock.Object, instance2Test.ParentNode); - Assert.AreSame(sourceMock.Object, instance2Test.SourceNode); Assert.AreSame(targetMock.Object, instance2Test.TargetNode); + asMock.Verify(z => z.GetOrCreateNodeContext(It.IsAny(), It.IsAny>()), Times.Exactly(2)); reference.IsForward = false; instance2Test = new UAReferenceContext(reference, asMock.Object, sourceMock.Object); @@ -59,9 +62,138 @@ public void ConstructorTest() Assert.AreEqual("ns=1;i=12:i=10:ns=1;i=1", instance2Test.Key); Assert.AreSame(typeMock.Object, instance2Test.TypeNode); Assert.AreSame(sourceMock.Object, instance2Test.ParentNode); - Assert.AreSame(sourceMock.Object, instance2Test.TargetNode); Assert.AreSame(targetMock.Object, instance2Test.SourceNode); } + + [TestMethod] + public void GetReferenceTypeNameTest() + { + XML.Reference reference = new XML.Reference() { IsForward = true, ReferenceType = ReferenceTypeIds.HasOrderedComponent.ToString(), Value = "ns=1;i=11" }; + reference.RecalculateNodeIds(x => NodeId.Parse(x)); + + Mock typeMock = new Mock(); + typeMock.Setup(x => x.NodeIdContext).Returns(new NodeId("i=10")); + + Mock targetMock = new Mock(); + targetMock.Setup(x => x.NodeIdContext).Returns(new NodeId("ns=1;i=12")); + + Mock asMock = new Mock(); + asMock.Setup(x => x.GetOrCreateNodeContext(It.IsAny(), It.IsAny>())).Returns(typeMock.Object); + asMock.Setup(x => x.GetOrCreateNodeContext(It.Is(z => z == reference.ValueNodeId), It.IsAny>())).Returns(targetMock.Object); + + Mock sourceMock = new Mock(); + sourceMock.Setup(x => x.NodeIdContext).Returns(NodeId.Parse("ns=1;i=1")); + + UAReferenceContext instance2Test = new UAReferenceContext(reference, asMock.Object, sourceMock.Object); + + asMock.Setup(x => x.ExportBrowseName(It.Is(z => z == new NodeId("i=10")), It.IsAny())).Returns(new XmlQualifiedName("2P8ZkTA2Ccahvs", "943IbIVI6ivpBj")); + XmlQualifiedName typeName = instance2Test.GetReferenceTypeName(); + asMock.Verify(x => x.ExportBrowseName(It.Is(z => z == new NodeId("i=10")), It.IsAny()), Times.Once); + Assert.IsNotNull(typeName); + Assert.AreEqual("943IbIVI6ivpBj", typeName.Namespace); + Assert.AreEqual("2P8ZkTA2Ccahvs", typeName.Name); + } + + [TestMethod] + public void BrowsePathNameIsForwardTest() + { + XML.Reference reference = new XML.Reference() { IsForward = true, ReferenceType = ReferenceTypeIds.HasOrderedComponent.ToString(), Value = "ns=1;i=11" }; + reference.RecalculateNodeIds(x => NodeId.Parse(x)); + + Mock typeMock = new Mock(); + typeMock.Setup(x => x.NodeIdContext).Returns(new NodeId("i=10")); + + Mock targetMock = new Mock(); + targetMock.Setup(x => x.NodeIdContext).Returns(new NodeId("ns=1;i=12")); + + Mock asMock = new Mock(); + asMock.Setup(x => x.GetOrCreateNodeContext(It.IsAny(), It.IsAny>())).Returns(typeMock.Object); + asMock.Setup(x => x.GetOrCreateNodeContext(It.Is(z => z == reference.ValueNodeId), It.IsAny>())).Returns(targetMock.Object); + + Mock sourceMock = new Mock(); + sourceMock.Setup(x => x.NodeIdContext).Returns(NodeId.Parse("ns=1;i=1")); + + UAReferenceContext instance2Test = new UAReferenceContext(reference, asMock.Object, sourceMock.Object); + + targetMock.Setup(z => z.BuildSymbolicId(It.Is>(x => CreatePathFixture(x)))); + XmlQualifiedName typeName = instance2Test.BrowsePath(); + targetMock.Verify(z => z.BuildSymbolicId(It.IsAny>()), Times.Once); + sourceMock.Verify(z => z.BuildSymbolicId(It.IsAny>()), Times.Never); + typeMock.Verify(z => z.BuildSymbolicId(It.IsAny>()), Times.Never); + Assert.IsNotNull(typeName); + Assert.AreEqual("", typeName.Namespace); + Assert.AreEqual("2P8ZkTA2Ccahvs_bLAsL6DSp1Ow5d", typeName.Name); + } + + [TestMethod] + public void BrowsePathNameTest() + { + XML.Reference reference = new XML.Reference() { IsForward = false, ReferenceType = ReferenceTypeIds.HasOrderedComponent.ToString(), Value = "ns=1;i=11" }; + reference.RecalculateNodeIds(x => NodeId.Parse(x)); + + Mock typeMock = new Mock(); + typeMock.Setup(x => x.NodeIdContext).Returns(new NodeId("i=10")); + + Mock targetMock = new Mock(); + targetMock.Setup(x => x.NodeIdContext).Returns(new NodeId("ns=1;i=12")); + + Mock asMock = new Mock(); + asMock.Setup(x => x.GetOrCreateNodeContext(It.IsAny(), It.IsAny>())).Returns(typeMock.Object); + asMock.Setup(x => x.GetOrCreateNodeContext(It.Is(z => z == reference.ValueNodeId), It.IsAny>())).Returns(targetMock.Object); + + Mock sourceMock = new Mock(); + sourceMock.Setup(x => x.NodeIdContext).Returns(NodeId.Parse("ns=1;i=1")); + + UAReferenceContext instance2Test = new UAReferenceContext(reference, asMock.Object, sourceMock.Object); + + Assert.IsFalse(instance2Test.IsForward); + targetMock.Setup(z => z.BuildSymbolicId(It.Is>(x => CreatePathFixture(x)))); + XmlQualifiedName typeName = instance2Test.BrowsePath(); + targetMock.Verify(z => z.BuildSymbolicId(It.IsAny>()), Times.Once); + sourceMock.Verify(z => z.BuildSymbolicId(It.IsAny>()), Times.Never); + typeMock.Verify(z => z.BuildSymbolicId(It.IsAny>()), Times.Never); + Assert.IsNotNull(typeName); + Assert.AreEqual("", typeName.Namespace); + Assert.AreEqual("2P8ZkTA2Ccahvs_bLAsL6DSp1Ow5d", typeName.Name); + } + + + [TestMethod] + public void BuildSymbolicIdTest() + { + XML.Reference reference = new XML.Reference() { IsForward = false, ReferenceType = ReferenceTypeIds.HasOrderedComponent.ToString(), Value = "ns=1;i=11" }; + reference.RecalculateNodeIds(x => NodeId.Parse(x)); + + Mock typeMock = new Mock(); + + Mock targetMock = new Mock(); + targetMock.Setup(x => x.NodeIdContext).Returns(new NodeId("ns=1;i=12")); + + Mock asMock = new Mock(); + asMock.Setup(x => x.GetOrCreateNodeContext(It.IsAny(), It.IsAny>())).Returns(typeMock.Object); + asMock.Setup(x => x.GetOrCreateNodeContext(It.Is(z => z == reference.ValueNodeId), It.IsAny>())).Returns(targetMock.Object); + + Mock sourceMock = new Mock(); + sourceMock.Setup(x => x.NodeIdContext).Returns(NodeId.Parse("ns=1;i=1")); + + UAReferenceContext instance2Test = new UAReferenceContext(reference, asMock.Object, sourceMock.Object); + + Assert.IsFalse(instance2Test.IsForward); + targetMock.Setup(z => z.BuildSymbolicId(It.Is>(x => CreatePathFixture(x)))); + List path = new List(); + instance2Test.BuildSymbolicId(path); + targetMock.Verify(z => z.BuildSymbolicId(It.IsAny>()), Times.Once); + sourceMock.Verify(z => z.BuildSymbolicId(It.IsAny>()), Times.Never); + typeMock.Verify(z => z.BuildSymbolicId(It.IsAny>()), Times.Never); + Assert.AreEqual(2, path.Count); + } + + private bool CreatePathFixture(List z) + { + z.Add("2P8ZkTA2Ccahvs"); + z.Add("bLAsL6DSp1Ow5d"); + return z.Count == 2; + } } } \ No newline at end of file diff --git a/SemanticData/UANodeSetValidation/UAReferenceContext.cs b/SemanticData/UANodeSetValidation/UAReferenceContext.cs index 9af6006c..136bc774 100644 --- a/SemanticData/UANodeSetValidation/UAReferenceContext.cs +++ b/SemanticData/UANodeSetValidation/UAReferenceContext.cs @@ -117,6 +117,8 @@ internal ReferenceKindEnum ReferenceKind #endregion semantics + #region naming + /// /// Gets the name of the reference type. /// @@ -139,6 +141,19 @@ internal XmlQualifiedName BrowsePath() return new XmlQualifiedName(_symbolicId, m_AddressSpace.GetNamespace(_startingNode.NodeIdContext.NamespaceIndex)); } + /// + /// Ir recursively builds the symbolic identifier. + /// + /// The browse path. + internal void BuildSymbolicId(List path) + { + this.SourceNode.BuildSymbolicId(path); + } + + #endregion naming + + #region navigation + /// /// Gets the parent node that the reference is attached to. /// @@ -146,17 +161,21 @@ internal XmlQualifiedName BrowsePath() internal IUANodeContext ParentNode => IsForward ? SourceNode : TargetNode; /// - /// Gets the target node context. + /// Gets the type node. /// - /// The target node context. + /// An instance of that captures information about a node representing type of the reference. internal IUANodeContext TypeNode { get; private set; } + /// + /// Gets the target node. + /// + /// An instance of that captures information about a target node. internal IUANodeContext TargetNode { get; private set; } /// /// Gets the source node context. /// - /// The source node context. + /// An instance of that captures information about a source node. internal IUANodeContext SourceNode { get; private set; } /// @@ -171,14 +190,7 @@ internal XmlQualifiedName BrowsePath() /// true if this instance is forward; otherwise, false. internal bool IsForward { get; private set; } - /// - /// Ir recursively builds the symbolic identifier. - /// - /// The browse path. - internal void BuildSymbolicId(List path) - { - this.SourceNode.BuildSymbolicId(path); - } + #endregion navigation #endregion API