]> git.tdb.fi Git - libs/core.git/blobdiff - tests/getopt.cpp
Add unit tests
[libs/core.git] / tests / getopt.cpp
diff --git a/tests/getopt.cpp b/tests/getopt.cpp
new file mode 100644 (file)
index 0000000..cb5df62
--- /dev/null
@@ -0,0 +1,141 @@
+#include <msp/core/getopt.h>
+#include <msp/test/test.h>
+
+using namespace std;
+using namespace Msp;
+
+class GetOptTests: public Test::RegisteredTest<GetOptTests>
+{
+public:
+       GetOptTests();
+
+       static const char *get_name() { return "GetOpt"; }
+
+private:
+       void short_options();
+       void long_options();
+       void arguments();
+       void non_options();
+       void help();
+       void invalid_option();
+       void invalid_arg();
+       void missing_arg();
+};
+
+GetOptTests::GetOptTests()
+{
+       add(&GetOptTests::short_options, "Short options");
+       add(&GetOptTests::long_options, "Long options");
+       add(&GetOptTests::arguments, "Option arguments");
+       add(&GetOptTests::non_options, "Non-options");
+       add(&GetOptTests::help, "Help").expect_throw<usage_error>();
+       add(&GetOptTests::invalid_option, "Invalid option").expect_throw<usage_error>();
+       add(&GetOptTests::invalid_arg, "Invalid argument").expect_throw<usage_error>();
+       add(&GetOptTests::missing_arg, "Missing argument").expect_throw<usage_error>();
+}
+
+void GetOptTests::short_options()
+{
+       static const char *argv[] = { "test", "-a", "-bc", 0 };
+
+       bool a = false;
+       bool b = false;
+       bool c = false;
+
+       GetOpt getopt;
+       getopt.add_option('a', "a", a, GetOpt::NO_ARG);
+       getopt.add_option('b', "b", b, GetOpt::NO_ARG);
+       getopt.add_option('c', "c", c, GetOpt::NO_ARG);
+       getopt(3, argv);
+
+       EXPECT(a && b && c);
+}
+
+void GetOptTests::long_options()
+{
+       static const char *argv[] = { "test", "--foo", "--bar", 0 };
+
+       bool foo = false;
+       bool bar = false;
+
+       GetOpt getopt;
+       getopt.add_option("foo", foo, GetOpt::NO_ARG);
+       getopt.add_option("bar", bar, GetOpt::NO_ARG);
+       getopt(3, argv);
+
+       EXPECT(foo && bar);
+}
+
+void GetOptTests::arguments()
+{
+       static const char *argv[] = { "test", "-aabc", "-b", "x y z", "--foo=42", "--bar", "69", 0 };
+
+       string a;
+       string b;
+       int foo = 0;
+       int bar = 0;
+
+       GetOpt getopt;
+       getopt.add_option('a', "a", a, GetOpt::REQUIRED_ARG);
+       getopt.add_option('b', "b", b, GetOpt::REQUIRED_ARG);
+       getopt.add_option("foo", foo, GetOpt::REQUIRED_ARG);
+       getopt.add_option("bar", bar, GetOpt::REQUIRED_ARG);
+       getopt(7, argv);
+
+       EXPECT_EQUAL(a, "abc");
+       EXPECT_EQUAL(b, "x y z");
+       EXPECT_EQUAL(foo, 42);
+       EXPECT_EQUAL(bar, 69);
+}
+
+void GetOptTests::non_options()
+{
+       static const char *argv[] = { "test", "-a", "foo", "-b", "bar", "baz", 0 };
+
+       bool a = false;
+       bool b = false;
+
+       GetOpt getopt;
+       getopt.add_option('a', "a", a, GetOpt::NO_ARG);
+       getopt.add_option('b', "b", b, GetOpt::NO_ARG);
+       getopt(6, argv);
+
+       EXPECT(a && b);
+       EXPECT_EQUAL(getopt.get_args().size(), 3U);
+}
+
+void GetOptTests::help()
+{
+       static const char *argv[] = { "test", "--help", 0 };
+
+       GetOpt getopt;
+       getopt(2, argv);
+}
+
+void GetOptTests::invalid_option()
+{
+       static const char *argv[] = { "test", "--invalid", 0 };
+
+       GetOpt getopt;
+       getopt(2, argv);
+}
+
+void GetOptTests::invalid_arg()
+{
+       static const char *argv[] = { "test", "--intval=foo", 0 };
+
+       int value;
+       GetOpt getopt;
+       getopt.add_option("intval", value, GetOpt::REQUIRED_ARG);
+       getopt(2, argv);
+}
+
+void GetOptTests::missing_arg()
+{
+       static const char *argv[] = { "test", "--value", 0 };
+
+       string value;
+       GetOpt getopt;
+       getopt.add_option("value", value, GetOpt::REQUIRED_ARG);
+       getopt(2, argv);
+}