blob: 34a73536642fa1a94bcce9c5f1a87ce630e886d3 [file] [log] [blame]
#include <gtest/gtest.h>
#include <BaSyx/submodel/simple/submodelelement/property/Property.h>
#include <BaSyx/submodel/map_v2/submodelelement/property/Property.h>
#include <BaSyx/submodel/simple/common/xsd_types/AnyURI.h>
using namespace basyx::submodel;
// Implementations to run tests for
using ImplTypes = ::testing::Types<
simple::Property<int>,
map::Property<int>
>;
template<class Impl>
class PropertyTest :public ::testing::Test {
protected:
using impl_t = Impl;
protected:
std::unique_ptr<api::IProperty> property;
protected:
void SetUp() override
{
std::string idShort("id test");
this->property = util::make_unique<Impl>(idShort);
}
void TearDown() override
{
}
};
TYPED_TEST_CASE(PropertyTest, ImplTypes);
TYPED_TEST(PropertyTest, TestConstructor)
{
ASSERT_EQ(this->property->getIdShort(), std::string("id test"));
}
TYPED_TEST(PropertyTest, TestValueType)
{
this->property->setValueType("valueType test");
ASSERT_EQ(this->property->getValueType(), std::string("valueType test"));
}
TYPED_TEST(PropertyTest, TestObject)
{
basyx::object o(123);
this->property->setObject(o);
ASSERT_EQ(this->property->getObject(), basyx::object(123));
}
TYPED_TEST(PropertyTest, TestValueID)
{
simple::Key key(KeyElements::ConceptDictionary, false, KeyType::Custom, "test key");
std::unique_ptr<api::IReference> ref = util::make_unique<simple::Reference>(key);
this->property->setValueId(*ref);
ASSERT_EQ(this->property->getValueId()->getKeys().at(0), key);
}
TYPED_TEST(PropertyTest, TestGetKeyElementType)
{
ASSERT_EQ(this->property->getKeyElementType(), KeyElements::Property);
}
TYPED_TEST(PropertyTest, TestAnyURI)
{
map::Property<simple::AnyURI> map_uri_prop("id");
ASSERT_EQ(map_uri_prop.getValueType(), std::string("anyURI"));
}
TYPED_TEST(PropertyTest, TestSafeDateTime)
{
map::Property<simple::DateTime> dateTime_property("test id");
std::string valueType = dateTime_property.getValueType();
ASSERT_EQ(valueType, std::string("dateTime"));
//Try to add a DateTime
time_t t = 1563002200;
tm time = *gmtime(&t);
simple::DateTime test_time(time);
dateTime_property.setValue(test_time);
auto dateTime_string = dateTime_property.getMap().getProperty(map::PropertyPath::Value).GetStringContent();
ASSERT_EQ(dateTime_string, std::string("2019-07-13T07:16:40Z"));
tm saved_time = dateTime_property.getValue().getTime();
ASSERT_EQ(mktime(&saved_time), mktime(&time));
}
TYPED_TEST(PropertyTest, TestSafeDate)
{
map::Property<simple::Date> date_property("test id");
std::string valueType = date_property.getValueType();
ASSERT_EQ(valueType, std::string("date"));
//Try to add a Date
tm date;
//epoche starts at 1900
date.tm_year = 1986 - 1900;
//month count starts at 0
date.tm_mon = 5 - 1;
date.tm_mday = 6;
simple::Date test_date(date);
date_property.setValue(test_date);
auto dateTime_string = date_property.getMap().getProperty(map::PropertyPath::Value).GetStringContent();
ASSERT_EQ(dateTime_string, std::string("1986-05-06Z"));
tm saved_date = date_property.getValue().getDate();
ASSERT_EQ(saved_date.tm_year, date.tm_year);
ASSERT_EQ(saved_date.tm_mon, date.tm_mon);
ASSERT_EQ(saved_date.tm_mday, date.tm_mday);
}
TYPED_TEST(PropertyTest, TestSafeDayTimeDuration)
{
map::Property<simple::DayTimeDuration> duration_property("test id");
ASSERT_EQ(duration_property.getValueType(), std::string("dayTimeDuration"));
std::vector<std::pair<long, std::string>> test_cases = {
{0, "P"},
{12312123, "P142D12H2M3S"},
{12268923, "P142D2M3S"},
{12312120, "P142D12H2M"},
{59, "P59S"},
{60, "P1M"},
{-1, "-P1S"},
{-12312123, "-P142D12H2M3S"}
};
for (auto pair : test_cases)
{
std::chrono::duration<long> test_duration{pair.first};
simple::DayTimeDuration duration{test_duration};
duration_property.setValue(duration);
auto dateTime_string = duration_property.getMap().getProperty(map::PropertyPath::Value).GetStringContent();
ASSERT_EQ(dateTime_string, std::string(pair.second));
ASSERT_EQ(duration_property.getValue().getDuration().count(), test_duration.count());
}
}
TYPED_TEST(PropertyTest, TestSafeYearMonthDuration)
{
map::Property<simple::YearMonthDuration> duration_property("test id");
ASSERT_EQ(duration_property.getValueType(), std::string("yearMonthDuration"));
std::vector<std::tuple<int, int, int, int, std::string>> test_cases = {
{0, 0, 0, 0, "P"},
{99, 0, 99, 0, "P99Y"},
{0, 11, 0, 11, "P11M"},
{50, 100, 58, 4, "P58Y4M"},
{50, -100, 41, 8, "P41Y8M"},
{-50, 100, -42, 4, "-P42Y4M"}
};
for (auto tuple : test_cases)
{
simple::YearMonthDuration duration{std::get<0>(tuple), std::get<1>(tuple)};
duration_property.setValue(duration);
auto duration_string = duration_property.getMap().getProperty(map::PropertyPath::Value).GetStringContent();
ASSERT_EQ(duration_string, std::string(std::get<4>(tuple)));
ASSERT_EQ(duration_property.getValue().getYears(), std::get<2>(tuple));
ASSERT_EQ(duration_property.getValue().getMonths(), std::get<3>(tuple));
}
}
TYPED_TEST(PropertyTest, TestTime)
{
map::Property<simple::Time> time_property("test id");
ASSERT_EQ(time_property.getValueType(), std::string("time"));
std::vector<std::tuple<uint8_t, uint8_t, float, std::string, std::string>> test_cases = {
{0, 0, 0, "Z", "00:00:00Z"},
{11, 12, 3, "+01:00", "11:12:03+01:00"},
{12, 34, 56.789, "-12:00", "12:34:56.789-12:00"},
{1, 2, 3.04, "Z", "01:02:03.04Z"}
};
for (auto tuple : test_cases)
{
simple::Time time{std::get<0>(tuple), std::get<1>(tuple), std::get<2>(tuple), std::get<3>(tuple)};
time_property.setValue(time);
auto xsd_str = time_property.getMap().getProperty(map::PropertyPath::Value).GetStringContent();
ASSERT_EQ(xsd_str, std::string(std::get<4>(tuple)));
ASSERT_EQ(time_property.getValue().getHours(), std::get<0>(tuple));
ASSERT_EQ(time_property.getValue().getMinutes(), std::get<1>(tuple));
ASSERT_EQ(time_property.getValue().getSeconds(), std::get<2>(tuple));
ASSERT_EQ(std::string{time_property.getValue().getTimezone()}, std::string(std::get<3>(tuple)));
}
}
TYPED_TEST(PropertyTest, TestGregorianYearMonth)
{
map::Property<simple::GYearMonth> gregorianYearMonth_property("test id");
ASSERT_EQ(gregorianYearMonth_property.getValueType(), std::string("gYearMonth"));
std::vector<std::tuple<int, uint8_t, std::string, std::string>> test_cases = {
{0, 01, "Z", "0000-01Z"},
{11, 12, "+01:00", "0011-12+01:00"},
{2016, 1, "-12:00", "2016-01-12:00"},
{-1, 10, "Z", "-0001-10Z"},
{20202, 10, "Z", "20202-10Z"}
};
for (auto tuple : test_cases)
{
simple::GYearMonth yearMonth{std::get<0>(tuple), std::get<1>(tuple), std::get<2>(tuple)};
gregorianYearMonth_property.setValue(yearMonth);
auto xsd_str = gregorianYearMonth_property.getMap().getProperty(map::PropertyPath::Value).GetStringContent();
ASSERT_EQ(xsd_str, std::string(std::get<3>(tuple)));
ASSERT_EQ(gregorianYearMonth_property.getValue().getYear(), std::get<0>(tuple));
ASSERT_EQ(gregorianYearMonth_property.getValue().getMonth(), std::get<1>(tuple));
ASSERT_EQ(std::string{gregorianYearMonth_property.getValue().getTimezone()}, std::string(std::get<2>(tuple)));
}
}
TYPED_TEST(PropertyTest, TestGregorianYear)
{
map::Property<simple::GYear> gregorianYear_property("test id");
ASSERT_EQ(gregorianYear_property.getValueType(), std::string("gYear"));
std::vector<std::tuple<int, std::string, std::string>> test_cases = {
{0, "Z", "0000Z"},
{11, "+01:00", "0011+01:00"},
{2016, "-12:00", "2016-12:00"},
{-1, "Z", "-0001Z"},
{-15445, "Z", "-15445Z"},
{20202, "Z", "20202Z"}
};
for (auto tuple : test_cases)
{
simple::GYear year{std::get<0>(tuple), std::get<1>(tuple)};
gregorianYear_property.setValue(year);
auto xsd_str = gregorianYear_property.getMap().getProperty(map::PropertyPath::Value).GetStringContent();
ASSERT_EQ(xsd_str, std::string(std::get<2>(tuple)));
ASSERT_EQ(gregorianYear_property.getValue().getYear(), std::get<0>(tuple));
ASSERT_EQ(std::string{gregorianYear_property.getValue().getTimezone()}, std::string(std::get<1>(tuple)));
}
}
TYPED_TEST(PropertyTest, TestGregorianMonthDay)
{
map::Property<simple::GMonthDay> gregorianMonthDay_property("test id");
ASSERT_EQ(gregorianMonthDay_property.getValueType(), std::string("gMonthDay"));
std::vector<std::tuple<uint8_t, uint8_t, std::string, std::string, uint8_t, uint8_t>> test_cases = {
{1, 1, "Z", "--01-01Z", 1, 1},
{10, 31, "+01:00", "--10-31+01:00", 10, 31},
{13, 32, "-12:00", "--01-31-12:00", 1, 31},
};
for (auto tuple : test_cases)
{
simple::GMonthDay monthDay{std::get<0>(tuple), std::get<1>(tuple), std::get<2>(tuple)};
gregorianMonthDay_property.setValue(monthDay);
auto xsd_str = gregorianMonthDay_property.getMap().getProperty(map::PropertyPath::Value).GetStringContent();
ASSERT_EQ(xsd_str, std::string(std::get<3>(tuple)));
ASSERT_EQ(gregorianMonthDay_property.getValue().getMonth(), std::get<4>(tuple));
ASSERT_EQ(gregorianMonthDay_property.getValue().getDay(), std::get<5>(tuple));
ASSERT_EQ(std::string{gregorianMonthDay_property.getValue().getTimezone()}, std::string(std::get<2>(tuple)));
}
}
TYPED_TEST(PropertyTest, TestGregorianDay)
{
map::Property<simple::GDay> gregorianDay_property("test id");
ASSERT_EQ(gregorianDay_property.getValueType(), std::string("gDay"));
std::vector<std::tuple<uint8_t, std::string, std::string, uint8_t>> test_cases = {
{1, "Z", "---01Z", 1},
{10, "+01:00", "---10+01:00", 10},
{32, "-12:00", "---01-12:00", 1},
};
for (auto tuple : test_cases)
{
simple::GDay day{std::get<0>(tuple), std::get<1>(tuple)};
gregorianDay_property.setValue(day);
auto xsd_str = gregorianDay_property.getMap().getProperty(map::PropertyPath::Value).GetStringContent();
ASSERT_EQ(xsd_str, std::string(std::get<2>(tuple)));
ASSERT_EQ(gregorianDay_property.getValue().getDay(), std::get<3>(tuple));
ASSERT_EQ(std::string{gregorianDay_property.getValue().getTimezone()}, std::string(std::get<1>(tuple)));
}
}
TYPED_TEST(PropertyTest, TestGregorianMonth)
{
map::Property<simple::GMonth> gregorianMonth_property("test id");
ASSERT_EQ(gregorianMonth_property.getValueType(), std::string("gMonth"));
std::vector<std::tuple<uint8_t, std::string, std::string, uint8_t>> test_cases = {
{1, "Z", "--01Z", 1},
{10, "+01:00", "--10+01:00", 10},
{13, "-12:00", "--01-12:00", 1},
};
for (auto tuple : test_cases)
{
simple::GMonth month{std::get<0>(tuple), std::get<1>(tuple)};
gregorianMonth_property.setValue(month);
auto xsd_str = gregorianMonth_property.getMap().getProperty(map::PropertyPath::Value).GetStringContent();
ASSERT_EQ(xsd_str, std::string(std::get<2>(tuple)));
ASSERT_EQ(gregorianMonth_property.getValue().getMonth(), std::get<3>(tuple));
ASSERT_EQ(std::string{gregorianMonth_property.getValue().getTimezone()}, std::string(std::get<1>(tuple)));
}
}