TEST(ProgramOptionsTest, Success) { EXPECT_EQ( "running foo\n" "foo global-foo 42\n" "foo local-foo 42\n", callHelper({"foo"})); EXPECT_EQ( "running foo\n" "foo global-foo 43\n" "foo local-foo 44\n" "foo arg a\n" "foo arg b\n", callHelper({"--global-foo", "43", "foo", "--local-foo", "44", "a", "b"})); // Check that global flags can still be given after the command EXPECT_EQ( "running foo\n" "foo global-foo 43\n" "foo local-foo 44\n" "foo arg a\n" "foo arg b\n", callHelper({"foo", "--global-foo", "43", "--local-foo", "44", "a", "b"})); }
void runTest() override { beginTest ("Call single listener"); listeners.add (&listener1); std::vector<int> expectedCounterValues; for (int i = 1; i < 8; ++i) expectedCounterValues.push_back (i); callHelper (expectedCounterValues, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr); beginTest ("Call multiple listeners"); listeners.add (&listener2); expectedCounterValues.clear(); for (int i = 1; i < 8; ++i) expectedCounterValues.push_back (-i); callHelper (expectedCounterValues, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr); beginTest ("Call listeners excluding"); expectedCounterValues.clear(); for (int i = 1; i < 8; ++i) expectedCounterValues.push_back (i); callExcludingHelper (listener2, expectedCounterValues, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr); }
TEST(ProgramOptionsTest, GNUStyleDefaultValues) { EXPECT_EQ( "flag-bool-true 1\n" "flag-bool-false 0\n" "flag-int 42\n" "flag-string foo\n", callHelper(ProgramOptionsStyle::GNU, {})); }
TEST(ProgramOptionsTest, GFlagsStyleDefaultValues) { EXPECT_EQ( "flag_bool_true 1\n" "flag_bool_false 0\n" "flag_int 42\n" "flag_string foo\n", callHelper(ProgramOptionsStyle::GFLAGS, {})); }
TEST(ProgramOptionsTest, Help) { // Not actually checking help output, just verifying that help doesn't fail callHelper({"--version"}); callHelper({"--help"}); callHelper({"--help", "foo"}); callHelper({"--help", "bar"}); callHelper({"help"}); callHelper({"help", "foo"}); callHelper({"help", "bar"}); // wrong command name callHelper({"--help", "qux"}, 1); callHelper({"help", "qux"}, 1); }
TEST(ProgramOptionsTest, Aliases) { EXPECT_EQ( "running foo\n" "foo global-foo 43\n" "foo local-foo 44\n" "foo arg a\n" "foo arg b\n", callHelper({"--global-foo", "43", "bar", "--local-foo", "44", "a", "b"})); }
TEST(ProgramOptionsTest, GFlagsStyleBoolFlagsNegation) { EXPECT_EQ( "flag_bool_true 0\n" "flag_bool_false 0\n" "flag_int 42\n" "flag_string foo\n", callHelper(ProgramOptionsStyle::GFLAGS, { "--noflag_bool_true", "--noflag_bool_false"})); }
TEST(ProgramOptionsTest, GNUStyleBoolFlagsNegation) { EXPECT_EQ( "flag-bool-true 0\n" "flag-bool-false 0\n" "flag-int 42\n" "flag-string foo\n", callHelper(ProgramOptionsStyle::GNU, { "--no-flag-bool-true", "--no-flag-bool-false"})); }
TEST(ProgramOptionsTest, GFlagsStyleFlagsSet) { EXPECT_EQ( "flag_bool_true 1\n" "flag_bool_false 1\n" "flag_int 43\n" "flag_string bar\n", callHelper(ProgramOptionsStyle::GFLAGS, { "--flag_bool_true", "--flag_bool_false", "--flag_int", "43", "--flag_string", "bar"})); }
TEST(ProgramOptionsTest, GNUStyleFlagsSet) { EXPECT_EQ( "flag-bool-true 1\n" "flag-bool-false 1\n" "flag-int 43\n" "flag-string bar\n", callHelper(ProgramOptionsStyle::GNU, { "--flag-bool-true", "--flag-bool-false", "--flag-int", "43", "--flag-string", "bar"})); }
void callHelper (std::vector<int>& expectedCounterValues, T first, Args... args) { const int expected = expectedCounterValues[sizeof... (args) + 1]; counter = 0; listeners.call (&ListenerBase::f, first, args...); expect (counter == expected); ListenerList<ListenerBase>::DummyBailOutChecker boc; counter = 0; listeners.callChecked (boc, &ListenerBase::f, first, args...); expect (counter == expected); callHelper (expectedCounterValues, args...); }
TEST(ProgramOptionsTest, GNUStyleSubCommandUnrecognizedOptionFirst) { EXPECT_EQ( "flag-bool-true 1\n" "flag-bool-false 1\n" "flag-int 43\n" "flag-string foo\n" "arg --wtf\n" "arg hello\n" "arg 100\n" "arg -x\n" "arg -xy\n", callHelper(ProgramOptionsStyle::GNU, { "--flag-bool-false", "--wtf", "hello", "--flag-int", "43", "100", "-x", "-xy"})); }
TEST(ProgramOptionsTest, DevFull) { folly::File full("/dev/full", O_RDWR); callHelper({"--help"}, 1, full.fd()); }
TEST(ProgramOptionsTest, Errors) { callHelper({}, 1); callHelper({"--wtf", "foo"}, 1); callHelper({"qux"}, 1); callHelper({"--global-foo", "x", "foo"}, 1); }