Skip to content

Commit bd8058a

Browse files
committed
test: Add tests
1 parent 177c1f3 commit bd8058a

File tree

2 files changed

+284
-2
lines changed

2 files changed

+284
-2
lines changed

foundation/utils/xml.spec.ts

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,68 @@
11
/* eslint-disable no-unused-expressions */
22
/* eslint-disable import/no-extraneous-dependencies */
33
import { expect } from '@open-wc/testing';
4+
import { iedWithLDevice, copyControlDoc } from './xml.testfiles.js';
5+
import { queryLDevice, queryLN } from './xml.js';
6+
7+
function parseXml(str: string): Document {
8+
return new DOMParser().parseFromString(str, 'application/xml');
9+
}
10+
11+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
12+
function findElement(str: string, selector: string): Element | null {
13+
return parseXml(str).querySelector(selector);
14+
}
415

516
describe('Xml utility', () => {
17+
let doc: Document;
18+
19+
beforeEach(() => {
20+
doc = parseXml(copyControlDoc);
21+
});
22+
623
describe('queryLDevice', () => {
7-
it('find LDevice in xml', () => {
8-
expect(true).to.equal(true);
24+
it('find LDevice in ied', () => {
25+
const ied = parseXml(iedWithLDevice).documentElement;
26+
const lDeviceInst = 'someLDInst';
27+
const lDevice = queryLDevice(ied, lDeviceInst);
28+
29+
expect(lDevice).to.not.be.null;
30+
expect(lDevice?.getAttribute('inst')).to.equal(lDeviceInst);
31+
});
32+
});
33+
34+
describe('queryLN', () => {
35+
it('finds LN0', () => {
36+
const lDevice = doc.querySelector(
37+
'IED[name="ToBeCopied"] LDevice[inst="LD1"]'
38+
)!;
39+
40+
const ln = queryLN(lDevice, 'LLN0', '', null);
41+
42+
expect(ln).to.not.be.null;
43+
expect(ln?.getAttribute('id')).to.equal('ToBeCopied_LN0');
44+
});
45+
46+
it('find LN with inst and prefix', () => {
47+
const lDevice = doc.querySelector(
48+
'IED[name="ToBeCopied"] LDevice[inst="LD1"]'
49+
)!;
50+
51+
const ln = queryLN(lDevice, 'CILO', '1', 'CBHost');
52+
53+
expect(ln).to.not.be.null;
54+
expect(ln?.getAttribute('id')).to.equal('ToBeCopied_CBHost1');
55+
});
56+
57+
it('find LN with inst and missing prefix', () => {
58+
const lDevice = doc.querySelector(
59+
'IED[name="ToBeCopied"] LDevice[inst="LD1"]'
60+
)!;
61+
62+
const ln = queryLN(lDevice, 'MMXU', '1', '');
63+
64+
expect(ln).to.not.be.null;
65+
expect(ln?.getAttribute('id')).to.equal('ToBeCopied_MMXU');
966
});
1067
});
1168
});

foundation/utils/xml.testfiles.ts

Lines changed: 225 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,225 @@
1+
export const iedWithLDevice = `
2+
<IED>
3+
<AccessPoint>
4+
<Server>
5+
<LDevice inst="someOtherLDInst" />
6+
<LDevice inst="someLDInst" />
7+
</Server>
8+
</AccessPoint>
9+
</IED>
10+
`;
11+
12+
export const copyControlDoc = `
13+
<SCL xmlns="http://www.iec.ch/61850/2003/SCL" version="2007" revision="B" release="4" xmlns:esld="https://transpower.co.nz/SCL/SSD/SLD/v0">
14+
<Header id="CopyDS"/>
15+
<IED name="ToBeCopied" >
16+
<AccessPoint name="AP1">
17+
<Server>
18+
<LDevice inst="LD1">
19+
<LN0 lnClass="LLN0" inst="" lnType="unimportant" id="ToBeCopied_LN0">
20+
<DataSet name="datSet" >
21+
<FCDA ldInst="LD1" prefix="" lnClass="MMXU" lnInst="1" doName="A.phsA" daName="cVal.ang.f" fc="MX" />
22+
<FCDA ldInst="LD1" prefix="" lnClass="MMXU" lnInst="1" doName="A.phsA" daName="q" fc="MX" />
23+
<FCDA ldInst="LD1" prefix="" lnClass="MMXU" lnInst="1" doName="A.phsA" daName="t" fc="MX" />
24+
<FCDA ldInst="LD1" prefix="" lnClass="CILO" lnInst="1" doName="EnaOpn" daName="blkEna" fc="BL" />
25+
<FCDA ldInst="LD1" prefix="" lnClass="CILO" lnInst="1" doName="EnaOpn" fc="ST" />
26+
</DataSet>
27+
<GSEControl name="gse" type="GOOSE" datSet="datSet"/>
28+
<SampledValueControl name="smv" datSet="datSet"/>
29+
</LN0>
30+
<LN prefix="CBHost" lnClass="CILO" inst="1" lnType="CILO$oscd$_eb5ec6bb69650d07" id="ToBeCopied_CBHost1">
31+
<DataSet name="datSet" >
32+
<FCDA ldInst="LD1" prefix="" lnClass="MMXU" lnInst="1" doName="A.phsA" daName="cVal.ang.f" fc="MX" />
33+
<FCDA ldInst="LD1" prefix="" lnClass="MMXU" lnInst="1" doName="A.phsA" daName="q" fc="MX" />
34+
<FCDA ldInst="LD1" prefix="" lnClass="MMXU" lnInst="1" doName="A.phsA" daName="t" fc="MX" />
35+
<FCDA ldInst="LD1" prefix="" lnClass="CILO" lnInst="1" doName="EnaOpn" daName="blkEna" fc="BL" />
36+
<FCDA ldInst="LD1" prefix="" lnClass="CILO" lnInst="1" doName="EnaOpn" fc="ST" />
37+
</DataSet>
38+
<ReportControl name="rp" datSet="datSet"/>
39+
</LN>
40+
<LN lnClass="MMXU" inst="1" lnType="MMXU$oscd$_bcec88edb16399a2" id="ToBeCopied_MMXU"/>
41+
<LN prefix="" lnClass="CILO" inst="1" lnType="CILO$oscd$_eb5ec6bb69650d07"/>
42+
</LDevice>
43+
</Server>
44+
</AccessPoint>
45+
</IED>
46+
<IED name="ToCopieTo1" desc="Incorrect Parent1">
47+
<AccessPoint name="AP1">
48+
<Server>
49+
<LDevice inst="LD2">
50+
<LN0 lnClass="LLN0" inst="" lnType="unimportant" />
51+
</LDevice>
52+
</Server>
53+
</AccessPoint>
54+
</IED>
55+
<IED name="ToCopieTo2" desc="Incorrect Parent2">
56+
<AccessPoint name="AP1">
57+
<Server>
58+
<LDevice inst="LD1">
59+
<LN prefix="CBHost" lnClass="CILO" inst="1" lnType="CILO$oscd$_eb5ec6bb69650d07" />
60+
<LN lnClass="MMXU" inst="1" lnType="MMXU$oscd$_bcec88edb16399a2"/>
61+
<LN prefix="" lnClass="CILO" inst="1" lnType="CILO$oscd$_eb5ec6bb69650d07"/>
62+
</LDevice>
63+
</Server>
64+
</AccessPoint>
65+
</IED>
66+
<IED name="ToCopieTo3" >
67+
<AccessPoint name="AP1">
68+
<Server>
69+
<LDevice inst="LD1">
70+
<LN0 lnClass="LLN0" inst="" lnType="unimportant" />
71+
<LN prefix="CBHost" lnClass="CILO" inst="2" lnType="CILO$oscd$_eb5ec6bb69650d07" />
72+
<LN lnClass="MMXU" inst="1" lnType="MMXU$oscd$_bcec88edb16399a2"/>
73+
<LN prefix="" lnClass="CILO" inst="1" lnType="CILO$oscd$_eb5ec6bb69650d07"/>
74+
</LDevice>
75+
</Server>
76+
</AccessPoint>
77+
</IED>
78+
<IED name="ToCopieTo4" desc="Missing Data Points1">
79+
<AccessPoint name="AP1">
80+
<Server>
81+
<LDevice inst="LD1">
82+
<LN0 lnClass="LLN0" inst="" lnType="unimportant" />
83+
<LN prefix="CBHost" lnClass="CILO" inst="1" lnType="CILO$oscd$_eb5ec6bb69650d07" />
84+
<LN lnClass="MMXU" inst="1" lnType="MMXU$oscd$_8046c36011040649"/>
85+
<LN prefix="" lnClass="CILO" inst="1" lnType="CILO$oscd$_eb5ec6bb69650d07"/>
86+
</LDevice>
87+
</Server>
88+
</AccessPoint>
89+
</IED>
90+
<IED name="ToCopieTo5" desc="Missing Data Points2">
91+
<AccessPoint name="AP1">
92+
<Server>
93+
<LDevice inst="LD1">
94+
<LN0 lnClass="LLN0" inst="" lnType="unimportant" />
95+
<LN prefix="CBHost" lnClass="CILO" inst="1" lnType="CILO$oscd$_eb5ec6bb69650d07" />
96+
<LN lnClass="MMXU" inst="1" lnType="MMXU$oscd$_bcec88edb16399a2"/>
97+
<LN prefix="" lnClass="CILO" inst="1" lnType="CILO$oscd$_aa7ec79ef27309b1"/>
98+
</LDevice>
99+
</Server>
100+
</AccessPoint>
101+
</IED>
102+
<IED name="ToCopieTo6" desc="Existing CB">
103+
<AccessPoint name="AP1">
104+
<Server>
105+
<LDevice inst="LD1">
106+
<LN0 lnClass="LLN0" inst="" lnType="unimportant">
107+
<GSEControl name="gse" />
108+
<SampledValueControl name="smv" />
109+
</LN0>
110+
<LN prefix="CBHost" lnClass="CILO" inst="1" lnType="CILO$oscd$_eb5ec6bb69650d07">
111+
<ReportControl name="rp" />
112+
</LN>
113+
<LN lnClass="MMXU" inst="1" lnType="MMXU$oscd$_bcec88edb16399a2"/>
114+
<LN prefix="" lnClass="CILO" inst="1" lnType="CILO$oscd$_eb5ec6bb69650d07"/>
115+
</LDevice>
116+
</Server>
117+
</AccessPoint>
118+
</IED>
119+
<IED name="ToCopieTo7" desc="Existing CB">
120+
<AccessPoint name="AP1">
121+
<Server>
122+
<LDevice inst="LD1">
123+
<LN0 lnClass="LLN0" inst="" lnType="unimportant">
124+
<DataSet name="datSet" />
125+
</LN0>
126+
<LN prefix="CBHost" lnClass="CILO" inst="1" lnType="CILO$oscd$_eb5ec6bb69650d07">
127+
<DataSet name="datSet" />
128+
</LN>
129+
<LN lnClass="MMXU" inst="1" lnType="MMXU$oscd$_bcec88edb16399a2"/>
130+
<LN prefix="" lnClass="CILO" inst="1" lnType="CILO$oscd$_eb5ec6bb69650d07"/>
131+
</LDevice>
132+
</Server>
133+
</AccessPoint>
134+
</IED>
135+
<IED name="ToCopieTo8" >
136+
<AccessPoint name="AP1">
137+
<Server>
138+
<LDevice inst="LD1">
139+
<LN0 lnClass="LLN0" inst="" lnType="unimportant" />
140+
<LN prefix="CBHost" lnClass="CILO" inst="1" lnType="CILO$oscd$_eb5ec6bb69650d07" />
141+
<LN lnClass="MMXU" inst="1" lnType="MMXU$oscd$_bcec88edb16399a2"/>
142+
<LN prefix="" lnClass="CILO" inst="1" lnType="CILO$oscd$_eb5ec6bb69650d07"/>
143+
</LDevice>
144+
</Server>
145+
</AccessPoint>
146+
</IED>
147+
<DataTypeTemplates>
148+
<LNodeType lnClass="CILO" id="CILO$oscd$_aa7ec79ef27309b1" desc="woBlockEna">
149+
<DO name="Beh" type="Beh$oscd$_c6ed035c8137b35a"/>
150+
<DO name="EnaCls" type="EnaCls$oscd$_d915d66d9e42a575"/>
151+
<DO name="EnaOpn" type="EnaOpn$oscd$_d915d66d9e42a575"/>
152+
</LNodeType>
153+
<LNodeType lnClass="CILO" id="CILO$oscd$_eb5ec6bb69650d07">
154+
<DO name="Beh" type="Beh$oscd$_c6ed035c8137b35a"/>
155+
<DO name="EnaCls" type="EnaCls$oscd$_d915d66d9e42a575"/>
156+
<DO name="EnaOpn" type="EnaOpn$oscd$_55462dcb3eb76dd6"/>
157+
</LNodeType>
158+
<LNodeType lnClass="MMXU" id="MMXU$oscd$_bcec88edb16399a2" desc="wAng">
159+
<DO name="Beh" type="Beh$oscd$_c6ed035c8137b35a"/>
160+
<DO name="A" type="A$oscd$_94900320e0ade7f4"/>
161+
</LNodeType>
162+
<LNodeType lnClass="MMXU" id="MMXU$oscd$_8046c36011040649">
163+
<DO name="Beh" type="Beh$oscd$_c6ed035c8137b35a"/>
164+
<DO name="A" type="A$oscd$_77cd469bb496bbab"/>
165+
</LNodeType>
166+
<DOType cdc="SPS" id="EnaOpn$oscd$_d915d66d9e42a575">
167+
<DA name="stVal" fc="ST" dchg="true" bType="BOOLEAN"/>
168+
<DA name="q" fc="ST" qchg="true" bType="Quality"/>
169+
<DA name="t" fc="ST" bType="Timestamp"/>
170+
</DOType>
171+
<DOType cdc="SPS" id="EnaCls$oscd$_d915d66d9e42a575">
172+
<DA name="stVal" fc="ST" dchg="true" bType="BOOLEAN"/>
173+
<DA name="q" fc="ST" qchg="true" bType="Quality"/>
174+
<DA name="t" fc="ST" bType="Timestamp"/>
175+
</DOType>
176+
<DOType cdc="SPS" id="EnaOpn$oscd$_55462dcb3eb76dd6">
177+
<DA name="stVal" fc="ST" dchg="true" bType="BOOLEAN"/>
178+
<DA name="q" fc="ST" qchg="true" bType="Quality"/>
179+
<DA name="t" fc="ST" bType="Timestamp"/>
180+
<DA name="blkEna" fc="BL" bType="BOOLEAN"/>
181+
</DOType>
182+
<DOType cdc="CMV" id="phsA$oscd$_c63a8f4457479fb7">
183+
<DA name="cVal" fc="MX" dchg="true" dupd="true" bType="Struct" type="cVal$oscd$_21f679e08734a896"/>
184+
<DA name="q" fc="MX" qchg="true" bType="Quality"/>
185+
<DA name="t" fc="MX" bType="Timestamp"/>
186+
</DOType>
187+
<DOType cdc="WYE" id="A$oscd$_94900320e0ade7f4">
188+
<SDO name="phsA" type="phsA$oscd$_c63a8f4457479fb7"/>
189+
</DOType>
190+
<DOType cdc="ENS" id="Beh$oscd$_c6ed035c8137b35a">
191+
<DA name="stVal" fc="ST" dchg="true" dupd="true" bType="Enum" type="stVal$oscd$_48ba16345b8e7f5b"/>
192+
<DA name="q" fc="ST" qchg="true" bType="Quality"/>
193+
<DA name="t" fc="ST" bType="Timestamp"/>
194+
</DOType>
195+
<DOType cdc="CMV" id="phsA$oscd$_65ee65af9248ae5d">
196+
<DA name="cVal" fc="MX" dchg="true" dupd="true" bType="Struct" type="cVal$oscd$_80272042468595d1"/>
197+
<DA name="q" fc="MX" qchg="true" bType="Quality"/>
198+
<DA name="t" fc="MX" bType="Timestamp"/>
199+
</DOType>
200+
<DOType cdc="WYE" id="A$oscd$_77cd469bb496bbab">
201+
<SDO name="phsA" type="phsA$oscd$_65ee65af9248ae5d"/>
202+
</DOType>
203+
<DAType id="ang$oscd$_ed49c2f7a55ad05a">
204+
<BDA name="f" bType="FLOAT32"/>
205+
</DAType>
206+
<DAType id="cVal$oscd$_21f679e08734a896">
207+
<BDA name="mag" bType="Struct" type="mag$oscd$_ed49c2f7a55ad05a"/>
208+
<BDA name="ang" bType="Struct" type="ang$oscd$_ed49c2f7a55ad05a"/>
209+
</DAType>
210+
<DAType id="mag$oscd$_ed49c2f7a55ad05a">
211+
<BDA name="f" bType="FLOAT32"/>
212+
</DAType>
213+
<DAType id="cVal$oscd$_80272042468595d1">
214+
<BDA name="mag" bType="Struct" type="mag$oscd$_ed49c2f7a55ad05a"/>
215+
</DAType>
216+
<EnumType id="stVal$oscd$_48ba16345b8e7f5b">
217+
<EnumVal ord="1">on</EnumVal>
218+
<EnumVal ord="2">blocked</EnumVal>
219+
<EnumVal ord="3">test</EnumVal>
220+
<EnumVal ord="4">test/blocked</EnumVal>
221+
<EnumVal ord="5">off</EnumVal>
222+
</EnumType>
223+
</DataTypeTemplates>
224+
</SCL>
225+
`;

0 commit comments

Comments
 (0)