Add unit tests
[libs/core.git] / tests / getopt.cpp
1 #include <msp/core/getopt.h>
2 #include <msp/test/test.h>
3
4 using namespace std;
5 using namespace Msp;
6
7 class GetOptTests: public Test::RegisteredTest<GetOptTests>
8 {
9 public:
10         GetOptTests();
11
12         static const char *get_name() { return "GetOpt"; }
13
14 private:
15         void short_options();
16         void long_options();
17         void arguments();
18         void non_options();
19         void help();
20         void invalid_option();
21         void invalid_arg();
22         void missing_arg();
23 };
24
25 GetOptTests::GetOptTests()
26 {
27         add(&GetOptTests::short_options, "Short options");
28         add(&GetOptTests::long_options, "Long options");
29         add(&GetOptTests::arguments, "Option arguments");
30         add(&GetOptTests::non_options, "Non-options");
31         add(&GetOptTests::help, "Help").expect_throw<usage_error>();
32         add(&GetOptTests::invalid_option, "Invalid option").expect_throw<usage_error>();
33         add(&GetOptTests::invalid_arg, "Invalid argument").expect_throw<usage_error>();
34         add(&GetOptTests::missing_arg, "Missing argument").expect_throw<usage_error>();
35 }
36
37 void GetOptTests::short_options()
38 {
39         static const char *argv[] = { "test", "-a", "-bc", 0 };
40
41         bool a = false;
42         bool b = false;
43         bool c = false;
44
45         GetOpt getopt;
46         getopt.add_option('a', "a", a, GetOpt::NO_ARG);
47         getopt.add_option('b', "b", b, GetOpt::NO_ARG);
48         getopt.add_option('c', "c", c, GetOpt::NO_ARG);
49         getopt(3, argv);
50
51         EXPECT(a && b && c);
52 }
53
54 void GetOptTests::long_options()
55 {
56         static const char *argv[] = { "test", "--foo", "--bar", 0 };
57
58         bool foo = false;
59         bool bar = false;
60
61         GetOpt getopt;
62         getopt.add_option("foo", foo, GetOpt::NO_ARG);
63         getopt.add_option("bar", bar, GetOpt::NO_ARG);
64         getopt(3, argv);
65
66         EXPECT(foo && bar);
67 }
68
69 void GetOptTests::arguments()
70 {
71         static const char *argv[] = { "test", "-aabc", "-b", "x y z", "--foo=42", "--bar", "69", 0 };
72
73         string a;
74         string b;
75         int foo = 0;
76         int bar = 0;
77
78         GetOpt getopt;
79         getopt.add_option('a', "a", a, GetOpt::REQUIRED_ARG);
80         getopt.add_option('b', "b", b, GetOpt::REQUIRED_ARG);
81         getopt.add_option("foo", foo, GetOpt::REQUIRED_ARG);
82         getopt.add_option("bar", bar, GetOpt::REQUIRED_ARG);
83         getopt(7, argv);
84
85         EXPECT_EQUAL(a, "abc");
86         EXPECT_EQUAL(b, "x y z");
87         EXPECT_EQUAL(foo, 42);
88         EXPECT_EQUAL(bar, 69);
89 }
90
91 void GetOptTests::non_options()
92 {
93         static const char *argv[] = { "test", "-a", "foo", "-b", "bar", "baz", 0 };
94
95         bool a = false;
96         bool b = false;
97
98         GetOpt getopt;
99         getopt.add_option('a', "a", a, GetOpt::NO_ARG);
100         getopt.add_option('b', "b", b, GetOpt::NO_ARG);
101         getopt(6, argv);
102
103         EXPECT(a && b);
104         EXPECT_EQUAL(getopt.get_args().size(), 3U);
105 }
106
107 void GetOptTests::help()
108 {
109         static const char *argv[] = { "test", "--help", 0 };
110
111         GetOpt getopt;
112         getopt(2, argv);
113 }
114
115 void GetOptTests::invalid_option()
116 {
117         static const char *argv[] = { "test", "--invalid", 0 };
118
119         GetOpt getopt;
120         getopt(2, argv);
121 }
122
123 void GetOptTests::invalid_arg()
124 {
125         static const char *argv[] = { "test", "--intval=foo", 0 };
126
127         int value;
128         GetOpt getopt;
129         getopt.add_option("intval", value, GetOpt::REQUIRED_ARG);
130         getopt(2, argv);
131 }
132
133 void GetOptTests::missing_arg()
134 {
135         static const char *argv[] = { "test", "--value", 0 };
136
137         string value;
138         GetOpt getopt;
139         getopt.add_option("value", value, GetOpt::REQUIRED_ARG);
140         getopt(2, argv);
141 }