Partially extracted ArgumentsReader

This commit is contained in:
Gabriel Schlozer 2016-08-29 23:56:40 +02:00
parent 83b3040364
commit 53c478d501
2 changed files with 80 additions and 50 deletions

View file

@ -0,0 +1,69 @@
#include <string>
#include <vector>
namespace UnitTest {
using namespace std;
class ArgumentsReader
{
public:
ArgumentsReader(int argc, char**argv)
{
_arguments.reserve(argc);
for (int i = 1; i < argc; i++)
{
_arguments.push_back(argv[i]);
}
}
bool findArgumentListIndex(const string & argumentName, int & outFrom, int & outCount)
{
if (_arguments.empty())
{
return false;
}
outCount = 0;
if (argumentName.empty())
{
outFrom = 1;
}
else
{
outFrom = 0;
for (size_t i = 1; i < _arguments.size(); i++)
{
if (argumentName == _arguments[i])
{
outFrom = i + 1;
break;
}
}
if (outFrom == 0)
{
return false;
}
}
for (size_t i = outFrom; i < _arguments.size(); i++)
{
string value = _arguments[i];
if (value.size() >= 2 && value.substr(0, 2) == "--")
{
break;
}
outCount++;
}
return true;
}
string getArgument(int index)
{
return _arguments[index];
}
private:
vector<string> _arguments;
};
}

View file

@ -5,6 +5,7 @@
#include "TimeHelpers.h"
#include "MemoryOutStream.h"
#include "SuitePredicate.h"
#include "ArgumentsReader.h"
#include <cstring>
@ -18,84 +19,44 @@ namespace UnitTest {
return runner.RunTestsIf(Test::GetTestList(), NULL, True(), 0);
}
bool findArgumentListIndex(int argc, char**argv, char const* argument, int & outFrom, int & outCount)
{
if (argc <= 1)
{
return false;
}
outCount = 0;
if (strlen(argument) > 0)
{
outFrom = 0;
for (int i = 1; i < argc; i++)
{
if (strcmp(argument, argv[i]) == 0)
{
outFrom = i + 1;
break;
}
}
if (outFrom == 0)
{
return false;
}
}
else
{
outFrom = 1;
}
for (int i = outFrom; i < argc; i++)
{
char* value = argv[i];
if (strlen(value) >= 2 && value[0] == '-'&& value[1] == '-')
{
break;
}
outCount++;
}
return true;
}
bool readSuiteArgument(SuitePredicate & predicate, int argc, char**argv, char const* argument)
bool readSuiteArgument(ArgumentsReader & arguments, SuitePredicate & predicate, char const* argument)
{
int from, count;
if (!findArgumentListIndex(argc, argv, argument, from, count))
if (!arguments.findArgumentListIndex(argument, from, count))
{
return false;
}
for (int i = from; i < from + count; i++)
{
predicate.addSuite(argv[i]);
predicate.addSuite(arguments.getArgument(i).c_str());
}
return true;
}
bool readTestArgument(SuitePredicate & predicate, int argc, char**argv, char const* argument)
bool readTestArgument(ArgumentsReader & arguments, SuitePredicate & predicate, char const* argument)
{
int from, count;
if (!findArgumentListIndex(argc, argv, argument, from, count))
if (!arguments.findArgumentListIndex(argument, from, count))
{
return false;
}
for (int i = from; i < from + count; i++)
{
predicate.addTest(argv[i]);
predicate.addTest(arguments.getArgument(i).c_str());
}
return true;
}
int RunTestsCmd(int argc, char**argv)
{
ArgumentsReader arguments(argc, argv);
SuitePredicate predicate;
bool specific = false;
specific |= readSuiteArgument(predicate, argc, argv, "--suite");
specific |= readTestArgument(predicate, argc, argv, "--test");
specific |= readTestArgument(predicate, argc, argv, "");
specific |= readSuiteArgument(arguments, predicate, "--suite");
specific |= readTestArgument(arguments, predicate, "--test");
specific |= readTestArgument(arguments, predicate, "");
if (!specific)
{