/** * @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 #include #include #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); }