|
|
@@ -230,3 +230,42 @@ TEST(GeneratedDefaultTest, CanReferenceThis) {
|
|
|
EXPECT_THAT(options.pwd, "/opt/local/bin");
|
|
|
EXPECT_THAT(options.git_dir, "/opt/local/bin/.git");
|
|
|
}
|
|
|
+
|
|
|
+struct CompoundOptionsTest : program::Arguments<CompoundOptionsTest> {
|
|
|
+ using Arguments::Arguments;
|
|
|
+ std::pair<int, int> screen_size =
|
|
|
+ std::make_pair(option("width"), option("height"));
|
|
|
+};
|
|
|
+
|
|
|
+TEST(CompoundOptionsTest, CanBindTupleElements) {
|
|
|
+ auto const options =
|
|
|
+ parse<CompoundOptionsTest>({"", "--width", "1920", "--height", "1080"});
|
|
|
+ EXPECT_THAT(options.screen_size.first, 1920);
|
|
|
+ EXPECT_THAT(options.screen_size.second, 1080);
|
|
|
+}
|
|
|
+
|
|
|
+struct dim2 {
|
|
|
+ int x, y;
|
|
|
+};
|
|
|
+
|
|
|
+template <> struct string_utils::cast_helper<dim2> {
|
|
|
+ bool operator()(std::string_view str, dim2 & out) {
|
|
|
+ return sscanf(str.data(), "%dx%d", &out.x, &out.y) == 2;
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+struct ParsedOptionTest : program::Arguments<ParsedOptionTest> {
|
|
|
+ using Arguments::Arguments;
|
|
|
+ dim2 screen_size = option("screen");
|
|
|
+};
|
|
|
+
|
|
|
+TEST(ParsedOptionTest, CanInvokeSpecialParser) {
|
|
|
+ auto const options = parse<ParsedOptionTest>({"", "--screen", "1920x1080"});
|
|
|
+ EXPECT_THAT(options.screen_size.x, 1920);
|
|
|
+ EXPECT_THAT(options.screen_size.y, 1080);
|
|
|
+}
|
|
|
+
|
|
|
+TEST(ParsedOptionTest, SpecialParserCanFail) {
|
|
|
+ EXPECT_THROW(parse<ParsedOptionTest>({"", "--screen", "1920"}),
|
|
|
+ program::ArgumentStructureError);
|
|
|
+}
|