Skip to content

Commit 6beb01b

Browse files
61 blank attributes name validation (#62)
* Fix for Blank Attributes causing name validation errors * Add testing for Issue 61
1 parent 4d03cf6 commit 6beb01b

File tree

7 files changed

+15606
-4
lines changed

7 files changed

+15606
-4
lines changed

NodeSetToAML.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2539,10 +2539,13 @@ private void ProcessOptionSets(ref AttributeTypeType att, NodeId nodeId)
25392539
Opc.Ua.LocalizedText[] OptionSetValues = OptionSets.DecodedValue.Value as Opc.Ua.LocalizedText[];
25402540
foreach (var OptionSetValue in OptionSetValues)
25412541
{
2542-
AttributeType a = new AttributeType(new System.Xml.Linq.XElement(defaultNS + "Attribute"));
2543-
a.Name = OptionSetValue.Text;
2544-
a.AttributeDataType = "xs:boolean";
2545-
att.Attribute.Insert(a, false);
2542+
if( OptionSetValue.Text != null && OptionSetValue.Text.Length > 0 )
2543+
{
2544+
AttributeType a = new AttributeType( new System.Xml.Linq.XElement( defaultNS + "Attribute" ) );
2545+
a.Name = OptionSetValue.Text;
2546+
a.AttributeDataType = "xs:boolean";
2547+
att.Attribute.Insert( a, false );
2548+
}
25462549
}
25472550
}
25482551

SystemTest/NodeSetFiles/AmlFxTest.xml

Lines changed: 382 additions & 0 deletions
Large diffs are not rendered by default.

SystemTest/NodeSetFiles/Opc.Ua.Di.NodeSet2.xml

Lines changed: 5719 additions & 0 deletions
Large diffs are not rendered by default.

SystemTest/NodeSetFiles/opc.ua.fx.ac.nodeset2.xml

Lines changed: 6501 additions & 0 deletions
Large diffs are not rendered by default.

SystemTest/NodeSetFiles/opc.ua.fx.data.nodeset2.xml

Lines changed: 2840 additions & 0 deletions
Large diffs are not rendered by default.

SystemTest/SystemTest.csproj

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@
2222
</ItemGroup>
2323

