From cb0147fe27accf38cae10dc10870f8bd34885f89 Mon Sep 17 00:00:00 2001
From: Benedikt Hock <benedikt.hock@stud.tu-darmstadt.de>
Date: Wed, 1 Mar 2023 17:11:14 +0100
Subject: [PATCH] add check for correct hierarchy

---
 functions/classes.py | 26 ++++++++++++++++++++++++--
 1 file changed, 24 insertions(+), 2 deletions(-)

diff --git a/functions/classes.py b/functions/classes.py
index abc3eee..81d0f8b 100644
--- a/functions/classes.py
+++ b/functions/classes.py
@@ -7,6 +7,7 @@ import uuid
 from typing import List, Dict
 import json
 import copy
+import operator
 
 
 # TODO
@@ -184,6 +185,11 @@ class LegoAssembly:
         return clone
 
 def print_assembly_tree(root, level=0, is_last=False):
+    if not isinstance(root, LegoAssembly):
+        raise TypeError(
+            f"Argument should be of type {LegoAssembly.__name__}, "
+            f"got {type(root).__name__} instead."
+        )
     # print component
     assembly_padding = ""
     if level > 0:
@@ -204,8 +210,24 @@ def print_assembly_tree(root, level=0, is_last=False):
         print(f"{component_padding}{item}")
 
 
-def check_aggregation_hierarchy(root):
-    pass
+def correct_aggregation_hierarchy(root: LegoAssembly, strict: bool = False):
+    if not isinstance(root, LegoAssembly):
+        raise TypeError(
+            f"Argument should be of type {LegoAssembly.__name__}, "
+            f"got {type(root).__name__} instead."
+        )
+    higher_level = operator.le
+    if strict:
+        higher_level = operator.lt
+    for component in root.components:
+        if not higher_level(root.layer.value, component.layer.value):
+            return False
+    for assembly in root.assemblies:
+        if not higher_level(root.layer.value, assembly.layer.value):
+            return False
+        if not correct_aggregation_hierarchy(assembly, strict):
+            return False
+    return True
 
 
 class KPIEncoder(json.JSONEncoder):
-- 
GitLab