24#include <gtest/gtest.h>
34class AlarmItemTest :
public ::testing::Test
40TEST_F(AlarmItemTest, ParseChannelDiagnosis)
43 PutU16(data,
static_cast<std::uint16_t
>(Usi::ChannelDiagnosis));
50 EXPECT_EQ(Offset, data.size());
52 auto* diag = std::get_if<DiagnosisItem>(&item);
53 ASSERT_NE(diag,
nullptr);
55 EXPECT_EQ(diag->ChannelNumberValue(),
static_cast<std::uint16_t
>(5));
56 EXPECT_TRUE(diag->IsAccumulative());
57 EXPECT_FALSE(diag->IsExtended());
58 EXPECT_EQ(diag->UsiName(),
"Channel Diagnosis");
62TEST_F(AlarmItemTest, ParseExtChannelDiagnosis)
65 PutU16(data,
static_cast<std::uint16_t
>(Usi::ExtendedChannelDiagnosis));
74 EXPECT_EQ(Offset, data.size());
76 auto* diag = std::get_if<DiagnosisItem>(&item);
77 ASSERT_NE(diag,
nullptr);
79 EXPECT_TRUE(diag->IsExtended());
81 EXPECT_EQ(diag->extChannelErrorType,
static_cast<std::uint16_t
>(0x1234));
83 EXPECT_EQ(diag->extChannelAddValue,
static_cast<std::uint32_t
>(0xDEADBEEF));
87TEST_F(AlarmItemTest, ParsePEAlarmItem)
90 PutU16(data,
static_cast<std::uint16_t
>(Usi::PeAlarm));
99 EXPECT_EQ(Offset, data.size());
101 auto* pe = std::get_if<PEAlarmItem>(&item);
102 ASSERT_NE(pe,
nullptr);
104 EXPECT_EQ(pe->ModeName(),
"PE_Operate");
112 data.push_back(0xAA);
113 data.push_back(0xBB);
117 EXPECT_EQ(Offset, data.size());
119 auto*
generic = std::get_if<AlarmItem>(&item);
120 ASSERT_NE(generic,
nullptr);
122 EXPECT_EQ(generic->rawData,
Bytes({0xAA, 0xBB}));
124 EXPECT_EQ(generic->UsiName().rfind(
"Manufacturer Specific", 0), 0U);
128TEST_F(AlarmItemTest, RejectsTruncatedData)
133TEST_F(AlarmItemTest, ParseAlarmNotificationParsesHeaderAndItems)
138 PutU16(data,
static_cast<std::uint16_t
>(BlockType::AlarmNotificationHigh));
158 PutU16(data,
static_cast<std::uint16_t
>(Usi::ChannelDiagnosis));
169 EXPECT_EQ(n.
Location(),
"0:1:0x0001");
171 ASSERT_EQ(n.
items.size(),
static_cast<std::size_t
>(1));
172 EXPECT_NE(std::get_if<DiagnosisItem>(&n.
items[0]),
nullptr);
175TEST_F(AlarmItemTest, ParseAlarmNotificationRejectsTooShortData)
Declares PROFINET alarm, diagnosis, maintenance, and USI payload types and parsers.
void PutU8(std::vector< std::uint8_t > &out, std::uint8_t value)
Append a single byte to a buffer.
void PutU16(std::vector< std::uint8_t > &out, std::uint16_t value)
Append a 16-bit value to a buffer in big-endian order.
void PutU32(std::vector< std::uint8_t > &out, std::uint32_t value)
Append a 32-bit value to a buffer in big-endian order.
TEST_F(AlarmListenerTests, InitializesWithEndpoint)
std::pair< AlarmItemVariant, std::size_t > ParseAlarmItem(const Bytes &data, std::size_t offset=0)
Parse a single alarm item starting at an offset.
AlarmNotification ParseAlarmNotification(const Bytes &data)
Parse a complete AlarmNotification PDU (BlockHeader + body + items).
std::vector< std::uint8_t > Bytes
Generic byte buffer alias used throughout the library for raw wire data.
Complete parsed AlarmNotification PDU: header fields + parsed items.
std::vector< AlarmItemVariant > items
Parsed alarm items carried by this notification.
std::uint16_t alarmSequenceNumber
Sequence number extracted from the alarm specifier.
std::string Location() const
Location string identifying where the alarm originated.
bool IsHighPriority() const
Whether this is a high-priority notification.
bool channelDiagnosis
Whether the alarm specifier indicates channel diagnosis is present.
std::string AlarmTypeName() const
Human-readable name for AlarmType.