reapack

Package manager for REAPER
Log | Files | Refs | Submodules | README | LICENSE

commit cd5b5090a426fefbc38acf7d5839a6a33b55c888
parent 23517d309c46d28de87294734204054c0cd850a1
Author: cfillion <cfillion@users.noreply.github.com>
Date:   Sun, 22 May 2016 21:18:45 -0400

version: don't allow leading letters

fix v1.0 being lower than 0 which caused Package#lastVersion(true) to return null

Diffstat:
Msrc/version.cpp | 13++++++++-----
Mtest/version.cpp | 41+++++++++++++++++++++++++----------------
2 files changed, 33 insertions(+), 21 deletions(-)

diff --git a/src/version.cpp b/src/version.cpp @@ -58,7 +58,7 @@ void Version::parse(const string &str) const auto &begin = sregex_iterator(str.begin(), str.end(), pattern); const sregex_iterator end; - size_t numeric = 0, alpha = 0; + size_t numbers = 0, letters = 0; vector<Segment> segments; for(sregex_iterator it = begin; it != end; it++) { @@ -66,13 +66,16 @@ void Version::parse(const string &str) const char first = tolower(match[0]); if(first >= 'a' || first >= 'z') { + if(!numbers) + throw reapack_error("invalid version name"); + segments.push_back(match); - alpha++; + letters++; } else { try { segments.push_back(boost::lexical_cast<Numeric>(match)); - numeric++; + numbers++; } catch(const boost::bad_lexical_cast &) { throw reapack_error("version segment overflow"); @@ -80,12 +83,12 @@ void Version::parse(const string &str) } } - if(!numeric) + if(!numbers) throw reapack_error("invalid version name"); m_name = str; swap(m_segments, segments); - m_stable = alpha < 1; + m_stable = letters < 1; } bool Version::tryParse(const string &str) diff --git a/test/version.cpp b/test/version.cpp @@ -28,7 +28,7 @@ TEST_CASE("construct null version", M) { REQUIRE(ver.mainSources().empty()); } -TEST_CASE("parse version", M) { +TEST_CASE("parse valid versions", M) { Version ver; SECTION("valid") { @@ -43,14 +43,33 @@ TEST_CASE("parse version", M) { ver.parse("1.0"); REQUIRE(ver.isStable()); } +} - SECTION("invalid") { - try { ver.parse("hello"); FAIL(); } - catch(const reapack_error &) {} +TEST_CASE("parse invalid versions", M) { + Version ver; - REQUIRE(ver.name().empty()); - REQUIRE(ver.size() == 0); + try { + SECTION("only letters") { + ver.parse("hello"); + FAIL(); + } + + SECTION("leading letter") { + ver.parse("v1.0"); + FAIL(); + } + + SECTION("empty") { + ver.parse(""); + FAIL(); + } } + catch(const reapack_error &e) { + REQUIRE(string(e.what()) == "invalid version name"); + } + + REQUIRE(ver.name().empty()); + REQUIRE(ver.size() == 0); } TEST_CASE("parse version failsafe", M) { @@ -71,16 +90,6 @@ TEST_CASE("parse version failsafe", M) { } } -TEST_CASE("construct invalid version", M) { - try { - Version ver("hello"); - FAIL(); - } - catch(const reapack_error &e) { - REQUIRE(string(e.what()) == "invalid version name"); - } -} - TEST_CASE("decimal version", M) { Version ver("5.05"); REQUIRE(ver == Version("5.5"));