options_test.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. //
  2. // options_test.cpp
  3. // program_args-test
  4. //
  5. // Created by Sam Jaffe on 2/7/21.
  6. //
  7. #include "program_args/arguments.h"
  8. #include "xcode_gtest_helper.h"
  9. using testing::Eq;
  10. template <typename T, size_t N> static T parse(char const * const (&argv)[N]) {
  11. return T(N, argv);
  12. }
  13. struct LongOptionTest : program::Arguments<LongOptionTest> {
  14. using program::Arguments<LongOptionTest>::Arguments;
  15. std::string endpoint = option("endpoint");
  16. int port = option("port");
  17. };
  18. TEST(LongOptionTest, ArgumentsAreDefaultedNaturally) {
  19. auto const options = parse<LongOptionTest>({""});
  20. EXPECT_THAT(options.endpoint, Eq(""));
  21. EXPECT_THAT(options.port, Eq(0));
  22. }
  23. TEST(LongOptionTest, CanProvideStringArgument) {
  24. auto const options = parse<LongOptionTest>({"", "--endpoint", "/null"});
  25. EXPECT_THAT(options.endpoint, Eq("/null"));
  26. }
  27. TEST(LongOptionTest, CanProvideNumericArgument) {
  28. auto const options = parse<LongOptionTest>({"", "--port", "443"});
  29. EXPECT_THAT(options.port, Eq(443));
  30. }
  31. TEST(LongOptionTest, WillThrowOnInvalidNumericArgument) {
  32. EXPECT_THROW(parse<LongOptionTest>({"", "--port", "one"}),
  33. program::ProgramArgumentsError);
  34. }
  35. TEST(LongOptionTest, WillThrowOnRepeatedArgument) {
  36. EXPECT_THROW(parse<LongOptionTest>({"", "--port", "8080", "--port", "443"}),
  37. program::ArgumentStructureError);
  38. }
  39. TEST(LongOptionTest, WillThrowOnUnknownArgument) {
  40. EXPECT_THROW(parse<LongOptionTest>({"", "--path", "/null"}),
  41. program::NotAnArgumentError);
  42. }
  43. TEST(LongOptionTest, DoesNotImplicitlyShortenArgs) {
  44. EXPECT_THROW(parse<LongOptionTest>({"", "-p", "443"}),
  45. program::NotAnArgumentError);
  46. }
  47. struct LongOptionWithDefaultTest
  48. : program::Arguments<LongOptionWithDefaultTest> {
  49. using program::Arguments<LongOptionWithDefaultTest>::Arguments;
  50. std::string endpoint = option("endpoint") = "/default";
  51. int port = option("port") = 8080;
  52. };
  53. TEST(LongOptionWithDefaultTest, ArgumentsAreDefaultedNaturally) {
  54. auto const options = parse<LongOptionWithDefaultTest>({""});
  55. EXPECT_THAT(options.endpoint, Eq("/default"));
  56. EXPECT_THAT(options.port, Eq(8080));
  57. }
  58. TEST(LongOptionWithDefaultTest, CanProvideStringArgument) {
  59. auto const options =
  60. parse<LongOptionWithDefaultTest>({"", "--endpoint", "/null"});
  61. EXPECT_THAT(options.endpoint, Eq("/null"));
  62. }
  63. TEST(LongOptionWithDefaultTest, CanProvideNumericArgument) {
  64. auto const options = parse<LongOptionWithDefaultTest>({"", "--port", "443"});
  65. EXPECT_THAT(options.port, Eq(443));
  66. }
  67. struct LongOptionWithAbbrevTest : program::Arguments<LongOptionWithAbbrevTest> {
  68. using program::Arguments<LongOptionWithAbbrevTest>::Arguments;
  69. std::string endpoint = option("endpoint", 'e');
  70. int port = option("port", 'p');
  71. };
  72. TEST(LongOptionWithAbbrevTest, CanProvideStringArgument) {
  73. auto const options =
  74. parse<LongOptionWithAbbrevTest>({"", "--endpoint", "/null"});
  75. EXPECT_THAT(options.endpoint, Eq("/null"));
  76. }
  77. TEST(LongOptionWithAbbrevTest, CanProvideAbbrevStringArgument) {
  78. auto const options = parse<LongOptionWithAbbrevTest>({"", "-e", "/null"});
  79. EXPECT_THAT(options.endpoint, Eq("/null"));
  80. }
  81. TEST(LongOptionWithAbbrevTest, CanProvideNumericArgument) {
  82. auto const options = parse<LongOptionWithAbbrevTest>({"", "--port", "443"});
  83. EXPECT_THAT(options.port, Eq(443));
  84. }
  85. TEST(LongOptionWithAbbrevTest, CanProvideAbbrevNumericArgument) {
  86. auto const options = parse<LongOptionWithAbbrevTest>({"", "-p", "443"});
  87. EXPECT_THAT(options.port, Eq(443));
  88. }
  89. TEST(LongOptionWithAbbrevTest, ShortAndLongArgsGoToSamePool) {
  90. EXPECT_THROW(
  91. parse<LongOptionWithAbbrevTest>({"", "--port", "8080", "-p", "443"}),
  92. program::ArgumentStructureError);
  93. }