Implements missing methods for DataSpecification classes and appropriate tests.

Change-Id: I10e14250f2e205dc789e47213558be6bbc090c3c
Signed-off-by: Johannes Wendel <johannes.wendel@iese.fraunhofer.de>
diff --git a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/common/ILangStringSet.h b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/common/ILangStringSet.h
index b68fac7..a9e41ae 100644
--- a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/common/ILangStringSet.h
+++ b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/common/ILangStringSet.h
@@ -13,7 +13,7 @@
 class ILangStringSet
 {
 public:
-	using langCodeSet_t = const std::unordered_set<std::string>;
+	using langCodeSet_t = std::unordered_set<std::string>;
 public:
 	virtual ~ILangStringSet();
 
diff --git a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/enumerations/DataTypeIEC61360.h b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/enumerations/DataTypeIEC61360.h
index 1c6de20..1c7c0e7 100644
--- a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/enumerations/DataTypeIEC61360.h
+++ b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/enumerations/DataTypeIEC61360.h
@@ -19,6 +19,7 @@
     Time,
     Timestamp,
     Url,
+    Undefined
 };
 
 class DataTypeIEC61360_
diff --git a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/enumerations/LevelType.h b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/enumerations/LevelType.h
index 2da4a2f..e90858e 100644
--- a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/enumerations/LevelType.h
+++ b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/enumerations/LevelType.h
@@ -11,6 +11,7 @@
     Min,
     Nom,
     Typ,
+    Undefined
 };
 
 class LevelType_
diff --git a/sdks/c++/basys.sdk.cc/src/submodel/submodel/enumerations/DataTypeIEC61360.cpp b/sdks/c++/basys.sdk.cc/src/submodel/submodel/enumerations/DataTypeIEC61360.cpp
index d3c8f95..af1d490 100644
--- a/sdks/c++/basys.sdk.cc/src/submodel/submodel/enumerations/DataTypeIEC61360.cpp
+++ b/sdks/c++/basys.sdk.cc/src/submodel/submodel/enumerations/DataTypeIEC61360.cpp
@@ -9,7 +9,7 @@
 
 using enum_pair_t = std::pair<const char*, DataTypeIEC61360>;
 
-static const std::array<enum_pair_t, 12> string_to_enum = 
+static const std::array<enum_pair_t, 13> string_to_enum =
 {
     std::make_pair("Boolean",  DataTypeIEC61360::Boolean),
     std::make_pair("Date", DataTypeIEC61360::Date),
@@ -23,6 +23,7 @@
     std::make_pair("Time", DataTypeIEC61360::Time),
     std::make_pair("Timestamp", DataTypeIEC61360::Timestamp),
     std::make_pair("Url", DataTypeIEC61360::Url),
+    std::make_pair("Undefined", DataTypeIEC61360::Undefined),
 };
 
 DataTypeIEC61360 DataTypeIEC61360_::from_string(const std::string & name)
diff --git a/sdks/c++/basys.sdk.cc/src/submodel/submodel/enumerations/LevelType.cpp b/sdks/c++/basys.sdk.cc/src/submodel/submodel/enumerations/LevelType.cpp
index 3220104..b69745a 100644
--- a/sdks/c++/basys.sdk.cc/src/submodel/submodel/enumerations/LevelType.cpp
+++ b/sdks/c++/basys.sdk.cc/src/submodel/submodel/enumerations/LevelType.cpp
@@ -9,12 +9,13 @@
 
 using enum_pair_t = std::pair<const char*, LevelType>;
 
-static const std::array<enum_pair_t, 4> string_to_enum = 
+static const std::array<enum_pair_t, 5> string_to_enum =
 {
     std::make_pair("Max",  LevelType::Max),
     std::make_pair("Min", LevelType::Min),
     std::make_pair("Nom", LevelType::Nom),
     std::make_pair("Typ", LevelType::Typ),
+    std::make_pair("Undefined", LevelType::Undefined),
 };
 
 LevelType LevelType_::from_string(const std::string & name)
diff --git a/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/common/LangStringSet.cpp b/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/common/LangStringSet.cpp
index c43bc89..3fa0294 100644
--- a/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/common/LangStringSet.cpp
+++ b/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/common/LangStringSet.cpp
@@ -26,10 +26,10 @@
 LangStringSet::langCodeSet_t LangStringSet::getLanguageCodes() const
 {
   auto &langStrings = this->map.Get<basyx::object::object_list_t &>();
-  std::vector<std::string> langCodes;
-  std::transform(langStrings.begin(), langStrings.end(), std::back_inserter(langCodes),
-                 [](basyx::object langSet) { return langSet.getProperty(Path::Language).GetStringContent(); });
-  return LangStringSet::langCodeSet_t(langCodes.begin(), langCodes.end());
+  LangStringSet::langCodeSet_t langCodes;
+  for (auto & langCode : langStrings)
+    langCodes.emplace(langCode.getProperty(Path::Language).GetStringContent());
+  return langCodes;
 }
 
 const std::string &LangStringSet::get(const std::string &languageCode) const
