From 2cdde810772eb00e6757d3c79de79971904c90c6 Mon Sep 17 00:00:00 2001 From: Martchus Date: Sun, 27 Oct 2019 15:43:44 +0100 Subject: [PATCH] Fix startsWith() if strings are equal --- conversion/stringconversion.h | 8 ++++++-- tests/conversiontests.cpp | 4 ++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/conversion/stringconversion.h b/conversion/stringconversion.h index 12ac8e3..b9e4a6e 100644 --- a/conversion/stringconversion.h +++ b/conversion/stringconversion.h @@ -212,9 +212,11 @@ template bool startsWith(const StringType &str, const Stri if (str.size() < phrase.size()) { return false; } - for (auto stri = str.cbegin(), strend = str.cend(), phrasei = phrase.cbegin(), phraseend = phrase.cend(); stri != strend; ++stri, ++phrasei) { + for (auto stri = str.cbegin(), strend = str.cend(), phrasei = phrase.cbegin(), phraseend = phrase.cend();; ++stri, ++phrasei) { if (phrasei == phraseend) { return true; + } else if (stri == strend) { + return false; } else if (*stri != *phrasei) { return false; } @@ -227,9 +229,11 @@ template bool startsWith(const StringType &str, const Stri */ template bool startsWith(const StringType &str, const typename StringType::value_type *phrase) { - for (auto stri = str.cbegin(), strend = str.cend(); stri != strend; ++stri, ++phrase) { + for (auto stri = str.cbegin(), strend = str.cend();; ++stri, ++phrase) { if (!*phrase) { return true; + } else if (stri == strend) { + return false; } else if (*stri != *phrase) { return false; } diff --git a/tests/conversiontests.cpp b/tests/conversiontests.cpp index 371ab9f..0a33b74 100644 --- a/tests/conversiontests.cpp +++ b/tests/conversiontests.cpp @@ -315,6 +315,10 @@ void ConversionTests::testStringConversions() CPPUNIT_ASSERT(startsWith(findReplaceTest, "findOr")); CPPUNIT_ASSERT(!startsWith(findReplaceTest, "findAnd"s)); CPPUNIT_ASSERT(startsWith(findReplaceTest, "findOr"s)); + CPPUNIT_ASSERT(startsWith("test"s, "test"s)); + CPPUNIT_ASSERT(startsWith("test"s, "test")); + CPPUNIT_ASSERT(!startsWith("test"s, "tests"s)); + CPPUNIT_ASSERT(!startsWith("test"s, "tests")); // containsSubstrings() CPPUNIT_ASSERT(containsSubstrings("this string contains foo and bar", { "foo", "bar" }));