forked from Kistler-Group/sdbus-cpp
feat: support enums in D-Bus serialization and signatures (#416)
This commit is contained in:
@@ -347,6 +347,24 @@ TEST(AMessage, CanCarryDBusArrayOfNontrivialTypesGivenAsStdSpan)
|
||||
}
|
||||
#endif
|
||||
|
||||
TEST(AMessage, CanCarryAnEnumValue)
|
||||
{
|
||||
auto msg = sdbus::createPlainMessage();
|
||||
|
||||
enum class EnumA : int16_t {X = 5} aWritten{EnumA::X};
|
||||
enum EnumB {Y = 11} bWritten{EnumB::Y};
|
||||
|
||||
msg << aWritten << bWritten;
|
||||
msg.seal();
|
||||
|
||||
EnumA aRead{};
|
||||
EnumB bRead{};
|
||||
msg >> aRead >> bRead;
|
||||
|
||||
ASSERT_THAT(aRead, Eq(aWritten));
|
||||
ASSERT_THAT(bRead, Eq(bWritten));
|
||||
}
|
||||
|
||||
TEST(AMessage, ThrowsWhenDestinationStdArrayIsTooSmallDuringDeserialization)
|
||||
{
|
||||
auto msg = sdbus::createPlainMessage();
|
||||
|
||||
@@ -49,6 +49,21 @@ namespace
|
||||
static std::string getDBusTypeSignature();
|
||||
};
|
||||
|
||||
enum class SomeEnumClass : uint8_t
|
||||
{
|
||||
A, B, C
|
||||
};
|
||||
|
||||
enum struct SomeEnumStruct : int64_t
|
||||
{
|
||||
A, B, C
|
||||
};
|
||||
|
||||
enum SomeClassicEnum
|
||||
{
|
||||
A, B, C
|
||||
};
|
||||
|
||||
#define TYPE(...) \
|
||||
template <> \
|
||||
std::string Type2DBusTypeSignatureConversion<__VA_ARGS__>::getDBusTypeSignature() \
|
||||
@@ -79,8 +94,11 @@ namespace
|
||||
TYPE(std::vector<int16_t>)HAS_DBUS_TYPE_SIGNATURE("an")
|
||||
TYPE(std::array<int16_t, 3>)HAS_DBUS_TYPE_SIGNATURE("an")
|
||||
#if __cplusplus >= 202002L
|
||||
TYPE(std::span<int16_t>)HAS_DBUS_TYPE_SIGNATURE("ao")
|
||||
TYPE(std::span<int16_t>)HAS_DBUS_TYPE_SIGNATURE("an")
|
||||
#endif
|
||||
TYPE(SomeEnumClass)HAS_DBUS_TYPE_SIGNATURE("y")
|
||||
TYPE(SomeEnumStruct)HAS_DBUS_TYPE_SIGNATURE("x")
|
||||
TYPE(SomeClassicEnum)HAS_DBUS_TYPE_SIGNATURE("u")
|
||||
TYPE(std::map<int32_t, int64_t>)HAS_DBUS_TYPE_SIGNATURE("a{ix}")
|
||||
TYPE(std::unordered_map<int32_t, int64_t>)HAS_DBUS_TYPE_SIGNATURE("a{ix}")
|
||||
using ComplexType = std::map<
|
||||
@@ -127,6 +145,9 @@ namespace
|
||||
#if __cplusplus >= 202002L
|
||||
, std::span<int16_t>
|
||||
#endif
|
||||
, SomeEnumClass
|
||||
, SomeEnumStruct
|
||||
, SomeClassicEnum
|
||||
, std::map<int32_t, int64_t>
|
||||
, std::unordered_map<int32_t, int64_t>
|
||||
, ComplexType
|
||||
|
||||
Reference in New Issue
Block a user