Merge "Set default behvaviour of basyx::object::insertkey to overwrite"
diff --git a/sdks/c++/basys.sdk.cc/include/BaSyx/shared/object/object_header.h b/sdks/c++/basys.sdk.cc/include/BaSyx/shared/object/object_header.h
index aab6a07..c9542c7 100644
--- a/sdks/c++/basys.sdk.cc/include/BaSyx/shared/object/object_header.h
+++ b/sdks/c++/basys.sdk.cc/include/BaSyx/shared/object/object_header.h
@@ -127,7 +127,7 @@
 		bool insert(const T & t);
 
 		template<typename T>
-		bool insertKey(const std::string & key, const T & t, bool override = false);
+		bool insertKey(const std::string & key, const T & t, bool override = true);
 
 		std::size_t size();
 
diff --git a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map/SubModel.h b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map/SubModel.h
index ebe9c34..3ded138 100644
--- a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map/SubModel.h
+++ b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map/SubModel.h
@@ -43,9 +43,10 @@
   public virtual vab::ElementMap
 {
 public:
+	using vab::ElementMap::ElementMap;
+
 	SubModel();
 	SubModel(const IHasSemantics & semantics, const IIdentifiable & identifiable, const IQualifiable & qualifiable, const IHasDataSpecification & specification, const IHasKind & hasKind);
-	SubModel(const basyx::object & object);
 	SubModel(const ISubModel & submodel);
 
 	// Inherited via ISubModel
diff --git a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map/reference/Reference.h b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map/reference/Reference.h
index 0ade5ba..b3cf36d 100644
--- a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map/reference/Reference.h
+++ b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map/reference/Reference.h
@@ -24,10 +24,11 @@
 	public vab::ElementMap
 {
 public:
+	using vab::ElementMap::ElementMap;
+
 	virtual ~Reference() = default;
 
 	Reference();
-	Reference(basyx::object obj);
 	Reference(const basyx::specificCollection_t<IKey> & keys);
 	Reference(const std::initializer_list<Key> keys);
 	Reference(const IReference & reference);
diff --git a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map/submodelelement/SubmodelElement.h b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map/submodelelement/SubmodelElement.h
index e830bcc..82d4889 100644
--- a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map/submodelelement/SubmodelElement.h
+++ b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map/submodelelement/SubmodelElement.h
@@ -37,12 +37,14 @@
 	// constructors
 	SubmodelElement();
 
+	using vab::ElementMap::ElementMap;
+
 	/**
 	* Constructs an SubmodelElement object from a map given that the map contains all required elements.
 	* 
 	* @param submodelElementMap the map representig the submodel.
 	*/
-	SubmodelElement(basyx::object object);
+//	SubmodelElement(basyx::object object);
 
   SubmodelElement(const ISubmodelElement & abstractSubmodelElement);
 };
diff --git a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map/submodelelement/operation/OperationVariable.h b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map/submodelelement/operation/OperationVariable.h
index 1d60bbc..bf36317 100644
--- a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map/submodelelement/operation/OperationVariable.h
+++ b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map/submodelelement/operation/OperationVariable.h
@@ -33,6 +33,8 @@
 	virtual std::string getType() const override;
 	                                                                        
 	// not inherited
+	void setValue(const SubmodelElement & value);
+
 	void setValue(const ISubmodelElement & value);
 	void setType(const std::string & string);
 };
diff --git a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map/submodelelement/property/Property.h b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map/submodelelement/property/Property.h
index cb26cfb..eb7d256 100644
--- a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map/submodelelement/property/Property.h
+++ b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map/submodelelement/property/Property.h
@@ -16,11 +16,14 @@
 template<typename T>
 class Property : 
 	public virtual ISingleProperty,
