#include #include #include #include class ArgParserTest : public uUnit { public: ArgParserTest() { uTEST(ArgParserTest::test_zero); uTEST(ArgParserTest::test_one); uTEST(ArgParserTest::test_many); uTEST(ArgParserTest::test_exceptional); uTEST(ArgParserTest::test2); } void test_zero() { const char* argv[] = { "app-name" }; int argc = sizeof(argv)/sizeof(*argv); arg::Parser args; auto res = args.parse(argc, argv); uASSERT_EQUAL(0, res); } void test_one() { const char* argv[] = { "app-name", "-x", "42" }; int argc = sizeof(argv)/sizeof(*argv); arg::Parser args; int x{}; args.add("-x", "--long-x", std::function([&](int i){ x = i; return 0;}), "Help x"); auto res = args.parse(argc, argv); uASSERT_EQUAL(0, res); uASSERT_EQUAL(42, x); } void test_many() { const char* argv[] = { "app-name", "-x", "42", "-y", "7", "-z" }; int argc = sizeof(argv)/sizeof(*argv); arg::Parser args; int x{}; int y{}; bool z{false}; args.add("-x", "--long-x", std::function([&](int i){ x = i; return 0;}), "Help x"); args.add("-y", "--long-y", std::function([&](int i){ y = i; return 0;}), "Help y"); args.add("-z", "--long-z", std::function([&](){ z = true; return 0;}), "Help z"); auto res = args.parse(argc, argv); uASSERT_EQUAL(0, res); uASSERT_EQUAL(42, x); uASSERT_EQUAL(7, y); uASSERT_EQUAL(true, z); } void test_exceptional() { arg::Parser args; int x{}; int y{}; args.add("-x", "--long-x", std::function([&](int i){ x = i; return 0;}), "Help x"); args.add("-y", "--long-y", std::function([&](int i){ y = i; return 0;}), "Help y"); { // Missing arg at trailing opt const char* argv[] = { "app-name", "-x" }; int argc = sizeof(argv)/sizeof(*argv); auto res = args.parse(argc, argv); uASSERT_EQUAL(1, res); } { // Missing arg before other opt const char* argv[] = { "app-name", "-x", "-y" }; int argc = sizeof(argv)/sizeof(*argv); auto res = args.parse(argc, argv); uASSERT_EQUAL(1, res); } { // Unknown arg const char* argv[] = { "app-name", "-T" }; int argc = sizeof(argv)/sizeof(*argv); auto res = args.parse(argc, argv); uASSERT_EQUAL(1, res); } } void test2() { const char* argv[] = { "app-name", "-x", "42" }; int argc = sizeof(argv)/sizeof(*argv); arg::Parser> args; int x{}; args.add("-x", "--long-x", std::function([&](int i){ x = i; return 0;}), "Help"); args.add("-X", "--opt-x", std::function([](std::optional i) { std::cout << "opt: " << (i?std::to_string(*i):"none") << "\n"; return 0; }), "Helptext for -X,--opt-x"); auto res = args.parse(argc, argv); uASSERT_EQUAL(0, res); } }; // Registers the fixture into the 'registry' static ArgParserTest test;