Skip to content

Commit 40468f5

Browse files
author
Flurb
committed
Added XSDValidator tests
Signed-off-by: Flurb <[email protected]>
1 parent bb2679f commit 40468f5

File tree

5 files changed

+243
-2
lines changed

5 files changed

+243
-2
lines changed

riseclipse/validator-riseclipse/src/main/java/org/lfenergy/compas/scl/validator/impl/SclRiseClipseValidator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public List<ValidationError> validate(SclFileType type, String sclData) {
4747
var validationErrors = new ArrayList<ValidationError>();
4848

4949
var xsdValidator = new XSDValidator(validationErrors, sclData);
50-
xsdValidator.validate(sclData);
50+
xsdValidator.validate();
5151

5252
if (!validationErrors.isEmpty()) return validationErrors;
5353

validator/src/main/java/org/lfenergy/compas/scl/validator/xsd/XSDValidator.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,11 @@ public class XSDValidator {
2727
private Validator validator;
2828

2929
private final List<ValidationError> errorList;
30+
private final String sclData;
3031

3132
public XSDValidator(List<ValidationError> errorList, String sclData) {
3233
this.errorList = errorList;
34+
this.sclData = sclData;
3335

3436
var sclVersion = getSclVersion(sclData);
3537

@@ -76,7 +78,7 @@ public void fatalError(SAXParseException exception) {
7678
} );
7779
}
7880

79-
public void validate(String sclData) {
81+
public void validate() {
8082
try {
8183
SAXSource source = new SAXSource(new InputSource(new StringReader(sclData)));
8284
validator.validate(source);
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// SPDX-FileCopyrightText: 2022 Alliander N.V.
2+
//
3+
// SPDX-License-Identifier: Apache-2.0
4+
package org.lfenergy.compas.scl.validator.xsd;
5+
6+
import org.junit.jupiter.api.Test;
7+
import org.lfenergy.compas.scl.validator.model.ValidationError;
8+
9+
import java.io.IOException;
10+
import java.nio.charset.StandardCharsets;
11+
import java.util.ArrayList;
12+
13+
import static org.junit.jupiter.api.Assertions.*;
14+
15+
class XSDValidatorTest {
16+
@Test
17+
void validate_WhenCalledWithSclDataWithoutXsdValidationErrors_ThenNoErrorsAreRetrieved() throws IOException {
18+
var errorList = new ArrayList<ValidationError>();
19+
try (var inputStream = getClass()
20+
.getResourceAsStream("/scl/validation/example-without-xsd-validation-errors.scd")) {
21+
var data = new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);
22+
new XSDValidator(errorList, data).validate();
23+
24+
assertEquals(0, errorList.size());
25+
}
26+
}
27+
28+
@Test
29+
void validate_WhenCalledWithSclDataWithXsdValidationErrors_ThenErrorsAreRetrieved() throws IOException {
30+
var errorList = new ArrayList<ValidationError>();
31+
try (var inputStream = getClass()
32+
.getResourceAsStream("/scl/validation/example-with-xsd-validation-errors.scd")) {
33+
var data = new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);
34+
new XSDValidator(errorList, data).validate();
35+
36+
assertEquals(4, errorList.size());
37+
38+
var error = errorList.get(2);
39+
assertEquals("[XSD validation] (line: 66, column: 45): cvc-complex-type.4: " +
40+
"Attribute 'name' must appear on element 'BDA'.",error.getMessage());
41+
}
42+
}
43+
}
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!-- SPDX-FileCopyrightText: 2020 RTE FRANCE -->
3+
<!-- -->
4+
<!-- SPDX-License-Identifier: Apache-2.0 -->
5+
6+
<SCL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.iec.ch/61850/2003/SCL" version="2007" revision="B" release="4">
7+
<Header id="f9283708-bf4f-412c-a1d6-f947b9ac3000" version="1.0.0" revision="Revision" toolID="toolID" nameStructure="IEDName"/>
8+
<IED name="IED_NAME">
9+
<AccessPoint name="AP_NAME">
10+
<Server>
11+
<Authentication/>
12+
<LDevice inst="LDPO">
13+
<LN0 lnType="LN2" lnClass="LLN0" inst="">
14+
<Inputs>
15+
<ExtRef intAddr="INTADDR" pDO="DO1" desc="DESC1"/>
16+
<ExtRef intAddr="INTADDR" pDO="DO2" desc="DESC2"/>
17+
</Inputs>
18+
</LN0>
19+
<LN lnType="LN1" lnClass="PIOC" inst="1">
20+
<Inputs>
21+
<ExtRef intAddr="INTADDR" pDO="DO1" desc="DESC1"/>
22+
<ExtRef intAddr="INTADDR" pDO="DO2" desc="DESC2"/>
23+
</Inputs>
24+
</LN>
25+
<LN lnType="LN1" lnClass="PIOC" inst="2">
26+
<Inputs>
27+
<ExtRef intAddr="INTADDR" pDO="DO1" desc="DESC1"/>
28+
<ExtRef intAddr="INTADDR" pDO="DO2" desc="DESC2"/>
29+
</Inputs>
30+
</LN>
31+
</LDevice>
32+
</Server>
33+
</AccessPoint>
34+
</IED>
35+
<DataTypeTemplates>
36+
<LNodeType lnClass="LLN0" id="LN2">
37+
<DO name="Beh" transient="false"/>
38+
<DO name="FACntRs" type="DO2" transient="true"/>
39+
<DO name="StrVal" type="DO3" transient="false"/>
40+
</LNodeType>
41+
<LNodeType lnClass="PIOC" id="LN1">
42+
<DO name="Beh" type="DO1" transient="false"/>
43+
<DO type="DO2" transient="true"/>
44+
<DO name="StrVal" type="DO3" transient="false"/>
45+
</LNodeType>
46+
<DOType cdc="WYE" id="DO1">
47+
<DA fc="DC" dchg="false" qchg="false" dupd="false" name="dataNs" bType="VisString255">
48+
<Val>IEC 61850-7-3:2007B</Val>
49+
</DA>
50+
<DA fc="CF" dchg="true" qchg="false" dupd="false" name="smpRate" bType="INT32U"/>
51+
</DOType>
52+
<DOType cdc="WYE" id="DO2">
53+
<SDO name="phsBHar" type="DO4"/>
54+
<DA fc="CF" dchg="true" qchg="false" dupd="true" name="angRef" bType="Enum" type="PhaseAngleReferenceKind"/>
55+
</DOType>
56+
<DOType cdc="WYE" id="DO3">
57+
<SDO name="neutHar" type="DO4"/>
58+
<DA fc="CF" dchg="true" qchg="false" dupd="false" name="smpRate" bType="INT32U"/>
59+
<DA fc="ST" dchg="false" qchg="false" dupd="false" name="origin" bType="Struct" type="DA3"/>
60+
</DOType>
61+
<DOType cdc="WYE" id="DO4">
62+
<DA fc="DC" dchg="false" qchg="false" dupd="false" name="configRev" bType="VisString255" valKind="RO" valImport="false"/>
63+
</DOType>
64+
<DAType id="DA1">
65+
<BDA name="operTm" bType="Timestamp"/>
66+
<BDA bType="Struct" type="DA3"/>
67+
<ProtNs type="8-MMS">IEC 61850-8-1:2003</ProtNs>
68+
</DAType>
69+
<DAType id="DA2">
70+
<BDA name="T" bType="Timestamp"/>
71+
<BDA name="ctlVal" bType="Enum" type="RecCycModKind"/>
72+
<ProtNs type="8-MMS">IEC 61850-8-1:2003</ProtNs>
73+
</DAType>
74+
<DAType id="DA3">
75+
<BDA bType="Check"/>
76+
<BDA name="Test" bType="BOOLEAN"/>
77+
<ProtNs type="8-MMS">IEC 61850-8-1:2003</ProtNs>
78+
</DAType>
79+
<EnumType id="RecCycModKind">
80+
<EnumVal ord="1">Completed</EnumVal>
81+
<EnumVal ord="2">Cancelled</EnumVal>
82+
<EnumVal ord="3">New adjustments</EnumVal>
83+
<EnumVal ord="4">AnotherValue</EnumVal>
84+
</EnumType>
85+
<EnumType id="PhaseAngleReferenceKind">
86+
<EnumVal ord="0">Va</EnumVal>
87+
<EnumVal ord="1">Vb</EnumVal>
88+
<EnumVal ord="2">Vc</EnumVal>
89+
<EnumVal ord="3">Aa</EnumVal>
90+
<EnumVal ord="4">Ab</EnumVal>
91+
<EnumVal ord="5">Ac</EnumVal>
92+
<EnumVal ord="6">Vab</EnumVal>
93+
<EnumVal ord="7">Vbc</EnumVal>
94+
<EnumVal ord="8">Vca</EnumVal>
95+
<EnumVal ord="9">AnotherValue</EnumVal>
96+
</EnumType>
97+
</DataTypeTemplates>
98+
</SCL>
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!-- SPDX-FileCopyrightText: 2020 RTE FRANCE -->
3+
<!-- -->
4+
<!-- SPDX-License-Identifier: Apache-2.0 -->
5+
6+
<SCL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.iec.ch/61850/2003/SCL" version="2007" revision="B" release="4">
7+
<Header id="f9283708-bf4f-412c-a1d6-f947b9ac3000" version="1.0.0" revision="Revision" toolID="toolID" nameStructure="IEDName"/>
8+
<IED name="IED_NAME">
9+
<AccessPoint name="AP_NAME">
10+
<Server>
11+
<Authentication/>
12+
<LDevice inst="LDPO">
13+
<LN0 lnType="LN2" lnClass="LLN0" inst="">
14+
<Inputs>
15+
<ExtRef intAddr="INTADDR" pDO="DO1" desc="DESC1"/>
16+
<ExtRef intAddr="INTADDR" pDO="DO2" desc="DESC2"/>
17+
</Inputs>
18+
</LN0>
19+
<LN lnType="LN1" lnClass="PIOC" inst="1">
20+
<Inputs>
21+
<ExtRef intAddr="INTADDR" pDO="DO1" desc="DESC1"/>
22+
<ExtRef intAddr="INTADDR" pDO="DO2" desc="DESC2"/>
23+
</Inputs>
24+
</LN>
25+
<LN lnType="LN1" lnClass="PIOC" inst="2">
26+
<Inputs>
27+
<ExtRef intAddr="INTADDR" pDO="DO1" desc="DESC1"/>
28+
<ExtRef intAddr="INTADDR" pDO="DO2" desc="DESC2"/>
29+
</Inputs>
30+
</LN>
31+
</LDevice>
32+
</Server>
33+
</AccessPoint>
34+
</IED>
35+
<DataTypeTemplates>
36+
<LNodeType lnClass="LLN0" id="LN2">
37+
<DO name="Beh" type="DO1" transient="false"/>
38+
<DO name="FACntRs" type="DO2" transient="true"/>
39+
<DO name="StrVal" type="DO3" transient="false"/>
40+
</LNodeType>
41+
<LNodeType lnClass="PIOC" id="LN1">
42+
<DO name="Beh" type="DO1" transient="false"/>
43+
<DO name="FACntRs" type="DO2" transient="true"/>
44+
<DO name="StrVal" type="DO3" transient="false"/>
45+
</LNodeType>
46+
<DOType cdc="WYE" id="DO1">
47+
<DA fc="DC" dchg="false" qchg="false" dupd="false" name="dataNs" bType="VisString255">
48+
<Val>IEC 61850-7-3:2007B</Val>
49+
</DA>
50+
<DA fc="CF" dchg="true" qchg="false" dupd="false" name="smpRate" bType="INT32U"/>
51+
</DOType>
52+
<DOType cdc="WYE" id="DO2">
53+
<SDO name="phsBHar" type="DO4"/>
54+
<DA fc="CF" dchg="true" qchg="false" dupd="true" name="angRef" bType="Enum" type="PhaseAngleReferenceKind"/>
55+
</DOType>
56+
<DOType cdc="WYE" id="DO3">
57+
<SDO name="neutHar" type="DO4"/>
58+
<DA fc="CF" dchg="true" qchg="false" dupd="false" name="smpRate" bType="INT32U"/>
59+
<DA fc="ST" dchg="false" qchg="false" dupd="false" name="origin" bType="Struct" type="DA3"/>
60+
</DOType>
61+
<DOType cdc="WYE" id="DO4">
62+
<DA fc="DC" dchg="false" qchg="false" dupd="false" name="configRev" bType="VisString255" valKind="RO" valImport="false"/>
63+
</DOType>
64+
<DAType id="DA1">
65+
<BDA name="operTm" bType="Timestamp"/>
66+
<BDA name="origin" bType="Struct" type="DA3"/>
67+
<ProtNs type="8-MMS">IEC 61850-8-1:2003</ProtNs>
68+
</DAType>
69+
<DAType id="DA2">
70+
<BDA name="T" bType="Timestamp"/>
71+
<BDA name="ctlVal" bType="Enum" type="RecCycModKind"/>
72+
<ProtNs type="8-MMS">IEC 61850-8-1:2003</ProtNs>
73+
</DAType>
74+
<DAType id="DA3">
75+
<BDA name="Check" bType="Check"/>
76+
<BDA name="Test" bType="BOOLEAN"/>
77+
<ProtNs type="8-MMS">IEC 61850-8-1:2003</ProtNs>
78+
</DAType>
79+
<EnumType id="RecCycModKind">
80+
<EnumVal ord="1">Completed</EnumVal>
81+
<EnumVal ord="2">Cancelled</EnumVal>
82+
<EnumVal ord="3">New adjustments</EnumVal>
83+
<EnumVal ord="4">AnotherValue</EnumVal>
84+
</EnumType>
85+
<EnumType id="PhaseAngleReferenceKind">
86+
<EnumVal ord="0">Va</EnumVal>
87+
<EnumVal ord="1">Vb</EnumVal>
88+
<EnumVal ord="2">Vc</EnumVal>
89+
<EnumVal ord="3">Aa</EnumVal>
90+
<EnumVal ord="4">Ab</EnumVal>
91+
<EnumVal ord="5">Ac</EnumVal>
92+
<EnumVal ord="6">Vab</EnumVal>
93+
<EnumVal ord="7">Vbc</EnumVal>
94+
<EnumVal ord="8">Vca</EnumVal>
95+
<EnumVal ord="9">AnotherValue</EnumVal>
96+
</EnumType>
97+
</DataTypeTemplates>
98+
</SCL>

0 commit comments

Comments
 (0)