From 578e0a69a23f4fa80e7dc39f21436713b61c1c09 Mon Sep 17 00:00:00 2001 From: massifben <105049157+massifben@users.noreply.github.com> Date: Fri, 17 Jan 2025 16:13:48 +0100 Subject: [PATCH] feat(#453): de-constructing #447 RSR-1116 Signed-off-by: massifben <105049157+massifben@users.noreply.github.com> --- .../sct/commons/DataTypeTemplatesService.java | 14 ++ .../sct/commons/LNodeStatusService.java | 103 ---------- .../commons/domain/DoLinkedToDaFilter.java | 23 ++- .../commons/DataTypeTemplatesServiceTest.java | 50 +++-- .../sct/commons/LNodeStatusServiceTest.java | 194 ------------------ .../scd_dtt_do_sdo_da_bda_tests.xml | 5 +- .../resources/scl-lnodestatus/lnodestatus.scd | 165 --------------- .../lnodestatus_without_mod_stval.scd | 101 --------- 8 files changed, 54 insertions(+), 601 deletions(-) delete mode 100644 sct-commons/src/main/java/org/lfenergy/compas/sct/commons/LNodeStatusService.java delete mode 100644 sct-commons/src/test/java/org/lfenergy/compas/sct/commons/LNodeStatusServiceTest.java delete mode 100644 sct-commons/src/test/resources/scl-lnodestatus/lnodestatus.scd delete mode 100644 sct-commons/src/test/resources/scl-lnodestatus/lnodestatus_without_mod_stval.scd diff --git a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/DataTypeTemplatesService.java b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/DataTypeTemplatesService.java index 3e6c643ab..efaaaa5a7 100644 --- a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/DataTypeTemplatesService.java +++ b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/DataTypeTemplatesService.java @@ -149,6 +149,20 @@ public Optional findDoLinkedToDa(TDataTypeTemplates dtt, String lN )); } + public Stream getEnumValues(TDataTypeTemplates dataTypeTemplates, String lnType, DoLinkedToDaFilter doLinkedToDaFilter) { + return findDoLinkedToDa(dataTypeTemplates, lnType, doLinkedToDaFilter) + .map(DoLinkedToDa::dataAttribute) + .filter(dataAttribute -> TPredefinedBasicTypeEnum.ENUM.equals(dataAttribute.getBType())) + .map(DataAttribute::getType) + .flatMap(enumId -> + dataTypeTemplates.getEnumType().stream() + .filter(tEnumType -> tEnumType.getId().equals(enumId)) + .findFirst()) + .stream() + .flatMap(tEnumType -> tEnumType.getEnumVal().stream()) + .map(TEnumVal::getValue); + } + private Optional getDATypeByDaName(TDataTypeTemplates dtt, TDOType tdoType, String daName) { return sdoOrDAService.findDA(tdoType, tda -> tda.getName().equals(daName)) .flatMap(tda -> daTypeService.findDaType(dtt, tda.getType())); diff --git a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/LNodeStatusService.java b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/LNodeStatusService.java deleted file mode 100644 index af902ca3a..000000000 --- a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/LNodeStatusService.java +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-FileCopyrightText: 2024 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.commons; - -import lombok.RequiredArgsConstructor; -import org.lfenergy.compas.scl2007b4.model.*; -import org.lfenergy.compas.sct.commons.domain.DataAttribute; -import org.lfenergy.compas.sct.commons.domain.DoLinkedToDa; -import org.lfenergy.compas.sct.commons.domain.DoLinkedToDaFilter; -import org.lfenergy.compas.sct.commons.dto.SclReportItem; -import org.lfenergy.compas.sct.commons.util.CommonConstants; -import org.lfenergy.compas.sct.commons.util.PrivateUtils; -import org.lfenergy.compas.sct.commons.util.SclConstructorHelper; - -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.stream.Stream; - -@RequiredArgsConstructor -public class LNodeStatusService { - - private static final String LNODE_STATUS_PRIVATE_TYPE = "COMPAS-LNodeStatus"; - private static final List LN_LNS_POSSIBLE_VALUES = List.of("off;on", "on;off", "on", "off"); - private static final List LNODE_LNS_POSSIBLE_VALUES = List.of("on", "off"); - private final LdeviceService ldeviceService; - private final LnService lnService; - private final DataTypeTemplatesService dataTypeTemplatesService; - - public List updateLnModStValBasedOnLNodeStatus(SCL scl) { - return scl.getSubstation().stream() - .flatMap(tSubstation -> tSubstation.getVoltageLevel().stream()) - .flatMap(tVoltageLevel -> tVoltageLevel.getBay().stream()) - .flatMap(tBay -> tBay.getFunction().stream()) - .flatMap(tFunction -> tFunction.getLNode().stream()) - .map(tlNode -> updateSingleLnModStValBasedOnLNodeStatus(scl, tlNode)) - .filter(Objects::nonNull) - .toList(); - } - - private SclReportItem updateSingleLnModStValBasedOnLNodeStatus(SCL scl, TLNode tlNode) { - String lNodeLNS = PrivateUtils.extractStringPrivate(tlNode, LNODE_STATUS_PRIVATE_TYPE).orElse(null); - if (lNodeLNS == null || !LNODE_LNS_POSSIBLE_VALUES.contains(lNodeLNS)) { - return SclReportItem.error(lNodePath(tlNode), "The private %s of the LNode has invalid value. Expecting one of [on, off] but got : %s".formatted(LNODE_STATUS_PRIVATE_TYPE, lNodeLNS)); - } - TAnyLN anyLn = findLn(scl, tlNode.getIedName(), tlNode.getLdInst(), tlNode.getLnClass().getFirst(), tlNode.getLnInst(), tlNode.getPrefix()).orElse(null); - if (anyLn == null) { - return SclReportItem.error(lNodePath(tlNode), "LNode in Substation section does not have a matching LN in IED section"); - } - String anyLnLNS = PrivateUtils.extractStringPrivate(anyLn, LNODE_STATUS_PRIVATE_TYPE).orElse(null); - if (anyLnLNS == null || !LN_LNS_POSSIBLE_VALUES.contains(anyLnLNS)) { - return SclReportItem.error(lnPath(tlNode), "The private %s of the LN has invalid value. Expecting one of %s but got : %s".formatted(LNODE_STATUS_PRIVATE_TYPE, LN_LNS_POSSIBLE_VALUES, anyLnLNS)); - - } - if (!anyLnLNS.contains(lNodeLNS)) { - return SclReportItem.error(lnPath(tlNode), "Cannot set DAI Mod.stVal to %s, because LN private %s is set to %s".formatted(lNodeLNS, LNODE_STATUS_PRIVATE_TYPE, anyLnLNS)); - } - TDAI daiModStVal = lnService.getDaiModStVal(anyLn).orElse(null); - if (daiModStVal == null) { - return null; // do nothing if DAI Mod.stVal is missing - } - List modStValEnumValues = getModStValEnumValues(scl.getDataTypeTemplates(), anyLn.getLnType()).toList(); - if (!modStValEnumValues.contains(lNodeLNS)) { - return SclReportItem.error(lnPath(tlNode), "Cannot set DAI Mod.stVal to '%s' because value is not in EnumType %s".formatted(lNodeLNS, modStValEnumValues)); - } - daiModStVal.getVal().clear(); - daiModStVal.getVal().add(SclConstructorHelper.newVal(lNodeLNS)); - return null; // no error - } - - private static String lnPath(TLNode tlNode) { - return "IED(%s)/LD(%s)/LN[%s,%s,%s]".formatted(tlNode.getIedName(), tlNode.getLdInst(), tlNode.getLnClass().getFirst(), tlNode.getLnInst(), tlNode.getPrefix()); - } - - private static String lNodePath(TLNode tlNode) { - return "LNode(iedName=%s, ldInst=%s, lnClass=%s, lnInst=%s, prefix=%s)".formatted(tlNode.getIedName(), tlNode.getLdInst(), tlNode.getLnClass().getFirst(), tlNode.getLnInst(), tlNode.getPrefix()); - } - - private Stream getModStValEnumValues(TDataTypeTemplates dataTypeTemplates, String lnType) { - return dataTypeTemplatesService.findDoLinkedToDa(dataTypeTemplates, lnType, DoLinkedToDaFilter.from(CommonConstants.MOD_DO_NAME, CommonConstants.STVAL_DA_NAME)) - .map(DoLinkedToDa::dataAttribute) - .filter(dataAttribute -> TPredefinedBasicTypeEnum.ENUM.equals(dataAttribute.getBType())) - .map(DataAttribute::getType) - .flatMap(enumId -> - dataTypeTemplates.getEnumType().stream() - .filter(tEnumType -> tEnumType.getId().equals(enumId)) - .findFirst()) - .stream() - .flatMap(tEnumType -> tEnumType.getEnumVal().stream()) - .map(TEnumVal::getValue); - } - - private Optional findLn(SCL scl, String iedName, String ldInst, String lnClass, String lnInst, String prefix) { - return scl.getIED().stream() - .filter(tied -> iedName.equals(tied.getName())) - .findFirst() - .flatMap(tied -> ldeviceService.findLdevice(tied, tlDevice -> ldInst.equals(tlDevice.getInst()))) - .flatMap(tlDevice -> lnService.findAnyLn(tlDevice, tAnyLN -> lnService.matchesLn(tAnyLN, lnClass, lnInst, prefix))); - - } -} diff --git a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/domain/DoLinkedToDaFilter.java b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/domain/DoLinkedToDaFilter.java index dbbe8fc1a..04cdfd247 100644 --- a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/domain/DoLinkedToDaFilter.java +++ b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/domain/DoLinkedToDaFilter.java @@ -19,32 +19,33 @@ public DoLinkedToDaFilter(String doName, List sdoNames, String daName, L this.daName = StringUtils.isBlank(daName) ? null : daName; this.bdaNames = bdaNames == null ? Collections.emptyList() : List.copyOf(bdaNames); } - public DoLinkedToDaFilter(){ - this(null,null,null,null); - } public static DoLinkedToDaFilter from(String doNames, String daNames) { String doName = null; List sdoNames = null; String daName = null; List bdaNames = null; - if (StringUtils.isNotBlank(doNames)){ + if (StringUtils.isNotBlank(doNames)) { doName = doNames.split("\\.")[0]; sdoNames = Arrays.stream(doNames.split("\\.")).skip(1).toList(); } - if (StringUtils.isNotBlank(daNames)){ + if (StringUtils.isNotBlank(daNames)) { daName = daNames.split("\\.")[0]; bdaNames = Arrays.stream(daNames.split("\\.")).skip(1).toList(); } return new DoLinkedToDaFilter(doName, sdoNames, daName, bdaNames); } -public String getDoRef() { - return doName + (sdoNames().isEmpty() ? StringUtils.EMPTY : "." + String.join(".", sdoNames())); -} + public String getDoRef() { + return doName + (sdoNames().isEmpty() ? StringUtils.EMPTY : "." + String.join(".", sdoNames())); + } -public String getDaRef() { - return daName + (bdaNames().isEmpty() ? StringUtils.EMPTY : "." + String.join(".", bdaNames())); -} + public String getDaRef() { + return daName + (bdaNames().isEmpty() ? StringUtils.EMPTY : "." + String.join(".", bdaNames())); + } + @Override + public String toString() { + return getDoRef() + "." + getDaRef(); + } } diff --git a/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/DataTypeTemplatesServiceTest.java b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/DataTypeTemplatesServiceTest.java index 54b837884..32bb50f2d 100644 --- a/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/DataTypeTemplatesServiceTest.java +++ b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/DataTypeTemplatesServiceTest.java @@ -4,6 +4,7 @@ package org.lfenergy.compas.sct.commons; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.lfenergy.compas.scl2007b4.model.*; import org.lfenergy.compas.sct.commons.domain.DataAttribute; @@ -23,12 +24,18 @@ class DataTypeTemplatesServiceTest { + private DataTypeTemplatesService dataTypeTemplatesService; + + @BeforeEach + void setUp() { + dataTypeTemplatesService = new DataTypeTemplatesService(); + } + @Test void isDoModAndDaStValExist_when_LNodeType_not_exist_should_return_false() { //Given TDataTypeTemplates dtt = new TDataTypeTemplates(); //When - DataTypeTemplatesService dataTypeTemplatesService = new DataTypeTemplatesService(); boolean result = dataTypeTemplatesService.isDoModAndDaStValExist(dtt, "lnodeTypeId"); //Then assertThat(result).isFalse(); @@ -43,7 +50,6 @@ void isDoModAndDaStValExist_when_Do_not_exist_should_return_false() { tlNodeType.setId("lnodeTypeId"); dtt.getLNodeType().add(tlNodeType); //When - DataTypeTemplatesService dataTypeTemplatesService = new DataTypeTemplatesService(); boolean result = dataTypeTemplatesService.isDoModAndDaStValExist(dtt, "lnodeTypeId"); //Then assertThat(result).isFalse(); @@ -61,7 +67,6 @@ void isDoModAndDaStValExist_when_DoType_not_exist_should_return_false() { tlNodeType.getDO().add(tdo); dtt.getLNodeType().add(tlNodeType); //When - DataTypeTemplatesService dataTypeTemplatesService = new DataTypeTemplatesService(); boolean result = dataTypeTemplatesService.isDoModAndDaStValExist(dtt, "lnodeTypeId"); //Then assertThat(result).isFalse(); @@ -83,7 +88,6 @@ void isDoModAndDaStValExist_when_Da_Mod_not_exist_should_return_false() { tdoType.setId("doTypeId"); dtt.getDOType().add(tdoType); //When - DataTypeTemplatesService dataTypeTemplatesService = new DataTypeTemplatesService(); boolean result = dataTypeTemplatesService.isDoModAndDaStValExist(dtt, "lnodeTypeId"); //Then assertThat(result).isFalse(); @@ -108,7 +112,6 @@ void isDoModAndDaStValExist_when_Da_stVal_not_found_should_return_false() { tdoType.getSDOOrDA().add(tda); dtt.getDOType().add(tdoType); //When - DataTypeTemplatesService dataTypeTemplatesService = new DataTypeTemplatesService(); boolean result = dataTypeTemplatesService.isDoModAndDaStValExist(dtt, "lnodeTypeId"); //Then assertThat(result).isFalse(); @@ -133,7 +136,6 @@ void isDoModAndDaStValExist_when_DO_Mod_And_DA_stVal_exist_return_true() { tdoType.getSDOOrDA().add(tda); dtt.getDOType().add(tdoType); //When - DataTypeTemplatesService dataTypeTemplatesService = new DataTypeTemplatesService(); boolean result = dataTypeTemplatesService.isDoModAndDaStValExist(dtt, "lnodeTypeId"); //Then assertThat(result).isTrue(); @@ -145,10 +147,9 @@ void getFilteredDoLinkedToDa_should_return_expected_items() { TDataTypeTemplates dtt = initDttFromFile("/dtt-test-schema-conf/scd_dtt_do_sdo_da_bda_test.xml"); String lNodeTypeId = "LNodeType0"; - DoLinkedToDaFilter doLinkedToDaFilter = new DoLinkedToDaFilter(); + DoLinkedToDaFilter doLinkedToDaFilter = new DoLinkedToDaFilter(null, null, null, null); //When - DataTypeTemplatesService dataTypeTemplatesService = new DataTypeTemplatesService(); List result = dataTypeTemplatesService.getFilteredDoLinkedToDa(dtt, lNodeTypeId, doLinkedToDaFilter).toList(); //Then assertThat(result).hasSize(9) @@ -189,7 +190,6 @@ void getFilteredDOAndDA_when_given_DoName_should_return_expected_dataReference() DoLinkedToDaFilter doLinkedToDaFilter = DoLinkedToDaFilter.from("SecondDoName", ""); //When - DataTypeTemplatesService dataTypeTemplatesService = new DataTypeTemplatesService(); List result = dataTypeTemplatesService.getFilteredDoLinkedToDa(dtt, lNodeTypeId, doLinkedToDaFilter).toList(); //Then assertThat(result).hasSize(1).extracting(doLinkedToDa1 -> doLinkedToDa1.dataObject().getDoName(), @@ -210,7 +210,6 @@ void getFilteredDOAndDA_when_given_DO_with_one_structName_should_return_expected DoLinkedToDaFilter doLinkedToDaFilter = DoLinkedToDaFilter.from("FirstDoName.sdoName1", ""); //When - DataTypeTemplatesService dataTypeTemplatesService = new DataTypeTemplatesService(); List result = dataTypeTemplatesService.getFilteredDoLinkedToDa(dtt, lNodeTypeId, doLinkedToDaFilter).toList(); //Then assertThat(result).hasSize(3).extracting(doLinkedToDa1 -> doLinkedToDa1.dataObject().getDoName(), @@ -232,7 +231,6 @@ void getFilteredDOAndDA_when_given_DO_with_many_structName_should_return_expecte DoLinkedToDaFilter doLinkedToDaFilter = DoLinkedToDaFilter.from("FirstDoName.sdoName1.sdoName21", ""); //When - DataTypeTemplatesService dataTypeTemplatesService = new DataTypeTemplatesService(); List result = dataTypeTemplatesService.getFilteredDoLinkedToDa(dtt, lNodeTypeId, doLinkedToDaFilter).toList(); //Then assertThat(result).hasSize(2).extracting(doLinkedToDa1 -> doLinkedToDa1.dataObject().getDoName(), @@ -254,7 +252,6 @@ void getFilteredDOAndDA_when_given_DO_and_DA_with_structNames_should_return_expe DoLinkedToDaFilter doLinkedToDaFilter = DoLinkedToDaFilter.from("FirstDoName.sdoName2", "structDaName1.structBdaName1.enumBdaName22"); //When - DataTypeTemplatesService dataTypeTemplatesService = new DataTypeTemplatesService(); List result = dataTypeTemplatesService.getFilteredDoLinkedToDa(dtt, lNodeTypeId, doLinkedToDaFilter).toList(); //Then assertThat(result).hasSize(1).extracting(doLinkedToDa1 -> doLinkedToDa1.dataObject().getDoName(), @@ -286,7 +283,6 @@ void findDoLinkedToDa_should_find_DO_SDO_DA_and_all_BDA() { DoLinkedToDa doLinkedToDa = new DoLinkedToDa(dataObject, dataAttribute); DoLinkedToDaFilter doLinkedToDaFilter = new DoLinkedToDaFilter("Do", List.of("sdo1", "d"), "antRef", List.of("bda1", "bda2", "bda3")); // When - DataTypeTemplatesService dataTypeTemplatesService = new DataTypeTemplatesService(); Optional result = dataTypeTemplatesService.findDoLinkedToDa(dtt, "LNO1", doLinkedToDaFilter); // Then assertThat(result).get().usingRecursiveComparison().isEqualTo(doLinkedToDa); @@ -308,7 +304,6 @@ void findDoLinkedToDa_should_find_DO_SDO_DA_and_partial_BDA_list() { dataAttribute.setType("EnumType1"); DoLinkedToDa doLinkedToDa = new DoLinkedToDa(dataObject, dataAttribute); // When - DataTypeTemplatesService dataTypeTemplatesService = new DataTypeTemplatesService(); Optional result = dataTypeTemplatesService.findDoLinkedToDa(dtt, "LN1", new DoLinkedToDaFilter("Do1", List.of("sdo1", "sdo2"), "da2", List.of("bda1", "bda2"))); // Then assertThat(result).get().usingRecursiveComparison().isEqualTo(doLinkedToDa); @@ -327,7 +322,6 @@ void findDoLinkedToDa_should_find_DO_DA() { dataAttribute.setFc(TFCEnum.ST); DoLinkedToDa doLinkedToDa = new DoLinkedToDa(dataObject, dataAttribute); // When - DataTypeTemplatesService dataTypeTemplatesService = new DataTypeTemplatesService(); Optional result = dataTypeTemplatesService.findDoLinkedToDa(dtt, "LN1", new DoLinkedToDaFilter("Do1", List.of(), "da1", List.of())); // Then assertThat(result).get().usingRecursiveComparison().isEqualTo(doLinkedToDa); @@ -338,7 +332,6 @@ void getAllDOAndDA_when_LNodeType_not_exist_should_return_empty_list() { //Given TDataTypeTemplates dtt = new TDataTypeTemplates(); //When - DataTypeTemplatesService dataTypeTemplatesService = new DataTypeTemplatesService(); List result = dataTypeTemplatesService.getAllDoLinkedToDa(dtt).toList(); //Then assertThat(result).isEmpty(); @@ -352,8 +345,7 @@ void getAllDOAndDA_when_DO_not_exist_should_return_empty_list() { tlNodeType.setId("lnodeTypeId"); dtt.getLNodeType().add(tlNodeType); //When - DataTypeTemplatesService dataTypeTemplatesService = new DataTypeTemplatesService(); - List result = dataTypeTemplatesService.getAllDoLinkedToDa(dtt).toList(); + List result = dataTypeTemplatesService.getAllDoLinkedToDa(dtt).toList(); //Then assertThat(result).isEmpty(); } @@ -370,8 +362,7 @@ void getAllDOAndDA_when_DoType_not_exist_should_return_empty_list() { tlNodeType.getDO().add(tdo); dtt.getLNodeType().add(tlNodeType); //When - DataTypeTemplatesService dataTypeTemplatesService = new DataTypeTemplatesService(); - List result = dataTypeTemplatesService.getAllDoLinkedToDa(dtt).toList(); + List result = dataTypeTemplatesService.getAllDoLinkedToDa(dtt).toList(); //Then assertThat(result).isEmpty(); } @@ -393,8 +384,7 @@ void getAllDOAndDA_when_DA_not_exist_should_return_empty_list() { dtt.getDOType().add(tdoType); scl.setDataTypeTemplates(dtt); //When - DataTypeTemplatesService dataTypeTemplatesService = new DataTypeTemplatesService(); - List result = dataTypeTemplatesService.getAllDoLinkedToDa(dtt).toList(); + List result = dataTypeTemplatesService.getAllDoLinkedToDa(dtt).toList(); //Then assertThat(result).isEmpty(); } @@ -419,8 +409,7 @@ void getAllDOAndDA_when_1DO_linked_to_1DA_should_return_expectedItems() { dtt.getDOType().add(tdoType); scl.setDataTypeTemplates(dtt); //When - DataTypeTemplatesService dataTypeTemplatesService = new DataTypeTemplatesService(); - List result = dataTypeTemplatesService.getAllDoLinkedToDa(dtt).toList(); + List result = dataTypeTemplatesService.getAllDoLinkedToDa(dtt).toList(); //Then assertThat(result).hasSize(1); assertThat(result.getFirst()) @@ -437,8 +426,7 @@ void getAllDOAndDA_should_return_all_dataReference() { // File contain all combinations that can be made TDataTypeTemplates dtt = initDttFromFile("/dtt-test-schema-conf/scd_dtt_do_sdo_da_bda_tests.xml"); // When - DataTypeTemplatesService dataTypeTemplatesService = new DataTypeTemplatesService(); - List result = dataTypeTemplatesService.getAllDoLinkedToDa(dtt).toList(); + List result = dataTypeTemplatesService.getAllDoLinkedToDa(dtt).toList(); // Then assertThat(result).hasSize(34) .extracting(doLinkedToDa1 -> doLinkedToDa1.dataObject().getDoName(), @@ -538,4 +526,14 @@ void getAllDOAndDA_should_return_all_dataReference() { ); } + @Test + void getEnumValues_should_succeed() { + // Given + TDataTypeTemplates dtt = initDttFromFile("/dtt-test-schema-conf/scd_dtt_do_sdo_da_bda_tests.xml"); + // When + List enumValues = dataTypeTemplatesService.getEnumValues(dtt, "LN1", DoLinkedToDaFilter.from("Do11", "sampleDa11")).toList(); + // Then + assertThat(enumValues).containsExactly("REB", "RVB", "RVL", "RVB+L"); + } + } diff --git a/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/LNodeStatusServiceTest.java b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/LNodeStatusServiceTest.java deleted file mode 100644 index 505431be5..000000000 --- a/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/LNodeStatusServiceTest.java +++ /dev/null @@ -1,194 +0,0 @@ -// SPDX-FileCopyrightText: 2024 RTE FRANCE -// -// SPDX-License-Identifier: Apache-2.0 - -package org.lfenergy.compas.sct.commons; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import org.lfenergy.compas.scl2007b4.model.SCL; -import org.lfenergy.compas.scl2007b4.model.TAnyLN; -import org.lfenergy.compas.scl2007b4.model.TLN; -import org.lfenergy.compas.sct.commons.dto.SclReportItem; -import org.lfenergy.compas.sct.commons.testhelpers.SclHelper; -import org.lfenergy.compas.sct.commons.testhelpers.SclTestMarshaller; - -import java.util.List; -import java.util.stream.Stream; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Named.named; -import static org.lfenergy.compas.sct.commons.testhelpers.SclHelper.*; - -class LNodeStatusServiceTest { - - private LNodeStatusService lNodeStatusService; - - @BeforeEach - void setUp() { - lNodeStatusService = new LNodeStatusService(new LdeviceService(), new LnService(), new DataTypeTemplatesService()); - } - - @ParameterizedTest - @MethodSource("provideUpdateModStVal") - void updateLnStatusBasedOnPrivateLNodeStatus_should_update_Mod_stVal(String ldInst, String lnClass, String lnInst, String expected) { - // Given - SCL scl = SclTestMarshaller.getSCLFromFile("/scl-lnodestatus/lnodestatus.scd"); - // When - List sclReportItems = lNodeStatusService.updateLnModStValBasedOnLNodeStatus(scl); - // Then - assertThat(sclReportItems).isEmpty(); - assertThat(findDai(scl, "IED_NAME_1", ldInst, lnClass, lnInst, "", "Mod", "stVal")) - .map(SclHelper::getValue) - .hasValue(expected); - } - - public static Stream provideUpdateModStVal() { - return Stream.of( - // Tests on LN - Arguments.of(named("LN 'on;off' to set to 'on'", "LDEVICE_1"), "PDIS", "1", "on"), - Arguments.of(named("LN 'off;on' to set to 'on'", "LDEVICE_1"), "PDIS", "2", "on"), - Arguments.of(named("LN 'on' to set to 'on'", "LDEVICE_1"), "PDIS", "3", "on"), - Arguments.of(named("LN 'on;off' to set to 'off'", "LDEVICE_1"), "PDIS", "4", "off"), - Arguments.of(named("LN 'off;on' to set to 'off'", "LDEVICE_1"), "PDIS", "5", "off"), - Arguments.of(named("LN 'off' to set to 'off'", "LDEVICE_1"), "PDIS", "6", "off"), - // Tests on LN0 - Arguments.of(named("LN0 'on;off' to set to 'on'", "LDEVICE_1"), "LLN0", "", "on"), - Arguments.of(named("LN0 'off;on' to set to 'on'", "LDEVICE_2"), "LLN0", "", "on"), - Arguments.of(named("LN0 'on' to set to 'on'", "LDEVICE_3"), "LLN0", "", "on"), - Arguments.of(named("LN0 'on;off' to set to 'off'", "LDEVICE_4"), "LLN0", "", "off"), - Arguments.of(named("LN0 'off;on' to set to 'off'", "LDEVICE_5"), "LLN0", "", "off"), - Arguments.of(named("LN0 'off' to set to 'off'", "LDEVICE_6"), "LLN0", "", "off") - ); - } - - @Test - void updateLnStatusBasedOnPrivateLNodeStatus_do_nothing_if_DAI_Mod_stVal_is_missing() { - // Given - SCL scl = SclTestMarshaller.getSCLFromFile("/scl-lnodestatus/lnodestatus_without_mod_stval.scd"); - // When - List sclReportItems = lNodeStatusService.updateLnModStValBasedOnLNodeStatus(scl); - // Then - assertThat(sclReportItems).isEmpty(); - assertThat(getLDevices(scl.getIED().getFirst()) - .flatMap(tlDevice -> Stream.concat(Stream.of(tlDevice.getLN0()), tlDevice.getLN().stream()))) - .flatMap(TAnyLN::getDOI) - .isEmpty(); - } - - @Test - void updateLnStatusBasedOnPrivateLNodeStatus_when_no_compasLNodeStatus_in_LNode_should_return_error() { - // Given - SCL scl = SclTestMarshaller.getSCLFromFile("/scl-lnodestatus/lnodestatus.scd"); - scl.getSubstation().getFirst().getVoltageLevel().getFirst().getBay().getFirst().getFunction().getFirst().getLNode().getFirst() - .getPrivate().clear(); - // When - List sclReportItems = lNodeStatusService.updateLnModStValBasedOnLNodeStatus(scl); - // Then - assertThat(sclReportItems).containsExactly( - SclReportItem.error("LNode(iedName=IED_NAME_1, ldInst=LDEVICE_1, lnClass=PDIS, lnInst=1, prefix=)", - "The private COMPAS-LNodeStatus of the LNode has invalid value. Expecting one of [on, off] but got : null") - ); - } - - @Test - void updateLnStatusBasedOnPrivateLNodeStatus_when_invalid_compasLNodeStatus_value_in_LNode_should_return_error() { - // Given - SCL scl = SclTestMarshaller.getSCLFromFile("/scl-lnodestatus/lnodestatus.scd"); - scl.getSubstation().getFirst().getVoltageLevel().getFirst().getBay().getFirst().getFunction().getFirst().getLNode().getFirst() - .getPrivate().getFirst().getContent().set(0, "helloworld"); - // When - List sclReportItems = lNodeStatusService.updateLnModStValBasedOnLNodeStatus(scl); - // Then - assertThat(sclReportItems).containsExactly( - SclReportItem.error("LNode(iedName=IED_NAME_1, ldInst=LDEVICE_1, lnClass=PDIS, lnInst=1, prefix=)", - "The private COMPAS-LNodeStatus of the LNode has invalid value. Expecting one of [on, off] but got : helloworld") - ); - } - - @Test - void updateLnStatusBasedOnPrivateLNodeStatus_when_LNode_does_not_match_any_LN_should_return_error() { - // Given - SCL scl = SclTestMarshaller.getSCLFromFile("/scl-lnodestatus/lnodestatus.scd"); - ((TLN) findAnyLn(scl, "IED_NAME_1", "LDEVICE_1", "PDIS", "1", "")) - .setPrefix("helloworld"); - // When - List sclReportItems = lNodeStatusService.updateLnModStValBasedOnLNodeStatus(scl); - // Then - assertThat(sclReportItems).containsExactly( - SclReportItem.error("LNode(iedName=IED_NAME_1, ldInst=LDEVICE_1, lnClass=PDIS, lnInst=1, prefix=)", - "LNode in Substation section does not have a matching LN in IED section") - ); - } - - @Test - void updateLnStatusBasedOnPrivateLNodeStatus_when_no_compasLNodeStatus_in_LN_should_return_error() { - // Given - SCL scl = SclTestMarshaller.getSCLFromFile("/scl-lnodestatus/lnodestatus.scd"); - findAnyLn(scl, "IED_NAME_1", "LDEVICE_1", "PDIS", "1", "") - .getPrivate().clear(); - // When - List sclReportItems = lNodeStatusService.updateLnModStValBasedOnLNodeStatus(scl); - // Then - assertThat(sclReportItems).containsExactly( - SclReportItem.error("IED(IED_NAME_1)/LD(LDEVICE_1)/LN[PDIS,1,]", - "The private COMPAS-LNodeStatus of the LN has invalid value. Expecting one of [off;on, on;off, on, off] but got : null") - ); - } - - @Test - void updateLnStatusBasedOnPrivateLNodeStatus_when_compasLNodeStatus_is_on_in_LNode_but_off_in_LN_should_return_error() { - // Given - SCL scl = SclTestMarshaller.getSCLFromFile("/scl-lnodestatus/lnodestatus.scd"); - findAnyLn(scl, "IED_NAME_1", "LDEVICE_1", "LLN0", "", "") - .getPrivate().getFirst().getContent().set(0, "off"); - findAnyLn(scl, "IED_NAME_1", "LDEVICE_1", "PDIS", "1", "") - .getPrivate().getFirst().getContent().set(0, "off"); - // When - List sclReportItems = lNodeStatusService.updateLnModStValBasedOnLNodeStatus(scl); - // Then - assertThat(sclReportItems).containsExactlyInAnyOrder( - SclReportItem.error("IED(IED_NAME_1)/LD(LDEVICE_1)/LN[LLN0,,]", - "Cannot set DAI Mod.stVal to on, because LN private COMPAS-LNodeStatus is set to off"), - SclReportItem.error("IED(IED_NAME_1)/LD(LDEVICE_1)/LN[PDIS,1,]", - "Cannot set DAI Mod.stVal to on, because LN private COMPAS-LNodeStatus is set to off") - ); - } - - @Test - void updateLnStatusBasedOnPrivateLNodeStatus_when_compasLNodeStatus_is_off_in_LNode_but_on_in_LN_should_return_error() { - // Given - SCL scl = SclTestMarshaller.getSCLFromFile("/scl-lnodestatus/lnodestatus.scd"); - findAnyLn(scl, "IED_NAME_1", "LDEVICE_4", "LLN0", "", "") - .getPrivate().getFirst().getContent().set(0, "on"); - findAnyLn(scl, "IED_NAME_1", "LDEVICE_1", "PDIS", "4", "") - .getPrivate().getFirst().getContent().set(0, "on"); - // When - List sclReportItems = lNodeStatusService.updateLnModStValBasedOnLNodeStatus(scl); - // Then - assertThat(sclReportItems).containsExactlyInAnyOrder( - SclReportItem.error("IED(IED_NAME_1)/LD(LDEVICE_4)/LN[LLN0,,]", - "Cannot set DAI Mod.stVal to off, because LN private COMPAS-LNodeStatus is set to on"), - SclReportItem.error("IED(IED_NAME_1)/LD(LDEVICE_1)/LN[PDIS,4,]", - "Cannot set DAI Mod.stVal to off, because LN private COMPAS-LNodeStatus is set to on") - ); - } - - @Test - void updateLnStatusBasedOnPrivateLNodeStatus_when_Mod_stVal_enumType_does_not_contains_value_should_return_error() { - // Given - SCL scl = SclTestMarshaller.getSCLFromFile("/scl-lnodestatus/lnodestatus.scd"); - scl.getDataTypeTemplates().getEnumType().getFirst().getEnumVal().removeIf(tEnumVal -> tEnumVal.getValue().equals("on")); - // When - List sclReportItems = lNodeStatusService.updateLnModStValBasedOnLNodeStatus(scl); - // Then - assertThat(sclReportItems).contains( - SclReportItem.error("IED(IED_NAME_1)/LD(LDEVICE_1)/LN[PDIS,1,]", - "Cannot set DAI Mod.stVal to 'on' because value is not in EnumType [off, test]") - ); - } - -} diff --git a/sct-commons/src/test/resources/dtt-test-schema-conf/scd_dtt_do_sdo_da_bda_tests.xml b/sct-commons/src/test/resources/dtt-test-schema-conf/scd_dtt_do_sdo_da_bda_tests.xml index 7afa8fad6..b99fdb787 100644 --- a/sct-commons/src/test/resources/dtt-test-schema-conf/scd_dtt_do_sdo_da_bda_tests.xml +++ b/sct-commons/src/test/resources/dtt-test-schema-conf/scd_dtt_do_sdo_da_bda_tests.xml @@ -37,7 +37,10 @@ - Completed-diff + REB + RVB + RVL + RVB+L diff --git a/sct-commons/src/test/resources/scl-lnodestatus/lnodestatus.scd b/sct-commons/src/test/resources/scl-lnodestatus/lnodestatus.scd deleted file mode 100644 index 6ff6a8e6f..000000000 --- a/sct-commons/src/test/resources/scl-lnodestatus/lnodestatus.scd +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - SCD - -
- - - 90 - - - - on - - - on - - - on - - - off - - - off - - - off - - - - - on - - - on - - - on - - - off - - - off - - - off - - - - - - - - - - - - on;off - - - - - - on;off - - - - - - off;on - - - - - - on - - - - - - on;off - - - - - - off;on - - - - - - off - - - - - - - - off;on - - - - - - - - on - - - - - - - - on;off - - - - - - - - off;on - - - - - - - - off - - - - - - - - - - - - - - - - - - - - on - off - test - - - diff --git a/sct-commons/src/test/resources/scl-lnodestatus/lnodestatus_without_mod_stval.scd b/sct-commons/src/test/resources/scl-lnodestatus/lnodestatus_without_mod_stval.scd deleted file mode 100644 index da7204fdc..000000000 --- a/sct-commons/src/test/resources/scl-lnodestatus/lnodestatus_without_mod_stval.scd +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - SCD - -
- - - 90 - - - - on - - - on - - - off - - - off - - - - - on - - - on - - - off - - - off - - - - - - - - - - - - on - - - on;off - - - on - - - on;off - - - off - - - - - on - - - - - on;off - - - - - off - - - - - - - - - - - - - - - - - on - off - test - - -