options_test.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  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::ElementsAre;
  10. using testing::Eq;
  11. using testing::IsEmpty;
  12. template <typename T, size_t N> static T parse(char const * const (&argv)[N]) {
  13. return T(N, argv);
  14. }
  15. struct LongOptionTest : program::Arguments<LongOptionTest> {
  16. using program::Arguments<LongOptionTest>::Arguments;
  17. std::string endpoint = option("endpoint");
  18. int port = option("port");
  19. };
  20. TEST(LongOptionTest, ArgumentsAreDefaultedNaturally) {
  21. auto const options = parse<LongOptionTest>({""});
  22. EXPECT_THAT(options.endpoint, Eq(""));
  23. EXPECT_THAT(options.port, Eq(0));
  24. }
  25. TEST(LongOptionTest, CanProvideStringArgument) {
  26. auto const options = parse<LongOptionTest>({"", "--endpoint", "/null"});
  27. EXPECT_THAT(options.endpoint, Eq("/null"));
  28. }
  29. TEST(LongOptionTest, CanProvideNumericArgument) {
  30. auto const options = parse<LongOptionTest>({"", "--port", "443"});
  31. EXPECT_THAT(options.port, Eq(443));
  32. }
  33. TEST(LongOptionTest, WillThrowOnInvalidNumericArgument) {
  34. EXPECT_THROW(parse<LongOptionTest>({"", "--port", "one"}),
  35. program::ProgramArgumentsError);
  36. }
  37. TEST(LongOptionTest, WillThrowOnRepeatedArgument) {
  38. EXPECT_THROW(parse<LongOptionTest>({"", "--port", "8080", "--port", "443"}),
  39. program::ArgumentStructureError);
  40. }
  41. TEST(LongOptionTest, WillThrowOnUnknownArgument) {
  42. EXPECT_THROW(parse<LongOptionTest>({"", "--path", "/null"}),
  43. program::NotAnArgumentError);
  44. }
  45. TEST(LongOptionTest, DoesNotImplicitlyShortenArgs) {
  46. EXPECT_THROW(parse<LongOptionTest>({"", "-p", "443"}),
  47. program::NotAnArgumentError);
  48. }
  49. struct LongOptionWithDefaultTest
  50. : program::Arguments<LongOptionWithDefaultTest> {
  51. using program::Arguments<LongOptionWithDefaultTest>::Arguments;
  52. std::string endpoint = option("endpoint") = "/default";
  53. int port = option("port") = 8080;
  54. };
  55. TEST(LongOptionWithDefaultTest, ArgumentsAreDefaultedNaturally) {
  56. auto const options = parse<LongOptionWithDefaultTest>({""});
  57. EXPECT_THAT(options.endpoint, Eq("/default"));
  58. EXPECT_THAT(options.port, Eq(8080));
  59. }
  60. TEST(LongOptionWithDefaultTest, CanProvideStringArgument) {
  61. auto const options =
  62. parse<LongOptionWithDefaultTest>({"", "--endpoint", "/null"});
  63. EXPECT_THAT(options.endpoint, Eq("/null"));
  64. }
  65. TEST(LongOptionWithDefaultTest, CanProvideNumericArgument) {
  66. auto const options = parse<LongOptionWithDefaultTest>({"", "--port", "443"});
  67. EXPECT_THAT(options.port, Eq(443));
  68. }
  69. struct LongOptionWithAbbrevTest : program::Arguments<LongOptionWithAbbrevTest> {
  70. using program::Arguments<LongOptionWithAbbrevTest>::Arguments;
  71. std::string endpoint = option("endpoint", 'e');
  72. int port = option("port", 'p');
  73. };
  74. TEST(LongOptionWithAbbrevTest, CanProvideStringArgument) {
  75. auto const options =
  76. parse<LongOptionWithAbbrevTest>({"", "--endpoint", "/null"});
  77. EXPECT_THAT(options.endpoint, Eq("/null"));
  78. }
  79. TEST(LongOptionWithAbbrevTest, CanProvideAbbrevStringArgument) {
  80. auto const options = parse<LongOptionWithAbbrevTest>({"", "-e", "/null"});
  81. EXPECT_THAT(options.endpoint, Eq("/null"));
  82. }
  83. TEST(LongOptionWithAbbrevTest, CanProvideNumericArgument) {
  84. auto const options = parse<LongOptionWithAbbrevTest>({"", "--port", "443"});
  85. EXPECT_THAT(options.port, Eq(443));
  86. }
  87. TEST(LongOptionWithAbbrevTest, CanProvideAbbrevNumericArgument) {
  88. auto const options = parse<LongOptionWithAbbrevTest>({"", "-p", "443"});
  89. EXPECT_THAT(options.port, Eq(443));
  90. }
  91. TEST(LongOptionWithAbbrevTest, ShortAndLongArgsGoToSamePool) {
  92. EXPECT_THROW(
  93. parse<LongOptionWithAbbrevTest>({"", "--port", "8080", "-p", "443"}),
  94. program::ArgumentStructureError);
  95. }
  96. TEST(LongOptionWithAbbrevTest, CanPutAbbrevArgAndValueInSameToken) {
  97. EXPECT_NO_THROW(parse<LongOptionWithAbbrevTest>({"", "-p443"}));
  98. auto const options = parse<LongOptionWithAbbrevTest>({"", "-p443"});
  99. EXPECT_THAT(options.port, Eq(443));
  100. }
  101. struct LongOptionRepeatTest : program::Arguments<LongOptionRepeatTest> {
  102. using program::Arguments<LongOptionRepeatTest>::Arguments;
  103. std::vector<int> port = option("port");
  104. };
  105. TEST(LongOptionRepeatTest, DefaultIsEmpty) {
  106. auto const options = parse<LongOptionRepeatTest>({""});
  107. EXPECT_THAT(options.port, IsEmpty());
  108. }
  109. TEST(LongOptionRepeatTest, CanProvideArgument) {
  110. auto const options = parse<LongOptionRepeatTest>({"", "--port", "443"});
  111. EXPECT_THAT(options.port, ElementsAre(443));
  112. }
  113. TEST(LongOptionRepeatTest, RepeatingArgumentsAppends) {
  114. auto const options =
  115. parse<LongOptionRepeatTest>({"", "--port", "443", "--port", "8080"});
  116. EXPECT_THAT(options.port, ElementsAre(443, 8080));
  117. }
  118. struct LongOptionRepeatWithDefaultTest
  119. : program::Arguments<LongOptionRepeatWithDefaultTest> {
  120. using program::Arguments<LongOptionRepeatWithDefaultTest>::Arguments;
  121. std::vector<int> port = option("port") = std::vector{8080};
  122. };
  123. TEST(LongOptionRepeatWithDefaultTest, DefaultIsProvided) {
  124. auto const options = parse<LongOptionRepeatWithDefaultTest>({""});
  125. EXPECT_THAT(options.port, ElementsAre(8080));
  126. }
  127. TEST(LongOptionRepeatWithDefaultTest, ArgumentOverwritesDefault) {
  128. auto const options =
  129. parse<LongOptionRepeatWithDefaultTest>({"", "--port", "443"});
  130. EXPECT_THAT(options.port, ElementsAre(443));
  131. }