diff --git a/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/dataspecification/DataSpecificationIEC61360.cpp b/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/dataspecification/DataSpecificationIEC61360.cpp
index 6408d06..6a3b47f 100644
--- a/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/dataspecification/DataSpecificationIEC61360.cpp
+++ b/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/dataspecification/DataSpecificationIEC61360.cpp
@@ -74,7 +74,12 @@
 }
 
 DataTypeIEC61360 DataSpecificationIEC61360::getDataType() const
-{}
+{
+  auto data_type = this->map.getProperty(Path::DataType);
+  if (data_type.IsNull())
+    return DataTypeIEC61360::Undefined;
+  return DataTypeIEC61360_::from_string(data_type.GetStringContent());
+}
 
 std::string * const DataSpecificationIEC61360::getValueFormat()
 {
@@ -92,8 +97,10 @@
 
 LevelType DataSpecificationIEC61360::getLevelType() const
 {
-  throw std::logic_error{"Function not yet implemented."};
-  //return from_string(this->map.getProperty(Path::LevelType));
+  auto level_type = this->map.getProperty(Path::LevelType);
+  if (level_type.IsNull())
+    return LevelType::Undefined;
+  return LevelType_::from_string(level_type.GetStringContent());
 }
 
 void DataSpecificationIEC61360::setPreferredName(const api::ILangStringSet & preferredName)
@@ -123,8 +130,7 @@
 
 void DataSpecificationIEC61360::setDataType(DataTypeIEC61360 dataType)
 {
-  throw std::logic_error{"Function not yet implemented."};
-  //this->map.insertKey(Path::DataType, to_string(dataType));
+  this->map.insertKey(Path::DataType, DataTypeIEC61360_::to_string(dataType));
 }
 
 void DataSpecificationIEC61360::setValueFormat(const std::string & valueFormat)
@@ -161,8 +167,7 @@
 
 void DataSpecificationIEC61360::setLevelType(LevelType levelType)
 {
-  throw std::logic_error{"Function not yet implemented."};
-  //this->map.insertKey(Path::LevelType, to_string(levelType));
+  this->map.insertKey(Path::LevelType, LevelType_::to_string(levelType));
 }
 
 }
diff --git a/sdks/c++/basys.sdk.cc/src/submodel/submodel/simple/common/LangStringSet.cpp b/sdks/c++/basys.sdk.cc/src/submodel/submodel/simple/common/LangStringSet.cpp
index 6e4fe02..d1972a6 100644
--- a/sdks/c++/basys.sdk.cc/src/submodel/submodel/simple/common/LangStringSet.cpp
+++ b/sdks/c++/basys.sdk.cc/src/submodel/submodel/simple/common/LangStringSet.cpp
@@ -19,10 +19,10 @@
 
 LangStringSet::langCodeSet_t LangStringSet::getLanguageCodes() const
 {
-  std::vector<std::string> langCodes;
-  for (auto langCode : this->langStrings)
-    langCodes.push_back(langCode.first);
-  return LangStringSet::langCodeSet_t(langCodes.begin(), langCodes.end());
+  LangStringSet::langCodeSet_t langCodes;
+  for (auto & langCode : this->langStrings)
+    langCodes.insert(langCode.first);
+  return langCodes;
 };
 
 
diff --git a/sdks/c++/basys.sdk.cc/tests/regression/submodel/map_v2/dataspecification/test_DataSpecificationIEC61360.cpp b/sdks/c++/basys.sdk.cc/tests/regression/submodel/map_v2/dataspecification/test_DataSpecificationIEC61360.cpp
index cfffea7..4eb70c5 100644
--- a/sdks/c++/basys.sdk.cc/tests/regression/submodel/map_v2/dataspecification/test_DataSpecificationIEC61360.cpp
+++ b/sdks/c++/basys.sdk.cc/tests/regression/submodel/map_v2/dataspecification/test_DataSpecificationIEC61360.cpp
@@ -83,10 +83,10 @@
   this->data_spec->setValueFormat("testValueFormat");
   ASSERT_EQ(*this->data_spec->getValueFormat(), std::string("testValueFormat"));
 }
-/* TODO
+
 TEST_F(DataSpecificationIEC61360Test, TestDataType)
 {
-  ASSERT_EQ(this->data_spec->getDataType(), DataTypeIEC61360::Unknown);
+  ASSERT_EQ(this->data_spec->getDataType(), DataTypeIEC61360::Undefined);
 
   this->data_spec->setDataType(DataTypeIEC61360::Rational);
   ASSERT_EQ(this->data_spec->getDataType(), DataTypeIEC61360::Rational);
@@ -94,11 +94,11 @@
 
 TEST_F(DataSpecificationIEC61360Test, TestLevelType)
 {
-  ASSERT_EQ(this->data_spec->getLevelType(), LevelType::Unknown);
+  ASSERT_EQ(this->data_spec->getLevelType(), LevelType::Undefined);
 
   this->data_spec->setLevelType(LevelType::Min);
   ASSERT_EQ(this->data_spec->getLevelType(), LevelType::Min);
-}*/
+}
 
 TEST_F(DataSpecificationIEC61360Test, TestUnitId)
 {