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

196 lines
5.7 KiB
C++

/**
* @file LogViewFieldTest.cpp
* @brief Unit tests for N_LogView::LogViewField.
*
* LogViewField is the tree node LogView builds from a telegram specification.
* These tests cover the name/label handling, the value list, the child tree and
* the timestamp-field detection. They deliberately avoid the accessors that
* dereference the XDR element, which needs a parsed specification file.
*/
#include <gtest/gtest.h>
#include <QtCore/QString>
#include <QtCore/QStringList>
#include "LogViewField.hpp"
using N_LogView::LogViewField;
namespace
{
LogViewField makeField(const QString &name,
LogViewField::E_FieldKind kind = LogViewField::e_FieldKindEdit)
{
return LogViewField(name, kind, nullptr);
}
} // namespace
TEST(LogViewFieldTest, ConstructorStoresNameAndKind)
{
const LogViewField field = makeField(QStringLiteral("issi"), LogViewField::e_FieldKindBorder);
EXPECT_EQ(field.name(), QStringLiteral("issi"));
EXPECT_EQ(field.kind(), LogViewField::e_FieldKindBorder);
EXPECT_EQ(field.xdrElement(), nullptr);
}
TEST(LogViewFieldTest, SetNameReplacesTheName)
{
LogViewField field = makeField(QStringLiteral("old"));
field.setName(QStringLiteral("new"));
EXPECT_EQ(field.name(), QStringLiteral("new"));
}
TEST(LogViewFieldTest, MakeCleanCapitalisesWordsAndDropsUnderscores)
{
EXPECT_EQ(LogViewField::makeClean(QStringLiteral("utm_nordwert")),
QStringLiteral("Utm Nordwert"));
EXPECT_EQ(LogViewField::makeClean(QStringLiteral("issi")), QStringLiteral("Issi"));
}
TEST(LogViewFieldTest, MakeCleanStripsTheRecordTypeSuffix)
{
EXPECT_EQ(LogViewField::makeClean(QStringLiteral("gef_header_rt")),
QStringLiteral("Gef Header"));
}
TEST(LogViewFieldTest, MakeCleanHandlesTheEmptyString)
{
EXPECT_EQ(LogViewField::makeClean(QString()), QString());
}
TEST(LogViewFieldTest, CleanNameUsesMakeClean)
{
const LogViewField field = makeField(QStringLiteral("gps_zeit"));
EXPECT_EQ(field.cleanName(), LogViewField::makeClean(QStringLiteral("gps_zeit")));
}
TEST(LogViewFieldTest, ValueListStartsEmpty)
{
const LogViewField field = makeField(QStringLiteral("issi"));
EXPECT_EQ(field.valueListSize(), 0);
EXPECT_TRUE(field.value(0).isEmpty());
}
TEST(LogViewFieldTest, AddValueAppendsInOrder)
{
LogViewField field = makeField(QStringLiteral("issi"));
field.addValue(QStringLiteral("11"));
field.addValue(QStringLiteral("22"));
EXPECT_EQ(field.valueListSize(), 2);
EXPECT_EQ(field.value(0), QStringLiteral("11"));
EXPECT_EQ(field.value(1), QStringLiteral("22"));
}
TEST(LogViewFieldTest, ValueReturnsEmptyForAnOutOfRangeIndex)
{
LogViewField field = makeField(QStringLiteral("issi"));
field.addValue(QStringLiteral("11"));
EXPECT_TRUE(field.value(1).isEmpty());
EXPECT_TRUE(field.value(99).isEmpty());
}
TEST(LogViewFieldTest, AddValueBinaryHexExpandsToDecimalBytes)
{
LogViewField field = makeField(QStringLiteral("payload"));
field.addValueBinaryHex(QStringLiteral("00ff10"));
ASSERT_EQ(field.valueListSize(), 3);
EXPECT_EQ(field.value(0), QStringLiteral("0"));
EXPECT_EQ(field.value(1), QStringLiteral("255"));
EXPECT_EQ(field.value(2), QStringLiteral("16"));
}
TEST(LogViewFieldTest, DateTimeFieldIsDetectedCaseInsensitively)
{
EXPECT_TRUE(makeField(QStringLiteral("gps_zeit")).isDateTimeField());
EXPECT_TRUE(makeField(QStringLiteral("GPS_ZEIT")).isDateTimeField());
EXPECT_FALSE(makeField(QStringLiteral("issi")).isDateTimeField());
}
TEST(LogViewFieldTest, MSecsFieldIsDetectedCaseInsensitively)
{
EXPECT_TRUE(makeField(QStringLiteral("timestamp")).isMSecsField());
EXPECT_TRUE(makeField(QStringLiteral("EffectStart")).isMSecsField());
EXPECT_FALSE(makeField(QStringLiteral("gps_zeit")).isMSecsField());
}
TEST(LogViewFieldTest, RawValueSkipsTheTimestampConversion)
{
LogViewField field = makeField(QStringLiteral("timestamp"));
field.addValue(QStringLiteral("1500000000000"));
EXPECT_EQ(field.value(0, true), QStringLiteral("1500000000000"));
EXPECT_NE(field.value(0), QStringLiteral("1500000000000"));
}
TEST(LogViewFieldTest, ScalarPropertiesRoundTrip)
{
LogViewField field = makeField(QStringLiteral("issi"));
field.setType(QStringLiteral("uint32_t"));
field.setSize(4);
field.setIsRightAligned(true);
field.setToolTipText(QStringLiteral("individual subscriber identity"));
field.setHasContent(false);
EXPECT_EQ(field.type(), QStringLiteral("uint32_t"));
EXPECT_EQ(field.size(), 4);
EXPECT_TRUE(field.isRightAligned());
EXPECT_EQ(field.toolTipText(), QStringLiteral("individual subscriber identity"));
EXPECT_FALSE(field.hasContent());
}
TEST(LogViewFieldTest, MaxArraySizeCarriesTheDynamicFlag)
{
LogViewField field = makeField(QStringLiteral("players"));
field.setMaxArraySize(8, false);
EXPECT_EQ(field.maxArraySize(), 8);
EXPECT_FALSE(field.isDynamicArray());
field.setMaxArraySize(16, true);
EXPECT_EQ(field.maxArraySize(), 16);
EXPECT_TRUE(field.isDynamicArray());
}
TEST(LogViewFieldTest, JsonPathRoundTrips)
{
LogViewField field = makeField(QStringLiteral("issi"));
const QStringList path{QStringLiteral("header"), QStringLiteral("issi")};
field.setJsonPath(path);
EXPECT_EQ(field.jsonPath(), path);
}
TEST(LogViewFieldTest, ChildrenAreOwnedAndOrdered)
{
LogViewField parent(QStringLiteral("header"), LogViewField::e_FieldKindBorder, nullptr);
EXPECT_EQ(parent.childCount(), 0);
auto *first = new LogViewField(QStringLiteral("a"), LogViewField::e_FieldKindEdit, nullptr);
auto *second = new LogViewField(QStringLiteral("b"), LogViewField::e_FieldKindEdit, nullptr);
parent.addChild(first);
parent.addChild(second);
ASSERT_EQ(parent.childCount(), 2);
EXPECT_EQ(parent.child(0), first);
EXPECT_EQ(parent.child(1), second);
parent.removeLastChild();
EXPECT_EQ(parent.childCount(), 1);
EXPECT_EQ(parent.child(0), first);
}