argument_test.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. //
  2. // argument_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 ArgumentTest : program::Arguments<ArgumentTest> {
  16. using Arguments::Arguments;
  17. std::string arg0 = argument(0, "arg0");
  18. };
  19. TEST(ArgumentTest, ThrowsIfMissingArg) {
  20. EXPECT_THROW(parse<ArgumentTest>({""}), program::IllegalPositionError);
  21. }
  22. TEST(ArgumentTest, ProcessesArgument) {
  23. auto const options = parse<ArgumentTest>({"", "value"});
  24. EXPECT_THAT(options.arg0, Eq("value"));
  25. }
  26. TEST(ArgumentTest, HasNoIssueWithOverflowArg) {
  27. auto const options = parse<ArgumentTest>({"", "value", "extra"});
  28. EXPECT_THAT(options.arg0, Eq("value"));
  29. EXPECT_THAT(options.args(), ElementsAre("extra"));
  30. }
  31. struct OptionalArgumentTest : program::Arguments<OptionalArgumentTest> {
  32. using Arguments::Arguments;
  33. std::string arg0 = argument(0, "arg0");
  34. std::string arg1 = argument(1, "arg1") = "second";
  35. };
  36. TEST(OptionalArgumentTest, DoesNotRequireOptionalArg) {
  37. EXPECT_NO_THROW(parse<OptionalArgumentTest>({"", "value"}));
  38. }
  39. TEST(OptionalArgumentTest, DefaultsOutValueAsExpected) {
  40. auto const options = parse<OptionalArgumentTest>({"", "value"});
  41. EXPECT_THAT(options.arg1, Eq("second"));
  42. }
  43. TEST(OptionalArgumentTest, DoesNotOverflowSecondArg) {
  44. auto const options = parse<OptionalArgumentTest>({"", "value", "extra"});
  45. EXPECT_THAT(options.arg0, Eq("value"));
  46. EXPECT_THAT(options.arg1, Eq("extra"));
  47. EXPECT_THAT(options.args(), ElementsAre());
  48. }
  49. struct DuplicateArgumentTest : program::Arguments<DuplicateArgumentTest> {
  50. using Arguments::Arguments;
  51. std::string arg0 = argument(0, "arg0");
  52. std::string arg1 = argument(0, "arg1");
  53. };
  54. TEST(DuplicateArgumentTest, ThrowsOnConstruction) {
  55. EXPECT_THROW(DuplicateArgumentTest(), program::IllegalPositionError);
  56. }
  57. struct SkippedArgumentTest : program::Arguments<SkippedArgumentTest> {
  58. using Arguments::Arguments;
  59. std::string arg0 = argument(1, "arg0");
  60. };
  61. TEST(SkippedArgumentTest, ThrowsOnParsing) {
  62. EXPECT_NO_THROW(SkippedArgumentTest());
  63. EXPECT_THROW(parse<SkippedArgumentTest>({"", "", ""}),
  64. program::IllegalPositionError);
  65. }
  66. struct OOOArgumentTest : program::Arguments<OOOArgumentTest> {
  67. using Arguments::Arguments;
  68. std::string arg0 = argument(0, "arg0") = "";
  69. std::string arg1 = argument(1, "arg1");
  70. };
  71. TEST(OOOArgumentTest, ThrowsOnConstruction) {
  72. EXPECT_THROW(OOOArgumentTest(), program::ArgumentStructureError);
  73. }
  74. struct RestArgsTest : program::Arguments<RestArgsTest> {
  75. using Arguments::Arguments;
  76. std::string arg0 = argument(0, "arg0") = "";
  77. std::vector<std::string> args = rest();
  78. };
  79. TEST(RestArgsTest, SetsOptionalArgFirst) {
  80. auto const options = parse<RestArgsTest>({"", "A"});
  81. EXPECT_THAT(options.arg0, "A");
  82. EXPECT_THAT(options.args, IsEmpty());
  83. }
  84. TEST(RestArgsTest, ForwardsOverflowIntoRest) {
  85. auto const options = parse<RestArgsTest>({"", "A", "B", "C"});
  86. EXPECT_THAT(options.arg0, "A");
  87. EXPECT_THAT(options.args, ElementsAre("B", "C"));
  88. }
  89. struct RestDefaultArgsTest : program::Arguments<RestDefaultArgsTest> {
  90. using Arguments::Arguments;
  91. std::string arg0 = argument(0, "arg0") = "";
  92. std::vector<std::string> args = rest() = "REST";
  93. };
  94. TEST(RestDefaultArgsTest, SetsRest) {
  95. auto const options = parse<RestDefaultArgsTest>({""});
  96. EXPECT_THAT(options.args, ElementsAre("REST"));
  97. }
  98. TEST(RestDefaultArgsTest, OverridesRest) {
  99. auto const options = parse<RestDefaultArgsTest>({"", "A", "B"});
  100. EXPECT_THAT(options.args, ElementsAre("B"));
  101. }