From 90d9d9c64de462aafb15e0d0c713a82f9ff32775 Mon Sep 17 00:00:00 2001
From: Lars Johansson <lars.johansson@ess.eu>
Date: Tue, 21 Jun 2022 19:47:12 +0200
Subject: [PATCH] Fix issues in validation and add integration tests for
 multiple name and structure elements

Fix issues in validation.
Add integration tests for multiple name elements - create, update, delete.
Add integration tests for multiple structure elements - create, update, delete, approve, cancel, reject.
---
 .../openepics/names/service/NamesService.java |   47 +-
 .../openepics/names/util/NameElementUtil.java |    6 +-
 .../org/openepics/names/util/TextUtil.java    |    1 +
 .../openepics/names/util/ValidateUtil.java    |   66 +-
 .../names/docker/complex/NamesMultipleIT.java |  599 ++++++
 .../docker/complex/StructuresMultipleIT.java  | 1658 +++++++++++++++++
 .../names/util/ValidateUtilTest.java          |    2 +-
 7 files changed, 2336 insertions(+), 43 deletions(-)
 create mode 100644 src/test/java/org/openepics/names/docker/complex/NamesMultipleIT.java
 create mode 100644 src/test/java/org/openepics/names/docker/complex/StructuresMultipleIT.java

diff --git a/src/main/java/org/openepics/names/service/NamesService.java b/src/main/java/org/openepics/names/service/NamesService.java
index 673ad520..fbb09ba6 100644
--- a/src/main/java/org/openepics/names/service/NamesService.java
+++ b/src/main/java/org/openepics/names/service/NamesService.java
@@ -26,6 +26,9 @@ import java.util.UUID;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
+import org.openepics.names.repository.DeviceGroupRepository;
+import org.openepics.names.repository.DeviceTypeRepository;
+import org.openepics.names.repository.DisciplineRepository;
 import org.openepics.names.repository.IDeviceGroupRepository;
 import org.openepics.names.repository.IDeviceTypeRepository;
 import org.openepics.names.repository.IDisciplineRepository;
@@ -34,6 +37,9 @@ import org.openepics.names.repository.ISubsystemRepository;
 import org.openepics.names.repository.ISystemGroupRepository;
 import org.openepics.names.repository.ISystemRepository;
 import org.openepics.names.repository.NameRepository;
+import org.openepics.names.repository.SubsystemRepository;
+import org.openepics.names.repository.SystemGroupRepository;
+import org.openepics.names.repository.SystemRepository;
 import org.openepics.names.repository.model.DeviceGroup;
 import org.openepics.names.repository.model.DeviceType;
 import org.openepics.names.repository.model.Discipline;
@@ -49,6 +55,7 @@ import org.openepics.names.rest.beans.response.ResponsePageNameElements;
 import org.openepics.names.util.EssNamingConvention;
 import org.openepics.names.util.ExceptionUtil;
 import org.openepics.names.util.HolderIRepositories;
+import org.openepics.names.util.HolderRepositories;
 import org.openepics.names.util.HolderSystemDeviceStructure;
 import org.openepics.names.util.NameElementUtil;
 import org.openepics.names.util.NameUtil;
