Mercurial > code
diff C++/Tests/OptionParser/main.cpp @ 236:ff2db0ed78f1
* Import GoogleTest
* Start testing of OptionParser
author | David Demelier <markand@malikania.fr> |
---|---|
date | Fri, 04 Jul 2014 22:16:04 +0200 |
parents | |
children | 887d43215b90 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/C++/Tests/OptionParser/main.cpp Fri Jul 04 22:16:04 2014 +0200 @@ -0,0 +1,195 @@ +#include <gtest/gtest.h> + +#include <OptionParser.h> + +#define LENGTH(x) (sizeof (x) / sizeof (x[0])) + +/* + * -a hello -a ok -v -c -p test + */ +TEST(OptionParser, simple) +{ + OptionParser parser; + const char *argv[] = { "-a", "hello", "-a", "ok", "-v", "-c", "-p", "test" }; + + parser.add(Option("a", "attribute", Option::Argument)); + parser.add(Option("v", "verbose")); + parser.add(Option("c", "check")); + parser.add(Option("p", "plugin", Option::Argument)); + + auto result = parser.parse(LENGTH(argv), argv, OptionParser::Strict); + auto begin = result.cbegin(); + + ASSERT_EQ(5, result.count()); + ASSERT_EQ(8, result.total()); + + // -a hello + ASSERT_EQ("a", begin->name()); + ASSERT_EQ("hello", begin->value()); + + // -a ok + std::advance(begin, 1); + ASSERT_EQ("a", begin->name()); + ASSERT_EQ("ok", begin->value()); + + // -v + std::advance(begin, 1); + ASSERT_EQ("v", begin->name()); + ASSERT_EQ("", begin->value()); + + // -c + std::advance(begin, 1); + ASSERT_EQ("c", begin->name()); + ASSERT_EQ("", begin->value()); + + // -p test + std::advance(begin, 1); + ASSERT_EQ("p", begin->name()); + ASSERT_EQ("test", begin->value()); +} + +/* + * -v install -y -x -p package + * + * Split as two kind of groups, + * -v are general options + * -y, -x -p are dedicated to install + */ +TEST(OptionParser, group) +{ + OptionParser parser; + const char *argv[] = { "-v", "install", "-y", "-x", "-p", "irccd" }; + + parser.add(Option("v", "verbose")); + parser.add(Option("y", "auto answer yes")); + parser.add(Option("x", "use regex")); + parser.add(Option("p", "package", Option::Argument)); + + /* + * First part: -v install + */ + + auto result = parser.parse(LENGTH(argv), argv, OptionParser::BreakNonOption); + auto option = result.cbegin(); + + ASSERT_EQ(1, result.count()); + ASSERT_EQ(1, result.total()); + + // "-v" + ASSERT_EQ("v", option->name()); + ASSERT_EQ("", option->value()); + + /* + * Second part: -y -x package + */ + + result = parser.parse(LENGTH(argv) - 2, argv + 2, OptionParser::Strict); + option = result.cbegin(); + + ASSERT_EQ(3, result.count()); + ASSERT_EQ(4, result.total()); + + // -y + ASSERT_EQ("y", option->name()); + ASSERT_EQ("", option->value()); + + // -x + std::advance(option, 1); + ASSERT_EQ("x", option->name()); + ASSERT_EQ("", option->value()); + + // -p irccd + std::advance(option, 1); + ASSERT_EQ("p", option->name()); + ASSERT_EQ("irccd", option->value()); +} + +/* + * Compact + * + * -abc -> -a -b -c + */ +TEST(OptionParser, compact) +{ + OptionParser parser; + const char *argv[] = { "-abc" }; + + parser.add(Option("a", "")); + parser.add(Option("b", "")); + parser.add(Option("c", "")); + + auto result = parser.parse(LENGTH(argv), argv); + auto option = result.cbegin(); + + ASSERT_EQ(3, result.count()); + ASSERT_EQ(3, result.total()); + + // -a + ASSERT_EQ("a", option->name()); + ASSERT_EQ("", option->value()); + + // -b + std::advance(option, 1); + ASSERT_EQ("b", option->name()); + ASSERT_EQ("", option->value()); + + // -c + std::advance(option, 1); + ASSERT_EQ("c", option->name()); + ASSERT_EQ("", option->value()); +} + +/* + * -o readonly -o loop -v -v -f true -f false + */ +TEST(OptionParser, numbered) +{ + OptionParser parser; + const char *argv[] = { "-o", "readonly", "-o", "loop", "-v", "-v", "-f", "true", "-f", "false" }; + + parser.add(Option("o", "option", Option::Argument)); + parser.add(Option("v", "verbose")); + parser.add(Option("f", "fullscreen", Option::Argument, Option::Single)); + + auto result = parser.parse(LENGTH(argv), argv, OptionParser::Silent); + auto option = result.cbegin(); + + ASSERT_EQ(6, result.count()); + ASSERT_EQ(10, result.total()); + + // -o readonly + ASSERT_EQ("o", option->name()); + ASSERT_EQ("readonly", option->value()); + + // -o loop + std::advance(option, 1); + ASSERT_EQ("o", option->name()); + ASSERT_EQ("loop", option->value()); + + // -v + std::advance(option, 1); + ASSERT_EQ("v", option->name()); + ASSERT_EQ("", option->value()); + + // -v + std::advance(option, 1); + ASSERT_EQ("v", option->name()); + ASSERT_EQ("", option->value()); + + // -f true + std::advance(option, 1); + ASSERT_EQ("f", option->name()); + ASSERT_EQ("true", option->value()); + + // -f false + std::advance(option, 1); + ASSERT_EQ("f", option->name()); + ASSERT_EQ("false", option->value()); +} + +int main(int argc, char **argv) +{ + testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +}