196 lines
5.7 KiB
C++
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);
|
|
}
|