2424
<ItemGroup>
25+
<None Update="NodeSetFiles\AmlFxTest.xml">
26+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
27+
</None>
2528
<None Update="NodeSetFiles\InstanceLevel.xml">
2629
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
2730
</None>
@@ -31,6 +34,15 @@
3134
<None Update="NodeSetFiles\LevelTwo.xml">
3235
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
3336
</None>
37+
<None Update="NodeSetFiles\Opc.Ua.Di.NodeSet2.xml">
38+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
39+
</None>
40+
<None Update="NodeSetFiles\opc.ua.fx.ac.nodeset2.xml">
41+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
42+
</None>
43+
<None Update="NodeSetFiles\opc.ua.fx.data.nodeset2.xml">
44+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
45+
</None>
3446
<None Update="NodeSetFiles\Opc.Ua.NodeSet2.xml">
3547
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
3648
</None>
Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
using Aml.Engine.CAEX;
2+
using Aml.Engine.CAEX.Extensions;
3+
using Aml.Engine.Services;
4+
using Microsoft.VisualStudio.TestTools.UnitTesting;
5+
using System.Collections.Generic;
6+
using System.Linq;
7+
8+
namespace SystemTest
9+
{
10+
[TestClass]
11+
public class TestOptionSetEmptyValues
12+
{
13+
CAEXDocument m_document = null;
14+
15+
#region Tests
16+
17+
[ TestMethod]
18+
public void Validation()
19+
{
20+
var lookupService = LookupService.Register();
21+
var service = ValidatorService.Register();
22+
23+
IEnumerable<ValidationElement> issues = service.ValidateAll(GetDocument());
24+
if (issues != null)
25+
{
26+
Assert.AreEqual(0, issues.AliasReferenceValidationResults().Count(), "AliasReferenceValidationResults");
27+
Assert.AreEqual(0, issues.ExternalReferenceValidationResults().Count(), "ExternalReferenceValidationResults");
28+
Assert.AreEqual(0, issues.ClassPathValidationResults().Count(), "ClassPathValidationResults");
29+
Assert.AreEqual(0, issues.IDReferenceValidationResults().Count(), "IDReferenceValidationResults");
30+
Assert.AreEqual(0, issues.PathReferenceValidationResults().Count(), "PathReferenceValidationResults");
31+
Assert.AreEqual(0, issues.NameReferenceValidationResults().Count(), "NameReferenceValidationResults");
32+
Assert.AreEqual(0, issues.NameValidationResults().Count(), "NameValidationResults");
33+
Assert.AreEqual(0, issues.IDValidationResults().Count(), "IDValidationResults");
34+
Assert.AreEqual(0, issues.MetaDataValidationResults().Count(), "MetaDataValidationResults");
35+
Assert.AreEqual(0, issues.InvalidAutomationMLVersion().Count(), "InvalidAutomationMLVersion");
36+
Assert.AreEqual(0, issues.InvalidSchemaVersion().Count(), "InvalidSchemaVersion");
37+
Assert.AreEqual(0, issues.MissingDocumentSourceInformation().Count(), "MissingDocumentSourceInformation");
38+
Assert.AreEqual(0, issues.InvalidIDs().Count(), "InvalidIDs");
39+
Assert.AreEqual(0, issues.NotUniquePath().Count(), "NotUniquePath");
40+
Assert.AreEqual(0, issues.Repairable().Count(), "Repairable");
41+
Assert.AreEqual(0, issues.NotRepairable().Count(), "NotRepairable");
42+
Assert.AreEqual(0, issues.UnresolvedIDRefs().Count(), "UnresolvedIDRefs");
43+
Assert.AreEqual(0, issues.UnresolvedPathRefs().Count(), "UnresolvedPathRefs");
44+
Assert.AreEqual(0, issues.EmptyPathRefs().Count(), "EmptyPathRefs");
45+
Assert.AreEqual(0, issues.EmptyIDRefs().Count(), "EmptyIDRefs");
46+
Assert.AreEqual(0, issues.MissingIDs().Count(), "MissingIDs");
47+
Assert.AreEqual(0, issues.NotUniqueIDs().Count(), "NotUniqueIDs");
48+
Assert.AreEqual(0, issues.UnidentifiedAlias().Count(), "UnidentifiedAlias");
49+
Assert.AreEqual(0, issues.UselessAlias().Count(), "UselessAlias");
50+
Assert.AreEqual(0, issues.Count(), "TotalIssues");
51+
}
52+
else
53+
{
54+
Assert.Fail("Unable to get validation results");
55+
}
56+
}
57+
58+
[TestMethod]
59+
public void TestOperationalHealthOptionSet()
60+
{
61+
AttributeTypeLibType attributeLibrary = GetFxAcAttributes();
62+
AttributeFamilyType attributeFamilyType = attributeLibrary[ "OperationalHealthOptionSet" ];
63+
TestOptionSet( attributeFamilyType );
64+
}
65+
66+
[TestMethod]
67+
public void TestAggregatedHealthOptionSet()
68+
{
69+
AttributeTypeLibType attributeLibrary = GetFxAcAttributes();
70+
AttributeFamilyType attributeFamilyType = attributeLibrary[ "AggregatedHealthDataType" ];
71+
Assert.IsNotNull( attributeFamilyType );
72+
AttributeType attributeType = attributeFamilyType.Attribute[ "AggregatedOperationalHealth" ];
73+
TestOptionSet( attributeType );
74+
}
75+
76+
[TestMethod]
77+
public void TestInstance()
78+
{
79+
CAEXDocument document = GetDocument();
80+
CAEXObject instance = document.FindByID( "nsu%3Dhttp%3A%2F%2Fopcfoundation.org%2FUA%2FFX%2FAML%2FTESTING%2FAmlFxTest%2F%3Bi%3D6003" );
81+
Assert.IsNotNull( instance );
82+
InternalElementType internalElementType = instance as InternalElementType;
83+
Assert.IsNotNull( internalElementType );
84+
AttributeType value = internalElementType.Attribute[ "Value" ];
85+
Assert.IsNotNull( value );
86+
TestOptionSet( value );
87+
}
88+
89+
90+
#endregion
91+
92+
#region Helpers
93+
94+
private CAEXDocument GetDocument()
95+
{
96+
if( m_document == null )
97+
{
98+
m_document = TestHelper.GetReadOnlyDocument( "AmlFxTest.xml.amlx" );
99+
}
100+
Assert.IsNotNull( m_document, "Unable to retrieve Document" );
101+
return m_document;
102+
}
103+
104+
public void TestOptionSet( AttributeTypeType attributeFamilyType )
105+
{
106+
Assert.IsNotNull( attributeFamilyType );
107+
Assert.AreEqual( 4, attributeFamilyType.Attribute.Count );
108+
ValidateOptionSetNames( attributeFamilyType );
109+
}
110+
111+
public void ValidateOptionSetNames( AttributeTypeType attributeFamilyType )
112+
{
113+
HashSet<string> names = GetOptionSetNames( attributeFamilyType );
114+
Assert.AreEqual( 4, names.Count );
115+
Assert.AreEqual( true, names.Contains( "OperationalWarning" ) );
116+
Assert.AreEqual( true, names.Contains( "OperationalError" ) );
117+
Assert.AreEqual( true, names.Contains( "SubOperationalWarning" ) );
118+
Assert.AreEqual( true, names.Contains( "SubOperationalError" ) );
119+
}
120+
121+
public HashSet<string> GetOptionSetNames( AttributeTypeType attributeFamilyType )
122+
{
123+
HashSet<string> strings = new HashSet<string>();
124+
125+
foreach( AttributeType attribute in attributeFamilyType.Attribute )
126+
{
127+
strings.Add( attribute.Name );
128+
}
129+
130+
return strings;
131+
}
132+
133+
public AttributeTypeLibType GetFxAcAttributes()
134+
{
135+
CAEXDocument document = GetDocument();
136+
AttributeTypeLibType fxAcAttributes = document.CAEXFile.AttributeTypeLib[
137+
"ATL_http://opcfoundation.org/UA/FX/AC/" ];
138+
Assert.IsNotNull( fxAcAttributes );
139+
return fxAcAttributes;
140+
}
141+
142+
#endregion
143+
144+
}
145+
}

0 commit comments

Comments
 (0)