SettingsAccessor: Add test for version upgrader registration

Change-Id: I04195b84b551333ef34f0f193d5c2237ad1c86c6
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
Tobias Hunger
2017-11-20 16:13:34 +01:00
parent 903fe559c2
commit cacab453f7

View File

@@ -29,6 +29,32 @@
using namespace Utils; using namespace Utils;
const char TESTACCESSOR_DN[] = "Test Settings Accessor";
const char TESTACCESSOR_APPLICATION_DN[] = "SettingsAccessor Test (Basic)";
const char TESTACCESSOR_DEFAULT_ID[] = "testId";
// --------------------------------------------------------------------
// TestVersionUpgrader:
// --------------------------------------------------------------------
class TestVersionUpgrader : public Utils::VersionUpgrader
{
public:
TestVersionUpgrader(int version) : m_version(version) { }
int version() const final { return m_version; }
QString backupExtension() const final { return QString("v") + QString::number(m_version); }
QVariantMap upgrade(const QVariantMap &data) final
{
QVariantMap result = data;
result.insert(QString("VERSION_") + QString::number(m_version), m_version);
return result;
}
private:
const int m_version = -1;
};
// -------------------------------------------------------------------- // --------------------------------------------------------------------
// BasicTestSettingsAccessor: // BasicTestSettingsAccessor:
// -------------------------------------------------------------------- // --------------------------------------------------------------------
@@ -36,19 +62,33 @@ using namespace Utils;
class BasicTestSettingsAccessor : public Utils::SettingsAccessor class BasicTestSettingsAccessor : public Utils::SettingsAccessor
{ {
public: public:
BasicTestSettingsAccessor(const QByteArray &id = QByteArray("test")); BasicTestSettingsAccessor(const QByteArray &id = QByteArray(TESTACCESSOR_DEFAULT_ID)) :
using Utils::SettingsAccessor::isBetterMatch;
using Utils::SettingsAccessor::addVersionUpgrader;
};
BasicTestSettingsAccessor::BasicTestSettingsAccessor(const QByteArray &id) :
Utils::SettingsAccessor(Utils::FileName::fromString("/foo/bar")) Utils::SettingsAccessor(Utils::FileName::fromString("/foo/bar"))
{ {
setDisplayName("Basic Test Settings Accessor"); setDisplayName(TESTACCESSOR_DN);
setApplicationDisplayName("SettingsAccessor Test (Basic)"); setApplicationDisplayName(TESTACCESSOR_APPLICATION_DN);
setSettingsId(id); setSettingsId(id);
} }
};
// --------------------------------------------------------------------
// TestSettingsAccessor:
// --------------------------------------------------------------------
class TestSettingsAccessor : public BasicTestSettingsAccessor
{
public:
TestSettingsAccessor(const QByteArray &id = QByteArray(TESTACCESSOR_DEFAULT_ID)) :
BasicTestSettingsAccessor(id)
{
addVersionUpgrader(std::make_unique<TestVersionUpgrader>(5));
addVersionUpgrader(std::make_unique<TestVersionUpgrader>(6));
addVersionUpgrader(std::make_unique<TestVersionUpgrader>(7));
}
// Make methods public for the tests:
using Utils::SettingsAccessor::isBetterMatch;
};
// -------------------------------------------------------------------- // --------------------------------------------------------------------
// tst_SettingsAccessor: // tst_SettingsAccessor:
@@ -59,6 +99,13 @@ class tst_SettingsAccessor : public QObject
Q_OBJECT Q_OBJECT
private slots: private slots:
void addVersionUpgrader();
void addVersionUpgrader_negativeVersion();
void addVersionUpgrader_v3v2();
void addVersionUpgrader_v3v5();
void addVersionUpgrader_v3v4v5();
void addVersionUpgrader_v0v1();
void isBetterMatch(); void isBetterMatch();
void isBetterMatch_idMismatch(); void isBetterMatch_idMismatch();
void isBetterMatch_noId(); void isBetterMatch_noId();
@@ -79,12 +126,86 @@ static QVariantMap versionedMap(int version, const QByteArray &id = QByteArray()
return result; return result;
} }
void tst_SettingsAccessor::addVersionUpgrader()
{
BasicTestSettingsAccessor accessor;
QCOMPARE(accessor.firstSupportedVersion(), -1);
QCOMPARE(accessor.currentVersion(), 0);
}
void tst_SettingsAccessor::addVersionUpgrader_negativeVersion()
{
BasicTestSettingsAccessor accessor;
QVERIFY(!accessor.addVersionUpgrader(std::make_unique<TestVersionUpgrader>(-1)));
QCOMPARE(accessor.firstSupportedVersion(), -1);
QCOMPARE(accessor.currentVersion(), 0);
}
void tst_SettingsAccessor::addVersionUpgrader_v3v2()
{
BasicTestSettingsAccessor accessor;
QVERIFY(accessor.addVersionUpgrader(std::make_unique<TestVersionUpgrader>(3)));
QCOMPARE(accessor.firstSupportedVersion(), 3);
QCOMPARE(accessor.currentVersion(), 4);
QVERIFY(!accessor.addVersionUpgrader(std::make_unique<TestVersionUpgrader>(2)));
QCOMPARE(accessor.firstSupportedVersion(), 3);
QCOMPARE(accessor.currentVersion(), 4);
}
void tst_SettingsAccessor::addVersionUpgrader_v3v5()
{
BasicTestSettingsAccessor accessor;
QVERIFY(accessor.addVersionUpgrader(std::make_unique<TestVersionUpgrader>(3)));
QCOMPARE(accessor.firstSupportedVersion(), 3);
QCOMPARE(accessor.currentVersion(), 4);
QVERIFY(!accessor.addVersionUpgrader(std::make_unique<TestVersionUpgrader>(5)));
QCOMPARE(accessor.firstSupportedVersion(), 3);
QCOMPARE(accessor.currentVersion(), 4);
}
void tst_SettingsAccessor::addVersionUpgrader_v3v4v5()
{
BasicTestSettingsAccessor accessor;
QVERIFY(accessor.addVersionUpgrader(std::make_unique<TestVersionUpgrader>(3)));
QCOMPARE(accessor.firstSupportedVersion(), 3);
QCOMPARE(accessor.currentVersion(), 4);
QVERIFY(accessor.addVersionUpgrader(std::make_unique<TestVersionUpgrader>(4)));
QCOMPARE(accessor.firstSupportedVersion(), 3);
QCOMPARE(accessor.currentVersion(), 5);
QVERIFY(accessor.addVersionUpgrader(std::make_unique<TestVersionUpgrader>(5)));
QCOMPARE(accessor.firstSupportedVersion(), 3);
QCOMPARE(accessor.currentVersion(), 6);
}
void tst_SettingsAccessor::addVersionUpgrader_v0v1()
{
BasicTestSettingsAccessor accessor;
QVERIFY(accessor.addVersionUpgrader(std::make_unique<TestVersionUpgrader>(0)));
QCOMPARE(accessor.firstSupportedVersion(), 0);
QCOMPARE(accessor.currentVersion(), 1);
QVERIFY(accessor.addVersionUpgrader(std::make_unique<TestVersionUpgrader>(1)));
QCOMPARE(accessor.firstSupportedVersion(), 0);
QCOMPARE(accessor.currentVersion(), 2);
}
void tst_SettingsAccessor::isBetterMatch() void tst_SettingsAccessor::isBetterMatch()
{ {
const BasicTestSettingsAccessor accessor; const TestSettingsAccessor accessor;
const QVariantMap a = versionedMap(1, "test"); const QVariantMap a = versionedMap(5, TESTACCESSOR_DEFAULT_ID);
const QVariantMap b = versionedMap(2, "test"); const QVariantMap b = versionedMap(6, TESTACCESSOR_DEFAULT_ID);
QVERIFY(accessor.isBetterMatch(a, b)); QVERIFY(accessor.isBetterMatch(a, b));
QVERIFY(!accessor.isBetterMatch(b, a)); QVERIFY(!accessor.isBetterMatch(b, a));
@@ -92,10 +213,10 @@ void tst_SettingsAccessor::isBetterMatch()
void tst_SettingsAccessor::isBetterMatch_idMismatch() void tst_SettingsAccessor::isBetterMatch_idMismatch()
{ {
const BasicTestSettingsAccessor accessor; const TestSettingsAccessor accessor;
const QVariantMap a = versionedMap(1, "test"); const QVariantMap a = versionedMap(5, TESTACCESSOR_DEFAULT_ID);
const QVariantMap b = versionedMap(2, "foo"); const QVariantMap b = versionedMap(6, "foo");
QVERIFY(!accessor.isBetterMatch(a, b)); QVERIFY(!accessor.isBetterMatch(a, b));
QVERIFY(accessor.isBetterMatch(b, a)); QVERIFY(accessor.isBetterMatch(b, a));
@@ -103,10 +224,10 @@ void tst_SettingsAccessor::isBetterMatch_idMismatch()
void tst_SettingsAccessor::isBetterMatch_noId() void tst_SettingsAccessor::isBetterMatch_noId()
{ {
const BasicTestSettingsAccessor accessor((QByteArray())); const TestSettingsAccessor accessor((QByteArray()));
const QVariantMap a = versionedMap(1, "test"); const QVariantMap a = versionedMap(5, TESTACCESSOR_DEFAULT_ID);
const QVariantMap b = versionedMap(2, "foo"); const QVariantMap b = versionedMap(6, "foo");
QVERIFY(accessor.isBetterMatch(a, b)); QVERIFY(accessor.isBetterMatch(a, b));
QVERIFY(!accessor.isBetterMatch(b, a)); QVERIFY(!accessor.isBetterMatch(b, a));
@@ -114,10 +235,10 @@ void tst_SettingsAccessor::isBetterMatch_noId()
void tst_SettingsAccessor::isBetterMatch_sameVersion() void tst_SettingsAccessor::isBetterMatch_sameVersion()
{ {
const BasicTestSettingsAccessor accessor; const TestSettingsAccessor accessor;
const QVariantMap a = versionedMap(10, "test"); const QVariantMap a = versionedMap(7, TESTACCESSOR_DEFAULT_ID);
const QVariantMap b = versionedMap(10, "test"); const QVariantMap b = versionedMap(7, TESTACCESSOR_DEFAULT_ID);
QVERIFY(!accessor.isBetterMatch(a, b)); QVERIFY(!accessor.isBetterMatch(a, b));
QVERIFY(!accessor.isBetterMatch(b, a)); QVERIFY(!accessor.isBetterMatch(b, a));
@@ -125,10 +246,10 @@ void tst_SettingsAccessor::isBetterMatch_sameVersion()
void tst_SettingsAccessor::isBetterMatch_emptyMap() void tst_SettingsAccessor::isBetterMatch_emptyMap()
{ {
const BasicTestSettingsAccessor accessor; const TestSettingsAccessor accessor;
const QVariantMap a; const QVariantMap a;
const QVariantMap b = versionedMap(10, "test"); const QVariantMap b = versionedMap(7, TESTACCESSOR_DEFAULT_ID);
QVERIFY(accessor.isBetterMatch(a, b)); QVERIFY(accessor.isBetterMatch(a, b));
QVERIFY(!accessor.isBetterMatch(b, a)); QVERIFY(!accessor.isBetterMatch(b, a));
@@ -136,13 +257,18 @@ void tst_SettingsAccessor::isBetterMatch_emptyMap()
void tst_SettingsAccessor::isBetterMatch_twoEmptyMaps() void tst_SettingsAccessor::isBetterMatch_twoEmptyMaps()
{ {
const BasicTestSettingsAccessor accessor; const TestSettingsAccessor accessor;
const QVariantMap a; const QVariantMap a;
const QVariantMap b; const QVariantMap b;
QVERIFY(accessor.isBetterMatch(a, b)); // The following two fails are harmless: They claim an empty map is better than another empty
QVERIFY(accessor.isBetterMatch(b, a)); // map, so it will trigger a useless copy of one empty map over another.
// This copy will be avoided when reworking isBetterMatch later.
QEXPECT_FAIL("", "harmless but unexpected behavior", Continue);
QVERIFY(!accessor.isBetterMatch(a, b));
QEXPECT_FAIL("", "harmless but unexpected behavior", Continue);
QVERIFY(!accessor.isBetterMatch(b, a));
} }
QTEST_MAIN(tst_SettingsAccessor) QTEST_MAIN(tst_SettingsAccessor)