add test with no options

This commit is contained in:
Jarryd Beck 2016-08-26 19:20:55 +10:00
parent 728da0e65a
commit 7b26c50e59

View File

@ -1,21 +1,29 @@
#define CATCH_CONFIG_MAIN #define CATCH_CONFIG_MAIN
#include "catch.hpp" #include "catch.hpp"
#include <initializer_list>
#include "../src/cxxopts.hpp" #include "../src/cxxopts.hpp"
class Argv { class Argv {
public: public:
Argv(int n, const char** argv) Argv(std::initializer_list<const char*> argv)
: m_argv(new char*[n]) : m_argv(new char*[argv.size()])
, m_argc(argv.size())
{ {
for (int i = 0; i != n; ++i) { int i = 0;
auto len = strlen(argv[i]) + 1; auto iter = argv.begin();
while (iter != argv.end()) {
auto len = strlen(*iter) + 1;
auto ptr = std::unique_ptr<char[]>(new char[len]); auto ptr = std::unique_ptr<char[]>(new char[len]);
strcpy(ptr.get(), argv[i]); strcpy(ptr.get(), *iter);
m_args.push_back(std::move(ptr)); m_args.push_back(std::move(ptr));
m_argv.get()[i] = m_args.back().get(); m_argv.get()[i] = m_args.back().get();
++iter;
++i;
} }
} }
@ -23,10 +31,15 @@ class Argv {
return m_argv.get(); return m_argv.get();
} }
int argc() const {
return m_argc;
}
private: private:
std::vector<std::unique_ptr<char[]>> m_args; std::vector<std::unique_ptr<char[]>> m_args;
std::unique_ptr<char*[]> m_argv; std::unique_ptr<char*[]> m_argv;
int m_argc;
}; };
TEST_CASE("Basic options", "[options]") TEST_CASE("Basic options", "[options]")
@ -40,7 +53,7 @@ TEST_CASE("Basic options", "[options]")
("value", "an option with a value", cxxopts::value<std::string>()) ("value", "an option with a value", cxxopts::value<std::string>())
("a,av", "a short option with a value", cxxopts::value<std::string>()); ("a,av", "a short option with a value", cxxopts::value<std::string>());
const char* args[] = { Argv argv({
"tester", "tester",
"--long", "--long",
"-s", "-s",
@ -48,13 +61,10 @@ TEST_CASE("Basic options", "[options]")
"value", "value",
"-a", "-a",
"b" "b"
}; });
int argc = sizeof(args) / sizeof(args[0]);
Argv argv(argc, args);
char** actual_argv = argv.argv(); char** actual_argv = argv.argv();
auto argc = argv.argc();
options.parse(argc, actual_argv); options.parse(argc, actual_argv);
@ -65,3 +75,14 @@ TEST_CASE("Basic options", "[options]")
CHECK(options["value"].as<std::string>() == "value"); CHECK(options["value"].as<std::string>() == "value");
CHECK(options["a"].as<std::string>() == "b"); CHECK(options["a"].as<std::string>() == "b");
} }
TEST_CASE("No positional", "[positional]")
{
cxxopts::Options options("test_positional", " - test no positional options");
Argv argv({"tester", "a", "b", "def"});
char** passed_argv = argv.argv();
auto argc = argv.argc();
options.parse(argc, passed_argv);
}