Skip to content

Commit

Permalink
Merge pull request #6 from ventsyv/expansion_problem
Browse files Browse the repository at this point in the history
Expansion problem
  • Loading branch information
ventsyv authored Nov 9, 2023
2 parents 7006f5f + 1b52781 commit 6e6cd86
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 12 deletions.
27 changes: 15 additions & 12 deletions src/Expander.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ void Expander::generate(const wstring &pattern)
return;
}

uint currentItem = 0; //current pattern in the data array
//Increment when unescaped [ is reached, decrement when ]
uint load = 0;
bool escSeqReached = false;
Expand Down Expand Up @@ -58,18 +57,17 @@ void Expander::generate(const wstring &pattern)
//it is a part of the pattern
if (load == 0) //constant character - escape sequences here are disregarded
{
if (currentItem == 0) //data array is empty
if (results.size() == 0) //data array is empty
{
results.push_back(wstring(1, expandedPattern[i]));
currentItem++;
}
else //variations are present.
{
//add the constant character to all variations
//Just appending the constant character to all patterns
for (uint j = 0; j < currentItem; j++)
for (size_t j = 0; j < results.size(); j++)
{
results[j] = results[j] + pattern[i];
results[j] = results[j] + expandedPattern[i];
}
}
}
Expand Down Expand Up @@ -116,7 +114,7 @@ uint Expander::getBlockElements(const wstring &pattern, uint &start,
uint currentIndx = start; //remember we are going from right to left

//Find the end of the block
while (currentIndx >= 0) //we are going backwards
while (currentIndx != 0) //we are going backwards
{
if (pattern[currentIndx] == groupBegin
|| pattern[currentIndx] == groupEnd)
Expand Down Expand Up @@ -316,6 +314,11 @@ bool Expander::validate(const wstring &pattern)
output << "Error: Unclosed group bracket" << endl;
}

if (loadQuotes %2 != 0)
{
output << "Error: Unclosed quote detected" << endl;
}

return ((loadQuotes % 2 == 0) && (loadBrackets % 2 == 0));
}

Expand All @@ -325,8 +328,8 @@ void Expander::getCombinations(vector<wstring> &data,
vector<wstring> original = data;
vector<wstring> temp = data;

uint numNewElements = newElements.size();
uint numOrgElements = original.size();
auto numNewElements = newElements.size();
auto numOrgElements = original.size();

//Nothing to do, just return
if (numNewElements == 0)
Expand All @@ -342,15 +345,15 @@ void Expander::getCombinations(vector<wstring> &data,
else
{

for (int i = 0; i < numOrgElements; i++)
for (size_t i = 0; i < numOrgElements; i++)
{
data[i] = data[i] + newElements[0];
}
}

for (int i = 1; i < numNewElements; i++)
for (size_t i = 1; i < numNewElements; i++)
{
for (int j = 0; j < numOrgElements; j++)
for (size_t j = 0; j < numOrgElements; j++)
{
temp[j] = temp[j] + newElements[i];
}
Expand Down Expand Up @@ -389,7 +392,7 @@ void Expander::processGroup(const wstring &pattern, uint &i, uint &currentItem)
}
//do the actual combination
int indx = 0; //current block element
for (int k = 0; k < currentItem; k++)
for (uint k = 0; k < currentItem; k++)
{

if (k != 0 && k % nDataElements == 0)
Expand Down
24 changes: 24 additions & 0 deletions test/TestExpander.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -640,6 +640,30 @@ TEST_F(TestExpander, testGenerate_VariableBlock_EmbededVarBlock_Cyrilic)
EXPECT_EQ(data[8], L"");
}

TEST_F(TestExpander, testGenerate_VariableBlock_First)
{

wstring pattern = L"[1-3]abc";
underTest.generate(pattern);
auto data = underTest.getData();
EXPECT_EQ(data.size(), 3);
EXPECT_EQ(data[0], L"1abc");
EXPECT_EQ(data[1], L"2abc");
EXPECT_EQ(data[2], L"3abc");
}

TEST_F(TestExpander, testGenerate_VariableBlock_Middle)
{

wstring pattern = L"ab[1-3]cd";
underTest.generate(pattern);
auto data = underTest.getData();
EXPECT_EQ(data.size(), 3);
EXPECT_EQ(data[0], L"ab1cd");
EXPECT_EQ(data[1], L"ab2cd");
EXPECT_EQ(data[2], L"ab3cd");
}

int main(int argc, char **argv)
{
::testing::InitGoogleTest(&argc, argv);
Expand Down

0 comments on commit 6e6cd86

Please sign in to comment.