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();
+}