Files
qt-migration-legatus/qt6-after/qt6-migrated-legatus/TetraIF/CoPrtCnv/unittest/CoPrtCnvRadioTelegramTest.cpp
T
2026-09-12 13:54:34 +02:00

168 lines
5.4 KiB
C++

/**
* @file CoPrtCnvRadioTelegramTest.cpp
* @brief Unit tests for N_CoPrtCnv::CoPrtCnvRadioTelegram.
*
* Covers the constructors that build a telegram from scratch, the header
* accessors (ISSIs, telegram id, PDU type, identity) and the payload helpers.
* Payload words are stored MSB first, which several of these tests pin down.
*/
#include <gtest/gtest.h>
#include <QtCore/QByteArray>
#include "CoPrtCnvRadioTelegram.hpp"
#include "tetra_telegram_ids.h"
using N_CoPrtCnv::CoPrtCnvRadioTelegram;
TEST(CoPrtCnvRadioTelegramTest, RegisterIndCarriesSourceIssi)
{
const uint32_t sourceISSI = 0x123456;
const CoPrtCnvRadioTelegram telegram(sourceISSI);
EXPECT_EQ(telegram.getSrcISSI(), sourceISSI);
EXPECT_EQ(telegram.getPDU_Type(), CoPrtCnvRadioTelegram::e_RegisterInd);
EXPECT_EQ(telegram.getSize(), 9);
}
TEST(CoPrtCnvRadioTelegramTest, HeaderStartsWithMagicNumber)
{
const CoPrtCnvRadioTelegram telegram(1234);
ASSERT_GT(telegram.getSize(), 0);
EXPECT_EQ(static_cast<uint8_t>(telegram.data().at(0)), CoPrtCnvRadioTelegram::MAGIC_NUMBER);
}
TEST(CoPrtCnvRadioTelegramTest, SetSrcIssiOverwritesPreviousValue)
{
CoPrtCnvRadioTelegram telegram(1);
telegram.setSrcISSI(0xABCDEF);
EXPECT_EQ(telegram.getSrcISSI(), 0xABCDEFu);
telegram.setSrcISSI(0);
EXPECT_EQ(telegram.getSrcISSI(), 0u);
}
TEST(CoPrtCnvRadioTelegramTest, TelegramIdConstructorSetsIdAndIdentity)
{
const uint16_t payloadSize = 8;
const uint16_t identity = 0x0042;
const CoPrtCnvRadioTelegram telegram(GEF_POSITIONS_MELDUNG, payloadSize, identity);
EXPECT_EQ(telegram.getTelID(), GEF_POSITIONS_MELDUNG);
EXPECT_EQ(telegram.getIdentity(), identity);
EXPECT_EQ(telegram.getPDU_Type(), CoPrtCnvRadioTelegram::e_DataIndReq);
EXPECT_EQ(telegram.getSize(),
payloadSize + CoPrtCnvRadioTelegram::DATA_IND_REQ_HEADER_LENGTH);
}
TEST(CoPrtCnvRadioTelegramTest, TelegramIdConstructorProducesANormalTelegram)
{
const CoPrtCnvRadioTelegram telegram(GEF_POSITIONS_MELDUNG, 8, 0);
EXPECT_TRUE(telegram.isNormalTelegram());
EXPECT_FALSE(telegram.isLoginTelegram());
}
TEST(CoPrtCnvRadioTelegramTest, SetIdentityIsReadBack)
{
CoPrtCnvRadioTelegram telegram(GEF_POSITIONS_MELDUNG, 8, 0);
telegram.setIdentity(0x1234);
EXPECT_EQ(telegram.getIdentity(), 0x1234);
// The identity lives behind the telegram id, which must survive the write.
EXPECT_EQ(telegram.getTelID(), GEF_POSITIONS_MELDUNG);
}
TEST(CoPrtCnvRadioTelegramTest, TelegramIdIsTruncatedToASingleByte)
{
// The telegram id is written into one payload byte, so ids of 256 and above
// are stored truncated. GEF_GEFECHTSFELDTELEGRAMM (300) reads back as 44.
const CoPrtCnvRadioTelegram telegram(GEF_GEFECHTSFELDTELEGRAMM, 8, 0);
EXPECT_EQ(static_cast<int>(telegram.getTelID()), GEF_GEFECHTSFELDTELEGRAMM & 0xFF);
EXPECT_NE(static_cast<int>(telegram.getTelID()), int(GEF_GEFECHTSFELDTELEGRAMM));
}
TEST(CoPrtCnvRadioTelegramTest, PayloadWordsAreStoredMostSignificantByteFirst)
{
CoPrtCnvRadioTelegram telegram(GEF_POSITIONS_MELDUNG, 8, 0);
telegram.setPayloadDataWithIndex(4, 0x00112233, 4);
EXPECT_EQ(telegram.getPayloadDataUInt32(4, 4), 0x00112233u);
EXPECT_EQ(telegram.getPayloadDataUInt8(4), 0x00);
EXPECT_EQ(telegram.getPayloadDataUInt8(5), 0x11);
EXPECT_EQ(telegram.getPayloadDataUInt8(6), 0x22);
EXPECT_EQ(telegram.getPayloadDataUInt8(7), 0x33);
}
TEST(CoPrtCnvRadioTelegramTest, PayloadDataUInt32HonoursRequestedWidth)
{
CoPrtCnvRadioTelegram telegram(GEF_POSITIONS_MELDUNG, 8, 0);
telegram.setPayloadDataWithIndex(4, 0x00112233, 4);
EXPECT_EQ(telegram.getPayloadDataUInt32(4, 1), 0x00u);
EXPECT_EQ(telegram.getPayloadDataUInt32(5, 2), 0x1122u);
EXPECT_EQ(telegram.getPayloadDataUInt32(5, 3), 0x112233u);
}
TEST(CoPrtCnvRadioTelegramTest, ConstructingFromRawDataPreservesBytes)
{
const CoPrtCnvRadioTelegram source(0x00ABCD);
const QByteArray raw = source.data();
const CoPrtCnvRadioTelegram restored(raw);
EXPECT_EQ(restored.data(), raw);
EXPECT_EQ(restored.getSrcISSI(), source.getSrcISSI());
EXPECT_EQ(restored.getPDU_Type(), source.getPDU_Type());
}
TEST(CoPrtCnvRadioTelegramTest, TelegramLengthLimits)
{
EXPECT_TRUE(CoPrtCnvRadioTelegram::isTelegramLengthOk(1));
EXPECT_TRUE(CoPrtCnvRadioTelegram::isTelegramLengthOk(
CoPrtCnvRadioTelegram::MAX_RADIO_TELEGRAM_PAYLOAD_LENGTH));
EXPECT_FALSE(CoPrtCnvRadioTelegram::isTelegramLengthOk(0xFFFF));
}
TEST(CoPrtCnvRadioTelegramTest, LoginTelegramIsRecognised)
{
const CoPrtCnvRadioTelegram login(CoPrtCnvRadioTelegram::e_LoginRequest, 0x0001, 0x001234);
EXPECT_TRUE(login.isLoginTelegram());
EXPECT_FALSE(login.isNormalTelegram());
EXPECT_EQ(login.getIdentity(), 0x0001);
EXPECT_EQ(login.getDestISSI(), 0x001234u);
}
TEST(CoPrtCnvRadioTelegramTest, BroadcastIndexRoundTrips)
{
// getBroadcastIndex() only reports an index when the payload extends past
// offset 4, so the telegram needs more than five payload bytes.
CoPrtCnvRadioTelegram telegram(GEF_POSITIONS_MELDUNG, 8, 0);
telegram.setBroadcastIndex(0x0107);
EXPECT_EQ(telegram.getBroadcastIndex(), 0x0107);
}
TEST(CoPrtCnvRadioTelegramTest, CounterRoundTrips)
{
CoPrtCnvRadioTelegram telegram(GEF_POSITIONS_MELDUNG, 8, 0);
telegram.setZaehler(0x2A);
EXPECT_EQ(telegram.zaehler(), 0x2A);
}
TEST(CoPrtCnvRadioTelegramTest, DestIssiRoundTrips)
{
CoPrtCnvRadioTelegram telegram(GEF_POSITIONS_MELDUNG, 8, 0);
telegram.setDestISSI(0x00FEDC);
EXPECT_EQ(telegram.getDestISSI(), 0x00FEDCu);
}