diff --git a/include/ProjectVersion.h b/include/ProjectVersion.h index d181ba49a..f4a2fc101 100644 --- a/include/ProjectVersion.h +++ b/include/ProjectVersion.h @@ -32,49 +32,16 @@ enum CompareType { Major, Minor, Release, Build }; -static inline int parseMajor(QString & version) { - return version.section( '.', 0, 0 ).toInt(); -} - -static inline int parseMinor(QString & version) { - return version.section( '.', 1, 1 ).toInt(); -} - -static inline int parseRelease(QString & version) { - return version.section( '.', 2 ).section( '-', 0, 0 ).toInt(); -} - -static inline QString parseBuild(QString & version) { - return version.section( '.', 2 ).section( '-', 1 ); -} - - -/*! \brief Version number parsing and comparison +/*! \brief Version number parsing and comparison * * Parses and compares version information. i.e. "1.0.3" < "1.0.10" */ class ProjectVersion { public: - ProjectVersion(QString version, CompareType c = CompareType::Build) : - m_version(version), - m_major(parseMajor(m_version)), - m_minor(parseMinor(m_version)), - m_release(parseRelease(m_version)) , - m_build(parseBuild(m_version)), - m_compareType(c) - { - } + ProjectVersion(QString version, CompareType c = CompareType::Build); - ProjectVersion(const char * version, CompareType c = CompareType::Build) : - m_version(QString(version)), - m_major(parseMajor(m_version)), - m_minor(parseMinor(m_version)), - m_release(parseRelease(m_version)) , - m_build(parseBuild(m_version)), - m_compareType(c) - { - } + ProjectVersion(const char * version, CompareType c = CompareType::Build); static int compare(ProjectVersion v1, ProjectVersion v2); @@ -84,7 +51,7 @@ public: QString getBuild() { return m_build; } CompareType getCompareType() { return m_compareType; } ProjectVersion setCompareType(CompareType compareType) { m_compareType = compareType; return * this; } - + private: QString m_version; @@ -95,41 +62,16 @@ private: CompareType m_compareType; } ; -inline int compare(ProjectVersion v1, QString v2) -{ - return ProjectVersion::compare(v1, ProjectVersion(v2)); -} - - -/* - * ProjectVersion v. QString - */ -inline bool operator<(ProjectVersion v1, QString v2) { return compare(v1, v2) < 0; } -inline bool operator>(ProjectVersion v1, QString v2) { return compare(v1, v2) > 0; } -inline bool operator<=(ProjectVersion v1, QString v2) { return compare(v1, v2) <= 0; } -inline bool operator>=(ProjectVersion v1, QString v2) { return compare(v1, v2) >= 0; } -inline bool operator==(ProjectVersion v1, QString v2) { return compare(v1, v2) == 0; } -inline bool operator!=(ProjectVersion v1, QString v2) { return compare(v1, v2) != 0; } - -inline bool operator<(QString v1, ProjectVersion v2) { return 0 < compare(v2, v1); } -inline bool operator>(QString v1, ProjectVersion v2) { return 0 > compare(v2, v1); } -inline bool operator<=(QString v1, ProjectVersion v2) { return 0 <= compare(v2, v1); } -inline bool operator>=(QString v1, ProjectVersion v2) { return 0 >= compare(v2, v1); } -inline bool operator==(QString v1, ProjectVersion v2) { return 0 == compare(v2, v1); } -inline bool operator!=(QString v1, ProjectVersion v2) { return 0 != compare(v2, v1); } - - - /* * ProjectVersion v. ProjectVersion */ -inline bool operator<(ProjectVersion & v1, ProjectVersion & v2) { return ProjectVersion::compare(v1, v2) < 0; } -inline bool operator>(ProjectVersion & v1, ProjectVersion & v2) { return ProjectVersion::compare(v1, v2) > 0; } -inline bool operator<=(ProjectVersion & v1, ProjectVersion & v2) { return ProjectVersion::compare(v1, v2) <= 0; } -inline bool operator>=(ProjectVersion & v1, ProjectVersion & v2) { return ProjectVersion::compare(v1, v2) >= 0; } -inline bool operator==(ProjectVersion & v1, ProjectVersion & v2) { return ProjectVersion::compare(v1, v2) == 0; } -inline bool operator!=(ProjectVersion & v1, ProjectVersion & v2) { return ProjectVersion::compare(v1, v2) != 0; } +inline bool operator<(const ProjectVersion & v1, const ProjectVersion & v2) { return ProjectVersion::compare(v1, v2) < 0; } +inline bool operator>(const ProjectVersion & v1, const ProjectVersion & v2) { return ProjectVersion::compare(v1, v2) > 0; } +inline bool operator<=(const ProjectVersion & v1, const ProjectVersion & v2) { return ProjectVersion::compare(v1, v2) <= 0; } +inline bool operator>=(const ProjectVersion & v1, const ProjectVersion & v2) { return ProjectVersion::compare(v1, v2) >= 0; } +inline bool operator==(const ProjectVersion & v1, const ProjectVersion & v2) { return ProjectVersion::compare(v1, v2) == 0; } +inline bool operator!=(const ProjectVersion & v1, const ProjectVersion & v2) { return ProjectVersion::compare(v1, v2) != 0; } #endif diff --git a/src/core/ProjectVersion.cpp b/src/core/ProjectVersion.cpp index df7b5bd46..3db29c418 100644 --- a/src/core/ProjectVersion.cpp +++ b/src/core/ProjectVersion.cpp @@ -4,7 +4,7 @@ * Copyright (c) 2007 Javier Serrano Polo * Copyright (c) 2008 Tobias Doerffel * Copyright (c) 2015 Tres Finocchiaro - * + * * This file is part of LMMS - http://lmms.io * * This program is free software; you can redistribute it and/or @@ -27,16 +27,52 @@ #include "ProjectVersion.h" +int parseMajor(QString & version) { + return version.section( '.', 0, 0 ).toInt(); +} + +int parseMinor(QString & version) { + return version.section( '.', 1, 1 ).toInt(); +} + +int parseRelease(QString & version) { + return version.section( '.', 2 ).section( '-', 0, 0 ).toInt(); +} + +QString parseBuild(QString & version) { + return version.section( '.', 2 ).section( '-', 1 ); +} + +ProjectVersion::ProjectVersion(QString version, CompareType c) : + m_version(version), + m_major(parseMajor(m_version)), + m_minor(parseMinor(m_version)), + m_release(parseRelease(m_version)) , + m_build(parseBuild(m_version)), + m_compareType(c) +{ +} + +ProjectVersion::ProjectVersion(const char* version, CompareType c) : + m_version(QString(version)), + m_major(parseMajor(m_version)), + m_minor(parseMinor(m_version)), + m_release(parseRelease(m_version)) , + m_build(parseBuild(m_version)), + m_compareType(c) +{ +} + int ProjectVersion::compare(ProjectVersion v1, ProjectVersion v2) { if(v1.getMajor() != v2.getMajor()) { return v1.getMajor() - v2.getMajor(); } - + // return prematurely for Major comparison - if(v1.getCompareType() == CompareType::Major || - v2.getCompareType() == CompareType::Major) + if(v1.getCompareType() == CompareType::Major || + v2.getCompareType() == CompareType::Major) { return 0; } @@ -47,7 +83,7 @@ int ProjectVersion::compare(ProjectVersion v1, ProjectVersion v2) } // return prematurely for Minor comparison - if(v1.getCompareType() == CompareType::Minor || + if(v1.getCompareType() == CompareType::Minor || v2.getCompareType() == CompareType::Minor) { return 0; @@ -58,7 +94,7 @@ int ProjectVersion::compare(ProjectVersion v1, ProjectVersion v2) return v1.getRelease() - v2.getRelease(); } - if(v1.getCompareType() == CompareType::Release || + if(v1.getCompareType() == CompareType::Release || v2.getCompareType() == CompareType::Release) { return 0; } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 612e8639f..56520dd89 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -18,8 +18,9 @@ ADD_EXECUTABLE(tests EXCLUDE_FROM_ALL main.cpp QTestSuite - $ + + src/core/ProjectVersionTest.cpp ) TARGET_LINK_LIBRARIES(tests ${QT_LIBRARIES} ${QT_QTTEST_LIBRARY}) TARGET_LINK_LIBRARIES(tests ${LMMS_REQUIRED_LIBS}) diff --git a/tests/main.cpp b/tests/main.cpp index 1f3e95355..bfc053ad8 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -6,6 +6,7 @@ int main(int argc, char* argv[]) { + qDebug() << ">> Will run" << QTestSuite::suites().size() << "test suites"; for (QTestSuite*& suite : QTestSuite::suites()) { QTest::qExec(suite, argc, argv); diff --git a/tests/src/core/ProjectVersionTest.cpp b/tests/src/core/ProjectVersionTest.cpp new file mode 100644 index 000000000..7e6d981ea --- /dev/null +++ b/tests/src/core/ProjectVersionTest.cpp @@ -0,0 +1,43 @@ +/* + * ProjectVersionTest.cpp + * + * Copyright (c) 2015 Lukas W + * + * This file is part of LMMS - http://lmms.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + +#include "QTestSuite.h" + +#include "ProjectVersion.h" + +class ProjectVersionTest : QTestSuite +{ + Q_OBJECT +private slots: + void test() + { + Q_ASSERT(ProjectVersion("1.1.0", CompareType::Minor) > "1.0.3"); + Q_ASSERT(ProjectVersion("1.1.0", CompareType::Major) < "2.1.0"); + Q_ASSERT(ProjectVersion("1.1.0", CompareType::Release) > "0.2.1"); + Q_ASSERT(ProjectVersion("1.1.4", CompareType::Release) < "1.1.10"); + Q_ASSERT(ProjectVersion("1.1.0", CompareType::Minor) == "1.1.5"); + } +} instance; + +#include "ProjectVersionTest.moc"