// SPDX-License-Identifier: LGPL-2.1-or-later #include #include "App/ComplexGeoData.h" #include "App/MappedName.h" #include // NOLINTBEGIN(readability-magic-numbers) TEST(MappedName, defaultConstruction) { // Act Data::MappedName mappedName; // Assert EXPECT_EQ(mappedName.isRaw(), false); EXPECT_EQ(mappedName.empty(), true); EXPECT_EQ(mappedName.size(), 0); EXPECT_EQ(mappedName.dataBytes(), QByteArray()); EXPECT_EQ(mappedName.postfixBytes(), QByteArray()); } TEST(MappedName, namedConstruction) { // Act Data::MappedName mappedName("TEST"); // Assert EXPECT_EQ(mappedName.isRaw(), false); EXPECT_EQ(mappedName.empty(), false); EXPECT_EQ(mappedName.size(), 4); EXPECT_EQ(mappedName.dataBytes(), QByteArray("TEST")); EXPECT_EQ(mappedName.postfixBytes(), QByteArray()); } TEST(MappedName, namedConstructionWithMaxSize) { // Act Data::MappedName mappedName("TEST", 2); // Assert EXPECT_EQ(mappedName.isRaw(), false); EXPECT_EQ(mappedName.empty(), false); EXPECT_EQ(mappedName.size(), 2); EXPECT_EQ(mappedName.dataBytes(), QByteArray("TE")); EXPECT_EQ(mappedName.postfixBytes(), QByteArray()); } TEST(MappedName, namedConstructionDiscardPrefix) { // Arrange std::string name = std::string(Data::ELEMENT_MAP_PREFIX) + "TEST"; // Act Data::MappedName mappedName(name.c_str()); // Assert EXPECT_EQ(mappedName.isRaw(), false); EXPECT_EQ(mappedName.empty(), false); EXPECT_EQ(mappedName.size(), 4); EXPECT_EQ(mappedName.dataBytes(), QByteArray("TEST")); EXPECT_EQ(mappedName.postfixBytes(), QByteArray()); } TEST(MappedName, stringNamedConstruction) { // Act Data::MappedName mappedName(std::string("TEST")); // Assert EXPECT_EQ(mappedName.isRaw(), false); EXPECT_EQ(mappedName.empty(), false); EXPECT_EQ(mappedName.size(), 4); EXPECT_EQ(mappedName.dataBytes(), QByteArray("TEST")); EXPECT_EQ(mappedName.postfixBytes(), QByteArray()); } TEST(MappedName, stringNamedConstructionDiscardPrefix) { // Arrange std::string name = std::string(Data::ELEMENT_MAP_PREFIX) + "TEST"; // Act Data::MappedName mappedName(name); // Assert EXPECT_EQ(mappedName.isRaw(), false); EXPECT_EQ(mappedName.empty(), false); EXPECT_EQ(mappedName.size(), 4); EXPECT_EQ(mappedName.dataBytes(), QByteArray("TEST")); EXPECT_EQ(mappedName.postfixBytes(), QByteArray()); } TEST(MappedName, constructFromIndexedNameNoIndex) { // Arrange Data::IndexedName indexedName {"INDEXED_NAME"}; // Act Data::MappedName mappedName {indexedName}; // Assert EXPECT_EQ(mappedName.dataBytes().constData(), indexedName.getType()); // shared memory EXPECT_EQ(mappedName.isRaw(), true); } TEST(MappedName, constructFromIndexedNameWithIndex) { // Arrange Data::IndexedName indexedName {"INDEXED_NAME", 1}; // Act Data::MappedName mappedName {indexedName}; // Assert EXPECT_NE(mappedName.dataBytes().constData(), indexedName.getType()); // NOT shared memory EXPECT_EQ(mappedName.isRaw(), false); EXPECT_EQ(mappedName.toString(), indexedName.toString()); } TEST(MappedName, copyConstructor) { // Arrange Data::MappedName temp("TEST"); // Act Data::MappedName mappedName(temp); // Assert EXPECT_EQ(mappedName.isRaw(), false); EXPECT_EQ(mappedName.empty(), false); EXPECT_EQ(mappedName.size(), 4); EXPECT_EQ(mappedName.dataBytes(), QByteArray("TEST")); EXPECT_EQ(mappedName.postfixBytes(), QByteArray()); } TEST(MappedName, copyConstructorWithPostfix) { // Arrange Data::MappedName temp("TEST"); // Act Data::MappedName mappedName(temp, "POSTFIXTEST"); // Assert EXPECT_EQ(mappedName.isRaw(), false); EXPECT_EQ(mappedName.empty(), false); EXPECT_EQ(mappedName.size(), 15); EXPECT_EQ(mappedName.dataBytes(), QByteArray("TEST")); EXPECT_EQ(mappedName.postfixBytes(), QByteArray("POSTFIXTEST")); // Act Data::MappedName mappedName2(mappedName, "ANOTHERPOSTFIX"); // Assert EXPECT_EQ(mappedName2.isRaw(), false); EXPECT_EQ(mappedName2.empty(), false); EXPECT_EQ(mappedName2.size(), 29); EXPECT_EQ(mappedName2.dataBytes(), QByteArray("TESTPOSTFIXTEST")); EXPECT_EQ(mappedName2.postfixBytes(), QByteArray("ANOTHERPOSTFIX")); } TEST(MappedName, copyConstructorStartpos) { // Arrange Data::MappedName temp(Data::MappedName("TEST"), "POSTFIXTEST"); // Act Data::MappedName mappedName(temp, 2, -1); // Assert EXPECT_EQ(mappedName.isRaw(), false); EXPECT_EQ(mappedName.empty(), false); EXPECT_EQ(mappedName.size(), 13); EXPECT_EQ(mappedName.dataBytes(), QByteArray("ST")); EXPECT_EQ(mappedName.postfixBytes(), QByteArray("POSTFIXTEST")); } TEST(MappedName, copyConstructorStartposAndSize) { // Arrange Data::MappedName temp(Data::MappedName("TEST"), "POSTFIXTEST"); // Act Data::MappedName mappedName(temp, 2, 6); // Assert EXPECT_EQ(mappedName.isRaw(), false); EXPECT_EQ(mappedName.empty(), false); EXPECT_EQ(mappedName.size(), 6); EXPECT_EQ(mappedName.dataBytes(), QByteArray("ST")); EXPECT_EQ(mappedName.postfixBytes(), QByteArray("POST")); } TEST(MappedName, moveConstructor) { // Arrange Data::MappedName temp(Data::MappedName("TEST"), "POSTFIXTEST"); // Act Data::MappedName mappedName(std::move(temp)); // Assert EXPECT_EQ(mappedName.isRaw(), false); EXPECT_EQ(mappedName.empty(), false); EXPECT_EQ(mappedName.size(), 15); EXPECT_EQ(mappedName.dataBytes(), QByteArray("TEST")); EXPECT_EQ(mappedName.postfixBytes(), QByteArray("POSTFIXTEST")); } TEST(MappedName, fromRawData) { // Act Data::MappedName mappedName = Data::MappedName::fromRawData("TESTTEST", 8); // Assert EXPECT_EQ(mappedName.isRaw(), true); EXPECT_EQ(mappedName.empty(), false); EXPECT_EQ(mappedName.size(), 8); EXPECT_EQ(mappedName.dataBytes(), QByteArray("TESTTEST", 8)); EXPECT_EQ(mappedName.postfixBytes(), QByteArray()); } TEST(MappedName, fromRawDataQByteArray) { // Arrange QByteArray testByteArray("TESTTEST", 8); // Act Data::MappedName mappedName = Data::MappedName::fromRawData(testByteArray); // Assert EXPECT_EQ(mappedName.isRaw(), true); EXPECT_EQ(mappedName.empty(), false); EXPECT_EQ(mappedName.size(), 8); EXPECT_EQ(mappedName.dataBytes(), QByteArray("TESTTEST", 8)); EXPECT_EQ(mappedName.postfixBytes(), QByteArray()); } TEST(MappedName, fromRawDataCopy) { // Arrange QByteArray testByteArray("TESTTEST", 8); Data::MappedName temp = Data::MappedName::fromRawData(testByteArray); temp.append("TESTPOSTFIX"); temp.compact(); // Always call compact before accessing data! // Act Data::MappedName mappedName = Data::MappedName::fromRawData(temp, 0); // Assert EXPECT_EQ(mappedName.isRaw(), true); EXPECT_EQ(mappedName.empty(), false); EXPECT_EQ(mappedName.size(), 19); EXPECT_EQ(mappedName.dataBytes(), QByteArray("TESTTEST", 8)); EXPECT_EQ(mappedName.postfixBytes(), QByteArray("TESTPOSTFIX")); } TEST(MappedName, fromRawDataCopyStartposAndSize) { // Arrange QByteArray testByteArray("TESTTEST", 8); Data::MappedName temp = Data::MappedName::fromRawData(testByteArray); temp.append("ABCDEFGHIJKLM"); // postfix temp.compact(); // Always call compact before accessing data! // Act Data::MappedName mappedName = Data::MappedName::fromRawData(temp, 2, 13); // Assert EXPECT_EQ(mappedName.isRaw(), true); EXPECT_EQ(mappedName.empty(), false); EXPECT_EQ(mappedName.size(), 13); EXPECT_EQ(mappedName.dataBytes(), QByteArray("STTEST", 6)); EXPECT_EQ(mappedName.postfixBytes(), QByteArray("ABCDEFG")); } TEST(MappedName, assignmentOperator) { // Arrange Data::MappedName temp(Data::MappedName("TEST"), "POSTFIXTEST"); // Act Data::MappedName mappedName = temp; // Assert EXPECT_EQ(mappedName.isRaw(), false); EXPECT_EQ(mappedName.empty(), false); EXPECT_EQ(mappedName.size(), 15); EXPECT_EQ(mappedName.dataBytes(), QByteArray("TEST")); EXPECT_EQ(mappedName.postfixBytes(), QByteArray("POSTFIXTEST")); } TEST(MappedName, assignmentOperatorString) { // Arrange Data::MappedName mappedName; // Act mappedName = std::string("TEST"); // Assert EXPECT_EQ(mappedName.isRaw(), false); EXPECT_EQ(mappedName.empty(), false); EXPECT_EQ(mappedName.size(), 4); EXPECT_EQ(mappedName.dataBytes(), QByteArray("TEST")); EXPECT_EQ(mappedName.postfixBytes(), QByteArray()); } TEST(MappedName, assignmentOperatorConstCharPtr) { // Arrange Data::MappedName mappedName; // Act mappedName = "TEST"; // Assert EXPECT_EQ(mappedName.isRaw(), false); EXPECT_EQ(mappedName.empty(), false); EXPECT_EQ(mappedName.size(), 4); EXPECT_EQ(mappedName.dataBytes(), QByteArray("TEST")); EXPECT_EQ(mappedName.postfixBytes(), QByteArray()); } TEST(MappedName, assignmentOperatorMove) { // Arrange Data::MappedName temp(Data::MappedName("TEST"), "POSTFIXTEST"); // Act Data::MappedName mappedName = std::move(temp); // Assert EXPECT_EQ(mappedName.isRaw(), false); EXPECT_EQ(mappedName.empty(), false); EXPECT_EQ(mappedName.size(), 15); EXPECT_EQ(mappedName.dataBytes(), QByteArray("TEST")); EXPECT_EQ(mappedName.postfixBytes(), QByteArray("POSTFIXTEST")); } TEST(MappedName, streamInsertionOperator) { // Arrange Data::MappedName mappedName(Data::MappedName("TEST"), "POSTFIXTEST"); std::stringstream ss; // Act ss << mappedName; // Assert EXPECT_EQ(ss.str(), std::string("TESTPOSTFIXTEST")); } TEST(MappedName, comparisonOperators) { // Arrange Data::MappedName mappedName1(Data::MappedName("TEST"), "POSTFIXTEST"); Data::MappedName mappedName2(Data::MappedName("TEST"), "POSTFIXTEST"); Data::MappedName mappedName3(Data::MappedName("TESTPOST"), "FIXTEST"); Data::MappedName mappedName4(Data::MappedName("THIS"), "ISDIFFERENT"); // Act & Assert EXPECT_EQ(mappedName1 == mappedName1, true); EXPECT_EQ(mappedName1 == mappedName2, true); EXPECT_EQ(mappedName1 == mappedName3, true); EXPECT_EQ(mappedName1 == mappedName4, false); EXPECT_EQ(mappedName1 != mappedName1, false); EXPECT_EQ(mappedName1 != mappedName2, false); EXPECT_EQ(mappedName1 != mappedName3, false); EXPECT_EQ(mappedName1 != mappedName4, true); } TEST(MappedName, additionOperators) { // Arrange Data::MappedName mappedName(Data::MappedName("TEST"), "POSTFIXTEST"); QByteArray post3("POST3"); // Act mappedName += "POST1"; mappedName += std::string("POST2"); mappedName += post3; mappedName += Data::MappedName("POST4"); // Assert EXPECT_EQ(mappedName.isRaw(), false); EXPECT_EQ(mappedName.empty(), false); EXPECT_EQ(mappedName.size(), 35); EXPECT_EQ(mappedName.dataBytes(), QByteArray("TEST")); EXPECT_EQ(mappedName.postfixBytes(), QByteArray("POSTFIXTESTPOST1POST2POST3POST4")); // Arrange mappedName = Data::MappedName(Data::MappedName("TEST"), "POSTFIXTEST"); QByteArray post8("POST8"); // Act mappedName = mappedName + Data::MappedName("POST5"); mappedName = mappedName + "POST6"; mappedName = mappedName + std::string("POST7"); mappedName = mappedName + post8; // Assert EXPECT_EQ(mappedName.isRaw(), false); EXPECT_EQ(mappedName.empty(), false); EXPECT_EQ(mappedName.size(), 35); EXPECT_EQ(mappedName.dataBytes(), QByteArray("TEST")); EXPECT_EQ(mappedName.postfixBytes(), QByteArray("POSTFIXTESTPOST5POST6POST7POST8")); } TEST(MappedName, append) { // Arrange Data::MappedName mappedName; // Act mappedName.append("TEST"); // Assert EXPECT_EQ(mappedName.isRaw(), false); EXPECT_EQ(mappedName.empty(), false); EXPECT_EQ(mappedName.size(), 4); EXPECT_EQ(mappedName.dataBytes(), QByteArray("TEST")); EXPECT_EQ(mappedName.postfixBytes(), QByteArray("")); // Act mappedName.append("POSTFIX"); // Assert EXPECT_EQ(mappedName.isRaw(), false); EXPECT_EQ(mappedName.empty(), false); EXPECT_EQ(mappedName.size(), 11); EXPECT_EQ(mappedName.dataBytes(), QByteArray("TEST")); EXPECT_EQ(mappedName.postfixBytes(), QByteArray("POSTFIX")); // Act mappedName.append("ANOTHERPOSTFIX", 5); // Assert EXPECT_EQ(mappedName.isRaw(), false); EXPECT_EQ(mappedName.empty(), false); EXPECT_EQ(mappedName.size(), 16); EXPECT_EQ(mappedName.dataBytes(), QByteArray("TEST")); EXPECT_EQ(mappedName.postfixBytes(), QByteArray("POSTFIXANOTH")); } TEST(MappedName, appendMappedNameObj) { // Arrange Data::MappedName mappedName; Data::MappedName temp(Data::MappedName("TEST"), "POSTFIXTEST"); // Act mappedName.append(temp); // Assert EXPECT_EQ(mappedName.isRaw(), false); EXPECT_EQ(mappedName.empty(), false); EXPECT_EQ(mappedName.size(), 15); EXPECT_EQ(mappedName.dataBytes(), QByteArray("TEST")); EXPECT_EQ(mappedName.postfixBytes(), QByteArray("POSTFIXTEST")); // Act mappedName.append(temp, 2, 7); // Assert EXPECT_EQ(mappedName.isRaw(), false); EXPECT_EQ(mappedName.empty(), false); EXPECT_EQ(mappedName.size(), 22); EXPECT_EQ(mappedName.dataBytes(), QByteArray("TEST")); EXPECT_EQ(mappedName.postfixBytes(), QByteArray("POSTFIXTESTSTPOSTF")); } TEST(MappedName, toString) { // Arrange Data::MappedName mappedName(Data::MappedName("TEST"), "POSTFIXTEST"); // Act & Assert EXPECT_EQ(mappedName.toString(0), "TESTPOSTFIXTEST"); EXPECT_EQ(mappedName.toString(0), std::string("TESTPOSTFIXTEST")); EXPECT_EQ(mappedName.toString(2, 8), "STPOSTFI"); EXPECT_EQ(mappedName.toString(2, 8), std::string("STPOSTFI")); } TEST(MappedName, toConstString) { // Arrange Data::MappedName mappedName(Data::MappedName("TEST"), "POSTFIXTEST"); int size {0}; // Act const char* temp = mappedName.toConstString(0, size); // Assert EXPECT_EQ(QByteArray(temp, size), QByteArray("TEST")); EXPECT_EQ(size, 4); // Act const char* temp2 = mappedName.toConstString(7, size); // Assert EXPECT_EQ(QByteArray(temp2, size), QByteArray("TFIXTEST")); EXPECT_EQ(size, 8); } TEST(MappedName, toRawBytes) { // Arrange Data::MappedName mappedName(Data::MappedName("TEST"), "POSTFIXTEST"); // Act & Assert EXPECT_EQ(mappedName.toRawBytes(), QByteArray("TESTPOSTFIXTEST")); EXPECT_EQ(mappedName.toRawBytes(3), QByteArray("TPOSTFIXTEST")); EXPECT_EQ(mappedName.toRawBytes(7, 3), QByteArray("TFI")); EXPECT_EQ(mappedName.toRawBytes(502, 5), QByteArray()); } TEST(MappedName, toIndexedNameASCIIOnly) { // Arrange Data::MappedName mappedName {"MAPPED_NAME"}; // Act auto indexedName = mappedName.toIndexedName(); // Assert EXPECT_FALSE(indexedName.isNull()); } TEST(MappedName, toIndexedNameInvalid) { // Arrange Data::MappedName mappedName {"MAPPED-NAME"}; // Act auto indexedName = mappedName.toIndexedName(); // Assert EXPECT_TRUE(indexedName.isNull()); } TEST(MappedName, appendToBuffer) { // Arrange Data::MappedName mappedName(Data::MappedName("TEST"), "POSTFIXTEST"); std::string buffer("STUFF"); // Act mappedName.appendToBuffer(buffer); // Assert EXPECT_EQ(buffer, std::string("STUFFTESTPOSTFIXTEST")); // Act mappedName.appendToBuffer(buffer, 2, 7); // Assert EXPECT_EQ(buffer, std::string("STUFFTESTPOSTFIXTESTSTPOSTF")); } TEST(MappedName, appendToBufferWithPrefix) { // Arrange Data::MappedName mappedName(Data::MappedName("TEST"), "POSTFIXTEST"); std::string buffer("STUFF"); std::string elemMapPrefix = Data::ELEMENT_MAP_PREFIX; // Act mappedName.appendToBufferWithPrefix(buffer); // Assert EXPECT_EQ(buffer, std::string("STUFF") + elemMapPrefix + std::string("TESTPOSTFIXTEST")); // Arrange Data::MappedName mappedName2("TEST"); // If mappedName does not have a postfix and is a valid // indexedName: prefix is not added // Act mappedName2.appendToBufferWithPrefix(buffer); // Assert EXPECT_EQ( buffer, std::string("STUFF") + elemMapPrefix + std::string("TESTPOSTFIXTEST") + /*missing prefix*/ std::string("TEST") ); } TEST(MappedName, toPrefixedString) { // Arrange Data::MappedName mappedName(Data::MappedName("TEST"), "POSTFIXTEST"); std::string buffer("STUFF"); std::string elemMapPrefix = Data::ELEMENT_MAP_PREFIX; // Act buffer += mappedName.toPrefixedString(); // Assert EXPECT_EQ(buffer, std::string("STUFF") + elemMapPrefix + std::string("TESTPOSTFIXTEST")); // Arrange Data::MappedName mappedName2("TEST"); // If mappedName does not have a postfix and is a valid // indexedName: prefix is not added // Act buffer += mappedName2.toPrefixedString(); // Assert EXPECT_EQ( buffer, std::string("STUFF") + elemMapPrefix + std::string("TESTPOSTFIXTEST") + /*missing prefix*/ std::string("TEST") ); } TEST(MappedName, toBytes) { // Arrange Data::MappedName mappedName(Data::MappedName("TEST"), "POSTFIXTEST"); // Act & Assert EXPECT_EQ(mappedName.toBytes(), QByteArray("TESTPOSTFIXTEST")); } TEST(MappedName, compare) { // Arrange Data::MappedName mappedName1(Data::MappedName("TEST"), "POSTFIXTEST"); Data::MappedName mappedName2(Data::MappedName("TEST"), "POSTFIXTEST"); Data::MappedName mappedName3(Data::MappedName("TESTPOST"), "FIXTEST"); Data::MappedName mappedName4(Data::MappedName("THIS"), "ISDIFFERENT"); Data::MappedName mappedName5(Data::MappedName("SH"), "ORTHER"); Data::MappedName mappedName6(Data::MappedName("VERYVERYVERY"), "VERYMUCHLONGER"); // Act & Assert EXPECT_EQ(mappedName1.compare(mappedName1), 0); EXPECT_EQ(mappedName1.compare(mappedName2), 0); EXPECT_EQ(mappedName1.compare(mappedName3), 0); EXPECT_EQ(mappedName1.compare(mappedName4), -1); EXPECT_EQ(mappedName1.compare(mappedName5), 1); EXPECT_EQ(mappedName1.compare(mappedName6), -1); EXPECT_EQ(mappedName1 < mappedName1, false); EXPECT_EQ(mappedName1 < mappedName2, false); EXPECT_EQ(mappedName1 < mappedName3, false); EXPECT_EQ(mappedName1 < mappedName4, true); EXPECT_EQ(mappedName1 < mappedName5, false); EXPECT_EQ(mappedName1 < mappedName6, true); } TEST(MappedName, subscriptOperator) { // Arrange Data::MappedName mappedName(Data::MappedName("TEST"), "POSTFIXTEST"); // Act & Assert EXPECT_EQ(mappedName[0], 'T'); EXPECT_EQ(mappedName[1], 'E'); EXPECT_EQ(mappedName[2], 'S'); EXPECT_EQ(mappedName[3], 'T'); EXPECT_EQ(mappedName[4], 'P'); EXPECT_EQ(mappedName[5], 'O'); EXPECT_EQ(mappedName[6], 'S'); EXPECT_EQ(mappedName[7], 'T'); EXPECT_EQ(mappedName[8], 'F'); EXPECT_EQ(mappedName[9], 'I'); } TEST(MappedName, copy) { // Arrange Data::MappedName mappedName(Data::MappedName("TEST"), "POSTFIXTEST"); // Act Data::MappedName mappedName2 = mappedName.copy(); // Assert EXPECT_EQ(mappedName, mappedName2); } TEST(MappedName, compact) { // Arrange Data::MappedName mappedName = Data::MappedName::fromRawData("TESTTEST", 8); // Act mappedName.compact(); // Assert EXPECT_EQ(mappedName.isRaw(), false); EXPECT_EQ(mappedName.empty(), false); EXPECT_EQ(mappedName.size(), 8); EXPECT_EQ(mappedName.dataBytes(), QByteArray("TESTTEST", 8)); EXPECT_EQ(mappedName.postfixBytes(), QByteArray()); } TEST(MappedName, boolOperator) { // Arrange Data::MappedName mappedName; // Act & Assert EXPECT_EQ((bool)mappedName, false); // Arrange mappedName.append("TEST"); // Act & Assert EXPECT_EQ((bool)mappedName, true); } TEST(MappedName, clear) { // Arrange Data::MappedName mappedName(Data::MappedName("TEST"), "POSTFIXTEST"); // Act mappedName.clear(); // Assert EXPECT_EQ(mappedName.empty(), true); } TEST(MappedName, find) { // Arrange Data::MappedName mappedName(Data::MappedName("TEST"), "POSTFIXTEST"); // Act & Assert EXPECT_EQ(mappedName.find(nullptr), -1); EXPECT_EQ(mappedName.find(""), 0); EXPECT_EQ(mappedName.find(std::string("")), 0); EXPECT_EQ(mappedName.find("TEST"), 0); EXPECT_EQ(mappedName.find("STPO"), -1); // sentence must be fully contained in data or postfix EXPECT_EQ(mappedName.find("POST"), 4); EXPECT_EQ(mappedName.find("POST", 4), 4); EXPECT_EQ(mappedName.find("POST", 5), -1); EXPECT_EQ(mappedName.rfind("ST"), 13); EXPECT_EQ(mappedName.rfind("ST", 15), 13); EXPECT_EQ(mappedName.rfind("ST", 14), 13); EXPECT_EQ(mappedName.rfind("ST", 13), 13); EXPECT_EQ(mappedName.rfind("ST", 12), 6); EXPECT_EQ(mappedName.rfind("ST", 11), 6); EXPECT_EQ(mappedName.rfind("ST", 10), 6); EXPECT_EQ(mappedName.rfind("ST", 9), 6); EXPECT_EQ(mappedName.rfind("ST", 8), 6); EXPECT_EQ(mappedName.rfind("ST", 7), 6); EXPECT_EQ(mappedName.rfind("ST", 6), 6); EXPECT_EQ(mappedName.rfind("ST", 5), 2); EXPECT_EQ(mappedName.rfind("ST", 4), 2); EXPECT_EQ(mappedName.rfind("ST", 3), 2); EXPECT_EQ(mappedName.rfind("ST", 2), 2); EXPECT_EQ(mappedName.rfind("ST", 1), -1); EXPECT_EQ(mappedName.rfind("ST", 0), -1); } TEST(MappedName, rfind) { // Arrange Data::MappedName mappedName(Data::MappedName("TEST"), "POSTFIXTEST"); // Act & Assert EXPECT_EQ(mappedName.rfind(nullptr), -1); EXPECT_EQ(mappedName.rfind(""), mappedName.size()); EXPECT_EQ(mappedName.rfind(std::string("")), mappedName.size()); EXPECT_EQ(mappedName.rfind("TEST"), 11); EXPECT_EQ(mappedName.rfind("STPO"), -1); // sentence must be fully contained in data or postfix EXPECT_EQ(mappedName.rfind("POST"), 4); EXPECT_EQ(mappedName.rfind("POST", 4), 4); EXPECT_EQ(mappedName.rfind("POST", 3), -1); EXPECT_EQ(mappedName.rfind("ST"), 13); EXPECT_EQ(mappedName.rfind("ST", 0), -1); EXPECT_EQ(mappedName.rfind("ST", 1), -1); EXPECT_EQ(mappedName.rfind("ST", 2), 2); EXPECT_EQ(mappedName.rfind("ST", 3), 2); EXPECT_EQ(mappedName.rfind("ST", 4), 2); EXPECT_EQ(mappedName.rfind("ST", 5), 2); EXPECT_EQ(mappedName.rfind("ST", 6), 6); EXPECT_EQ(mappedName.rfind("ST", 7), 6); EXPECT_EQ(mappedName.rfind("ST", 8), 6); EXPECT_EQ(mappedName.rfind("ST", 9), 6); EXPECT_EQ(mappedName.rfind("ST", 10), 6); EXPECT_EQ(mappedName.rfind("ST", 11), 6); EXPECT_EQ(mappedName.rfind("ST", 12), 6); EXPECT_EQ(mappedName.rfind("ST", 13), 13); EXPECT_EQ(mappedName.rfind("ST", 14), 13); EXPECT_EQ(mappedName.rfind("ST", 15), 13); } TEST(MappedName, endswith) { // Arrange Data::MappedName mappedName("TEST"); // Act & Assert EXPECT_EQ(mappedName.endsWith(nullptr), false); EXPECT_EQ(mappedName.endsWith("TEST"), true); EXPECT_EQ(mappedName.endsWith(std::string("TEST")), true); EXPECT_EQ(mappedName.endsWith("WASD"), false); // Arrange mappedName.append("POSTFIX"); // Act & Assert EXPECT_EQ(mappedName.endsWith(nullptr), false); EXPECT_EQ(mappedName.endsWith("TEST"), false); EXPECT_EQ(mappedName.endsWith("FIX"), true); } TEST(MappedName, startsWith) { // Arrange Data::MappedName mappedName; // Act & Assert EXPECT_EQ(mappedName.startsWith(nullptr), false); EXPECT_EQ(mappedName.startsWith(QByteArray()), true); EXPECT_EQ(mappedName.startsWith(""), true); EXPECT_EQ(mappedName.startsWith(std::string("")), true); EXPECT_EQ(mappedName.startsWith("WASD"), false); // Arrange mappedName.append("TEST"); // Act & Assert EXPECT_EQ(mappedName.startsWith(nullptr), false); EXPECT_EQ(mappedName.startsWith(QByteArray()), true); EXPECT_EQ(mappedName.startsWith("TEST"), true); EXPECT_EQ(mappedName.startsWith(std::string("TEST")), true); EXPECT_EQ(mappedName.startsWith("WASD"), false); } TEST(MappedName, findTagInElementNameHexPositiveIndexNonrecursive) { // The non-recursive version will find just the last tag, prefixed by the POSTFIX_TAG (";:H"). // It consists of a tag (stored in hexadecimal) and a length (also stored in hex), separated by // a colon. In this example, we expect the get ;:H1b:10,F as our element, which is a tag of // 0x1b and an indicated length of 0x10 (16 bytes). So the output length is the position of the // tag (36) minus the indicated length, giving 20. // Arrange Data::MappedName mappedName("#94;:G0;XTR;:H19:8,F;:H1a,F;BND:-1:0;:H1b:10,F"); long tagOutput {0}; int lenOutput {0}; std::string postfix; char type {0}; // Act int result = mappedName.findTagInElementName(&tagOutput, &lenOutput, &postfix, &type, false, false); // Assert EXPECT_EQ(result, 36); // The location of the tag EXPECT_EQ(tagOutput, 0x1b); // The tag EXPECT_EQ(lenOutput, 20); // The calculated length based on the tag's length parameter EXPECT_EQ(postfix, ";:H1b:10,F"); EXPECT_EQ(type, 'F'); // F=Face } TEST(MappedName, findTagInElementNameDecPositiveIndexNonrecursive) { // Test backwards compatibility with the older style decimal tag storage. // Arrange Data::MappedName mappedName("#94;:G0;XTR;:T19:8,F;:T26,F;BND:-1:0;:T27:16,F"); long tagOutput {0}; int lenOutput {0}; std::string postfix; char type {0}; // Act int result = mappedName.findTagInElementName(&tagOutput, &lenOutput, &postfix, &type, false, false); // Assert EXPECT_EQ(result, 36); // The location of the tag EXPECT_EQ(tagOutput, 27); // The tag EXPECT_EQ(lenOutput, 16); // The specified length EXPECT_EQ(postfix, ";:T27:16,F"); EXPECT_EQ(type, 'F'); // F=Face } TEST(MappedName, findTagInElementNameHexNegativeIndexNonrecursive) { // Test handling a negative index that is flipped to positive // Arrange Data::MappedName mappedName("#94;:G0;XTR;:H19:8,F;:H1a,F;BND:-1:0;:H-1b:10,F"); long tagOutput {0}; int lenOutput {0}; std::string postfix; char type {0}; // Act int result = mappedName.findTagInElementName(&tagOutput, &lenOutput, &postfix, &type, false, false); // Assert EXPECT_EQ(result, 36); // The location of the tag EXPECT_EQ(tagOutput, 0x1b); // The tag is returned positive, even though it was input negative EXPECT_EQ(lenOutput, 20); // The calculated length based on the tag's length parameter EXPECT_EQ(postfix, ";:H-1b:10,F"); EXPECT_EQ(type, 'F'); // F=Face } TEST(MappedName, findTagInElementNameHexExpectedNegativeIndexNonrecursive) { // Test handling an untransformed negative index // Arrange Data::MappedName mappedName("#94;:G0;XTR;:H19:8,F;:H1a,F;BND:-1:0;:H-1b:10,F"); long tagOutput {0}; int lenOutput {0}; std::string postfix; char type {0}; // Act int result = mappedName.findTagInElementName(&tagOutput, &lenOutput, &postfix, &type, true, false); // Assert EXPECT_EQ(result, 36); // The location of the tag EXPECT_EQ(tagOutput, -0x1b); // The tag is returned negative EXPECT_EQ(lenOutput, 20); // The calculated length based on the tag's length parameter EXPECT_EQ(postfix, ";:H-1b:10,F"); EXPECT_EQ(type, 'F'); // F=Face } TEST(MappedName, findTagInElementNameRecursive) { // Test the recursive resolution of the name // Arrange Data::MappedName mappedName("#94;:G0;XTR;:H19:8,F;:H1a,F;BND:-1:0;:H1b:10,F"); long tagOutput {0}; int lenOutput {0}; std::string postfix; char type {0}; // Act int result = mappedName.findTagInElementName(&tagOutput, &lenOutput, &postfix, &type, false, true); // Assert EXPECT_EQ(result, 36); // The location of the tag EXPECT_EQ(tagOutput, 0x1b); // The tag EXPECT_EQ(lenOutput, 27); // Now includes the next tag, from the recursive search EXPECT_EQ(postfix, ";:H1b:10,F"); EXPECT_EQ(type, 'F'); // F=Face } TEST(MappedName, hash) { // Arrange Data::MappedName mappedName(Data::MappedName("TEST"), "POSTFIXTEST"); // Act & Assert EXPECT_EQ(mappedName.hash(), qHash(QByteArray("TEST"), qHash(QByteArray("POSTFIXTEST")))); } // NOLINTEND(readability-magic-numbers)