summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2020-06-11 12:15:36 -0700
committerMårten Nordheim <marten.nordheim@qt.io>2020-06-23 00:29:50 +0000
commit727fab7d291d8d6e1b61a7faec4b4318f714d1e0 (patch)
tree596b3b57f51fc9e2f5d59ba842af73eac327ad2f /tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp
parentcdcb75c46b968dbfeb1992c6bee19aceda27da38 (diff)
QCborMap: remove the optimization not to detach from non-const find()
All our tests were find() == end() or !=, which depends on the evaluation order of the arguments to operator==(). If end() is called first, then the detach happens before find() and all is well. But if find() is called first, it may return end() before end() detaches. [ChangeLog][QCborMap] Fixed a bug that could cause the iterator returned from a failing key search with find() not to match end(). Now, every call to find() will detach in shared QCborMaps; to avoid this, use constFind() and constEnd(). Fixes: QTBUG-84583 Pick-to: 5.15 5.12 Change-Id: I552d244076a447ab92d7fffd161793496a8d03a8 Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
Diffstat (limited to 'tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp')
-rw-r--r--tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp62
1 files changed, 62 insertions, 0 deletions
diff --git a/tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp b/tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp
index 1379cc348d..0a780d3e46 100644
--- a/tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp
+++ b/tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp
@@ -63,6 +63,7 @@ private slots:
void arrayDefaultInitialization();
void arrayEmptyInitializerList();
void arrayEmptyDetach();
+ void arrayNonEmptyDetach();
void arrayInitializerList();
void arrayMutation();
void arrayMutateWithCopies();
@@ -78,6 +79,7 @@ private slots:
void mapDefaultInitialization();
void mapEmptyInitializerList();
void mapEmptyDetach();
+ void mapNonEmptyDetach();
void mapSimpleInitializerList();
void mapMutation();
void mapMutateWithCopies();
@@ -657,6 +659,66 @@ void tst_QCborValue::mapEmptyDetach()
QCOMPARE(m2, m);
}
+void tst_QCborValue::arrayNonEmptyDetach()
+{
+ QCborArray a;
+ a.append(1);
+ a.append(2);
+
+ QCOMPARE(a.first(), 1);
+ QCOMPARE(a.last(), 2);
+ QVERIFY(!a.contains(3));
+ QVERIFY(a.constBegin() != a.constEnd());
+ QVERIFY(a.begin() != a.end());
+
+ // now the same, with an active copy
+ { QCborArray copy(a); QCOMPARE(a.first(), 1); }
+ { QCborArray copy(a); QCOMPARE(a.last(), 2); }
+ { QCborArray copy(a); QVERIFY(!a.contains(3)); }
+ { QCborArray copy(a); QVERIFY(a.constBegin() != a.constEnd()); }
+ { QCborArray copy(a); QVERIFY(a.begin() != a.end()); }
+}
+
+void tst_QCborValue::mapNonEmptyDetach()
+{
+ QCborMap m;
+ m.insert(1, {});
+ m.insert(2, nullptr);
+ QVERIFY(!m.contains(3));
+ QVERIFY(m.constBegin() != m.constEnd());
+ QVERIFY(m.begin() != m.end());
+ // test all 4 overloads of find()
+ QVERIFY(m.constFind(3) == m.constEnd());
+ QVERIFY(m.constFind(QLatin1String("3")) == m.constEnd());
+ QVERIFY(m.constFind(QString("3")) == m.constEnd());
+ QVERIFY(m.constFind(QCborValue(3)) == m.constEnd());
+ QVERIFY(m.find(3) == m.end());
+ QVERIFY(m.find(QLatin1String("3")) == m.end());
+ QVERIFY(m.find(QString("3")) == m.end());
+ QVERIFY(m.find(QCborValue(3)) == m.end());
+ { auto it = m.find(3); QVERIFY(it == m.end()); }
+ { auto it = m.find(QLatin1String("3")); QVERIFY(it == m.end()); }
+ { auto it = m.find(QString("3")); QVERIFY(it == m.end()); }
+ { auto it = m.find(QCborValue(3)); QVERIFY(it == m.end()); }
+
+ // now the same, with an active copy
+ { QCborMap copy(m); QVERIFY(!m.contains(3)); }
+ { QCborMap copy(m); QVERIFY(m.constBegin() != m.constEnd()); }
+ { QCborMap copy(m); QVERIFY(m.begin() != m.end()); }
+ { QCborMap copy(m); QVERIFY(m.constFind(3) == m.constEnd()); }
+ { QCborMap copy(m); QVERIFY(m.constFind(QLatin1String("3")) == m.constEnd()); }
+ { QCborMap copy(m); QVERIFY(m.constFind(QString("3")) == m.constEnd()); }
+ { QCborMap copy(m); QVERIFY(m.constFind(QCborValue(3)) == m.constEnd()); }
+ { QCborMap copy(m); QVERIFY(m.find(3) == m.end()); }
+ { QCborMap copy(m); QVERIFY(m.find(QLatin1String("3")) == m.end()); }
+ { QCborMap copy(m); QVERIFY(m.find(QString("3")) == m.end()); }
+ { QCborMap copy(m); QVERIFY(m.find(QCborValue(3)) == m.end()); }\
+ { QCborMap copy(m); auto it = m.find(3); QVERIFY(it == m.end()); }
+ { QCborMap copy(m); auto it = m.find(QLatin1String("3")); QVERIFY(it == m.end()); }
+ { QCborMap copy(m); auto it = m.find(QString("3")); QVERIFY(it == m.end()); }
+ { QCborMap copy(m); auto it = m.find(QCborValue(3)); QVERIFY(it == m.end()); }
+}
+
void tst_QCborValue::arrayInitializerList()
{
QCborArray a{0, -1, false, true, nullptr, {}, 1.0};