Added tests for string-split, and fixed some bigs
This commit is contained in:
parent
25bd269729
commit
5fbf07f946
BIN
Exec/.main.cpp.swp
Normal file
BIN
Exec/.main.cpp.swp
Normal file
Binary file not shown.
@ -4,7 +4,7 @@
|
||||
int main()
|
||||
{
|
||||
std::vector<std::string> foo =
|
||||
StringTools::Split("Hello, lol, test", ", ");
|
||||
StringTools::Split(",,Hello,,lol,,test,,", ",,");
|
||||
|
||||
for (const auto& it : foo)
|
||||
std::cout << "'" << it << "'" << std::endl;
|
||||
|
@ -94,10 +94,14 @@ std::string StringTools::Upper(const std::string& str) {
|
||||
}
|
||||
|
||||
std::vector<std::string> StringTools::Split(const std::string& str, const std::string& seperator) {
|
||||
std::vector<std::string> toRet;
|
||||
std::vector<std::string> toRet;
|
||||
|
||||
// Quick-accept: str length is 0
|
||||
if (str.length() == 0)
|
||||
toRet.push_back("");
|
||||
|
||||
// Quick-accept: seperator length is 0
|
||||
if (seperator.length() == 0) {
|
||||
else if (seperator.length() == 0) {
|
||||
for (const char c : str)
|
||||
toRet.push_back(std::string(&c, (&c) + 1));
|
||||
}
|
||||
@ -106,15 +110,23 @@ std::vector<std::string> StringTools::Split(const std::string& str, const std::s
|
||||
std::size_t idx = 0;
|
||||
while (idx != std::string::npos) {
|
||||
std::size_t lastIdx = idx;
|
||||
idx = str.find(seperator, idx + seperator.length());
|
||||
idx = str.find(seperator, idx);
|
||||
|
||||
toRet.push_back(str.substr(
|
||||
lastIdx,
|
||||
idx - lastIdx
|
||||
));
|
||||
// Grab our substring until the next finding of sep
|
||||
if (idx != std::string::npos) {
|
||||
toRet.push_back(str.substr(
|
||||
lastIdx,
|
||||
idx - lastIdx
|
||||
));
|
||||
|
||||
if (idx != std::string::npos)
|
||||
idx += seperator.length();
|
||||
}
|
||||
// No more seperator found. Grab the rest until the end of the string
|
||||
else {
|
||||
toRet.push_back(str.substr(
|
||||
lastIdx
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
BIN
Test/.String__Split.cpp.swp
Normal file
BIN
Test/.String__Split.cpp.swp
Normal file
Binary file not shown.
@ -15,6 +15,7 @@ add_executable(Test
|
||||
String__Upper.cpp
|
||||
String__Replace_Char.cpp
|
||||
String__Replace_String.cpp
|
||||
String__Split.cpp
|
||||
|
||||
# CharTools-Tests
|
||||
Char__IsVowel.cpp
|
||||
|
156
Test/String__Split.cpp
Normal file
156
Test/String__Split.cpp
Normal file
@ -0,0 +1,156 @@
|
||||
#include <StringTools.h>
|
||||
#include "Catch2.h"
|
||||
|
||||
// Tests that splitting an empty string always returns {""}
|
||||
TEST_CASE(__FILE__"/EmptyString", "[Strings][Split]")
|
||||
{
|
||||
SECTION("Empty seperator") {
|
||||
// Setup
|
||||
const std::string in = "";
|
||||
const std::string sep = "";
|
||||
|
||||
// Exercise
|
||||
const std::vector<std::string> out = StringTools::Split(in, sep);
|
||||
|
||||
// Verify
|
||||
REQUIRE(out.size() == 1);
|
||||
REQUIRE(out[0] == "");
|
||||
}
|
||||
|
||||
SECTION("Nonempty seperator") {
|
||||
// Setup
|
||||
const std::string in = "";
|
||||
const std::string sep = ",";
|
||||
|
||||
// Exercise
|
||||
const std::vector<std::string> out = StringTools::Split(in, sep);
|
||||
|
||||
// Verify
|
||||
REQUIRE(out.size() == 1);
|
||||
REQUIRE(out[0] == "");
|
||||
}
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Tests that splitting a string with an empty seperator returns all the chars
|
||||
TEST_CASE(__FILE__"/EmptySeperator", "[Strings][Split]")
|
||||
{
|
||||
// Setup
|
||||
const std::string in = "hello world";
|
||||
const std::string sep = "";
|
||||
const std::vector<std::string> expected = { "h", "e", "l", "l", "o", " ", "w", "o", "r", "l", "d" };
|
||||
|
||||
// Exercise
|
||||
const std::vector<std::string> out = StringTools::Split(in, sep);
|
||||
|
||||
// Verify
|
||||
REQUIRE(out == expected);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Tests that splitting a string with a single-char seperator works
|
||||
TEST_CASE(__FILE__"/SingleCharSeperator", "[Strings][Split]")
|
||||
{
|
||||
// Setup
|
||||
const std::string in = "0,1,2,3,4,5,6,7,8,9";
|
||||
const std::string sep = ",";
|
||||
const std::vector<std::string> expected = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
|
||||
|
||||
// Exercise
|
||||
const std::vector<std::string> out = StringTools::Split(in, sep);
|
||||
|
||||
// Verify
|
||||
REQUIRE(out == expected);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Tests that having seperators next to each other gets empty strings
|
||||
TEST_CASE(__FILE__"/SingleCharSeperatorsNextToEachOther", "[Strings][Split]")
|
||||
{
|
||||
// Setup
|
||||
const std::string in = "0,1,,3";
|
||||
const std::string sep = ",";
|
||||
const std::vector<std::string> expected = { "0", "1", "", "3" };
|
||||
|
||||
// Exercise
|
||||
const std::vector<std::string> out = StringTools::Split(in, sep);
|
||||
|
||||
// Verify
|
||||
REQUIRE(out == expected);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Tests that having seperators at index 0 and -1 returns empty strings
|
||||
TEST_CASE(__FILE__"/SingleCharSeperatorsAtExtremePoints", "[Strings][Split]")
|
||||
{
|
||||
// Setup
|
||||
const std::string in = ",0,1,2,";
|
||||
const std::string sep = ",";
|
||||
const std::vector<std::string> expected = { "", "0", "1", "2", "" };
|
||||
|
||||
// Exercise
|
||||
const std::vector<std::string> out = StringTools::Split(in, sep);
|
||||
|
||||
// Verify
|
||||
REQUIRE(out == expected);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Tests that splitting a string with a multi-char seperator works
|
||||
TEST_CASE(__FILE__"/MultiCharSeperator", "[Strings][Split]")
|
||||
{
|
||||
// Setup
|
||||
const std::string in = "0;;1;;2;;3;;4;;5;;6;;7;;8;;9";
|
||||
const std::string sep = ";;";
|
||||
const std::vector<std::string> expected = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
|
||||
|
||||
// Exercise
|
||||
const std::vector<std::string> out = StringTools::Split(in, sep);
|
||||
|
||||
// Verify
|
||||
REQUIRE(out == expected);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Tests that having seperators next to each other gets empty strings
|
||||
TEST_CASE(__FILE__"/MultiCharSeperatorsNextToEachOther", "[Strings][Split]")
|
||||
{
|
||||
// Setup
|
||||
const std::string in = "0;;1;;;;3";
|
||||
const std::string sep = ";;";
|
||||
const std::vector<std::string> expected = { "0", "1", "", "3" };
|
||||
|
||||
// Exercise
|
||||
const std::vector<std::string> out = StringTools::Split(in, sep);
|
||||
|
||||
// Verify
|
||||
REQUIRE(out == expected);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Tests that having seperators at index 0 and -1 returns empty strings
|
||||
TEST_CASE(__FILE__"/MultiCharSeperatorsAtExtremePoints", "[Strings][Split]")
|
||||
{
|
||||
// Setup
|
||||
const std::string in = ";;0;;1;;2;;";
|
||||
const std::string sep = ";;";
|
||||
const std::vector<std::string> expected = { "", "0", "1", "2", "" };
|
||||
|
||||
// Exercise
|
||||
const std::vector<std::string> out = StringTools::Split(in, sep);
|
||||
|
||||
// Verify
|
||||
REQUIRE(out == expected);
|
||||
|
||||
return;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user