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