3
#include "App/MappedName.h"
4
#include "gtest/gtest.h"
6
#include <App/StringHasher.h>
7
#include <App/StringHasherPy.h>
8
#include <App/StringIDPy.h>
10
#include <QCryptographicHash>
13
class StringIDTest: public ::testing::Test
19
static App::StringID givenFlaggedStringID(App::StringID::Flag flag)
21
const long value {42};
22
const QByteArray data {"data", 4};
23
return App::StringID {value, data, flag};
27
TEST_F(StringIDTest, stringIDManualConstructionNoFlags)
30
const long expectedValue {42};
31
const QByteArray expectedData {"data", 4};
34
auto id = App::StringID(expectedValue, expectedData);
37
EXPECT_EQ(expectedValue, id.value());
38
EXPECT_EQ(expectedData, id.data());
39
EXPECT_FALSE(id.isBinary());
42
TEST_F(StringIDTest, stringIDManualConstructionWithFlag)
45
const long expectedValue {42};
46
const QByteArray expectedData {"data", 4};
47
const App::StringID::Flags expectedFlags {App::StringID::Flag::Binary};
50
auto id = App::StringID(expectedValue, expectedData, expectedFlags);
53
EXPECT_EQ(expectedValue, id.value());
54
EXPECT_EQ(expectedData, id.data());
55
EXPECT_TRUE(id.isBinary());
58
TEST_F(StringIDTest, stringIDDefaultConstruction)
61
auto id = App::StringID();
64
EXPECT_EQ(0, id.value());
67
TEST_F(StringIDTest, value)
70
const long expectedValueA {0};
71
auto idA = App::StringID(expectedValueA, nullptr);
72
const long expectedValueB {42};
73
auto idB = App::StringID(expectedValueB, nullptr);
74
const long expectedValueC {314159};
75
auto idC = App::StringID(expectedValueC, nullptr);
78
auto valueA = idA.value();
79
auto valueB = idB.value();
80
auto valueC = idC.value();
83
EXPECT_EQ(expectedValueA, valueA);
84
EXPECT_EQ(expectedValueB, valueB);
85
EXPECT_EQ(expectedValueC, valueC);
88
TEST_F(StringIDTest, relatedIDs)
93
TEST_F(StringIDTest, isBinary)
96
auto flaggedID = givenFlaggedStringID(App::StringID::Flag::Binary);
97
auto controlID = App::StringID {};
100
EXPECT_TRUE(flaggedID.isBinary());
101
EXPECT_FALSE(controlID.isBinary());
104
TEST_F(StringIDTest, isHashed)
107
auto flaggedID = givenFlaggedStringID(App::StringID::Flag::Hashed);
108
auto controlID = App::StringID {};
111
EXPECT_TRUE(flaggedID.isHashed());
112
EXPECT_FALSE(controlID.isHashed());
115
TEST_F(StringIDTest, isPostfixed)
118
auto flaggedID = givenFlaggedStringID(App::StringID::Flag::Postfixed);
119
auto controlID = App::StringID {};
122
EXPECT_TRUE(flaggedID.isPostfixed());
123
EXPECT_FALSE(controlID.isPostfixed());
126
TEST_F(StringIDTest, isPostfixEncoded)
129
auto flaggedID = givenFlaggedStringID(App::StringID::Flag::PostfixEncoded);
130
auto controlID = App::StringID {};
133
EXPECT_TRUE(flaggedID.isPostfixEncoded());
134
EXPECT_FALSE(controlID.isPostfixEncoded());
137
TEST_F(StringIDTest, isIndexed)
140
auto flaggedID = givenFlaggedStringID(App::StringID::Flag::Indexed);
141
auto controlID = App::StringID {};
144
EXPECT_TRUE(flaggedID.isIndexed());
145
EXPECT_FALSE(controlID.isIndexed());
148
TEST_F(StringIDTest, isPrefixID)
151
auto flaggedID = givenFlaggedStringID(App::StringID::Flag::PrefixID);
152
auto controlID = App::StringID {};
155
EXPECT_TRUE(flaggedID.isPrefixID());
156
EXPECT_FALSE(controlID.isPrefixID());
159
TEST_F(StringIDTest, isPrefixIDIndex)
162
auto flaggedID = givenFlaggedStringID(App::StringID::Flag::PrefixIDIndex);
163
auto controlID = App::StringID {};
166
EXPECT_TRUE(flaggedID.isPrefixIDIndex());
167
EXPECT_FALSE(controlID.isPrefixIDIndex());
170
TEST_F(StringIDTest, isMarked)
173
auto flaggedID = givenFlaggedStringID(App::StringID::Flag::Marked);
174
auto controlID = App::StringID {};
177
EXPECT_TRUE(flaggedID.isMarked());
178
EXPECT_FALSE(controlID.isMarked());
181
TEST_F(StringIDTest, isPersistent)
184
auto flaggedID = givenFlaggedStringID(App::StringID::Flag::Persistent);
185
auto controlID = App::StringID {};
188
EXPECT_TRUE(flaggedID.isPersistent());
189
EXPECT_FALSE(controlID.isPersistent());
192
TEST_F(StringIDTest, isFromSameHasher)
197
TEST_F(StringIDTest, getHasher)
202
TEST_F(StringIDTest, data)
205
QByteArray expectedData {"data", 4};
206
auto id = App::StringID(1, expectedData);
209
auto data = id.data();
212
EXPECT_EQ(expectedData, data);
215
TEST_F(StringIDTest, postfix)
220
TEST_F(StringIDTest, getPyObject)
224
auto id = new App::StringID(1, nullptr);
228
Py::Object py(id->getPyObject(), true);
232
EXPECT_TRUE(PyObject_TypeCheck(py.ptr(), &App::StringIDPy::Type));
235
TEST_F(StringIDTest, getPyObjectWithIndex)
239
auto id = new App::StringID(1, nullptr);
243
Py::Object py(id->getPyObjectWithIndex(2), true);
247
ASSERT_TRUE(PyObject_TypeCheck(py.ptr(), &App::StringIDPy::Type));
250
TEST_F(StringIDTest, toStringWithoutIndex)
253
const long bigHex = 0xfcad10;
254
auto idA = App::StringID(1, QByteArray {"data", 4});
255
auto idB = App::StringID(bigHex, QByteArray {"data", 4});
258
auto resultA = idA.toString();
259
auto resultB = idB.toString();
262
EXPECT_EQ(std::string("#1"), resultA);
263
EXPECT_EQ(std::string("#fcad10"), resultB);
266
TEST_F(StringIDTest, toStringWithIndex)
269
const long bigHex = 0xfcad10;
270
auto id = App::StringID(1, QByteArray {"data", 4});
273
auto resultA = id.toString(bigHex);
274
auto resultB = id.toString(0);
277
EXPECT_EQ(std::string("#1:fcad10"), resultA);
278
EXPECT_EQ(std::string("#1"), resultB);
281
TEST_F(StringIDTest, fromStringWithEOFAndLengthGood)
284
const std::string testString {"#1:fcad"};
288
App::StringID::fromString(testString.c_str(), true, static_cast<int>(testString.length()));
291
EXPECT_EQ(result.id, 1);
292
EXPECT_EQ(result.index, 0xfcad);
295
TEST_F(StringIDTest, fromStringExtraData)
298
const std::string testString {"#1:fcad#2:bad"};
302
App::StringID::fromString(testString.c_str(), true, static_cast<int>(testString.length()));
304
App::StringID::fromString(testString.c_str(), false, static_cast<int>(testString.length()));
307
EXPECT_EQ(trueResult.id, -1);
308
EXPECT_EQ(falseResult.id, 1);
311
TEST_F(StringIDTest, fromStringLengthUnspecified)
314
const std::string testString {"#1:fcad#2:bad"};
317
auto trueResult = App::StringID::fromString(testString.c_str(), true);
318
auto falseResult = App::StringID::fromString(testString.c_str(), false);
321
EXPECT_EQ(trueResult.id, -1);
322
EXPECT_EQ(falseResult.id, 1);
325
TEST_F(StringIDTest, fromStringShorterLength)
328
const int dataLength {7};
329
const std::string testString {"#1:fcad#2:bad"};
332
auto trueResult = App::StringID::fromString(testString.c_str(), true, dataLength);
333
auto falseResult = App::StringID::fromString(testString.c_str(), false, dataLength);
336
EXPECT_EQ(trueResult.id, 1);
337
EXPECT_EQ(falseResult.id, 1);
340
TEST_F(StringIDTest, fromStringNoHashtag)
343
const std::string testString {"1:fcad"};
346
auto result = App::StringID::fromString(testString.c_str(), true);
349
EXPECT_EQ(result.id, -1);
352
TEST_F(StringIDTest, fromStringNotHex)
355
const std::string testStringA {"1:freecad"};
356
const std::string testStringB {"zoink:2"};
359
auto resultA = App::StringID::fromString(testStringA.c_str(), false);
360
auto resultB = App::StringID::fromString(testStringB.c_str(), false);
363
EXPECT_EQ(resultA.id, -1);
364
EXPECT_EQ(resultB.id, -1);
367
TEST_F(StringIDTest, fromStringQByteArray)
370
const QByteArray testString {"#1:fcad", 7};
373
auto result = App::StringID::fromString(testString, true);
376
EXPECT_EQ(result.id, 1);
377
EXPECT_EQ(result.index, 0xfcad);
380
TEST_F(StringIDTest, dataToTextHashed)
383
QByteArray buffer {"120ca87015d849dbea060eaf2295fcc4ee981427", 40};
384
auto id = App::StringID(1, buffer, App::StringID::Flag::Hashed);
387
auto result = id.dataToText(0);
390
EXPECT_EQ(result, buffer.toBase64().constData());
393
TEST_F(StringIDTest, dataToTextBinary)
396
QByteArray buffer {"120ca87015d849dbea060eaf2295fcc4ee981427", 40};
397
auto id = App::StringID(1, buffer, App::StringID::Flag::Binary);
400
auto result = id.dataToText(0);
403
EXPECT_EQ(result, buffer.toBase64().constData());
406
TEST_F(StringIDTest, dataToTextNoIndex)
409
QByteArray data {"data", 4};
410
auto id = App::StringID(1, data);
413
auto result = id.dataToText(0);
416
EXPECT_EQ(result, "data");
419
TEST_F(StringIDTest, dataToTextWithIndex)
422
QByteArray data {"data", 4};
423
auto id = App::StringID(1, data);
426
auto resultA = id.dataToText(1);
427
auto resultB = id.dataToText(1024);
430
EXPECT_EQ(resultA, "data1");
431
EXPECT_EQ(resultB, "data1024");
434
TEST_F(StringIDTest, dataToTextWithPostfix)
437
QByteArray data {"data", 4};
438
QByteArray postfix {"postfix", 7};
439
auto id = App::StringID(1, data);
440
id.setPostfix(postfix);
443
auto result = id.dataToText(1);
446
EXPECT_EQ(result, "data1postfix");
449
TEST_F(StringIDTest, dataToBytesNoIndex)
452
QByteArray data {"data", 4};
453
auto id = App::StringID(1, data);
456
auto result = id.dataToBytes();
459
EXPECT_EQ(data, result);
462
TEST_F(StringIDTest, dataToBytesWithIndex)
465
QByteArray data {"data", 4};
466
const int index {1234};
467
auto id = App::StringID(1, data);
470
auto result = id.dataToBytes(index);
473
EXPECT_EQ(data + QByteArray::number(index), result);
476
TEST_F(StringIDTest, dataToBytesWithPostfix)
479
QByteArray data {"data", 4};
480
QByteArray postfix {"postfix", 7};
481
auto id = App::StringID(1, data);
482
id.setPostfix(postfix);
485
auto result = id.dataToBytes();
488
EXPECT_EQ(data + postfix, result);
491
TEST_F(StringIDTest, dataToBytesWithIndexAndPostfix)
494
QByteArray data {"data", 4};
495
QByteArray postfix {"postfix", 7};
496
const int index {1234};
497
auto id = App::StringID(1, data);
498
id.setPostfix(postfix);
501
auto result = id.dataToBytes(index);
504
EXPECT_EQ(data + QByteArray::number(index) + postfix, result);
507
TEST_F(StringIDTest, mark)
510
QByteArray data {"data", 4};
511
auto id = App::StringID(1, data);
512
ASSERT_FALSE(id.isMarked());
518
EXPECT_TRUE(id.isMarked());
521
TEST_F(StringIDTest, setPersistent)
524
QByteArray data {"data", 4};
525
auto id = App::StringID(1, data);
526
ASSERT_FALSE(id.isPersistent());
529
id.setPersistent(true);
532
EXPECT_TRUE(id.isPersistent());
535
TEST_F(StringIDTest, operatorLessThan)
540
TEST_F(StringIDTest, compare)
545
TEST_F(StringIDTest, IndexIDBooleanConversion)
549
const int index {123};
550
App::StringID::IndexID indexIdTrue {id, index};
551
App::StringID::IndexID indexIdFalse {0, index};
554
EXPECT_TRUE(indexIdTrue);
555
EXPECT_FALSE(indexIdFalse);
558
TEST_F(StringIDTest, IndexIDStreamInsertionOperator)
562
const int index {123};
563
App::StringID::IndexID indexIdNonZero {id, index};
564
App::StringID::IndexID indexIdZero {id, 0};
565
std::ostringstream stream;
568
stream << indexIdNonZero << " " << indexIdZero;
571
EXPECT_EQ("42:123 42", stream.str());
575
class StringIDRefTest: public ::testing::Test
581
App::StringID* createStringID() const
583
return new App::StringID {_id, _data};
587
QByteArray _data {"data", 4};
592
TEST_F(StringIDRefTest, defaultConstructor)
595
auto idRef = App::StringIDRef();
601
TEST_F(StringIDRefTest, constructFromNewStringID)
604
auto idRef = App::StringIDRef(createStringID());
608
EXPECT_EQ(1, idRef.getRefCount());
614
TEST_F(StringIDRefTest, constructFromStringIDAndIndex)
617
const int index {42};
620
auto idRef = App::StringIDRef(createStringID(), index);
624
EXPECT_EQ(1, idRef.getRefCount());
625
EXPECT_EQ(index, idRef.getIndex());
631
TEST_F(StringIDRefTest, copyConstructor)
634
const int index {42};
635
auto idRef = App::StringIDRef(createStringID(), index);
638
auto newIdRef = App::StringIDRef(idRef);
641
EXPECT_TRUE(newIdRef);
642
EXPECT_EQ(2, newIdRef.getRefCount());
643
EXPECT_EQ(index, idRef.getIndex());
644
EXPECT_EQ(index, newIdRef.getIndex());
647
TEST_F(StringIDRefTest, copyConstructorWithIndex)
650
const int index {42};
651
const int otherIndex {12345};
652
auto idRef = App::StringIDRef(createStringID(), index);
655
auto newIdRef = App::StringIDRef(idRef, otherIndex);
658
EXPECT_TRUE(newIdRef);
659
EXPECT_EQ(2, newIdRef.getRefCount());
660
EXPECT_EQ(index, idRef.getIndex());
661
EXPECT_EQ(otherIndex, newIdRef.getIndex());
664
TEST_F(StringIDRefTest, moveConstructor)
667
auto idRef = App::StringIDRef(createStringID());
670
auto newIdRef = App::StringIDRef(std::move(idRef));
673
EXPECT_EQ(1, newIdRef.getRefCount());
676
TEST_F(StringIDRefTest, destructor)
679
auto idRef = App::StringIDRef(createStringID());
682
auto newIdRef = App::StringIDRef(idRef);
683
ASSERT_EQ(2, idRef.getRefCount());
690
EXPECT_EQ(1, idRef.getRefCount());
693
TEST_F(StringIDRefTest, reset)
696
auto idRef = App::StringIDRef(createStringID());
705
TEST_F(StringIDRefTest, resetWithStringID)
708
const int index {42};
709
auto idRef = App::StringIDRef(createStringID(), index);
712
idRef.reset(createStringID());
716
EXPECT_NE(index, idRef.getIndex());
719
TEST_F(StringIDRefTest, resetWithStringIDAndIndex)
722
const int indexA {42};
723
const int indexB {12345};
724
auto idRef = App::StringIDRef(createStringID(), indexA);
727
idRef.reset(createStringID(), indexB);
731
EXPECT_EQ(indexB, idRef.getIndex());
734
TEST_F(StringIDRefTest, swap)
737
const int indexA {42};
738
const int indexB {12345};
739
auto idRefA = App::StringIDRef(createStringID(), indexA);
740
auto idRefB = App::StringIDRef(createStringID(), indexB);
746
EXPECT_EQ(indexB, idRefA.getIndex());
747
EXPECT_EQ(indexA, idRefB.getIndex());
750
#if defined(__clang__)
751
#pragma clang diagnostic push
752
#pragma clang diagnostic ignored "-Wself-assign-overloaded"
755
TEST_F(StringIDRefTest, assignmentFromSelf)
758
auto idRef = App::StringIDRef(createStringID());
764
EXPECT_EQ(1, idRef.getRefCount());
767
#if defined(__clang__)
768
#pragma clang diagnostic pop
771
TEST_F(StringIDRefTest, assignmentToEmptyFromStringID)
775
auto idRef = App::StringIDRef();
779
idRef = createStringID();
785
TEST_F(StringIDRefTest, assignmentFromStringIDRef)
788
auto firstIdRef = App::StringIDRef(createStringID());
789
auto firstIdRefExtra = firstIdRef;
790
auto secondIdRef = App::StringIDRef(createStringID());
793
firstIdRef = secondIdRef;
796
EXPECT_EQ(2, secondIdRef.getRefCount());
797
EXPECT_EQ(2, firstIdRef.getRefCount());
798
EXPECT_EQ(1, firstIdRefExtra.getRefCount());
801
TEST_F(StringIDRefTest, moveAssignmentFromStringIDRef)
803
auto emptyIdRef = App::StringIDRef();
804
auto goodIdRef = App::StringIDRef(createStringID());
805
ASSERT_FALSE(emptyIdRef);
808
emptyIdRef = std::move(goodIdRef);
811
EXPECT_TRUE(emptyIdRef);
812
EXPECT_EQ(1, emptyIdRef.getRefCount());
815
TEST_F(StringIDRefTest, operatorLess)
818
auto emptySIDA = App::StringIDRef();
819
auto emptySIDB = App::StringIDRef();
820
auto lowID = App::StringIDRef(new App::StringID {1, nullptr});
821
auto highID = App::StringIDRef(new App::StringID {2, nullptr});
824
EXPECT_FALSE(emptySIDA < emptySIDB);
825
EXPECT_FALSE(emptySIDB < emptySIDA);
826
EXPECT_TRUE(emptySIDA < lowID);
827
EXPECT_TRUE(emptySIDA < highID);
828
EXPECT_TRUE(lowID < highID);
829
EXPECT_FALSE(highID < lowID);
834
TEST_F(StringIDRefTest, operatorEquality)
837
auto emptySIDA = App::StringIDRef();
838
auto emptySIDB = App::StringIDRef();
839
auto nonEmptyA = App::StringIDRef(new App::StringID {1, nullptr});
840
auto nonEmptyB = App::StringIDRef(new App::StringID {1, nullptr});
841
auto nonEmptyOther = App::StringIDRef(new App::StringID {2, nullptr});
844
EXPECT_TRUE(emptySIDA == emptySIDB);
845
EXPECT_TRUE(nonEmptyA == nonEmptyB);
846
EXPECT_FALSE(emptySIDA == nonEmptyA);
847
EXPECT_FALSE(nonEmptyA == nonEmptyOther);
850
TEST_F(StringIDRefTest, operatorInequality)
853
auto emptySIDA = App::StringIDRef();
854
auto emptySIDB = App::StringIDRef();
855
auto nonEmptyA = App::StringIDRef(new App::StringID {1, nullptr});
856
auto nonEmptyB = App::StringIDRef(new App::StringID {1, nullptr});
857
auto nonEmptyOther = App::StringIDRef(new App::StringID {2, nullptr});
860
EXPECT_FALSE(emptySIDA != emptySIDB);
861
EXPECT_FALSE(nonEmptyA != nonEmptyB);
862
EXPECT_TRUE(emptySIDA != nonEmptyA);
863
EXPECT_TRUE(nonEmptyA != nonEmptyOther);
866
TEST_F(StringIDRefTest, booleanConversion)
869
auto emptySID = App::StringIDRef();
870
auto nonEmpty = App::StringIDRef(new App::StringID {1, nullptr});
873
EXPECT_FALSE(emptySID);
874
EXPECT_TRUE(nonEmpty);
877
TEST_F(StringIDRefTest, getRefCount)
880
auto stringID = createStringID();
881
auto stringIDRef = App::StringIDRef(stringID);
884
auto firstCount = stringIDRef.getRefCount();
885
auto stringIDRef2 = App::StringIDRef(stringID);
886
auto secondCount = stringIDRef.getRefCount();
889
EXPECT_EQ(1, firstCount);
890
EXPECT_EQ(2, secondCount);
893
TEST_F(StringIDRefTest, toString)
896
auto emptySID = App::StringIDRef();
897
auto nonEmpty = App::StringIDRef(createStringID());
900
auto empty = emptySID.toString();
901
auto nonempty = nonEmpty.toString();
905
EXPECT_TRUE(empty.empty());
906
EXPECT_FALSE(nonempty.empty());
909
TEST_F(StringIDRefTest, dataToText)
912
auto emptySID = App::StringIDRef();
913
auto nonEmpty = App::StringIDRef(createStringID());
916
auto empty = emptySID.dataToText();
917
auto nonempty = nonEmpty.dataToText();
921
EXPECT_TRUE(empty.empty());
922
EXPECT_FALSE(nonempty.empty());
925
TEST_F(StringIDRefTest, constData)
928
auto sid = App::StringIDRef(createStringID());
931
auto constData = sid.constData();
934
ASSERT_NE(constData, nullptr);
935
EXPECT_STREQ(constData, "data");
938
TEST_F(StringIDRefTest, deref)
941
auto sid = createStringID();
942
auto ref = App::StringIDRef(sid);
945
EXPECT_EQ(sid, &(ref.deref()));
948
TEST_F(StringIDRefTest, value)
951
auto empty = App::StringIDRef();
952
auto nonEmpty = App::StringIDRef(createStringID());
955
auto emptyValue = empty.value();
956
auto nonEmptyValue = nonEmpty.value();
959
EXPECT_EQ(0, emptyValue);
960
EXPECT_NE(0, nonEmptyValue);
963
TEST_F(StringIDRefTest, relatedIDs)
968
TEST_F(StringIDRefTest, isBinary)
971
auto nothing = App::StringIDRef();
972
auto binary = App::StringIDRef(new App::StringID {1, nullptr, App::StringID::Flag::Binary});
973
auto nonBinary = App::StringIDRef(new App::StringID {1, nullptr, App::StringID::Flag::None});
976
EXPECT_FALSE(nothing.isBinary());
977
EXPECT_TRUE(binary.isBinary());
978
EXPECT_FALSE(nonBinary.isBinary());
981
TEST_F(StringIDRefTest, isHashed)
984
auto nothing = App::StringIDRef();
985
auto hashed = App::StringIDRef(new App::StringID {1, nullptr, App::StringID::Flag::Hashed});
986
auto nonHashed = App::StringIDRef(new App::StringID {1, nullptr, App::StringID::Flag::None});
989
EXPECT_FALSE(nothing.isHashed());
990
EXPECT_TRUE(hashed.isHashed());
991
EXPECT_FALSE(nonHashed.isHashed());
994
TEST_F(StringIDRefTest, toBytes)
997
QByteArray byteStorage;
998
auto ref = App::StringIDRef(createStringID());
1001
ref.toBytes(byteStorage);
1004
EXPECT_FALSE(byteStorage.isNull());
1007
TEST_F(StringIDRefTest, getPyObject)
1011
auto ref = App::StringIDRef(createStringID());
1012
auto empty = App::StringIDRef();
1015
Py::Object pyObject(ref.getPyObject(), true);
1016
Py::Object none(empty.getPyObject(), true);
1019
EXPECT_TRUE(PyObject_TypeCheck(pyObject.ptr(), &App::StringIDPy::Type));
1020
EXPECT_EQ(none.ptr(), Py_None);
1023
TEST_F(StringIDRefTest, mark)
1026
auto ref = App::StringIDRef(createStringID());
1027
ASSERT_FALSE(ref.isMarked());
1033
EXPECT_TRUE(ref.isMarked());
1036
TEST_F(StringIDRefTest, isMarked)
1039
auto marked = App::StringIDRef(new App::StringID(1, nullptr, App::StringID::Flag::Marked));
1040
auto notMarked = App::StringIDRef(createStringID());
1043
EXPECT_TRUE(marked.isMarked());
1044
EXPECT_FALSE(notMarked.isMarked());
1047
TEST_F(StringIDRefTest, isFromSameHasher)
1052
TEST_F(StringIDRefTest, getHasher)
1057
TEST_F(StringIDRefTest, setPersistent)
1060
auto persistent = App::StringIDRef(createStringID());
1061
ASSERT_FALSE(persistent.deref().isPersistent());
1064
persistent.setPersistent(true);
1067
ASSERT_TRUE(persistent.deref().isPersistent());
1071
class StringHasherTest: public ::testing::Test
1074
void SetUp() override
1077
_hasher = Base::Reference<App::StringHasher>(new App::StringHasher);
1080
void TearDown() override
1085
Base::Reference<App::StringHasher> Hasher()
1090
static Data::MappedName givenMappedName(const char* name, const char* postfix = nullptr)
1092
QByteArray expectedPrefix {name, static_cast<int>(std::strlen(name))};
1093
Data::MappedName mappedName(expectedPrefix);
1095
QByteArray expectedPostfix {postfix, static_cast<int>(std::strlen(postfix))};
1096
Data::MappedName mappedNameA(mappedName, expectedPostfix.data());
1104
App::StringIDRef givenSomeHashedValues()
1106
const std::string prefix {"Test1"};
1107
const std::string postfix {";:M;FUS;:Hb:7,F"};
1108
auto mappedName = givenMappedName(prefix.c_str(), postfix.c_str());
1109
QVector<App::StringIDRef> sids;
1110
return Hasher()->getID(mappedName, sids);
1114
Base::Reference<App::StringHasher> _hasher;
1117
TEST_F(StringHasherTest, defaultConstructor)
1126
EXPECT_EQ(0, Hasher()->size());
1129
TEST_F(StringHasherTest, getMemSize)
1132
givenSomeHashedValues();
1135
auto result = Hasher()->getMemSize();
1140
EXPECT_LT(Hasher()->size(), result);
1143
TEST_F(StringHasherTest, Save)
1150
TEST_F(StringHasherTest, Restore)
1157
TEST_F(StringHasherTest, SaveDocFile)
1164
TEST_F(StringHasherTest, RestoreDocFile)
1171
TEST_F(StringHasherTest, setPersistenceFileName)
1178
TEST_F(StringHasherTest, getPersistenceFileName)
1185
TEST_F(StringHasherTest, getIDFromQByteArrayShort)
1188
const std::array<char, 5> string {"data"};
1189
QByteArray qba(string.data(), string.size());
1190
Hasher()->setThreshold(string.size() + 1);
1193
auto id = Hasher()->getID(qba, App::StringHasher::Option::Hashable);
1196
EXPECT_STREQ(string.data(), id.constData());
1197
EXPECT_FALSE(id.isHashed());
1198
EXPECT_NE(qba.constData(), id.constData());
1199
EXPECT_EQ(2, id.getRefCount());
1202
TEST_F(StringHasherTest, getIDFromQByteArrayLongHashable)
1205
const std::array<char, 47> string {"data that is longer than our hasher threshold"};
1206
QByteArray qba(string.data(), string.size());
1207
Hasher()->setThreshold(string.size() - 1);
1210
auto id = Hasher()->getID(qba, App::StringHasher::Option::Hashable);
1213
EXPECT_STRNE(string.data(), id.constData());
1214
EXPECT_TRUE(id.isHashed());
1215
EXPECT_NE(qba.constData(), id.constData());
1218
TEST_F(StringHasherTest, getIDFromQByteArrayLongUnhashable)
1221
const std::array<char, 47> string {"data that is longer than our hasher threshold"};
1222
QByteArray qba(string.data(), string.size());
1223
Hasher()->setThreshold(string.size() - 1);
1226
auto id = Hasher()->getID(qba, App::StringHasher::Option::None);
1229
EXPECT_STREQ(string.data(), id.constData());
1230
EXPECT_FALSE(id.isHashed());
1231
EXPECT_NE(qba.constData(), id.constData());
1234
TEST_F(StringHasherTest, getIDFromQByteArrayNoCopy)
1237
const std::array<char, 5> string {"data"};
1238
QByteArray qba(string.data(), string.size());
1239
Hasher()->setThreshold(string.size() + 1);
1242
auto id = Hasher()->getID(qba, App::StringHasher::Option::NoCopy);
1245
EXPECT_STREQ(string.data(), id.constData());
1246
EXPECT_EQ(qba.constData(), id.constData());
1249
TEST_F(StringHasherTest, getIDFromQByteArrayTwoDifferentStrings)
1252
const std::array<char, 6> stringA {"dataA"};
1253
QByteArray qbaA(stringA.data(), stringA.size());
1254
const std::array<char, 6> stringB {"dataB"};
1255
QByteArray qbaB(stringB.data(), stringB.size());
1258
auto idA = Hasher()->getID(qbaA);
1259
auto idB = Hasher()->getID(qbaB);
1262
EXPECT_NE(idA.dataToText(), idB.dataToText());
1265
TEST_F(StringHasherTest, getIDFromQByteArrayTwoIdenticalStrings)
1268
const std::array<char, 5> stringA {"data"};
1269
QByteArray qbaA(stringA.data(), stringA.size());
1270
const std::array<char, 5> stringB {"data"};
1271
QByteArray qbaB(stringB.data(), stringB.size());
1274
auto idA = Hasher()->getID(qbaA);
1275
auto idB = Hasher()->getID(qbaB);
1278
EXPECT_EQ(idA.dataToText(), idB.dataToText());
1281
TEST_F(StringHasherTest, getIDFromQByteArrayBinaryFlag)
1284
const std::array<char, 5> string {"data"};
1285
QByteArray qba(string.data(), string.size());
1288
auto id = Hasher()->getID(qba, App::StringHasher::Option::Binary);
1291
EXPECT_TRUE(id.isBinary());
1294
TEST_F(StringHasherTest, getIDFromCString)
1313
TEST_F(StringHasherTest, getIDFromMappedNameWithoutPostfixWithoutIndex)
1316
const char* name {"Face"};
1317
QByteArray expectedPrefix {name, static_cast<int>(std::strlen(name))};
1318
Data::MappedName mappedName1(expectedPrefix);
1319
QVector<App::StringIDRef> sids;
1322
auto id = Hasher()->getID(mappedName1, sids);
1325
EXPECT_EQ(id.dataToText(), mappedName1.toString());
1328
TEST_F(StringHasherTest, getIDFromMappedNameWithoutPostfixWithIndex)
1331
const char* expectedName {"Face"};
1332
QByteArray expectedPrefix {expectedName, static_cast<int>(std::strlen(expectedName))};
1333
const char* name {"Face3"};
1334
QByteArray prefix {name, static_cast<int>(std::strlen(name))};
1335
Data::MappedName mappedName1(prefix);
1336
QVector<App::StringIDRef> sids;
1339
auto id = Hasher()->getID(mappedName1, sids);
1342
EXPECT_EQ(id.dataToText(), mappedName1.toString());
1345
TEST_F(StringHasherTest, getIDFromMappedNameWithoutIndexWithPostfix)
1348
const char* name {"Face"};
1349
QByteArray expectedPrefix {name, static_cast<int>(std::strlen(name))};
1350
const char* postfix {";:M;FUS;:Hb:7,F"};
1351
QByteArray expectedPostfix {postfix, static_cast<int>(std::strlen(postfix))};
1352
Data::MappedName mappedName1(expectedPrefix);
1353
Data::MappedName mappedName2(mappedName1, expectedPostfix.data());
1354
QVector<App::StringIDRef> sids;
1357
auto id = Hasher()->getID(mappedName2, sids);
1360
EXPECT_EQ(expectedPrefix, id.deref().data());
1361
EXPECT_EQ(expectedPostfix, id.deref().postfix());
1364
TEST_F(StringHasherTest, getIDFromMappedNameWithIndexWithPostfix)
1367
const char* name {"Face3"};
1368
QByteArray expectedPrefix {name, static_cast<int>(std::strlen(name))};
1369
const char* postfix {";:M;FUS;:Hb:7,F"};
1370
QByteArray expectedPostfix {postfix, static_cast<int>(std::strlen(postfix))};
1371
Data::MappedName mappedName1(expectedPrefix);
1372
Data::MappedName mappedName2(mappedName1, expectedPostfix.data());
1373
QVector<App::StringIDRef> sids;
1376
auto id = Hasher()->getID(mappedName2, sids);
1379
EXPECT_EQ(id.dataToText(), mappedName2.toString());
1382
TEST_F(StringHasherTest, getIDFromMappedNameExistingNameNoIndex)
1385
Data::MappedName mappedName1 = givenMappedName("SomeTestName");
1386
QVector<App::StringIDRef> sids;
1387
auto firstIDInserted = Hasher()->getID(mappedName1, sids);
1388
ASSERT_EQ(1, Hasher()->size());
1391
auto secondIDInserted = Hasher()->getID(mappedName1, sids);
1394
EXPECT_EQ(secondIDInserted.dataToText(), mappedName1.toString());
1397
TEST_F(StringHasherTest, getIDFromMappedNameExistingNameWithIndex)
1400
auto mappedNameA = givenMappedName("Test1");
1401
auto mappedNameB = givenMappedName("Test2");
1402
QVector<App::StringIDRef> sids;
1403
auto firstIDInserted = Hasher()->getID(mappedNameA, sids);
1406
auto secondIDInserted = Hasher()->getID(mappedNameB, sids);
1409
EXPECT_EQ(firstIDInserted.dataToText(), mappedNameA.toString());
1410
EXPECT_EQ(secondIDInserted.dataToText(), mappedNameB.toString());
1413
TEST_F(StringHasherTest, getIDFromMappedNameExistingNameWithIndexAndPostfix)
1416
auto mappedNameA = givenMappedName("Test1", ";:M;FUS;:Hb:7,F");
1417
auto mappedNameB = givenMappedName("Test2", ";:M;FUS;:Hb:7,F");
1418
QVector<App::StringIDRef> sids;
1419
auto firstIDInserted = Hasher()->getID(mappedNameA, sids);
1422
auto secondIDInserted = Hasher()->getID(mappedNameB, sids);
1425
EXPECT_EQ(firstIDInserted.dataToText(), mappedNameA.toString());
1426
EXPECT_EQ(secondIDInserted.dataToText(), mappedNameB.toString());
1429
TEST_F(StringHasherTest, getIDFromMappedNameDuplicateWithEncodedPostfix)
1432
auto mappedNameA = givenMappedName("Test1", ";:M;FUS;:Hb:7,F");
1433
auto mappedNameB = givenMappedName("Test1", "#1");
1434
QVector<App::StringIDRef> sids;
1435
auto firstIDInserted = Hasher()->getID(mappedNameA, sids);
1438
auto secondIDInserted = Hasher()->getID(mappedNameB, sids);
1441
EXPECT_EQ(firstIDInserted.dataToText(), mappedNameA.toString());
1442
EXPECT_EQ(secondIDInserted.dataToText(), mappedNameB.toString());
1445
TEST_F(StringHasherTest, getIDFromIntegerIDNoSuchID)
1451
auto result = Hasher()->getID(1);
1454
EXPECT_FALSE(result);
1457
TEST_F(StringHasherTest, getIDFromIntegerIDBadID)
1460
const std::string prefix {"Test1"};
1461
auto mappedName = givenMappedName(prefix.c_str());
1462
QVector<App::StringIDRef> sids;
1463
auto inserted = Hasher()->getID(mappedName, sids);
1464
ASSERT_EQ(1, Hasher()->size());
1467
auto result = Hasher()->getID(-1);
1470
EXPECT_FALSE(result);
1474
TEST_F(StringHasherTest, getIDMap)
1477
givenSomeHashedValues();
1480
auto map = Hasher()->getIDMap();
1483
EXPECT_GT(map.size(), 0);
1486
TEST_F(StringHasherTest, clear)
1489
givenSomeHashedValues();
1495
EXPECT_EQ(0, Hasher()->size());
1498
TEST_F(StringHasherTest, size)
1501
givenSomeHashedValues();
1504
auto result = Hasher()->size();
1507
EXPECT_GT(result, 0);
1510
TEST_F(StringHasherTest, count)
1513
givenSomeHashedValues();
1516
auto result = Hasher()->count();
1519
EXPECT_GT(result, 0);
1522
TEST_F(StringHasherTest, getPyObject)
1527
Py::Object py(Hasher()->getPyObject(), true);
1530
EXPECT_TRUE(PyObject_TypeCheck(py.ptr(), &App::StringHasherPy::Type));
1533
TEST_F(StringHasherTest, setGetSaveAll)
1538
Hasher()->setSaveAll(true);
1539
bool expectedTrue = Hasher()->getSaveAll();
1540
Hasher()->setSaveAll(false);
1541
bool expectedFalse = Hasher()->getSaveAll();
1544
EXPECT_TRUE(expectedTrue);
1545
EXPECT_FALSE(expectedFalse);
1548
TEST_F(StringHasherTest, setGetThreshold)
1551
const int expectedThreshold {42};
1554
Hasher()->setThreshold(expectedThreshold);
1555
auto foundThreshold = Hasher()->getThreshold();
1558
EXPECT_EQ(expectedThreshold, foundThreshold);
1561
TEST_F(StringHasherTest, clearMarks)
1564
auto ref = givenSomeHashedValues();
1566
ASSERT_TRUE(ref.isMarked());
1569
Hasher()->clearMarks();
1572
ASSERT_FALSE(ref.isMarked());
1575
TEST_F(StringHasherTest, compact)
1578
givenSomeHashedValues();
1581
Hasher()->compact();
1584
EXPECT_EQ(0, Hasher()->count());