#2310 Version compare : Improve interface and add unit test

This commit is contained in:
Magne Sjaastad
2018-01-04 07:57:11 +01:00
parent 226b43611e
commit dbc1061a59
3 changed files with 294 additions and 137 deletions

View File

@@ -23,62 +23,93 @@
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
bool RiaProjectFileVersionTools::isProjectFileVersionNewerThan(const QString& projectFileVersion, bool RiaProjectFileVersionTools::isCandidateVersionNewerThanOther(const QString& candidateProjectFileVersion,
const RiaProjectFileVersionData& fileVersionData) const QString& projectFileVersion)
{ {
return isProjectFileVersionNewerThan(projectFileVersion, fileVersionData.m_majorVersion, fileVersionData.m_minorVersion, int candidateMajorVersion = 0;
fileVersionData.m_patch, fileVersionData.m_developmentId); int candidateMinorVersion = 0;
int candidatePatchNumber = 0;
int candidateDevelopmentId = 0;
RiaProjectFileVersionTools::decodeVersionString(candidateProjectFileVersion, &candidateMajorVersion, &candidateMinorVersion,
&candidatePatchNumber, &candidateDevelopmentId);
int majorVersion = 0;
int minorVersion = 0;
int patchNumber = 0;
int developmentId = 0;
RiaProjectFileVersionTools::decodeVersionString(projectFileVersion, &majorVersion, &minorVersion, &patchNumber,
&developmentId);
return RiaProjectFileVersionTools::isCandidateNewerThanOther(candidateMajorVersion, candidateMinorVersion,
candidatePatchNumber, candidateDevelopmentId, majorVersion,
minorVersion, patchNumber, developmentId);
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
bool RiaProjectFileVersionTools::isProjectFileVersionNewerThan(const QString& projectFileVersion, int majorVersion, void RiaProjectFileVersionTools::decodeVersionString(const QString& projectFileVersion, int* majorVersion, int* minorVersion,
int minorVersion, int patchNumber, int developmentId) int* patch, int* developmentId)
{ {
int projectMajorVersion = 0; if (projectFileVersion.isEmpty()) return;
int projectMinorVersion = 0;
int projectPatchNumber = 0;
int projectDevelopmentId = 0;
// Split string and interpret sub strings QStringList subStrings = projectFileVersion.split(".");
if (subStrings.size() > 0)
{ {
QStringList subStrings = projectFileVersion.split("."); *majorVersion = subStrings[0].toInt();
if (subStrings.size() > 0)
{
projectMajorVersion = subStrings[0].toInt();
}
if (subStrings.size() > 1)
{
projectMinorVersion = subStrings[1].toInt();
}
if (subStrings.size() > 2)
{
projectPatchNumber = subStrings[2].toInt();
}
} }
if (projectMajorVersion != majorVersion) if (subStrings.size() > 1)
{ {
return (projectMajorVersion > majorVersion); *minorVersion = subStrings[1].toInt();
} }
if (projectMinorVersion != minorVersion) if (subStrings.size() > 2)
{ {
return (projectMinorVersion > minorVersion); QString candidate = subStrings[2];
QString candidateDigitsOnly = RiaProjectFileVersionTools::stringOfDigits(candidate);
*patch = candidateDigitsOnly.toInt();
} }
if (projectPatchNumber != patchNumber) if (subStrings.size() > 3)
{ {
return (projectPatchNumber > patchNumber); QString candidate = subStrings.back();
QString candidateDigitsOnly = RiaProjectFileVersionTools::stringOfDigits(candidate);
*developmentId = candidateDigitsOnly.toInt();
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RiaProjectFileVersionTools::isCandidateNewerThanOther(int candidateMajorVersion, int candidateMinorVersion,
int candidatePatchNumber, int candidateDevelopmentId,
int otherMajorVersion, int otherMinorVersion, int otherPatchNumber,
int otherDevelopmentId)
{
if (candidateMajorVersion != otherMajorVersion)
{
return (candidateMajorVersion > otherMajorVersion);
} }
if (projectDevelopmentId != developmentId) if (candidateMinorVersion != otherMinorVersion)
{ {
return (projectDevelopmentId > developmentId); return (candidateMinorVersion > otherMinorVersion);
}
if (candidatePatchNumber != otherPatchNumber)
{
return (candidatePatchNumber > otherPatchNumber);
}
if (candidateDevelopmentId != otherDevelopmentId)
{
return (candidateDevelopmentId > otherDevelopmentId);
} }
return false; return false;
@@ -87,68 +118,25 @@ bool RiaProjectFileVersionTools::isProjectFileVersionNewerThan(const QString& pr
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
QStringList RiaProjectFileVersionTools::knownProjectVersionStrings() QString RiaProjectFileVersionTools::stringOfDigits(const QString& string)
{ {
QStringList versionStrings; QString digitsOnly;
versionStrings << "2017.05.2-dev.15"; for (const auto& c : string)
versionStrings << "2017.05.2-dev.14"; {
versionStrings << "2017.05.2-dev.13"; if (c.isDigit())
versionStrings << "2017.05.2-dev.12"; {
versionStrings << "2017.05.2-dev.11"; digitsOnly += c;
versionStrings << "2017.05.2-dev.10"; }
versionStrings << "2017.05.2-dev.09"; else
versionStrings << "2017.05.2-dev.08"; {
versionStrings << "2017.05.2-dev.07"; if (!digitsOnly.isEmpty())
versionStrings << "2017.05.2-dev.06"; {
versionStrings << "2017.05.2-dev.05"; return digitsOnly;
versionStrings << "2017.05.2-dev.04"; }
versionStrings << "2017.05.2-dev.03"; }
versionStrings << "2017.05.2-dev.02"; }
versionStrings << "2017.05.2-fdev.02";
versionStrings << "2017.05.2-dev.1";
versionStrings << "2017.05.2-fdev.01";
versionStrings << "2017.05.2";
versionStrings << "2017.05.pre-proto.15";
versionStrings << "2017.05.1-dev";
versionStrings << "2017.05.1";
versionStrings << "2017.05.0";
versionStrings << "2016.11.flow.14"; return digitsOnly;
versionStrings << "2016.11.flow.12";
versionStrings << "2016.11.flow.11";
versionStrings << "2016.11.flow.9";
versionStrings << "2016.11.flow.8";
versionStrings << "2016.11.flow.7";
versionStrings << "2016.11.flow.1";
versionStrings << "2016.11.m.1";
versionStrings << "2016.11.0";
versionStrings << "1.6.10-dev";
versionStrings << "1.6.9-dev";
versionStrings << "1.6.8-dev";
versionStrings << "1.6.7-gm-beta";
versionStrings << "1.6.6-dev";
versionStrings << "1.6.5-dev";
versionStrings << "1.6.4-dev";
versionStrings << "1.6.3-dev";
versionStrings << "1.6.1-dev";
versionStrings << "1.6.2-dev";
versionStrings << "1.6.0-RC";
versionStrings << "1.5.111-RC";
versionStrings << "1.5.110-RC";
versionStrings << "1.5.109-RC";
versionStrings << "1.5.108-RC";
versionStrings << "1.5.107-RC";
versionStrings << "1.5.106-RC";
versionStrings << "1.5.105-RC";
versionStrings << "1.5.104-RC";
versionStrings << "1.5.103-dev";
versionStrings << "1.5.102-dev";
versionStrings << "1.5.101-dev";
versionStrings << "1.5.100-dev";
versionStrings << "1.5.0";
return versionStrings;
} }

View File

@@ -20,37 +20,23 @@
#include <QString> #include <QString>
//==================================================================================================
//
//==================================================================================================
struct RiaProjectFileVersionData
{
int m_majorVersion;
int m_minorVersion;
int m_patch;
int m_developmentId;
RiaProjectFileVersionData() : m_majorVersion(0), m_minorVersion(0), m_patch(0), m_developmentId(0) {}
RiaProjectFileVersionData(int majorVersion, int minorVersion, int patch, int developmentId)
: m_majorVersion(majorVersion), m_minorVersion(minorVersion), m_patch(patch), m_developmentId(developmentId)
{
}
};
//================================================================================================== //==================================================================================================
// //
//================================================================================================== //==================================================================================================
class RiaProjectFileVersionTools class RiaProjectFileVersionTools
{ {
public: public:
static bool isProjectFileVersionNewerThan(const QString& projectFileVersion, static bool isCandidateVersionNewerThanOther(const QString& candidateProjectFileVersion,
const RiaProjectFileVersionData& fileVersionData); const QString& otherProjectFileVersion);
// Public to be able to unit test function, not intended to be used
static void decodeVersionString(const QString& projectFileVersion, int* majorVersion, int* minorVersion, int* patch,
int* developmentId);
private: private:
static bool isProjectFileVersionNewerThan(const QString& projectFileVersion, int majorVersion, int minorVersion, int patch, static bool isCandidateNewerThanOther(int candidateMajorVersion, int candidateMinorVersion, int candidatePatchNumber,
int developmentId); int candidateDevelopmentId, int otherMajorVersion, int otherMinorVersion,
int otherPatchNumber, int otherDevelopmentId);
static QStringList knownProjectVersionStrings(); static QString stringOfDigits(const QString& string);
}; };

View File

@@ -1,30 +1,213 @@
#include "gtest/gtest.h" #include "gtest/gtest.h"
#include "RiaProjectFileVersionTools.h"
#include <QStringList>
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
TEST(RiaProjectFileVersionTools, BasicUsage) TEST(RiaProjectFileVersionTools, BasicUsage)
{ {
/* /*
std::vector<double> a(10); {
std::iota(a.begin(), a.end(), 10); QString projectFileVersionString = "2017.05.1";
std::vector<double> b(10); int majorVersion = 2017;
std::iota(b.begin(), b.end(), 100); int minorVersion = 5;
int patchNumber = 0;
int developmentId = 0;
std::vector<double> c(10); bool isNewer = RiaProjectFileVersionTools::isProjectFileVersionNewerThan(projectFileVersionString, majorVersion,
minorVersion, patchNumber, developmentId);
EXPECT_TRUE(isNewer);
}
ExpressionParser parser; {
parser.assignVector("a", a); QString projectFileVersionString = "2017.05.1.text.13";
parser.assignVector("b", b);
parser.assignVector("c", c);
QString expr = "c := a + b"; {
EXPECT_TRUE(parser.evaluate(expr)); int majorVersion = 2017;
int minorVersion = 5;
int patchNumber = 1;
int developmentId = 14;
EXPECT_DOUBLE_EQ(c[0], 110.0); bool isNewer = RiaProjectFileVersionTools::isProjectFileVersionNewerThan(projectFileVersionString, majorVersion,
EXPECT_DOUBLE_EQ(c[9], 128.0); minorVersion, patchNumber,
*/ developmentId); EXPECT_FALSE(isNewer);
}
{
int majorVersion = 2017;
int minorVersion = 5;
int patchNumber = 1;
int developmentId = 13;
bool isNewer = RiaProjectFileVersionTools::isProjectFileVersionNewerThan(projectFileVersionString, majorVersion,
minorVersion, patchNumber,
developmentId); EXPECT_TRUE(isNewer);
}
{
int majorVersion = 2017;
int minorVersion = 5;
int patchNumber = 1;
int developmentId = 12;
bool isNewer = RiaProjectFileVersionTools::isProjectFileVersionNewerThan(projectFileVersionString, majorVersion,
minorVersion, patchNumber,
developmentId); EXPECT_TRUE(isNewer);
}
}
*/
}
TEST(RiaProjectFileVersionTools, DecodeProjectVersionString)
{
{
int majorVersion = -1;
int minorVersion = -1;
int patchNumber = -1;
int developmentId = -1;
QString projectFileVersionString = "2017.05.1";
RiaProjectFileVersionTools::decodeVersionString(projectFileVersionString, &majorVersion, &minorVersion, &patchNumber,
&developmentId);
EXPECT_EQ(2017, majorVersion);
EXPECT_EQ(5, minorVersion);
EXPECT_EQ(1, patchNumber);
EXPECT_EQ(-1, developmentId);
}
{
int majorVersion = -1;
int minorVersion = -1;
int patchNumber = -1;
int developmentId = -1;
QString projectFileVersionString = "";
RiaProjectFileVersionTools::decodeVersionString(projectFileVersionString, &majorVersion, &minorVersion, &patchNumber,
&developmentId);
EXPECT_EQ(-1, majorVersion);
EXPECT_EQ(-1, minorVersion);
EXPECT_EQ(-1, patchNumber);
EXPECT_EQ(-1, developmentId);
}
{
int majorVersion = -1;
int minorVersion = -1;
int patchNumber = -1;
int developmentId = -1;
QString projectFileVersionString = "2017.05.2-dev.23";
RiaProjectFileVersionTools::decodeVersionString(projectFileVersionString, &majorVersion, &minorVersion, &patchNumber,
&developmentId);
EXPECT_EQ(2017, majorVersion);
EXPECT_EQ(5, minorVersion);
EXPECT_EQ(2, patchNumber);
EXPECT_EQ(23, developmentId);
}
{
int majorVersion = -1;
int minorVersion = -1;
int patchNumber = -1;
int developmentId = -1;
QString projectFileVersionString = "2017.05.2-dev.long.text..23";
RiaProjectFileVersionTools::decodeVersionString(projectFileVersionString, &majorVersion, &minorVersion, &patchNumber,
&developmentId);
EXPECT_EQ(2017, majorVersion);
EXPECT_EQ(5, minorVersion);
EXPECT_EQ(2, patchNumber);
EXPECT_EQ(23, developmentId);
}
}
TEST(RiaProjectFileVersionTools, OrderKnownVersionStrings)
{
QStringList versionStrings;
{
// The following list is taken from traversing history of ResInsightVersion.cmake
versionStrings << "2017.05.2-dev.15";
versionStrings << "2017.05.2-dev.14";
versionStrings << "2017.05.2-dev.13";
versionStrings << "2017.05.2-dev.12";
versionStrings << "2017.05.2-dev.11";
versionStrings << "2017.05.2-dev.10";
versionStrings << "2017.05.2-dev.09";
versionStrings << "2017.05.2-dev.08";
versionStrings << "2017.05.2-dev.07";
versionStrings << "2017.05.2-dev.06";
versionStrings << "2017.05.2-dev.05";
versionStrings << "2017.05.2-dev.04";
versionStrings << "2017.05.2-dev.03";
versionStrings << "2017.05.2-dev.02";
versionStrings << "2017.05.2-fdev.02";
versionStrings << "2017.05.2-dev.1";
versionStrings << "2017.05.2-fdev.01";
versionStrings << "2017.05.2";
versionStrings << "2017.05.pre-proto.15";
versionStrings << "2017.05.1-dev";
versionStrings << "2017.05.1";
versionStrings << "2017.05.0";
versionStrings << "2016.11.flow.14";
versionStrings << "2016.11.flow.12";
versionStrings << "2016.11.flow.11";
versionStrings << "2016.11.flow.9";
versionStrings << "2016.11.flow.8";
versionStrings << "2016.11.flow.7";
versionStrings << "2016.11.flow.1";
versionStrings << "2016.11.m.1";
versionStrings << "2016.11.0";
versionStrings << "1.6.10-dev";
versionStrings << "1.6.9-dev";
versionStrings << "1.6.8-dev";
versionStrings << "1.6.7-gm-beta";
versionStrings << "1.6.6-dev";
versionStrings << "1.6.5-dev";
versionStrings << "1.6.4-dev";
versionStrings << "1.6.3-dev";
versionStrings << "1.6.1-dev";
versionStrings << "1.6.2-dev";
versionStrings << "1.6.0-RC";
versionStrings << "1.5.111-RC";
versionStrings << "1.5.110-RC";
versionStrings << "1.5.109-RC";
versionStrings << "1.5.108-RC";
versionStrings << "1.5.107-RC";
versionStrings << "1.5.106-RC";
versionStrings << "1.5.105-RC";
versionStrings << "1.5.104-RC";
versionStrings << "1.5.103-dev";
versionStrings << "1.5.102-dev";
versionStrings << "1.5.101-dev";
versionStrings << "1.5.100-dev";
versionStrings << "1.5.0";
}
// Additional dummy test versions
versionStrings << "2016.12";
versionStrings << "2015";
versionStrings << "2016.10.1.sd flkj....03";
versionStrings << "2016.10.1.sdf lkj. ...04";
QStringList sortedVersionList = versionStrings;
{
qSort(sortedVersionList.begin(), sortedVersionList.end(),
RiaProjectFileVersionTools::isCandidateVersionNewerThanOther);
}
for (const auto& s : sortedVersionList)
{
// std::cout << s.toStdString() << "\n";
}
} }