@@ -83,6 +90,8 @@ public class NamesService {
     private EssNamingConvention namingConvention;
 
     private HolderIRepositories holderIRepositories;
+    private HolderRepositories holderRepositories;
+    // convenience, also part of holderRepositories
     private NameRepository nameRepository;
 
     @Autowired
@@ -94,7 +103,13 @@ public class NamesService {
             IDisciplineRepository iDisciplineRepository,
             IDeviceGroupRepository iDeviceGroupRepository,
             IDeviceTypeRepository iDeviceTypeRepository,
-            NameRepository nameRepository) {
+            NameRepository nameRepository,
+            SystemGroupRepository systemGroupRepository,
+            SystemRepository systemRepository,
+            SubsystemRepository subsystemRepository,
+            DisciplineRepository disciplineRepository,
+            DeviceGroupRepository deviceGroupRepository,
+            DeviceTypeRepository deviceTypeRepository) {
 
         this.namingConvention = new EssNamingConvention();
         this.holderIRepositories = new HolderIRepositories(
@@ -105,6 +120,14 @@ public class NamesService {
                 iDisciplineRepository,
                 iDeviceGroupRepository,
                 iDeviceTypeRepository);
+        this.holderRepositories = new HolderRepositories(
+                nameRepository,
+                systemGroupRepository,
+                systemRepository,
+                subsystemRepository,
+                disciplineRepository,
+                deviceGroupRepository,
+                deviceTypeRepository);
         this.nameRepository = nameRepository;
     }
 
@@ -129,12 +152,16 @@ public class NamesService {
         String requestedBy = "test who";
         final List<NameElement> createdNameElements = Lists.newArrayList();
         for (NameElementCommand nameElement : nameElements) {
-            // find out system group, system, subsystem
-            //     one of the three expected to be non-null, other two expected to be null
+            // find out
+            //     system structure - system group, system, subsystem - one of the three expected to be non-null, other two expected to be null
+            //     device structure - device type - may be null
             SystemGroup systemGroup = holderIRepositories.getSystemGroupRepository().findLatestByUuid(nameElement.getParentsystemstructure().toString());
             System      system      = holderIRepositories.getSystemRepository().findLatestByUuid(nameElement.getParentsystemstructure().toString());
             Subsystem   subsystem   = holderIRepositories.getSubsystemRepository().findLatestByUuid(nameElement.getParentsystemstructure().toString());
-            DeviceType  deviceType  = holderIRepositories.getDeviceTypeRepository().findLatestByUuid(nameElement.getParentdevicestructure().toString());
+            DeviceType  deviceType  = null;
+            if (nameElement.getParentdevicestructure() != null) {
+                deviceType = holderIRepositories.getDeviceTypeRepository().findLatestByUuid(nameElement.getParentdevicestructure().toString());
+            }
 
             String derivedName = null;
             if (systemGroup != null) {
@@ -471,7 +498,7 @@ public class NamesService {
         HolderSystemDeviceStructure holder = new HolderSystemDeviceStructure(holderIRepositories, false);
 
         // validate data
-        ValidateUtil.validateNameDataCreate(name, namingConvention, holderIRepositories, nameRepository, holder);
+        ValidateUtil.validateNameDataCreate(name, namingConvention, holderRepositories, holder);
 
         return Boolean.TRUE;
     }
@@ -620,7 +647,10 @@ public class NamesService {
             SystemGroup systemGroup = holderIRepositories.getSystemGroupRepository().findLatestByUuid(nameElement.getParentsystemstructure().toString());
             System      system      = holderIRepositories.getSystemRepository().findLatestByUuid(nameElement.getParentsystemstructure().toString());
             Subsystem   subsystem   = holderIRepositories.getSubsystemRepository().findLatestByUuid(nameElement.getParentsystemstructure().toString());
-            DeviceType  deviceType  = holderIRepositories.getDeviceTypeRepository().findLatestByUuid(nameElement.getParentdevicestructure().toString());
+            DeviceType  deviceType  = null;
+            if (nameElement.getParentdevicestructure() != null) {
+                deviceType  = holderIRepositories.getDeviceTypeRepository().findLatestByUuid(nameElement.getParentdevicestructure().toString());
+            }
 
             String derivedName = null;
             if (systemGroup != null) {
@@ -688,7 +718,10 @@ public class NamesService {
             SystemGroup systemGroup = holderIRepositories.getSystemGroupRepository().findLatestByUuid(nameElement.getParentsystemstructure().toString());
             System      system      = holderIRepositories.getSystemRepository().findLatestByUuid(nameElement.getParentsystemstructure().toString());
             Subsystem   subsystem   = holderIRepositories.getSubsystemRepository().findLatestByUuid(nameElement.getParentsystemstructure().toString());
-            DeviceType  deviceType  = holderIRepositories.getDeviceTypeRepository().findLatestByUuid(nameElement.getParentdevicestructure().toString());
+            DeviceType  deviceType  = null;
+            if (nameElement.getParentdevicestructure() != null) {
+                deviceType  = holderIRepositories.getDeviceTypeRepository().findLatestByUuid(nameElement.getParentdevicestructure().toString());
+            }
 
             String derivedName = null;
             if (systemGroup != null) {
diff --git a/src/main/java/org/openepics/names/util/NameElementUtil.java b/src/main/java/org/openepics/names/util/NameElementUtil.java
index 43c69706..6618c2dc 100644
--- a/src/main/java/org/openepics/names/util/NameElementUtil.java
+++ b/src/main/java/org/openepics/names/util/NameElementUtil.java
@@ -150,10 +150,14 @@ public class NameElementUtil {
 
         // find out system group, system, subsystem
         //     one of the three expected to be non-null, other two expected to be null
+
         SystemGroup systemGroup = holderIRepositories.getSystemGroupRepository().findLatestByUuid(nameElement.getParentsystemstructure().toString());
         System      system      = holderIRepositories.getSystemRepository().findLatestByUuid(nameElement.getParentsystemstructure().toString());
         Subsystem   subsystem   = holderIRepositories.getSubsystemRepository().findLatestByUuid(nameElement.getParentsystemstructure().toString());
-        DeviceType  deviceType  = holderIRepositories.getDeviceTypeRepository().findLatestByUuid(nameElement.getParentdevicestructure().toString());
+        DeviceType  deviceType  = null;
+        if (nameElement.getParentdevicestructure() != null) {
+            deviceType = holderIRepositories.getDeviceTypeRepository().findLatestByUuid(nameElement.getParentdevicestructure().toString());
+        }
 
         String derivedName = null;
         if (systemGroup != null) {
diff --git a/src/main/java/org/openepics/names/util/TextUtil.java b/src/main/java/org/openepics/names/util/TextUtil.java
index 47fd1efc..462a68f6 100644
--- a/src/main/java/org/openepics/names/util/TextUtil.java
+++ b/src/main/java/org/openepics/names/util/TextUtil.java
@@ -107,6 +107,7 @@ public class TextUtil {
     public static final String DEVICEGROUP_IS_NOT_AVAILABLE            = DEVICEGROUP      + SPACE + IS_NOT_AVAILABLE;
     public static final String DEVICETYPE_IS_NOT_AVAILABLE             = DEVICETYPE       + SPACE + IS_NOT_AVAILABLE;
 
+    public static final String PARENT_IS_NOT_CORRECT                   = PARENT           + SPACE + IS_NOT_CORRECT;
     public static final String SYSTEM_STRUCTURE_IS_NOT_CORRECT         = SYSTEM_STRUCTURE + SPACE + IS_NOT_CORRECT;
     public static final String SYSTEMGROUP_IS_NOT_CORRECT              = SYSTEMGROUP      + SPACE + IS_NOT_CORRECT;
     public static final String SYSTEM_IS_NOT_CORRECT                   = SYSTEM           + SPACE + IS_NOT_CORRECT;
diff --git a/src/main/java/org/openepics/names/util/ValidateUtil.java b/src/main/java/org/openepics/names/util/ValidateUtil.java
index 90303136..70d11e39 100644
--- a/src/main/java/org/openepics/names/util/ValidateUtil.java
+++ b/src/main/java/org/openepics/names/util/ValidateUtil.java
@@ -454,15 +454,12 @@ public class ValidateUtil {
             // system structure
             if (systemGroup != null) {
                 ExceptionUtil.validateConditionDataDeletedException(!systemGroup.isDeleted(), TextUtil.DATA_IS_DELETED, details, TextUtil.PARENTSYSTEMSTRUCTURE);
-
                 derivedName = NameUtil.getName(systemGroup, deviceType, nameElement.getIndex(), holder);
             } else if (system != null) {
                 ExceptionUtil.validateConditionDataDeletedException(!system.isDeleted(), TextUtil.DATA_IS_DELETED, details, TextUtil.PARENTSYSTEMSTRUCTURE);
-
                 derivedName = NameUtil.getName(system, deviceType, nameElement.getIndex(), holder);
             } else if (subsystem != null) {
                 ExceptionUtil.validateConditionDataDeletedException(!subsystem.isDeleted(), TextUtil.DATA_IS_DELETED, details, TextUtil.PARENTSYSTEMSTRUCTURE);
-
                 derivedName = NameUtil.getName(subsystem, deviceType, nameElement.getIndex(), holder);
             } else {
                 throw ExceptionUtil.createDataNotCorrectException(TextUtil.DATA_IS_NOT_CORRECT, details, TextUtil.PARENTSYSTEMSTRUCTURE);
@@ -513,14 +510,13 @@ public class ValidateUtil {
      *
      * @param name name
      * @param namingConvention naming convention
-     * @param holderIRepositories holder repositories
-     * @param nameRepository name repository
+     * @param holderRepositories holder repositories
      * @param holder holder
      *
      * @see ValidateUtil#validateNameDataCreate(NameElement, EssNamingConvention, HolderIRepositories, NameRepository, HolderSystemDeviceStructure)
      */
-    public static void validateNameDataCreate(String name, EssNamingConvention namingConvention, HolderIRepositories holderIRepositories, NameRepository nameRepository, HolderSystemDeviceStructure holder) {
-        if (name == null || namingConvention == null || holderIRepositories == null || nameRepository == null || holder == null) {
+    public static void validateNameDataCreate(String name, EssNamingConvention namingConvention, HolderRepositories holderRepositories, HolderSystemDeviceStructure holder) {
+        if (name == null || namingConvention == null || holderRepositories == null || holder == null) {
             return;
         }
 
@@ -538,6 +534,9 @@ public class ValidateUtil {
         String dt  = NamingConventionUtil.extractDeviceType(name);
         String idx = NamingConventionUtil.extractInstanceIndex(name);
 
+        String mnemonicPathSystemstructure = NamingConventionUtil.extractMnemonicPathSystemStructure(name);
+        String mnemonicPathDevicestructure = NamingConventionUtil.extractMnemonicPathDeviceStructure(name);
+
         int count = 0;
         int countSgSys = 0;
         int countSgSub = 0;
@@ -554,6 +553,7 @@ public class ValidateUtil {
             count++;
             countSgSub++;
         }
+
         // one or two system structure mnemonics + not system group and system + not system group and subsystem
         if (count < 1 || count > 2 || countSgSys == 2 || countSgSub == 2) {
             throw ExceptionUtil.createDataNotCorrectException(TextUtil.SYSTEM_STRUCTURE_IS_NOT_CORRECT, details, field);
@@ -577,34 +577,27 @@ public class ValidateUtil {
 
         // device structure
         if (!StringUtils.isEmpty(dt)) {
-            deviceType = holderIRepositories.getDeviceTypeRepository().findLatestNotDeletedByMnemonic(dt);
-            ExceptionUtil.validateConditionDataNotAvailableException(deviceType != null, TextUtil.DEVICETYPE_IS_NOT_AVAILABLE, details, field);
+            List<DeviceType> deviceTypes = holderRepositories.getDeviceTypeRepository().readDeviceTypes(Status.APPROVED, false, FieldStructure.MNEMONICPATH, mnemonicPathDevicestructure);
+            ExceptionUtil.validateConditionDataNotAvailableException(deviceTypes != null && deviceTypes.size() == 1, TextUtil.DEVICETYPE_IS_NOT_AVAILABLE, details, field);
+            deviceType = deviceTypes.get(0);
         }
 
         // system structure
-        if (!StringUtils.isEmpty(sg)) {
-            systemGroup = holderIRepositories.getSystemGroupRepository().findLatestNotDeletedByMnemonic(sg);
-            ExceptionUtil.validateConditionDataNotAvailableException(systemGroup != null, TextUtil.SYSTEMGROUP_IS_NOT_AVAILABLE, details, field);
-
+        List<Subsystem>   subsystems   = holderRepositories.getSubsystemRepository().readSubsystems(Status.APPROVED, false, FieldStructure.MNEMONICPATH, mnemonicPathSystemstructure);
+        List<System>      systems      = holderRepositories.getSystemRepository().readSystems(Status.APPROVED, false, FieldStructure.MNEMONICPATH, mnemonicPathSystemstructure);
+        List<SystemGroup> systemGroups = holderRepositories.getSystemGroupRepository().readSystemGroups(Status.APPROVED, false, FieldStructure.MNEMONICPATH, mnemonicPathSystemstructure);
+
+        if (subsystems != null && subsystems.size() == 1) {
+            subsystem = subsystems.get(0);
+            derivedName = NameUtil.getName(subsystem, deviceType, NamingConventionUtil.extractInstanceIndex(name), holder);
+        } else if (systems != null && systems.size() == 1) {
+            system = systems.get(0);
+            derivedName = NameUtil.getName(system, deviceType, NamingConventionUtil.extractInstanceIndex(name), holder);
+        } else if (systemGroups != null && systemGroups.size() == 1) {
+            systemGroup = systemGroups.get(0);
             derivedName = NameUtil.getName(systemGroup, deviceType, NamingConventionUtil.extractInstanceIndex(name), holder);
-        } else {
-            if (!StringUtils.isEmpty(sys)) {
-                system = holderIRepositories.getSystemRepository().findLatestNotDeletedByMnemonic(sys);
-                ExceptionUtil.validateConditionDataNotAvailableException(system != null, TextUtil.SYSTEM_IS_NOT_AVAILABLE, details, field);
-
-                derivedName = NameUtil.getName(system, deviceType, NamingConventionUtil.extractInstanceIndex(name), holder);
-            } else {
-                throw ExceptionUtil.createDataNotAvailableException(
-                        TextUtil.SYSTEM_IS_NOT_AVAILABLE, details, field);
-            }
-            // TODO is this condition correct?
-            ExceptionUtil.validateConditionDataNotAvailableException(system != null, TextUtil.SYSTEM_IS_NOT_AVAILABLE, details, field);
-            if (!StringUtils.isEmpty(sub)) {
-                subsystem = holderIRepositories.getSubsystemRepository().findLatestNotDeletedByParentAndMnemonic(system.getUuid().toString(), sub);
-                ExceptionUtil.validateConditionDataNotAvailableException(subsystem != null, TextUtil.SUBSYSTEM_IS_NOT_AVAILABLE, details, field);
-
-                derivedName = NameUtil.getName(subsystem, deviceType, NamingConventionUtil.extractInstanceIndex(name), holder);
-            }
+        } else  {
+            throw ExceptionUtil.createDataNotCorrectException(TextUtil.SYSTEM_STRUCTURE_IS_NOT_CORRECT, details, field);
         }
 
         // index
@@ -619,10 +612,10 @@ public class ValidateUtil {
         //     convention name equivalence not exists
         ExceptionUtil.validateConditionDataNotCorrectException(StringUtils.equals(name, derivedName), TextUtil.CONVENTION_NAME_IS_NOT_CORRECT, details, field);
 
-        List<Name> names = nameRepository.readNames(false, FieldName.NAME, name);
+        List<Name> names = holderRepositories.getNameRepository().readNames(false, FieldName.NAME, name);
         ExceptionUtil.validateConditionDataExistException(names.isEmpty(), TextUtil.CONVENTION_NAME_EXISTS, details, field);
 
-        names = nameRepository.readNames(false, FieldName.NAMEEQUIVALENCE, namingConvention.equivalenceClassRepresentative(name));
+        names = holderRepositories.getNameRepository().readNames(false, FieldName.NAMEEQUIVALENCE, namingConvention.equivalenceClassRepresentative(name));
         ExceptionUtil.validateConditionDataExistException(names.isEmpty(), TextUtil.CONVENTION_NAME_EQUIVALENCE_EXISTS, details, field);
     }
 
@@ -889,13 +882,18 @@ public class ValidateUtil {
         String field   = TextUtil.UUID;
 
         // validate data in itself
+        //     systemgroup, discipline
+        //         not have parent
         //     update, delete
         //         entry not pending
         //         entry approved and not deleted
         //     approve, cancel, reject
         //         entry pending
 
-        if (StructureChoice.UPDATE.equals(structureChoice) || StructureChoice.DELETE.equals(structureChoice)) {
+        if ((Type.SYSTEMGROUP.equals(structureElement.getType()) || Type.DISCIPLINE.equals(structureElement.getType()))
+                && structureElement.getParent() != null) {
+            throw ExceptionUtil.createDataNotCorrectException(TextUtil.PARENT_IS_NOT_CORRECT, details, field);
+        } else if (StructureChoice.UPDATE.equals(structureChoice) || StructureChoice.DELETE.equals(structureChoice)) {
             ValidateUtil.validateStructuresStatusSize0(
                     structureElement.getUuid(), structureElement.getType(), Status.PENDING, null,
                     holderRepositories, message, details, field);
diff --git a/src/test/java/org/openepics/names/docker/complex/NamesMultipleIT.java b/src/test/java/org/openepics/names/docker/complex/NamesMultipleIT.java
new file mode 100644
index 00000000..c2c9c875
--- /dev/null
+++ b/src/test/java/org/openepics/names/docker/complex/NamesMultipleIT.java
@@ -0,0 +1,599 @@
+/*
+ * Copyright (C) 2022 European Spallation Source ERIC.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+
+package org.openepics.names.docker.complex;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import java.io.File;
+import java.util.UUID;
+
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.openepics.names.docker.ITUtil;
+import org.openepics.names.docker.ITUtilNameElement;
+import org.openepics.names.docker.ITUtilStructureElement;
+import org.openepics.names.rest.beans.Type;
+import org.openepics.names.rest.beans.element.NameElement;
+import org.openepics.names.rest.beans.element.NameElementCommand;
+import org.openepics.names.rest.beans.element.StructureElement;
+import org.openepics.names.rest.beans.element.StructureElementCommand;
+import org.openepics.names.util.EnumUtil.NameChoice;
+import org.testcontainers.containers.DockerComposeContainer;
+import org.testcontainers.containers.wait.strategy.Wait;
+import org.testcontainers.junit.jupiter.Container;
+import org.testcontainers.junit.jupiter.Testcontainers;
+
+/**
+ * Integration tests for Naming and PostgreSQL that make use of existing dockerization
+ * with docker-compose.yml / Dockerfile.
+ *
+ * <p>
+ * Focus of this class is names endpoint.
+ * In particular, purpose is to test arrays of names.
+ * </p>
+ *
+ * @author Lars Johansson
+ */
+@Testcontainers
+class NamesMultipleIT {
+
+    // names for each of
+    //     system group                       + description + comment
+    //     system group + device type + index + description + comment
+    //     system                             + description + comment
+    //     system       + device type + index + description + comment
+    //     subsystem                          + description + comment
+    //     subsystem    + device type + index + description + comment
+
+    @Container
+    public static final DockerComposeContainer<?> ENVIRONMENT =
+        new DockerComposeContainer<>(new File("docker-compose-it-db-schema-migration.yml"))
+            .waitingFor(ITUtil.NAMING, Wait.forLogMessage(".*Started NamingApplication.*", 1));
+
+    private static UUID systemGroupAcc     = null;
+    private static UUID systemRFQ          = null;
+    private static UUID subsystem010PRL    = null;
+
+    private static UUID disciplineCryo     = null;
+    private static UUID deviceGroupCryo    = null;
+    private static UUID deviceType_Cryo_FS = null;
+
+    @BeforeAll
+    public static void initAll() {
+        // init system group, system, subsystem, discipline, device group, device type
+
+        StructureElementCommand structureElement  = null;
+        StructureElement approvedStructureElement = null;
+
+        structureElement = new StructureElementCommand(
+                null, Type.SYSTEMGROUP, null,
+                "Accelerator", "Acc",
+                "The ESS Linear Accelerator", "approved by alfio");
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        systemGroupAcc = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(
+                null, Type.SYSTEM, systemGroupAcc,
+                "Radio Frequency Quadrupole", "RFQ",
+                "empty", "empty");
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        systemRFQ = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(
+                null, Type.SUBSYSTEM, systemRFQ,
+                "01 Phase Reference Line", "010PRL",
+                "empty", "Approved by Daniel Piso");
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        subsystem010PRL = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(
+                null, Type.DISCIPLINE, null,
+                "Cryogenics", "Cryo",
+                "empty", "empty");
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        disciplineCryo = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(
+                null, Type.DEVICEGROUP, disciplineCryo,
+                "empty", null,
+                "empty", "empty");
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        deviceGroupCryo = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(
+                null, Type.DEVICETYPE, deviceGroupCryo,
+                "Flow Switch", "FS",
+                "empty", "empty");
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        deviceType_Cryo_FS = approvedStructureElement.getUuid();
+    }
+
+    @Test
+    void checkCreate() {
+        // purpose
+        //     test conditions for create name
+        //         not create itself
+        //
+        // what - combination of
+        //     read        exists name
+        //     read        is legacy name
+        //     read        is valid to create
+        //     read        validate create
+        //
+        // note
+        //     with and without index
+
+        try {
+            NameElementCommand[] nameElements = null;
+            UUID uuid = null;
+            String value = null;
+
+            nameElements = new NameElementCommand[] {
+                    new NameElementCommand(null, systemGroupAcc,  deviceType_Cryo_FS, "011", "checkCreate 1.3.011", "checkCreate 1.3.011"),
+                    new NameElementCommand(null, systemGroupAcc,  deviceType_Cryo_FS, "012", "checkCreate 1.3.012", "checkCreate 1.3.012"),
+                    new NameElementCommand(null, systemGroupAcc,  deviceType_Cryo_FS, "013", "checkCreate 1.3.013", "checkCreate 1.3.013"),
+                    new NameElementCommand(null, systemRFQ,       deviceType_Cryo_FS, "011", "checkCreate 2.3.011", "checkCreate 2.3.011"),
+                    new NameElementCommand(null, systemRFQ,       deviceType_Cryo_FS, "012", "checkCreate 2.3.012", "checkCreate 2.3.012"),
+                    new NameElementCommand(null, systemRFQ,       deviceType_Cryo_FS, "013", "checkCreate 2.3.013", "checkCreate 2.3.013"),
+                    new NameElementCommand(null, subsystem010PRL, deviceType_Cryo_FS, "011", "checkCreate 3.3.011", "checkCreate 3.3.011"),
+                    new NameElementCommand(null, subsystem010PRL, deviceType_Cryo_FS, "012", "checkCreate 3.3.012", "checkCreate 3.3.012"),
+                    new NameElementCommand(null, subsystem010PRL, deviceType_Cryo_FS, "013", "checkCreate 3.3.013", "checkCreate 3.3.013")
+            };
+
+            ITUtilNameElement.assertExists("RFQ:Cryo-FS-011", Boolean.FALSE);
+            ITUtilNameElement.assertIsLegacy("RFQ:Cryo-FS-011", Boolean.FALSE);
+            ITUtilNameElement.assertIsValidToCreate("RFQ:Cryo-FS-011", Boolean.TRUE);
+            ITUtilNameElement.assertValidate(nameElements, NameChoice.CREATE, Boolean.TRUE);
+            ITUtilNameElement.assertValidate(nameElements, NameChoice.UPDATE, Boolean.FALSE);
+            ITUtilNameElement.assertValidate(nameElements, NameChoice.DELETE, Boolean.FALSE);
+
+            uuid = deviceType_Cryo_FS;
+            nameElements[3].setUuid(uuid);
+            ITUtilNameElement.assertValidate(nameElements, NameChoice.CREATE, Boolean.FALSE);
+            nameElements[3].setUuid(null);
+            ITUtilNameElement.assertValidate(nameElements, NameChoice.CREATE, Boolean.TRUE);
+
+            uuid = nameElements[3].getParentsystemstructure();
+            nameElements[3].setParentsystemstructure(null);
+            ITUtilNameElement.assertValidate(nameElements, NameChoice.CREATE, Boolean.FALSE);
+            nameElements[3].setParentsystemstructure(uuid);
+            ITUtilNameElement.assertValidate(nameElements, NameChoice.CREATE, Boolean.TRUE);
+
+            uuid = nameElements[3].getParentdevicestructure();
+            nameElements[3].setParentdevicestructure(null);
+            ITUtilNameElement.assertValidate(nameElements, NameChoice.CREATE, Boolean.FALSE);
+            nameElements[3].setParentdevicestructure(uuid);
+            ITUtilNameElement.assertValidate(nameElements, NameChoice.CREATE, Boolean.TRUE);
+
+            value = nameElements[3].getIndex();
+            nameElements[3].setIndex(null);
+            ITUtilNameElement.assertValidate(nameElements, NameChoice.CREATE, Boolean.FALSE);
+            nameElements[3].setIndex(value);
+            ITUtilNameElement.assertValidate(nameElements, NameChoice.CREATE, Boolean.TRUE);
+
+            value = nameElements[3].getDescription();
+            nameElements[3].setDescription(null);
+            ITUtilNameElement.assertValidate(nameElements, NameChoice.CREATE, Boolean.FALSE);
+            nameElements[3].setDescription(value);
+            ITUtilNameElement.assertValidate(nameElements, NameChoice.CREATE, Boolean.TRUE);
+
+            value = nameElements[3].getComment();
+            nameElements[3].setComment(null);
+            ITUtilNameElement.assertValidate(nameElements, NameChoice.CREATE, Boolean.FALSE);
+            nameElements[3].setComment(value);
+            ITUtilNameElement.assertValidate(nameElements, NameChoice.CREATE, Boolean.TRUE);
+        } catch (Exception e) {
+            fail();
+        }
+    }
+
+    @Test
+    void create() {
+        // purpose
+        //     test create name
+        //
+        // what - combination of
+        //     create      create names
+        //     read        exists name
+        //     read        is legacy name
+        //     read        is valid to create
+        //     read        validate create
+        //
+        // note
+        //     with and without index
+
+        try {
+            NameElementCommand[] nameElements = null;
+            NameElement[] createdNameElements = null;
+
+            nameElements = new NameElementCommand[] {
+                    new NameElementCommand(null, systemGroupAcc,  null,               null,  "create 1.0.0",   "create 1.0.0"),
+                    new NameElementCommand(null, systemGroupAcc,  deviceType_Cryo_FS, "021", "create 1.3.021", "create 1.3.021"),
+                    new NameElementCommand(null, systemGroupAcc,  deviceType_Cryo_FS, "022", "create 1.3.022", "create 1.3.022"),
+                    new NameElementCommand(null, systemGroupAcc,  deviceType_Cryo_FS, "023", "create 1.3.023", "create 1.3.023"),
+                    new NameElementCommand(null, systemRFQ,       deviceType_Cryo_FS, "021", "create 2.3.021", "create 2.3.021"),
+                    new NameElementCommand(null, systemRFQ,       deviceType_Cryo_FS, "022", "create 2.3.022", "create 2.3.022"),
+                    new NameElementCommand(null, systemRFQ,       deviceType_Cryo_FS, "023", "create 2.3.023", "create 2.3.023"),
+                    new NameElementCommand(null, subsystem010PRL, deviceType_Cryo_FS, "021", "create 3.3.021", "create 3.3.021"),
+                    new NameElementCommand(null, subsystem010PRL, deviceType_Cryo_FS, "022", "create 3.3.022", "create 3.3.022"),
+                    new NameElementCommand(null, subsystem010PRL, deviceType_Cryo_FS, "023", "create 3.3.023", "create 3.3.023")
+            };
+
+            ITUtilNameElement.assertExists("Acc:Cryo-FS-023", Boolean.FALSE);
+            ITUtilNameElement.assertIsLegacy("Acc:Cryo-FS-023", Boolean.FALSE);
+            ITUtilNameElement.assertIsValidToCreate("Acc:Cryo-FS-023", Boolean.TRUE);
+            ITUtilNameElement.assertValidate(nameElements, NameChoice.CREATE, Boolean.TRUE);
+            ITUtilNameElement.assertValidate(nameElements, NameChoice.UPDATE, Boolean.FALSE);
+            ITUtilNameElement.assertValidate(nameElements, NameChoice.DELETE, Boolean.FALSE);
+
+            createdNameElements = ITUtilNameElement.assertCreate(nameElements);
+            assertNotNull(createdNameElements);
+            assertEquals(10, createdNameElements.length);
+
+            ITUtilNameElement.assertExists("Acc:Cryo-FS-023", Boolean.TRUE);
+            ITUtilNameElement.assertIsLegacy("Acc:Cryo-FS-023", Boolean.FALSE);
+            ITUtilNameElement.assertIsValidToCreate("Acc:Cryo-FS-023", Boolean.FALSE);
+            ITUtilNameElement.assertValidate(createdNameElements, NameChoice.CREATE, Boolean.FALSE);
+            ITUtilNameElement.assertValidate(createdNameElements, NameChoice.UPDATE, Boolean.TRUE);
+            ITUtilNameElement.assertValidate(createdNameElements, NameChoice.DELETE, Boolean.TRUE);
+        } catch (Exception e) {
+            fail();
+        }
+    }
+
+    @Test
+    void checkUpdate() {
+        // purpose
+        //     test conditions for update name
+        //         not update
+        //
+        // what - combination of
+        //     create      create names
+        //     read        exists name
+        //     read        is legacy name
+        //     read        is valid to create
+        //     read        validate create
+        //     read        validate update
+        //
+        // note
+        //     create in order to update
+        //     validate update
+
+        NameElementCommand[] nameElements = null;
+        NameElement[] createdNameElements = null;
+        UUID uuid = null;
+        String value = null;
+
+        nameElements = new NameElementCommand[] {
+                new NameElementCommand(null, systemGroupAcc,  deviceType_Cryo_FS, "031", "checkUpdate 1.3.031", "checkUpdate 1.3.031"),
+                new NameElementCommand(null, systemGroupAcc,  deviceType_Cryo_FS, "032", "checkUpdate 1.3.032", "checkUpdate 1.3.032"),
+                new NameElementCommand(null, systemGroupAcc,  deviceType_Cryo_FS, "033", "checkUpdate 1.3.033", "checkUpdate 1.3.033"),
+                new NameElementCommand(null, systemRFQ,       deviceType_Cryo_FS, "031", "checkUpdate 2.3.031", "checkUpdate 2.3.031"),
+                new NameElementCommand(null, systemRFQ,       deviceType_Cryo_FS, "032", "checkUpdate 2.3.032", "checkUpdate 2.3.032"),
+                new NameElementCommand(null, systemRFQ,       deviceType_Cryo_FS, "033", "checkUpdate 2.3.033", "checkUpdate 2.3.033"),
+                new NameElementCommand(null, subsystem010PRL, deviceType_Cryo_FS, "031", "checkUpdate 3.3.031", "checkUpdate 3.3.031"),
+                new NameElementCommand(null, subsystem010PRL, deviceType_Cryo_FS, "032", "checkUpdate 3.3.032", "checkUpdate 3.3.032"),
+                new NameElementCommand(null, subsystem010PRL, deviceType_Cryo_FS, "033", "checkUpdate 3.3.033", "checkUpdate 3.3.033")
+        };
+
+        ITUtilNameElement.assertExists("RFQ:Cryo-FS-031", Boolean.FALSE);
+        ITUtilNameElement.assertIsLegacy("RFQ:Cryo-FS-031", Boolean.FALSE);
+        ITUtilNameElement.assertIsValidToCreate("RFQ:Cryo-FS-031", Boolean.TRUE);
+        ITUtilNameElement.assertValidate(nameElements, NameChoice.CREATE, Boolean.TRUE);
+        ITUtilNameElement.assertValidate(nameElements, NameChoice.UPDATE, Boolean.FALSE);
+        ITUtilNameElement.assertValidate(nameElements, NameChoice.DELETE, Boolean.FALSE);
+
+        createdNameElements = ITUtilNameElement.assertCreate(nameElements);
+        assertNotNull(createdNameElements);
+        assertEquals(9, createdNameElements.length);
+
+        ITUtilNameElement.assertExists("RFQ:Cryo-FS-031", Boolean.TRUE);
+        ITUtilNameElement.assertIsLegacy("RFQ:Cryo-FS-031", Boolean.FALSE);
+        ITUtilNameElement.assertIsValidToCreate("RFQ:Cryo-FS-031", Boolean.FALSE);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.CREATE, Boolean.FALSE);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.UPDATE, Boolean.TRUE);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.DELETE, Boolean.TRUE);
+
+        uuid = createdNameElements[3].getUuid();
+        createdNameElements[3].setUuid(null);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.UPDATE, Boolean.FALSE);
+        createdNameElements[3].setUuid(uuid);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.UPDATE, Boolean.TRUE);
+
+        uuid = createdNameElements[3].getParentsystemstructure();
+        createdNameElements[3].setParentsystemstructure(null);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.UPDATE, Boolean.FALSE);
+        createdNameElements[3].setParentsystemstructure(uuid);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.UPDATE, Boolean.TRUE);
+
+        uuid = createdNameElements[3].getParentdevicestructure();
+        createdNameElements[3].setParentdevicestructure(null);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.UPDATE, Boolean.FALSE);
+        createdNameElements[3].setParentdevicestructure(uuid);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.UPDATE, Boolean.TRUE);
+
+        value = createdNameElements[3].getIndex();
+        createdNameElements[3].setIndex(null);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.UPDATE, Boolean.FALSE);
+        createdNameElements[3].setIndex(value);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.UPDATE, Boolean.TRUE);
+
+        value = createdNameElements[3].getDescription();
+        createdNameElements[3].setDescription(null);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.UPDATE, Boolean.FALSE);
+        createdNameElements[3].setDescription(value);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.UPDATE, Boolean.TRUE);
+
+        value = createdNameElements[3].getComment();
+        createdNameElements[3].setComment(null);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.UPDATE, Boolean.FALSE);
+        createdNameElements[3].setComment(value);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.UPDATE, Boolean.TRUE);
+    }
+
+    @Test
+    void update() {
+        // purpose
+        //     test update name
+        //
+        // what - combination of
+        //     create      create names
+        //     read        exists name
+        //     read        is legacy name
+        //     read        is valid to create
+        //     read        validate create
+        //     read        validate update
+        //     update      update names
+        //
+        // note
+        //     create in order to update
+
+        NameElementCommand[] nameElements = null;
+        NameElement[] createdNameElements = null;
+        NameElement[] updatedNameElements = null;
+
+        nameElements = new NameElementCommand[] {
+                new NameElementCommand(null, systemGroupAcc,  deviceType_Cryo_FS, "041", "update 1.3.041", "update 1.3.041"),
+                new NameElementCommand(null, systemGroupAcc,  deviceType_Cryo_FS, "042", "update 1.3.042", "update 1.3.042"),
+                new NameElementCommand(null, systemGroupAcc,  deviceType_Cryo_FS, "043", "update 1.3.043", "update 1.3.043"),
+                new NameElementCommand(null, systemRFQ,       null,               null,  "update 2.0.0",   "update 2.0.0"),
+                new NameElementCommand(null, systemRFQ,       deviceType_Cryo_FS, "041", "update 2.3.041", "update 2.3.041"),
+                new NameElementCommand(null, systemRFQ,       deviceType_Cryo_FS, "042", "update 2.3.042", "update 2.3.042"),
+                new NameElementCommand(null, systemRFQ,       deviceType_Cryo_FS, "043", "update 2.3.043", "update 2.3.043"),
+                new NameElementCommand(null, subsystem010PRL, deviceType_Cryo_FS, "041", "update 3.3.041", "update 3.3.041"),
+                new NameElementCommand(null, subsystem010PRL, deviceType_Cryo_FS, "042", "update 3.3.042", "update 3.3.042"),
+                new NameElementCommand(null, subsystem010PRL, deviceType_Cryo_FS, "043", "update 3.3.043", "update 3.3.043")
+        };
+
+        ITUtilNameElement.assertExists("RFQ", Boolean.FALSE);
+        ITUtilNameElement.assertIsLegacy("RFQ", Boolean.FALSE);
+        ITUtilNameElement.assertIsValidToCreate("RFQ", Boolean.TRUE);
+        ITUtilNameElement.assertValidate(nameElements, NameChoice.CREATE, Boolean.TRUE);
+        ITUtilNameElement.assertValidate(nameElements, NameChoice.UPDATE, Boolean.FALSE);
+        ITUtilNameElement.assertValidate(nameElements, NameChoice.DELETE, Boolean.FALSE);
+
+        createdNameElements = ITUtilNameElement.assertCreate(nameElements);
+        assertNotNull(createdNameElements);
+        assertEquals(10, createdNameElements.length);
+
+        ITUtilNameElement.assertExists("RFQ", Boolean.TRUE);
+        ITUtilNameElement.assertIsLegacy("RFQ", Boolean.FALSE);
+        ITUtilNameElement.assertIsValidToCreate("RFQ", Boolean.FALSE);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.CREATE, Boolean.FALSE);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.UPDATE, Boolean.TRUE);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.DELETE, Boolean.TRUE);
+
+        createdNameElements[0].setDescription("0");
+        createdNameElements[1].setDescription("1");
+        createdNameElements[2].setDescription("2");
+        createdNameElements[3].setDescription("3");
+        createdNameElements[4].setDescription("4");
+        createdNameElements[5].setDescription("5");
+        createdNameElements[6].setDescription("6");
+        createdNameElements[7].setDescription("7");
+        createdNameElements[8].setDescription("8");
+        createdNameElements[9].setDescription("9");
+
+        ITUtilNameElement.assertExists("RFQ", Boolean.TRUE);
+        ITUtilNameElement.assertIsLegacy("RFQ", Boolean.FALSE);
+        ITUtilNameElement.assertIsValidToCreate("RFQ", Boolean.FALSE);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.CREATE, Boolean.FALSE);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.UPDATE, Boolean.TRUE);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.DELETE, Boolean.TRUE);
+
+        updatedNameElements = ITUtilNameElement.assertUpdate(createdNameElements);
+        assertNotNull(updatedNameElements);
+        assertEquals(10, updatedNameElements.length);
+
+        ITUtilNameElement.assertExists("RFQ", Boolean.TRUE);
+        ITUtilNameElement.assertIsLegacy("RFQ", Boolean.FALSE);
+        ITUtilNameElement.assertIsValidToCreate("RFQ", Boolean.FALSE);
+        ITUtilNameElement.assertValidate(updatedNameElements, NameChoice.CREATE, Boolean.FALSE);
+        ITUtilNameElement.assertValidate(updatedNameElements, NameChoice.UPDATE, Boolean.TRUE);
+        ITUtilNameElement.assertValidate(updatedNameElements, NameChoice.DELETE, Boolean.TRUE);
+    }
+
+    @Test
+    void checkDelete() {
+        // purpose
+        //     test conditions for delete name
+        //         not delete
+        //
+        // what - combination of
+        //     create      create names
+        //     read        exists name
+        //     read        is legacy name
+        //     read        is valid to create
+        //     read        validate create
+        //     read        validate delete
+        //
+        // note
+        //     create in order to delete
+        //     validate delete
+        //         uuid
+        //         comment
+
+        NameElementCommand[] nameElements = null;
+        NameElement[] createdNameElements = null;
+        UUID uuid = null;
+        String value = null;
+
+        nameElements = new NameElementCommand[] {
+                new NameElementCommand(null, systemGroupAcc,  deviceType_Cryo_FS, "051", "checkDelete 1.3.051", "checkDelete 1.3.051"),
+                new NameElementCommand(null, systemGroupAcc,  deviceType_Cryo_FS, "052", "checkDelete 1.3.052", "checkDelete 1.3.052"),
+                new NameElementCommand(null, systemGroupAcc,  deviceType_Cryo_FS, "053", "checkDelete 1.3.053", "checkDelete 1.3.053"),
+                new NameElementCommand(null, systemRFQ,       deviceType_Cryo_FS, "051", "checkDelete 2.3.051", "checkDelete 2.3.051"),
+                new NameElementCommand(null, systemRFQ,       deviceType_Cryo_FS, "052", "checkDelete 2.3.052", "checkDelete 2.3.052"),
+                new NameElementCommand(null, systemRFQ,       deviceType_Cryo_FS, "053", "checkDelete 2.3.053", "checkDelete 2.3.053"),
+                new NameElementCommand(null, subsystem010PRL, deviceType_Cryo_FS, "051", "checkDelete 3.3.051", "checkDelete 3.3.051"),
+                new NameElementCommand(null, subsystem010PRL, deviceType_Cryo_FS, "052", "checkDelete 3.3.052", "checkDelete 3.3.052"),
+                new NameElementCommand(null, subsystem010PRL, deviceType_Cryo_FS, "053", "checkDelete 3.3.053", "checkDelete 3.3.053")
+        };
+
+        ITUtilNameElement.assertExists("RFQ:Cryo-FS-051", Boolean.FALSE);
+        ITUtilNameElement.assertIsLegacy("RFQ:Cryo-FS-051", Boolean.FALSE);
+        ITUtilNameElement.assertIsValidToCreate("RFQ:Cryo-FS-051", Boolean.TRUE);
+        ITUtilNameElement.assertValidate(nameElements, NameChoice.CREATE, Boolean.TRUE);
+        ITUtilNameElement.assertValidate(nameElements, NameChoice.UPDATE, Boolean.FALSE);
+        ITUtilNameElement.assertValidate(nameElements, NameChoice.DELETE, Boolean.FALSE);
+
+        createdNameElements = ITUtilNameElement.assertCreate(nameElements);
+        assertNotNull(createdNameElements);
+        assertEquals(9, createdNameElements.length);
+
+        ITUtilNameElement.assertExists("RFQ:Cryo-FS-051", Boolean.TRUE);
+        ITUtilNameElement.assertIsLegacy("RFQ:Cryo-FS-051", Boolean.FALSE);
+        ITUtilNameElement.assertIsValidToCreate("RFQ:Cryo-FS-051", Boolean.FALSE);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.CREATE, Boolean.FALSE);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.UPDATE, Boolean.TRUE);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.DELETE, Boolean.TRUE);
+
+        uuid = createdNameElements[3].getUuid();
+        createdNameElements[3].setUuid(null);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.DELETE, Boolean.FALSE);
+        createdNameElements[3].setUuid(uuid);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.DELETE, Boolean.TRUE);
+
+        uuid = createdNameElements[3].getParentsystemstructure();
+        createdNameElements[3].setParentsystemstructure(null);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.DELETE, Boolean.TRUE);
+        createdNameElements[3].setParentsystemstructure(uuid);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.DELETE, Boolean.TRUE);
+
+        uuid = createdNameElements[3].getParentdevicestructure();
+        createdNameElements[3].setParentdevicestructure(null);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.DELETE, Boolean.TRUE);
+        createdNameElements[3].setParentdevicestructure(uuid);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.DELETE, Boolean.TRUE);
+
+        value = createdNameElements[3].getIndex();
+        createdNameElements[3].setIndex(null);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.DELETE, Boolean.TRUE);
+        createdNameElements[3].setIndex(value);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.DELETE, Boolean.TRUE);
+
+        value = createdNameElements[3].getDescription();
+        createdNameElements[3].setDescription(null);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.DELETE, Boolean.TRUE);
+        createdNameElements[3].setDescription(value);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.DELETE, Boolean.TRUE);
+
+        value = createdNameElements[3].getComment();
+        createdNameElements[3].setComment(null);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.DELETE, Boolean.FALSE);
+        createdNameElements[3].setComment(value);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.DELETE, Boolean.TRUE);
+    }
+
+    @Test
+    void delete() {
+        // purpose
+        //     test delete name
+        //
+        // what - combination of
+        //     create      create names
+        //     read        exists name
+        //     read        is legacy name
+        //     read        is valid to create
+        //     read        validate create
+        //     read        validate update
+        //     delete      delete names
+        //
+        // note
+        //     create in order to delete
+        //
+        // names for each of
+        //     system group                       + description + comment
+        //     system group + device type + index + description + comment
+        //     system                             + description + comment
+        //     system       + device type + index + description + comment
+        //     subsystem                          + description + comment
+        //     subsystem    + device type + index + description + comment
+
+        NameElementCommand[] nameElements = null;
+        NameElement[] createdNameElements = null;
+        NameElement[] deletedNameElements = null;
+
+        nameElements = new NameElementCommand[] {
+                new NameElementCommand(null, systemGroupAcc,  deviceType_Cryo_FS, "061", "delete 1.3.061", "delete 1.3.061"),
+                new NameElementCommand(null, systemGroupAcc,  deviceType_Cryo_FS, "062", "delete 1.3.062", "delete 1.3.062"),
+                new NameElementCommand(null, systemGroupAcc,  deviceType_Cryo_FS, "063", "delete 1.3.063", "delete 1.3.063"),
+                new NameElementCommand(null, systemRFQ,       deviceType_Cryo_FS, "061", "delete 2.3.061", "delete 2.3.061"),
+                new NameElementCommand(null, systemRFQ,       deviceType_Cryo_FS, "062", "delete 2.3.062", "delete 2.3.062"),
+                new NameElementCommand(null, systemRFQ,       deviceType_Cryo_FS, "063", "delete 2.3.063", "delete 2.3.063"),
+                new NameElementCommand(null, subsystem010PRL, null,               null,  "delete 3.0.0",   "delete 3.0.0"),
+                new NameElementCommand(null, subsystem010PRL, deviceType_Cryo_FS, "061", "delete 3.3.061", "delete 3.3.061"),
+                new NameElementCommand(null, subsystem010PRL, deviceType_Cryo_FS, "062", "delete 3.3.062", "delete 3.3.062"),
+                new NameElementCommand(null, subsystem010PRL, deviceType_Cryo_FS, "063", "delete 3.3.063", "delete 3.3.063")
+        };
+
+        ITUtilNameElement.assertExists("RFQ:Cryo-FS-061", Boolean.FALSE);
+        ITUtilNameElement.assertIsLegacy("RFQ:Cryo-FS-061", Boolean.FALSE);
+        ITUtilNameElement.assertIsValidToCreate("RFQ:Cryo-FS-061", Boolean.TRUE);
+        ITUtilNameElement.assertValidate(nameElements, NameChoice.CREATE, Boolean.TRUE);
+        ITUtilNameElement.assertValidate(nameElements, NameChoice.UPDATE, Boolean.FALSE);
+        ITUtilNameElement.assertValidate(nameElements, NameChoice.DELETE, Boolean.FALSE);
+
+        createdNameElements = ITUtilNameElement.assertCreate(nameElements);
+        assertNotNull(createdNameElements);
+        assertEquals(10, createdNameElements.length);
+
+        ITUtilNameElement.assertExists("RFQ:Cryo-FS-061", Boolean.TRUE);
+        ITUtilNameElement.assertIsLegacy("RFQ:Cryo-FS-061", Boolean.FALSE);
+        ITUtilNameElement.assertIsValidToCreate("RFQ:Cryo-FS-061", Boolean.FALSE);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.CREATE, Boolean.FALSE);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.UPDATE, Boolean.TRUE);
+        ITUtilNameElement.assertValidate(createdNameElements, NameChoice.DELETE, Boolean.TRUE);
+
+        deletedNameElements = ITUtilNameElement.assertDelete(createdNameElements);
+        assertNotNull(deletedNameElements);
+        assertEquals(10, deletedNameElements.length);
+
+        ITUtilNameElement.assertExists("RFQ:Cryo-FS-061", Boolean.FALSE);
+        ITUtilNameElement.assertIsLegacy("RFQ:Cryo-FS-061", Boolean.FALSE);
+        ITUtilNameElement.assertIsValidToCreate("RFQ:Cryo-FS-061", Boolean.TRUE);
+        ITUtilNameElement.assertValidate(nameElements, NameChoice.CREATE, Boolean.TRUE);
+        ITUtilNameElement.assertValidate(deletedNameElements, NameChoice.CREATE, Boolean.FALSE);
+        ITUtilNameElement.assertValidate(deletedNameElements, NameChoice.UPDATE, Boolean.FALSE);
+        ITUtilNameElement.assertValidate(deletedNameElements, NameChoice.DELETE, Boolean.FALSE);
+    }
+
+}
diff --git a/src/test/java/org/openepics/names/docker/complex/StructuresMultipleIT.java b/src/test/java/org/openepics/names/docker/complex/StructuresMultipleIT.java
new file mode 100644
index 00000000..c23be18b
--- /dev/null
+++ b/src/test/java/org/openepics/names/docker/complex/StructuresMultipleIT.java
@@ -0,0 +1,1658 @@
+/*
+ * Copyright (C) 2022 European Spallation Source ERIC.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+
+package org.openepics.names.docker.complex;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import java.io.File;
+import java.util.UUID;
+
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.openepics.names.docker.ITUtil;
+import org.openepics.names.docker.ITUtilStructureElement;
+import org.openepics.names.rest.beans.Type;
+import org.openepics.names.rest.beans.element.StructureElement;
+import org.openepics.names.rest.beans.element.StructureElementCommand;
+import org.openepics.names.util.EnumUtil.StructureChoice;
+import org.testcontainers.containers.DockerComposeContainer;
+import org.testcontainers.containers.wait.strategy.Wait;
+import org.testcontainers.junit.jupiter.Container;
+import org.testcontainers.junit.jupiter.Testcontainers;
+
+/**
+ * Integration tests for Naming and PostgreSQL that make use of existing dockerization
+ * with docker-compose.yml / Dockerfile.
+ *
+ * <p>
+ * Focus of this class is structures endpoint and system.
+ * In particular, purpose is to test arrays of structures.
+ * </p>
+ *
+ * @author Lars Johansson
+ */
+@Testcontainers
+class StructuresMultipleIT {
+
+    @Container
+    public static final DockerComposeContainer<?> ENVIRONMENT =
+        new DockerComposeContainer<>(new File("docker-compose-it-db-schema-migration.yml"))
+            .waitingFor(ITUtil.NAMING, Wait.forLogMessage(".*Started NamingApplication.*", 1));
+
+    private static UUID systemGroupUuid = null;
+    private static UUID systemUuid = null;
+    private static UUID subsystemUuid = null;
+
+    private static UUID disciplineUuid = null;
+    private static UUID deviceGroupUuid = null;
+    @SuppressWarnings("unused")
+    private static UUID deviceTypeUuid = null;
+
+    @BeforeAll
+    public static void initAll() {
+        // init system group, system, discipline, device group
+
+        StructureElementCommand structureElement  = null;
+        StructureElement approvedStructureElement = null;
+
+        structureElement = new StructureElementCommand(
+                null, Type.SYSTEMGROUP, null,
+                "name", "Sg",
+                "description", "comment");
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        systemGroupUuid = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(
+                null, Type.SYSTEM, systemGroupUuid,
+                "name", "Sys",
+                "description", "comment");
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        systemUuid = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(
+                null, Type.SUBSYSTEM, systemUuid,
+                "name", "Sub",
+                "description", "comment");
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        subsystemUuid = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(
+                null, Type.DISCIPLINE, null,
+                "name", "Di",
+                "description", "comment");
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        disciplineUuid = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(
+                null, Type.DEVICEGROUP, disciplineUuid,
+                "name", null,
+                "description", "comment");
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        deviceGroupUuid = approvedStructureElement.getUuid();
+
+        structureElement = new StructureElementCommand(
+                null, Type.DEVICETYPE, deviceGroupUuid,
+                "name", "Dt",
+                "description", "comment");
+        approvedStructureElement = ITUtilStructureElement.assertCreateApprove(structureElement);
+        deviceTypeUuid = approvedStructureElement.getUuid();
+    }
+
+    @Test
+    void checkCreate() {
+        // purpose
+        //     test conditions for create subsystem
+        //         not create itself
+        //
+        // what - combination of
+        //     create      create structures
+        //     read        exists in structure
+        //     read        is valid to create
+        //     read        validate create
+        //
+        // validate create
+        //     type
+        //     parent
+        //     name
+        //     mnemonic
+        //     description
+        //     comment
+
+        try {
+            StructureElementCommand[] structureElements = null;
+            UUID uuid = null;
+            String value = null;
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "Sg",    Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgChc", Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "Sg",   Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgChc", Boolean.TRUE);
+
+            ITUtilStructureElement.assertExists(Type.SYSTEM, "Sys",    Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM, "SysChc", Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM, "Sys",   Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM, "SysChc", Boolean.TRUE);
+
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys-Sub", Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM, "Sys-SubChc",  Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM, "Sys-Sub",   Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM, "Sys-SubChc", Boolean.TRUE);
+
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE, "Di",   Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE, "DiChc", Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE, "Di",   Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE, "DiChc", Boolean.TRUE);
+
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "Grp",   Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpChc", Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "Grp",   Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpChc", Boolean.FALSE);
+
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di-Dt",    Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE, "Di-DtChc", Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE, "Di-Dt",   Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE, "Di-DtChc", Boolean.TRUE);
+
+            structureElements = new StructureElementCommand[] {
+                    new StructureElementCommand(null, Type.SYSTEMGROUP, null,            "name", "SgChc",  "description", "comment"),
+                    new StructureElementCommand(null, Type.SYSTEM,      systemGroupUuid, "name", "SysChc", "description", "comment"),
+                    new StructureElementCommand(null, Type.SUBSYSTEM,   systemUuid,      "name", "SubChc", "description", "comment"),
+                    new StructureElementCommand(null, Type.DISCIPLINE,  null,            "name", "DiChc",  "description", "comment"),
+                    new StructureElementCommand(null, Type.DEVICEGROUP, disciplineUuid,  "name", "",      "description", "comment"),
+                    new StructureElementCommand(null, Type.DEVICETYPE,  deviceGroupUuid, "name", "DtChc",  "description", "comment")
+            };
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CREATE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.UPDATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.DELETE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.REJECT,  Boolean.FALSE);
+
+            uuid = subsystemUuid;
+            structureElements[1].setUuid(uuid);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CREATE, Boolean.FALSE);
+            structureElements[1].setUuid(null);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CREATE, Boolean.TRUE);
+
+            structureElements[1].setType(null);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CREATE, Boolean.FALSE);
+            structureElements[1].setType(Type.SYSTEMGROUP);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CREATE, Boolean.FALSE);
+            structureElements[1].setType(Type.SUBSYSTEM);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CREATE, Boolean.FALSE);
+            structureElements[1].setType(Type.SYSTEM);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CREATE, Boolean.TRUE);
+
+            structureElements[1].setParent(null);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CREATE, Boolean.FALSE);
+            structureElements[1].setParent(systemUuid);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CREATE, Boolean.FALSE);
+            structureElements[1].setParent(subsystemUuid);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CREATE, Boolean.FALSE);
+            structureElements[1].setParent(systemGroupUuid);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CREATE, Boolean.TRUE);
+
+            value = structureElements[1].getName();
+            structureElements[1].setName(null);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CREATE, Boolean.FALSE);
+            structureElements[1].setName(value);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CREATE, Boolean.TRUE);
+
+            value = structureElements[1].getDescription();
+            structureElements[1].setDescription(null);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CREATE, Boolean.FALSE);
+            structureElements[1].setDescription(value);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CREATE, Boolean.TRUE);
+
+            value = structureElements[1].getComment();
+            structureElements[1].setComment(null);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CREATE, Boolean.FALSE);
+            structureElements[1].setComment(value);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CREATE, Boolean.TRUE);
+        } catch (Exception e) {
+            fail();
+        }
+    }
+
+    @Test
+    void createApprove() {
+        // purpose
+        //     test create and approve subsystem
+        //
+        // what - combination of
+        //     create      create structures
+        //     read        exists in structure
+        //     read        is valid to create
+        //     read        validate create
+        //     read        validate approve
+        //     patch       approve structures
+        //
+        // note
+        //     create in order to approve
+
+        try {
+            StructureElementCommand[] structureElements = null;
+            StructureElement[] createdStructureElements = null;
+            StructureElement[] approvedStructureElements = null;
+
+            structureElements = new StructureElementCommand[] {
+                    new StructureElementCommand(null, Type.SYSTEMGROUP, null,            "name", "SgCa",  "description", "comment"),
+                    new StructureElementCommand(null, Type.SYSTEM,      systemGroupUuid, "name", "SysCa", "description", "comment"),
+                    new StructureElementCommand(null, Type.SUBSYSTEM,   systemUuid,      "name", "SubCa", "description", "comment"),
+                    new StructureElementCommand(null, Type.DISCIPLINE,  null,            "name", "DiCa",  "description", "comment"),
+                    new StructureElementCommand(null, Type.DEVICEGROUP, disciplineUuid,  "name", "",      "description", "comment"),
+                    new StructureElementCommand(null, Type.DEVICETYPE,  deviceGroupUuid, "name", "DtCa",  "description", "comment")
+            };
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgCa",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysCa",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubCa", Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiCa",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpCa",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtCa",   Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgCa",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysCa",     Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubCa", Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiCa",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpCa",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtCa",   Boolean.TRUE);
+
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CREATE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.UPDATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.DELETE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.REJECT,  Boolean.FALSE);
+
+            createdStructureElements = ITUtilStructureElement.assertCreate(structureElements);
+            assertNotNull(createdStructureElements);
+            assertEquals(6, createdStructureElements.length);
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgCa",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysCa",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubCa", Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiCa",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpCa",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtCa",   Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgCa",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysCa",     Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubCa", Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiCa",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpCa",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtCa",   Boolean.TRUE);
+
+            ITUtilStructureElement.assertValidate(createdStructureElements, StructureChoice.CREATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(createdStructureElements, StructureChoice.UPDATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(createdStructureElements, StructureChoice.DELETE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(createdStructureElements, StructureChoice.APPROVE, Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(createdStructureElements, StructureChoice.CANCEL,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(createdStructureElements, StructureChoice.REJECT,  Boolean.TRUE);
+
+            approvedStructureElements = ITUtilStructureElement.assertApprove(createdStructureElements);
+            assertNotNull(approvedStructureElements);
+            assertEquals(6, approvedStructureElements.length);
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgCa",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysCa",     Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubCa", Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiCa",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpCa",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtCa",   Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgCa",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysCa",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubCa", Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiCa",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpCa",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtCa",   Boolean.FALSE);
+
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.CREATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.UPDATE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.DELETE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.REJECT,  Boolean.FALSE);
+        } catch (Exception e) {
+            fail();
+        }
+    }
+
+    @Test
+    void createCancel() {
+        // purpose
+        //     test create and cancel subsystem
+        //
+        // what - combination of
+        //     create      create structures
+        //     read        exists in structure
+        //     read        is valid to create
+        //     read        validate create
+        //     read        validate cancel
+        //     patch       cancel structures
+        //
+        // note
+        //     create in order to cancel
+
+        try {
+            StructureElementCommand[] structureElements = null;
+            StructureElement[] createdStructureElements = null;
+            StructureElement[] cancelledStructureElements = null;
+
+            structureElements = new StructureElementCommand[] {
+                    new StructureElementCommand(null, Type.SYSTEMGROUP, null,            "name", "SgCc",  "description", "comment"),
+                    new StructureElementCommand(null, Type.SYSTEM,      systemGroupUuid, "name", "SysCc", "description", "comment"),
+                    new StructureElementCommand(null, Type.SUBSYSTEM,   systemUuid,      "name", "SubCc", "description", "comment"),
+                    new StructureElementCommand(null, Type.DISCIPLINE,  null,            "name", "DiCc",  "description", "comment"),
+                    new StructureElementCommand(null, Type.DEVICEGROUP, disciplineUuid,  "name", "",      "description", "comment"),
+                    new StructureElementCommand(null, Type.DEVICETYPE,  deviceGroupUuid, "name", "DtCc",  "description", "comment")
+            };
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgCc",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysCc",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubCc", Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiCc",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpCc",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtCc",   Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgCc",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysCc",     Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubCc", Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiCc",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpCc",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtCc",   Boolean.TRUE);
+
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CREATE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.UPDATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.DELETE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.REJECT,  Boolean.FALSE);
+
+            createdStructureElements = ITUtilStructureElement.assertCreate(structureElements);
+            assertNotNull(createdStructureElements);
+            assertEquals(6, createdStructureElements.length);
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgCc",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysCc",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubCc", Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiCc",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpCc",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtCc",   Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgCc",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysCc",     Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubCc", Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiCc",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpCc",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtCc",   Boolean.TRUE);
+
+            ITUtilStructureElement.assertValidate(createdStructureElements, StructureChoice.CREATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(createdStructureElements, StructureChoice.UPDATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(createdStructureElements, StructureChoice.DELETE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(createdStructureElements, StructureChoice.APPROVE, Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(createdStructureElements, StructureChoice.CANCEL,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(createdStructureElements, StructureChoice.REJECT,  Boolean.TRUE);
+
+            cancelledStructureElements = ITUtilStructureElement.assertCancel(createdStructureElements);
+            assertNotNull(cancelledStructureElements);
+            assertEquals(6, cancelledStructureElements.length);
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgCc",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysCc",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubCc", Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiCc",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpCc",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtCc",   Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgCc",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysCc",     Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubCc", Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiCc",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpCc",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtCc",   Boolean.TRUE);
+
+            ITUtilStructureElement.assertValidate(cancelledStructureElements, StructureChoice.CREATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(cancelledStructureElements, StructureChoice.UPDATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(cancelledStructureElements, StructureChoice.DELETE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(cancelledStructureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(cancelledStructureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(cancelledStructureElements, StructureChoice.REJECT,  Boolean.FALSE);
+        } catch (Exception e) {
+            fail();
+        }
+    }
+
+    @Test
+    void createReject() {
+        // purpose
+        //     test create and reject subsystem
+        //
+        // what - combination of
+        //     create      create structures
+        //     read        validate create
+        //     read        validate reject
+        //     patch       reject structures
+        //
+        // note
+        //     create in order to reject
+
+        try {
+            StructureElementCommand[] structureElements = null;
+            StructureElement[] createdStructureElements = null;
+            StructureElement[] rejectedStructureElements = null;
+
+            structureElements = new StructureElementCommand[] {
+                    new StructureElementCommand(null, Type.SYSTEMGROUP, null,            "name", "SgCr",  "description", "comment"),
+                    new StructureElementCommand(null, Type.SYSTEM,      systemGroupUuid, "name", "SysCr", "description", "comment"),
+                    new StructureElementCommand(null, Type.SUBSYSTEM,   systemUuid,      "name", "SubCr", "description", "comment"),
+                    new StructureElementCommand(null, Type.DISCIPLINE,  null,            "name", "DiCr",  "description", "comment"),
+                    new StructureElementCommand(null, Type.DEVICEGROUP, disciplineUuid,  "name", "",      "description", "comment"),
+                    new StructureElementCommand(null, Type.DEVICETYPE,  deviceGroupUuid, "name", "DtCr",  "description", "comment")
+            };
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgCr",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysCr",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubCr", Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiCr",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpCr",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtCr",   Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgCr",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysCr",     Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubCr", Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiCr",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpCr",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtCr",   Boolean.TRUE);
+
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CREATE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.UPDATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.DELETE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.REJECT,  Boolean.FALSE);
+
+            createdStructureElements = ITUtilStructureElement.assertCreate(structureElements);
+            assertNotNull(createdStructureElements);
+            assertEquals(6, createdStructureElements.length);
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgCr",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysCr",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubCr", Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiCr",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpCr",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtCr",   Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgCr",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysCr",     Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubCr", Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiCr",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpCr",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtCr",   Boolean.TRUE);
+
+            ITUtilStructureElement.assertValidate(createdStructureElements, StructureChoice.CREATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(createdStructureElements, StructureChoice.UPDATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(createdStructureElements, StructureChoice.DELETE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(createdStructureElements, StructureChoice.APPROVE, Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(createdStructureElements, StructureChoice.CANCEL,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(createdStructureElements, StructureChoice.REJECT,  Boolean.TRUE);
+
+            rejectedStructureElements = ITUtilStructureElement.assertReject(createdStructureElements);
+            assertNotNull(rejectedStructureElements);
+            assertEquals(6, rejectedStructureElements.length);
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgCr",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysCr",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubCr", Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiCr",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpCr",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtCr",   Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgCr",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysCr",     Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubCr", Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiCr",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpCr",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtCr",   Boolean.TRUE);
+
+            ITUtilStructureElement.assertValidate(rejectedStructureElements, StructureChoice.CREATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(rejectedStructureElements, StructureChoice.UPDATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(rejectedStructureElements, StructureChoice.DELETE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(rejectedStructureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(rejectedStructureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(rejectedStructureElements, StructureChoice.REJECT,  Boolean.FALSE);
+        } catch (Exception e) {
+            fail();
+        }
+    }
+
+    @Test
+    void checkUpdate() {
+        // purpose
+        //     test conditions for update subsystem
+        //         not update
+        //
+        // what - combination of
+        //     create      create structures
+        //     read        exists in structure
+        //     read        is valid to create
+        //     read        validate create
+        //     read        validate update
+        //     read        validate approve
+        //     patch       approve structures
+        //
+        // note
+        //     create, approve in order to update
+        //
+        // validate update
+        //     uuid
+        //     type
+        //     parent
+        //     name
+        //     mnemonic
+        //     description
+        //     comment
+
+        try {
+            StructureElementCommand[] structureElements = null;
+            StructureElement[] approvedStructureElements = null;
+            UUID uuid = null;
+            String value = null;
+
+            structureElements = new StructureElementCommand[] {
+                    new StructureElementCommand(null, Type.SYSTEMGROUP, null,            "name", "SgCu",  "description", "comment"),
+                    new StructureElementCommand(null, Type.SYSTEM,      systemGroupUuid, "name", "SysCu", "description", "comment"),
+                    new StructureElementCommand(null, Type.SUBSYSTEM,   systemUuid,      "name", "SubCu", "description", "comment"),
+                    new StructureElementCommand(null, Type.DISCIPLINE,  null,            "name", "DiCu",  "description", "comment"),
+                    new StructureElementCommand(null, Type.DEVICEGROUP, disciplineUuid,  "name", "",      "description", "comment"),
+                    new StructureElementCommand(null, Type.DEVICETYPE,  deviceGroupUuid, "name", "DtCu",  "description", "comment")
+            };
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgCu",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysCu",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubCu", Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiCu",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpCu",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtCu",   Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgCu",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysCu",     Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubCu", Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiCu",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpCu",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtCu",   Boolean.TRUE);
+
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CREATE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.UPDATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.DELETE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.REJECT,  Boolean.FALSE);
+
+            approvedStructureElements = ITUtilStructureElement.assertCreateApprove(structureElements);
+            assertNotNull(approvedStructureElements);
+            assertEquals(6, approvedStructureElements.length);
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgCu",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysCu",     Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubCu", Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiCu",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpCu",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtCu",   Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgCu",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysCu",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubCu", Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiCu",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpCu",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtCu",   Boolean.FALSE);
+
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.CREATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.UPDATE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.DELETE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.REJECT,  Boolean.FALSE);
+
+            uuid = approvedStructureElements[1].getUuid();
+            approvedStructureElements[1].setUuid(null);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.UPDATE, Boolean.FALSE);
+            approvedStructureElements[1].setUuid(uuid);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.UPDATE, Boolean.TRUE);
+
+            approvedStructureElements[1].setType(null);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.UPDATE, Boolean.FALSE);
+            approvedStructureElements[1].setType(Type.SYSTEMGROUP);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.UPDATE, Boolean.FALSE);
+            approvedStructureElements[1].setType(Type.SUBSYSTEM);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.UPDATE, Boolean.FALSE);
+            approvedStructureElements[1].setType(Type.SYSTEM);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.UPDATE, Boolean.TRUE);
+
+            approvedStructureElements[1].setParent(null);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.UPDATE, Boolean.FALSE);
+            approvedStructureElements[1].setParent(systemUuid);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.UPDATE, Boolean.FALSE);
+            approvedStructureElements[1].setParent(subsystemUuid);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.UPDATE, Boolean.FALSE);
+            approvedStructureElements[1].setParent(systemGroupUuid);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.UPDATE, Boolean.TRUE);
+
+            value = approvedStructureElements[1].getName();
+            approvedStructureElements[1].setName(null);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.UPDATE, Boolean.FALSE);
+            approvedStructureElements[1].setName(value);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.UPDATE, Boolean.TRUE);
+
+            value = approvedStructureElements[1].getDescription();
+            approvedStructureElements[1].setDescription(null);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.UPDATE, Boolean.FALSE);
+            approvedStructureElements[1].setDescription(value);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.UPDATE, Boolean.TRUE);
+
+            value = approvedStructureElements[1].getComment();
+            approvedStructureElements[1].setComment(null);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.UPDATE, Boolean.FALSE);
+            approvedStructureElements[1].setComment(value);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.UPDATE, Boolean.TRUE);
+        } catch (Exception e) {
+            fail();
+        }
+    }
+
+    @Test
+    void updateApprove() {
+        // purpose
+        //     test update and approve subsystem
+        //
+        // what - combination of
+        //     create      create structures
+        //     read        exists in structure
+        //     read        is valid to create
+        //     read        validate create
+        //     read        validate update
+        //     read        validate approve
+        //     update      update structures
+        //     patch       approve structures
+        //
+        // note
+        //     create, approve in order to update, approve
+
+        try {
+            StructureElementCommand[] structureElements = null;
+            StructureElement[] approvedStructureElements = null;
+            StructureElement[] updatedStructureElements = null;
+
+            structureElements = new StructureElementCommand[] {
+                    new StructureElementCommand(null, Type.SYSTEMGROUP, null,            "name", "SgUa",  "description", "comment"),
+                    new StructureElementCommand(null, Type.SYSTEM,      systemGroupUuid, "name", "SysUa", "description", "comment"),
+                    new StructureElementCommand(null, Type.SUBSYSTEM,   systemUuid,      "name", "SubUa", "description", "comment"),
+                    new StructureElementCommand(null, Type.DISCIPLINE,  null,            "name", "DiUa",  "description", "comment"),
+                    new StructureElementCommand(null, Type.DEVICEGROUP, disciplineUuid,  "name", "",      "description", "comment"),
+                    new StructureElementCommand(null, Type.DEVICETYPE,  deviceGroupUuid, "name", "DtUa",  "description", "comment")
+            };
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgUa",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysUa",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubUa", Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiUa",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpUa",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtUa",   Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgUa",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysUa",     Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubUa", Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiUa",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpUa",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtUa",   Boolean.TRUE);
+
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CREATE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.UPDATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.DELETE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.REJECT,  Boolean.FALSE);
+
+            approvedStructureElements = ITUtilStructureElement.assertCreateApprove(structureElements);
+            assertNotNull(approvedStructureElements);
+            assertEquals(6, approvedStructureElements.length);
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgUa",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysUa",     Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubUa", Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiUa",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpUa",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtUa",   Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgUa",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysUa",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubUa", Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiUa",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpUa",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtUa",   Boolean.FALSE);
+
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.CREATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.UPDATE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.DELETE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.REJECT,  Boolean.FALSE);
+
+            approvedStructureElements[0].setDescription("0");
+            approvedStructureElements[1].setDescription("1");
+            approvedStructureElements[2].setDescription("2");
+            approvedStructureElements[3].setDescription("3");
+            approvedStructureElements[4].setDescription("4");
+            approvedStructureElements[5].setDescription("5");
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgUa",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysUa",     Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubUa", Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiUa",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpUa",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtUa",   Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgUa",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysUa",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubUa", Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiUa",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpUa",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtUa",   Boolean.FALSE);
+
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.CREATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.UPDATE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.DELETE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.REJECT,  Boolean.FALSE);
+
+            updatedStructureElements = ITUtilStructureElement.assertUpdate(approvedStructureElements);
+            assertNotNull(updatedStructureElements);
+            assertEquals(6, updatedStructureElements.length);
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgUa",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysUa",     Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubUa", Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiUa",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpUa",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtUa",   Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgUa",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysUa",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubUa", Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiUa",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpUa",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtUa",   Boolean.FALSE);
+
+            ITUtilStructureElement.assertValidate(updatedStructureElements, StructureChoice.CREATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(updatedStructureElements, StructureChoice.UPDATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(updatedStructureElements, StructureChoice.DELETE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(updatedStructureElements, StructureChoice.APPROVE, Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(updatedStructureElements, StructureChoice.CANCEL,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(updatedStructureElements, StructureChoice.REJECT,  Boolean.TRUE);
+
+            approvedStructureElements = ITUtilStructureElement.assertApprove(updatedStructureElements);
+            assertNotNull(approvedStructureElements);
+            assertEquals(6, approvedStructureElements.length);
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgUa",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysUa",     Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubUa", Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiUa",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpUa",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtUa",   Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgUa",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysUa",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubUa", Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiUa",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpUa",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtUa",   Boolean.FALSE);
+
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.CREATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.UPDATE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.DELETE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.REJECT,  Boolean.FALSE);
+        } catch (Exception e) {
+            fail();
+        }
+    }
+
+    @Test
+    void updateCancel() {
+        // purpose
+        //     test update and cancel subsystem
+        //
+        // what - combination of
+        //     create      create structures
+        //     read        exists in structure
+        //     read        is valid to create
+        //     read        validate create
+        //     read        validate update
+        //     read        validate approve
+        //     read        validate cancel
+        //     update      update structures
+        //     patch       approve structures
+        //     patch       cancel structures
+        //
+        // note
+        //     create, approve in order to update, cancel
+
+        try {
+            StructureElementCommand[] structureElements = null;
+            StructureElement[] approvedStructureElements = null;
+            StructureElement[] updatedStructureElements = null;
+            StructureElement[] cancelledStructureElements = null;
+
+            structureElements = new StructureElementCommand[] {
+                    new StructureElementCommand(null, Type.SYSTEMGROUP, null,            "name", "SgUc",  "description", "comment"),
+                    new StructureElementCommand(null, Type.SYSTEM,      systemGroupUuid, "name", "SysUc", "description", "comment"),
+                    new StructureElementCommand(null, Type.SUBSYSTEM,   systemUuid,      "name", "SubUc", "description", "comment"),
+                    new StructureElementCommand(null, Type.DISCIPLINE,  null,            "name", "DiUc",  "description", "comment"),
+                    new StructureElementCommand(null, Type.DEVICEGROUP, disciplineUuid,  "name", "",      "description", "comment"),
+                    new StructureElementCommand(null, Type.DEVICETYPE,  deviceGroupUuid, "name", "DtUc",  "description", "comment")
+            };
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgUc",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysUc",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubUc", Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiUc",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpUc",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtUc",   Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgUc",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysUc",     Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubUc", Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiUc",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpUc",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtUc",   Boolean.TRUE);
+
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CREATE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.UPDATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.DELETE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.REJECT,  Boolean.FALSE);
+
+            approvedStructureElements = ITUtilStructureElement.assertCreateApprove(structureElements);
+            assertNotNull(approvedStructureElements);
+            assertEquals(6, approvedStructureElements.length);
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgUc",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysUc",     Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubUc", Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiUc",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpUc",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtUc",   Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgUc",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysUc",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubUc", Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiUc",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpUc",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtUc",   Boolean.FALSE);
+
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.CREATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.UPDATE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.DELETE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.REJECT,  Boolean.FALSE);
+
+            approvedStructureElements[0].setDescription("0");
+            approvedStructureElements[1].setDescription("1");
+            approvedStructureElements[2].setDescription("2");
+            approvedStructureElements[3].setDescription("3");
+            approvedStructureElements[4].setDescription("4");
+            approvedStructureElements[5].setDescription("5");
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgUc",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysUc",     Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubUc", Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiUc",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpUc",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtUc",   Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgUc",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysUc",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubUc", Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiUc",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpUc",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtUc",   Boolean.FALSE);
+
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.CREATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.UPDATE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.DELETE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.REJECT,  Boolean.FALSE);
+
+            updatedStructureElements = ITUtilStructureElement.assertUpdate(approvedStructureElements);
+            assertNotNull(updatedStructureElements);
+            assertEquals(6, updatedStructureElements.length);
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgUc",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysUc",     Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubUc", Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiUc",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpUc",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtUc",   Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgUc",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysUc",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubUc", Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiUc",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpUc",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtUc",   Boolean.FALSE);
+
+            ITUtilStructureElement.assertValidate(updatedStructureElements, StructureChoice.CREATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(updatedStructureElements, StructureChoice.UPDATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(updatedStructureElements, StructureChoice.DELETE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(updatedStructureElements, StructureChoice.APPROVE, Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(updatedStructureElements, StructureChoice.CANCEL,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(updatedStructureElements, StructureChoice.REJECT,  Boolean.TRUE);
+
+            cancelledStructureElements = ITUtilStructureElement.assertCancel(updatedStructureElements);
+            assertNotNull(cancelledStructureElements);
+            assertEquals(6, cancelledStructureElements.length);
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgUc",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysUc",     Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubUc", Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiUc",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpUc",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtUc",   Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgUc",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysUc",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubUc", Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiUc",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpUc",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtUc",   Boolean.FALSE);
+
+            ITUtilStructureElement.assertValidate(cancelledStructureElements, StructureChoice.CREATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(cancelledStructureElements, StructureChoice.UPDATE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(cancelledStructureElements, StructureChoice.DELETE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(cancelledStructureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(cancelledStructureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(cancelledStructureElements, StructureChoice.REJECT,  Boolean.FALSE);
+        } catch (Exception e) {
+            fail();
+        }
+    }
+
+    @Test
+    void updateReject() {
+        // purpose
+        //     test update and reject subsystem
+        //
+        // what - combination of
+        //     create      create structures
+        //     read        exists in structure
+        //     read        is valid to create
+        //     read        validate create
+        //     read        validate update
+        //     read        validate approve
+        //     read        validate reject
+        //     update      update structures
+        //     patch       approve structures
+        //     patch       reject structures
+        //
+        // note
+        //     create, approve in order to update, reject
+
+        try {
+            StructureElementCommand[] structureElements = null;
+            StructureElement[] approvedStructureElements = null;
+            StructureElement[] updatedStructureElements = null;
+            StructureElement[] rejectedStructureElements = null;
+
+            structureElements = new StructureElementCommand[] {
+                    new StructureElementCommand(null, Type.SYSTEMGROUP, null,            "name", "SgUr",  "description", "comment"),
+                    new StructureElementCommand(null, Type.SYSTEM,      systemGroupUuid, "name", "SysUr", "description", "comment"),
+                    new StructureElementCommand(null, Type.SUBSYSTEM,   systemUuid,      "name", "SubUr", "description", "comment"),
+                    new StructureElementCommand(null, Type.DISCIPLINE,  null,            "name", "DiUr",  "description", "comment"),
+                    new StructureElementCommand(null, Type.DEVICEGROUP, disciplineUuid,  "name", "",      "description", "comment"),
+                    new StructureElementCommand(null, Type.DEVICETYPE,  deviceGroupUuid, "name", "DtUr",  "description", "comment")
+            };
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgUr",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysUr",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubUr", Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiUr",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpUr",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtUr",   Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgUr",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysUr",     Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubUr", Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiUr",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpUr",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtUr",   Boolean.TRUE);
+
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CREATE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.UPDATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.DELETE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.REJECT,  Boolean.FALSE);
+
+            approvedStructureElements = ITUtilStructureElement.assertCreateApprove(structureElements);
+            assertNotNull(approvedStructureElements);
+            assertEquals(6, approvedStructureElements.length);
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgUr",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysUr",     Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubUr", Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiUr",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpUr",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtUr",   Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgUr",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysUr",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubUr", Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiUr",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpUr",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtUr",   Boolean.FALSE);
+
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.CREATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.UPDATE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.DELETE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.REJECT,  Boolean.FALSE);
+
+            approvedStructureElements[0].setDescription("0");
+            approvedStructureElements[1].setDescription("1");
+            approvedStructureElements[2].setDescription("2");
+            approvedStructureElements[3].setDescription("3");
+            approvedStructureElements[4].setDescription("4");
+            approvedStructureElements[5].setDescription("5");
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgUr",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysUr",     Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubUr", Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiUr",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpUr",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtUr",   Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgUr",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysUr",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubUr", Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiUr",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpUr",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtUr",   Boolean.FALSE);
+
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.CREATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.UPDATE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.DELETE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.REJECT,  Boolean.FALSE);
+
+            updatedStructureElements = ITUtilStructureElement.assertUpdate(approvedStructureElements);
+            assertNotNull(updatedStructureElements);
+            assertEquals(6, updatedStructureElements.length);
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgUr",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysUr",     Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubUr", Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiUr",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpUr",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtUr",   Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgUr",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysUr",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubUr", Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiUr",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpUr",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtUr",   Boolean.FALSE);
+
+            ITUtilStructureElement.assertValidate(updatedStructureElements, StructureChoice.CREATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(updatedStructureElements, StructureChoice.UPDATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(updatedStructureElements, StructureChoice.DELETE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(updatedStructureElements, StructureChoice.APPROVE, Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(updatedStructureElements, StructureChoice.CANCEL,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(updatedStructureElements, StructureChoice.REJECT,  Boolean.TRUE);
+
+            rejectedStructureElements = ITUtilStructureElement.assertReject(updatedStructureElements);
+            assertNotNull(rejectedStructureElements);
+            assertEquals(6, rejectedStructureElements.length);
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgUr",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysUr",     Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubUr", Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiUr",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpUr",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtUr",   Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgUr",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysUr",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubUr", Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiUr",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpUr",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtUr",   Boolean.FALSE);
+
+            ITUtilStructureElement.assertValidate(rejectedStructureElements, StructureChoice.CREATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(rejectedStructureElements, StructureChoice.UPDATE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(rejectedStructureElements, StructureChoice.DELETE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(rejectedStructureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(rejectedStructureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(rejectedStructureElements, StructureChoice.REJECT,  Boolean.FALSE);
+        } catch (Exception e) {
+            fail();
+        }
+    }
+
+    @Test
+    void checkDelete() {
+        // purpose
+        //     test conditions for delete subsystem
+        //         not delete
+        //
+        // what - combination of
+        //     create      create structures
+        //     read        validate create
+        //     read        validate delete
+        //     read        validate approve
+        //     patch       approve structures
+        //
+        // note
+        //     create, approve in order to delete
+        //
+        // validate delete
+        //     uuid
+        //     type
+        //     comment
+
+        try {
+            StructureElementCommand[] structureElements = null;
+            StructureElement[] approvedStructureElements = null;
+            UUID uuid = null;
+            String value = null;
+
+            structureElements = new StructureElementCommand[] {
+                    new StructureElementCommand(null, Type.SYSTEMGROUP, null,            "name", "SgCd",  "description", "comment"),
+                    new StructureElementCommand(null, Type.SYSTEM,      systemGroupUuid, "name", "SysCd", "description", "comment"),
+                    new StructureElementCommand(null, Type.SUBSYSTEM,   systemUuid,      "name", "SubCd", "description", "comment"),
+                    new StructureElementCommand(null, Type.DISCIPLINE,  null,            "name", "DiCd",  "description", "comment"),
+                    new StructureElementCommand(null, Type.DEVICEGROUP, disciplineUuid,  "name", "",      "description", "comment"),
+                    new StructureElementCommand(null, Type.DEVICETYPE,  deviceGroupUuid, "name", "DtCd",  "description", "comment")
+            };
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgCd",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysCd",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubCd", Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiCd",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpCd",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtCd",   Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgCd",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysCd",     Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubCd", Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiCd",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpCd",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtCd",   Boolean.TRUE);
+
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CREATE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.UPDATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.DELETE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.REJECT,  Boolean.FALSE);
+
+            approvedStructureElements = ITUtilStructureElement.assertCreateApprove(structureElements);
+            assertNotNull(approvedStructureElements);
+            assertEquals(6, approvedStructureElements.length);
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgCd",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysCd",     Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubCd", Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiCd",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpCd",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtCd",   Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgCd",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysCd",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubCd", Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiCd",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpCd",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtCd",   Boolean.FALSE);
+
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.CREATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.UPDATE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.DELETE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.REJECT,  Boolean.FALSE);
+
+            uuid = approvedStructureElements[1].getUuid();
+            approvedStructureElements[1].setUuid(null);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.DELETE, Boolean.FALSE);
+            approvedStructureElements[1].setUuid(uuid);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.DELETE, Boolean.TRUE);
+
+            approvedStructureElements[1].setType(null);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.DELETE, Boolean.FALSE);
+            approvedStructureElements[1].setType(Type.SYSTEMGROUP);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.DELETE, Boolean.FALSE);
+            approvedStructureElements[1].setType(Type.SUBSYSTEM);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.DELETE, Boolean.FALSE);
+            approvedStructureElements[1].setType(Type.SYSTEM);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.DELETE, Boolean.TRUE);
+
+            approvedStructureElements[1].setParent(null);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.DELETE, Boolean.TRUE);
+            approvedStructureElements[1].setParent(systemUuid);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.DELETE, Boolean.TRUE);
+            approvedStructureElements[1].setParent(subsystemUuid);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.DELETE, Boolean.TRUE);
+            approvedStructureElements[1].setParent(systemGroupUuid);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.DELETE, Boolean.TRUE);
+
+            value = approvedStructureElements[1].getName();
+            approvedStructureElements[1].setName(null);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.DELETE, Boolean.TRUE);
+            approvedStructureElements[1].setName(value);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.DELETE, Boolean.TRUE);
+
+            value = approvedStructureElements[1].getDescription();
+            approvedStructureElements[1].setDescription(null);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.DELETE, Boolean.TRUE);
+            approvedStructureElements[1].setDescription(value);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.DELETE, Boolean.TRUE);
+
+            value = approvedStructureElements[1].getComment();
+            approvedStructureElements[1].setComment(null);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.DELETE, Boolean.FALSE);
+            approvedStructureElements[1].setComment(value);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.DELETE, Boolean.TRUE);
+        } catch (Exception e) {
+            fail();
+        }
+    }
+
+    @Test
+    void deleteApprove() {
+        // purpose
+        //     test delete and approve subsystem
+        //
+        // what - combination of
+        //     create      create structures
+        //     read        exists in structure
+        //     read        is valid to create
+        //     read        validate create
+        //     read        validate delete
+        //     read        validate approve
+        //     delete      delete structures
+        //     patch       approve structures
+        //
+        // note
+        //     create, approve in order to delete, approve
+
+        try {
+            StructureElementCommand[] structureElements = null;
+            StructureElement[] approvedStructureElements = null;
+            StructureElement[] deletedStructureElements = null;
+
+            structureElements = new StructureElementCommand[] {
+                    new StructureElementCommand(null, Type.SYSTEMGROUP, null,            "name", "SgDa",  "description", "comment"),
+                    new StructureElementCommand(null, Type.SYSTEM,      systemGroupUuid, "name", "SysDa", "description", "comment"),
+                    new StructureElementCommand(null, Type.SUBSYSTEM,   systemUuid,      "name", "SubDa", "description", "comment"),
+                    new StructureElementCommand(null, Type.DISCIPLINE,  null,            "name", "DiDa",  "description", "comment"),
+                    new StructureElementCommand(null, Type.DEVICEGROUP, disciplineUuid,  "name", "",      "description", "comment"),
+                    new StructureElementCommand(null, Type.DEVICETYPE,  deviceGroupUuid, "name", "DtDa",  "description", "comment")
+            };
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgDa",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysDa",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubDa", Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiDa",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpDa",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtDa",   Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgDa",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysDa",     Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubDa", Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiDa",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpDa",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtDa",   Boolean.TRUE);
+
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CREATE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.UPDATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.DELETE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.REJECT,  Boolean.FALSE);
+
+            approvedStructureElements = ITUtilStructureElement.assertCreateApprove(structureElements);
+            assertNotNull(approvedStructureElements);
+            assertEquals(6, approvedStructureElements.length);
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgDa",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysDa",     Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubDa", Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiDa",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpDa",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtDa",   Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgDa",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysDa",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubDa", Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiDa",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpDa",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtDa",   Boolean.FALSE);
+
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.CREATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.UPDATE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.DELETE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.REJECT,  Boolean.FALSE);
+
+            deletedStructureElements = ITUtilStructureElement.assertDelete(approvedStructureElements);
+            assertNotNull(deletedStructureElements);
+            assertEquals(6, deletedStructureElements.length);
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgDa",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysDa",     Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubDa", Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiDa",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpDa",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtDa",   Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgDa",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysDa",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubDa", Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiDa",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpDa",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtDa",   Boolean.FALSE);
+
+            ITUtilStructureElement.assertValidate(deletedStructureElements, StructureChoice.CREATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(deletedStructureElements, StructureChoice.UPDATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(deletedStructureElements, StructureChoice.DELETE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(deletedStructureElements, StructureChoice.APPROVE, Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(deletedStructureElements, StructureChoice.CANCEL,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(deletedStructureElements, StructureChoice.REJECT,  Boolean.TRUE);
+
+            approvedStructureElements = ITUtilStructureElement.assertApprove(deletedStructureElements);
+            assertNotNull(approvedStructureElements);
+            assertEquals(6, approvedStructureElements.length);
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgDa",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysDa",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubDa", Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiDa",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpDa",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtDa",   Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgDa",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysDa",     Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubDa", Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiDa",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpDa",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtDa",   Boolean.TRUE);
+
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.CREATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.UPDATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.DELETE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.REJECT,  Boolean.FALSE);
+        } catch (Exception e) {
+            fail();
+        }
+    }
+
+    @Test
+    void deleteCancel() {
+        // purpose
+        //     test delete and cancel subsystem
+        //
+        // what - combination of
+        //     create      create structures
+        //     read        exists in structure
+        //     read        is valid to create
+        //     read        validate create
+        //     read        validate delete
+        //     read        validate approve
+        //     read        validate cancel
+        //     update      delete structures
+        //     patch       approve structures
+        //     patch       cancel structures
+        //
+        // note
+        //     create, approve in order to delete, cancel
+
+        try {
+            StructureElementCommand[] structureElements = null;
+            StructureElement[] approvedStructureElements = null;
+            StructureElement[] deletedStructureElements = null;
+            StructureElement[] cancelledStructureElements = null;
+
+            structureElements = new StructureElementCommand[] {
+                    new StructureElementCommand(null, Type.SYSTEMGROUP, null,            "name", "SgDc",  "description", "comment"),
+                    new StructureElementCommand(null, Type.SYSTEM,      systemGroupUuid, "name", "SysDc", "description", "comment"),
+                    new StructureElementCommand(null, Type.SUBSYSTEM,   systemUuid,      "name", "SubDc", "description", "comment"),
+                    new StructureElementCommand(null, Type.DISCIPLINE,  null,            "name", "DiDc",  "description", "comment"),
+                    new StructureElementCommand(null, Type.DEVICEGROUP, disciplineUuid,  "name", "",      "description", "comment"),
+                    new StructureElementCommand(null, Type.DEVICETYPE,  deviceGroupUuid, "name", "DtDc",  "description", "comment")
+            };
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgDc",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysDc",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubDc", Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiDc",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpDc",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtDc",   Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgDc",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysDc",     Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubDc", Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiDc",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpDc",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtDc",   Boolean.TRUE);
+
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CREATE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.UPDATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.DELETE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.REJECT,  Boolean.FALSE);
+
+            approvedStructureElements = ITUtilStructureElement.assertCreateApprove(structureElements);
+            assertNotNull(approvedStructureElements);
+            assertEquals(6, approvedStructureElements.length);
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgDc",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysDc",     Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubDc", Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiDc",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpDc",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtDc",   Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgDc",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysDc",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubDc", Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiDc",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpDc",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtDc",   Boolean.FALSE);
+
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.CREATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.UPDATE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.DELETE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.REJECT,  Boolean.FALSE);
+
+            deletedStructureElements = ITUtilStructureElement.assertDelete(approvedStructureElements);
+            assertNotNull(deletedStructureElements);
+            assertEquals(6, deletedStructureElements.length);
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgDc",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysDc",     Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubDc", Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiDc",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpDc",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtDc",   Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgDc",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysDc",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubDc", Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiDc",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpDc",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtDc",   Boolean.FALSE);
+
+            ITUtilStructureElement.assertValidate(deletedStructureElements, StructureChoice.CREATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(deletedStructureElements, StructureChoice.UPDATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(deletedStructureElements, StructureChoice.DELETE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(deletedStructureElements, StructureChoice.APPROVE, Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(deletedStructureElements, StructureChoice.CANCEL,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(deletedStructureElements, StructureChoice.REJECT,  Boolean.TRUE);
+
+            cancelledStructureElements = ITUtilStructureElement.assertCancel(deletedStructureElements);
+            assertNotNull(cancelledStructureElements);
+            assertEquals(6, cancelledStructureElements.length);
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgDc",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysDc",     Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubDc", Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiDc",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpDc",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtDc",   Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgDc",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysDc",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubDc", Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiDc",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpDc",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtDc",   Boolean.FALSE);
+
+            ITUtilStructureElement.assertValidate(cancelledStructureElements, StructureChoice.CREATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(cancelledStructureElements, StructureChoice.UPDATE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(cancelledStructureElements, StructureChoice.DELETE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(cancelledStructureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(cancelledStructureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(cancelledStructureElements, StructureChoice.REJECT,  Boolean.FALSE);
+        } catch (Exception e) {
+            fail();
+        }
+    }
+
+    @Test
+    void deleteReject() {
+        // purpose
+        //     test delete and reject subsystem
+        //
+        // what - combination of
+        //     create      create structures
+        //     read        exists in structure
+        //     read        is valid to create
+        //     read        validate create
+        //     read        validate delete
+        //     read        validate approve
+        //     read        validate reject
+        //     update      delete structures
+        //     patch       approve structures
+        //     patch       reject structures
+        //
+        // note
+        //     create, approve in order to delete, reject
+
+        try {
+            StructureElementCommand[] structureElements = null;
+            StructureElement[] approvedStructureElements = null;
+            StructureElement[] deletedStructureElements = null;
+            StructureElement[] rejectedStructureElements = null;
+
+            structureElements = new StructureElementCommand[] {
+                    new StructureElementCommand(null, Type.SYSTEMGROUP, null,            "name", "SgDr",  "description", "comment"),
+                    new StructureElementCommand(null, Type.SYSTEM,      systemGroupUuid, "name", "SysDr", "description", "comment"),
+                    new StructureElementCommand(null, Type.SUBSYSTEM,   systemUuid,      "name", "SubDr", "description", "comment"),
+                    new StructureElementCommand(null, Type.DISCIPLINE,  null,            "name", "DiDr",  "description", "comment"),
+                    new StructureElementCommand(null, Type.DEVICEGROUP, disciplineUuid,  "name", "",      "description", "comment"),
+                    new StructureElementCommand(null, Type.DEVICETYPE,  deviceGroupUuid, "name", "DtDr",  "description", "comment")
+            };
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgDr",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysDr",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubDr", Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiDr",      Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpDr",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtDr",   Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgDr",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysDr",     Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubDr", Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiDr",      Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpDr",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtDr",   Boolean.TRUE);
+
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CREATE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.UPDATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.DELETE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(structureElements, StructureChoice.REJECT,  Boolean.FALSE);
+
+            approvedStructureElements = ITUtilStructureElement.assertCreateApprove(structureElements);
+            assertNotNull(approvedStructureElements);
+            assertEquals(6, approvedStructureElements.length);
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgDr",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysDr",     Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubDr", Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiDr",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpDr",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtDr",   Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgDr",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysDr",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubDr", Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiDr",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpDr",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtDr",   Boolean.FALSE);
+
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.CREATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.UPDATE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.DELETE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(approvedStructureElements, StructureChoice.REJECT,  Boolean.FALSE);
+
+            deletedStructureElements = ITUtilStructureElement.assertDelete(approvedStructureElements);
+            assertNotNull(deletedStructureElements);
+            assertEquals(6, deletedStructureElements.length);
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgDr",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysDr",     Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubDr", Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiDr",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpDr",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtDr",   Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgDr",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysDr",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubDr", Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiDr",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpDr",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtDr",   Boolean.FALSE);
+
+            ITUtilStructureElement.assertValidate(deletedStructureElements, StructureChoice.CREATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(deletedStructureElements, StructureChoice.UPDATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(deletedStructureElements, StructureChoice.DELETE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(deletedStructureElements, StructureChoice.APPROVE, Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(deletedStructureElements, StructureChoice.CANCEL,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(deletedStructureElements, StructureChoice.REJECT,  Boolean.TRUE);
+
+            rejectedStructureElements = ITUtilStructureElement.assertReject(deletedStructureElements);
+            assertNotNull(rejectedStructureElements);
+            assertEquals(6, rejectedStructureElements.length);
+
+            ITUtilStructureElement.assertExists(Type.SYSTEMGROUP, "SgDr",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SYSTEM,      "SysDr",     Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.SUBSYSTEM,   "Sys-SubDr", Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DISCIPLINE,  "DiDr",      Boolean.TRUE);
+            ITUtilStructureElement.assertExists(Type.DEVICEGROUP, "GrpDr",     Boolean.FALSE);
+            ITUtilStructureElement.assertExists(Type.DEVICETYPE,  "Di-DtDr",   Boolean.TRUE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEMGROUP, "SgDr",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SYSTEM,      "SysDr",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.SUBSYSTEM,   "Sys-SubDr", Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DISCIPLINE,  "DiDr",      Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICEGROUP, "GrpDr",     Boolean.FALSE);
+            ITUtilStructureElement.assertIsValidToCreate(Type.DEVICETYPE,  "Di-DtDr",   Boolean.FALSE);
+
+            ITUtilStructureElement.assertValidate(rejectedStructureElements, StructureChoice.CREATE,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(rejectedStructureElements, StructureChoice.UPDATE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(rejectedStructureElements, StructureChoice.DELETE,  Boolean.TRUE);
+            ITUtilStructureElement.assertValidate(rejectedStructureElements, StructureChoice.APPROVE, Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(rejectedStructureElements, StructureChoice.CANCEL,  Boolean.FALSE);
+            ITUtilStructureElement.assertValidate(rejectedStructureElements, StructureChoice.REJECT,  Boolean.FALSE);
+        } catch (Exception e) {
+            fail();
+        }
+    }
+
+}
diff --git a/src/test/java/org/openepics/names/util/ValidateUtilTest.java b/src/test/java/org/openepics/names/util/ValidateUtilTest.java
index fb05b2da..d2e19534 100644
--- a/src/test/java/org/openepics/names/util/ValidateUtilTest.java
+++ b/src/test/java/org/openepics/names/util/ValidateUtilTest.java
@@ -309,7 +309,7 @@ class ValidateUtilTest {
      */
     @Test
     void validateDataCreateName() {
-        ValidateUtil.validateNameDataCreate(null, null, null, null, null);
+        ValidateUtil.validateNameDataCreate(null, null, null, null);
     }
     /**
      * Test of validate input update name element.
-- 
GitLab