diff --git a/launcher/Version.cpp b/launcher/Version.cpp index fdfd2721b..ebe31b12a 100644 --- a/launcher/Version.cpp +++ b/launcher/Version.cpp @@ -107,9 +107,11 @@ void Version::parse() if (c == '+') { break; // Ignore appendices } - if (c == '-') { + // custom: the space is special to handle the strings like "1.20 Pre-Release 1" + // this is needed to support Modrinth versions + if (c == '-' || c == ' ') { // Add dash to component - cur.value += '-'; + cur.value += c; i++; // If the next rune is non-digit, mark as pre-release (requires >= 1 non-digit after dash so the component has length > 1) if (i < len && !m_string.at(i).isDigit()) { @@ -121,8 +123,9 @@ void Version::parse() } for (; i < len; i++) { auto r = m_string.at(i); - if ((r.isDigit() != (cur.t == Section::Type::Numeric)) || - (r == '-' && cur.t != Section::Type::PreRelease) // "---" is a valid pre-release component + if ((r.isDigit() != (cur.t == Section::Type::Numeric)) // starts a new section + || (r == ' ' && cur.t == Section::Type::Numeric) // custom: numeric section then a space is a pre-release + || (r == '-' && cur.t != Section::Type::PreRelease) // "---" is a valid pre-release component || r == '+') { // Run completed (do not consume this rune) break; diff --git a/tests/Version_test.cpp b/tests/Version_test.cpp index f3bdfec14..f6ac6f951 100644 --- a/tests/Version_test.cpp +++ b/tests/Version_test.cpp @@ -181,8 +181,33 @@ class VersionTest : public QObject { QCOMPARE(v1 > v2, !lessThan && !equal); QCOMPARE(v1 == v2, equal); } + + void test_strict_weak_order() + { + // this tests the strict_weak_order + // https://en.cppreference.com/w/cpp/concepts/strict_weak_order.html + Version a("1.10 Pre-Release 1"); // this is a pre-relese is before b because ' ' is lower than '-' + Version b("1.10-pre1"); // this is a pre-release is before c that is an actual release + Version c("1.10"); + + auto r = [](const Version& a, const Version& b) { return a < b; }; + auto e = [&r](const Version& a, const Version& b) { return !r(a, b) && !r(b, a); }; + + qCritical() << a << b << c; + + // irreflexive + QCOMPARE(r(a, a), false); + QCOMPARE(r(b, b), false); + QCOMPARE(r(c, c), false); + // transitive + QCOMPARE(r(a, b), true); + QCOMPARE(r(b, c), true); + QCOMPARE(r(a, c), true); + // transitive equivalence + QCOMPARE(e(a, b) && e(b, c), e(a, c)); + } }; QTEST_GUILESS_MAIN(VersionTest) -#include "Version_test.moc" +#include "Version_test.moc" \ No newline at end of file