-	public virtual DataElement
+	public virtual DataElement,
+	public virtual vab::ElementMap
 {
 public:
 	using Path = IProperty::Path;
 public:
+	using vab::ElementMap::ElementMap;
+
   Property() : ModelType{Path::ModelType}
 	{
 		map.insertKey(Path::Value, basyx::object::make_null());
@@ -42,7 +45,7 @@
 
 	void setValue(const T & t)
 	{
-		map.insertKey(Path::Value, t);
+		map.insertKey(Path::Value, t, true);
 		//map.insertKey(Path::ValueType, util::from_string<basyx::type::basyx_type<T>::value_type>());
 	};
 
diff --git a/sdks/c++/basys.sdk.cc/src/submodel/submodel/map/SubModel.cpp b/sdks/c++/basys.sdk.cc/src/submodel/submodel/map/SubModel.cpp
index 434b645..d7f0983 100644
--- a/sdks/c++/basys.sdk.cc/src/submodel/submodel/map/SubModel.cpp
+++ b/sdks/c++/basys.sdk.cc/src/submodel/submodel/map/SubModel.cpp
@@ -30,12 +30,12 @@
         this->map.insertKey(ISubModel::Path::Submodelelement, basyx::object::make_map());
     }
 
-    SubModel::SubModel(const basyx::object& object)
-        : vab::ElementMap { object }
-        , ModelType { ISubModel::Path::ModelType }
-    {
-        //todo: may assert if all sufficient parent classes are in object
-    }
+    //SubModel::SubModel(const basyx::object& object)
+    //    : vab::ElementMap { object }
+    //    , ModelType { ISubModel::Path::ModelType }
+    //{
+    //    //todo: may assert if all sufficient parent classes are in object
+    //}
 
     SubModel::SubModel()
         : SubModel {
diff --git a/sdks/c++/basys.sdk.cc/src/submodel/submodel/map/reference/Reference.cpp b/sdks/c++/basys.sdk.cc/src/submodel/submodel/map/reference/Reference.cpp
index 43a368b..1610ff3 100644
--- a/sdks/c++/basys.sdk.cc/src/submodel/submodel/map/reference/Reference.cpp
+++ b/sdks/c++/basys.sdk.cc/src/submodel/submodel/map/reference/Reference.cpp
@@ -42,12 +42,6 @@
   this->setKeys(reference.getKeys());
 }
 
-Reference::Reference(basyx::object object)
-	: vab::ElementMap{ object }
-{
-  this->map.insertKey(IReference::Path::Key, basyx::object::make_list<basyx::object>());
-}
-
 const basyx::specificCollection_t<IKey> Reference::getKeys() const
 {
 	auto & obj_list = this->map.getProperty(IReference::Path::Key).Get<basyx::object::object_list_t&>();
diff --git a/sdks/c++/basys.sdk.cc/src/submodel/submodel/map/submodelelement/SubmodelElement.cpp b/sdks/c++/basys.sdk.cc/src/submodel/submodel/map/submodelelement/SubmodelElement.cpp
index 009fa0e..1464883 100644
--- a/sdks/c++/basys.sdk.cc/src/submodel/submodel/map/submodelelement/SubmodelElement.cpp
+++ b/sdks/c++/basys.sdk.cc/src/submodel/submodel/map/submodelelement/SubmodelElement.cpp
@@ -15,15 +15,6 @@
 	, ModelType(ISubmodelElement::Path::ModelType)
 {}
 
-SubmodelElement::SubmodelElement(basyx::object object)
-	: vab::ElementMap( object )
-  , ModelType{ISubmodelElement::Path::ModelType}
-  , HasDataSpecification()
-  , HasKind()
-  , HasSemantics()
-  , Qualifiable()
-  , Referable()
-{}
 
 SubmodelElement::SubmodelElement(const ISubmodelElement & abstractSubmodelElement)
   : vab::ElementMap{}
diff --git a/sdks/c++/basys.sdk.cc/src/submodel/submodel/map/submodelelement/operation/OperationVariable.cpp b/sdks/c++/basys.sdk.cc/src/submodel/submodel/map/submodelelement/operation/OperationVariable.cpp
index c1cf2f0..44183a4 100644
--- a/sdks/c++/basys.sdk.cc/src/submodel/submodel/map/submodelelement/operation/OperationVariable.cpp
+++ b/sdks/c++/basys.sdk.cc/src/submodel/submodel/map/submodelelement/operation/OperationVariable.cpp
@@ -20,7 +20,7 @@
 
 std::shared_ptr<ISubmodelElement> OperationVariable::getValue() const
 {
-  return std::make_shared<SubmodelElement>(this->map.getProperty(IOperationVariable::Path::Value));
+	return std::make_shared<SubmodelElement>(this->map.getProperty(IOperationVariable::Path::Value));
 }
 
 std::string OperationVariable::getType() const
@@ -28,6 +28,11 @@
 	return this->map.getProperty(Path::Type).GetStringContent();
 }
 
+void OperationVariable::setValue(const SubmodelElement & value)
+{
+	this->map.insertKey(IOperationVariable::Path::Value, value.getMap(), true);
+}
+
 void OperationVariable::setValue(const ISubmodelElement & value)
 {
   auto map = SubmodelElement(value).getMap();
diff --git a/sdks/c++/basys.sdk.cc/tests/regression/submodel/map/reference/test_Reference.cpp b/sdks/c++/basys.sdk.cc/tests/regression/submodel/map/reference/test_Reference.cpp
index ebf1d93..9317a63 100644
--- a/sdks/c++/basys.sdk.cc/tests/regression/submodel/map/reference/test_Reference.cpp
+++ b/sdks/c++/basys.sdk.cc/tests/regression/submodel/map/reference/test_Reference.cpp
@@ -37,6 +37,7 @@
 {
   auto obj = basyx::object::make_map();
   obj.insertKey("test", "testvalue");
+  obj.insertKey(IReference::Path::Key, basyx::object::make_object_list());
   
   reference = Reference(obj);
 
diff --git a/sdks/c++/basys.sdk.cc/tests/regression/submodel/map/submodelelement/operation/test_OperationVariable.cpp b/sdks/c++/basys.sdk.cc/tests/regression/submodel/map/submodelelement/operation/test_OperationVariable.cpp
index a7e4515..e305322 100644
--- a/sdks/c++/basys.sdk.cc/tests/regression/submodel/map/submodelelement/operation/test_OperationVariable.cpp
+++ b/sdks/c++/basys.sdk.cc/tests/regression/submodel/map/submodelelement/operation/test_OperationVariable.cpp
@@ -6,7 +6,8 @@
 
 #include <gtest/gtest.h>
 
-#include "BaSyx/submodel/map/submodelelement/operation/OperationVariable.h"
+#include <BaSyx/submodel/map/submodelelement/operation/OperationVariable.h>
+#include <BaSyx/submodel/map/submodelelement/property/Property.h>
 
 #include "support/AdditionalAssertions.hpp"
 #include "support/ReferableMock.hpp"
@@ -68,44 +69,17 @@
 	basyx::assertions::AssertMapContainsValue<std::string>(map, IOperationVariable::Path::Type, "testingType");
 }
 
-TEST_F(OperationVariableTest, TestGetValue)
+TEST_F(OperationVariableTest, TestGetSetValue)
 {
-	// Construct a map containing modelType info
-	ModelType modelType;
-	auto obj = modelType.getMap();
-	obj.insertKey(ModelType::Path::Name, IOperationVariable::Path::ModelType, true);
-  
-	// construct SubmodelElement with testing description
-	basyx::object submodel_element = basyx::object::make_map();
-	Description test_description = basyx::testing::testingDescription();
-	submodel_element.insertKey(IReferable::Path::Description, test_description.getMap());
+	Property<int> prop;
+	prop.setValue(5);
 
-	// set the constructed submodel_element in map
-	obj.insertKey(IOperationVariable::Path::Value, SubmodelElement(submodel_element).getMap());
+	op_var.setValue(prop);
+	auto submodelElement = op_var.getValue();
+	auto elem = std::dynamic_pointer_cast<SubmodelElement>(submodelElement);
+	Property<int> prop2(elem->getMap());
 
-	op_var = OperationVariable(obj);
+	ASSERT_EQ(prop2.getValue(), 5);
 
-	// test if description is kept
-	auto value = op_var.getValue();
-	ASSERT_EQ(value->getDescription(), test_description);
-}
-
-TEST_F(OperationVariableTest, TestSetValue)
-{
-	//construct a map containing testing Description
-	//basyx::object submodel_element = basyx::object::make_map();
-	//Description test_description = basyx::testing::testingDescription();
-	//submodel_element.insertKey(IReferable::Path::Description, test_description.getMap());
-	//// if this is not set, construction fails
-	//submodel_element.insertKey(IHasDataSpecification::Path::HasDataSpecification, basyx::object::make_list<basyx::object>());
-	//submodel_element.insertKey(IHasKind::Path::Kind, util::to_string(Kind::NotSpecified));
-	//submodel_element.insertKey(IHasSemantics::Path::SemanticId, basyx::testing::ReferenceMock().getMap());
-
-	//// call method set value
-	//SubmodelElement elem{ submodel_element };
-	//op_var.setValue(elem);
-
-	////// check if object map contains testing description
-	//auto map = op_var.getMap();
-	//basyx::assertions::AssertMapContainsValue<Description>(map, IReferable::Path::Description, test_description);
-}
+	return;
+}
\ No newline at end of file
diff --git a/sdks/c++/basys.sdk.cc/tests/regression/util/fundamentals/test_basyx_object.cc b/sdks/c++/basys.sdk.cc/tests/regression/util/fundamentals/test_basyx_object.cc
index 2cc09dc..894531f 100644
--- a/sdks/c++/basys.sdk.cc/tests/regression/util/fundamentals/test_basyx_object.cc
+++ b/sdks/c++/basys.sdk.cc/tests/regression/util/fundamentals/test_basyx_object.cc
@@ -247,8 +247,8 @@
 	ASSERT_TRUE(anyMap.insertKey("test", basyx::object::make_object_ref(&i)));
 	ASSERT_EQ(map.size(), 1);
 	
-	// Insert element with same key again, shouldn't do anything
-	ASSERT_FALSE(anyMap.insertKey("test", basyx::object::make_object_ref(&i)));
+	// Insert element with same key again, with overwrite = false, shouldn't do anything
+	ASSERT_FALSE(anyMap.insertKey("test", basyx::object::make_object_ref(&i), false));
 	ASSERT_EQ(map.size(), 1);
 
 	// Insert element with another key