// // logging_test.cpp // program_args-test // // Created by Sam Jaffe on 2/16/21. // #define PROGRAM_ARGS_NOEXIT_ON_HELP #include "program_args/arguments.h" #include "scoped_buffer_capture.h" #include "xcode_gtest_helper.h" using testing::HasSubstr; using testing::Not; template static T parse(char const * const (&argv)[N]) { return T(N, argv); } template auto usage() { scoped_buffer_capture_t cap_cout(std::cout); parse({"", "--help"}); return cap_cout.str(); } struct ArgNamesTest : program::Arguments { using Arguments::Arguments; bool dry_run = flag("dry-run"); int level = option("level"); int port = option("port", 'p'); }; TEST(ArgNamesTest, PrintsOutBothArgsWhenRelevant) { auto result = usage(); EXPECT_THAT(result, HasSubstr(" --port,-p:")); } TEST(ArgNamesTest, PrintsOutInversionFlag) { auto result = usage(); EXPECT_THAT(result, HasSubstr(" --no-dry-run,--dry-run:")); } TEST(ArgNamesTest, PrintsOutBothSingleNameWithoutAbbrev) { auto result = usage(); EXPECT_THAT(result, HasSubstr(" --level:")); } struct ArgDescTest : program::Arguments { using Arguments::Arguments; int port = option("port", "The host port to listen on for web traffic"); }; TEST(ArgDescTest, PrintsOutBothArgsWhenRelevant) { auto result = usage(); EXPECT_THAT(result, HasSubstr(" --port: The host port")); } struct ArgDefValTest : program::Arguments { using Arguments::Arguments; int level = option("level") = 5; int port = option("port", "The host port to listen on for web traffic") = 8080; }; TEST(ArgDefValTest, PrintsOutDefaultValueWithDescription) { auto result = usage(); EXPECT_THAT(result, HasSubstr("Default Value: 8080")); } TEST(ArgDefValTest, DoesntAddDefValWithoutDescription) { auto result = usage(); EXPECT_THAT(result, Not(HasSubstr("5"))); }