flag_test.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. //
  2. // flag_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 FlagTest : program::Arguments<FlagTest> {
  14. using Arguments::Arguments;
  15. bool dry_run = flag("dry-run");
  16. int verbosity = flag("verbose");
  17. };
  18. TEST(FlagTest, ArgumentsAreDefaultedNaturally) {
  19. auto const options = parse<FlagTest>({""});
  20. EXPECT_THAT(options.dry_run, Eq(false));
  21. EXPECT_THAT(options.verbosity, Eq(0));
  22. }
  23. TEST(FlagTest, FlagsDoNotRequireAdditionalArguments) {
  24. EXPECT_NO_THROW(parse<FlagTest>({"", "--dry-run"}));
  25. }
  26. TEST(FlagTest, BooleanFlagSetsState) {
  27. auto const options = parse<FlagTest>({"", "--dry-run"});
  28. EXPECT_THAT(options.dry_run, Eq(true));
  29. }
  30. TEST(FlagTest, BooleanFlagIsIdempotent) {
  31. EXPECT_NO_THROW(parse<FlagTest>({"", "--dry-run", "--dry-run"}));
  32. }
  33. TEST(FlagTest, BooleanFlagCanBeInverted) {
  34. auto const options = parse<FlagTest>({"", "--dry-run", "--no-dry-run"});
  35. EXPECT_THAT(options.dry_run, Eq(false));
  36. }
  37. TEST(FlagTest, IntegerFlagIncrementsState) {
  38. auto const options = parse<FlagTest>({"", "--verbose"});
  39. EXPECT_THAT(options.verbosity, Eq(1));
  40. }
  41. TEST(FlagTest, IntegerFlagCanBeRepeated) {
  42. auto const options = parse<FlagTest>({"", "--verbose", "--verbose"});
  43. EXPECT_THAT(options.verbosity, Eq(2));
  44. }
  45. struct FlagWithDefaultTest : program::Arguments<FlagWithDefaultTest> {
  46. using Arguments::Arguments;
  47. bool dry_run = flag("dry-run") = true;
  48. };
  49. TEST(FlagWithDefaultTest, ArgumentsAreDefaultedToValue) {
  50. auto const options = parse<FlagWithDefaultTest>({""});
  51. EXPECT_THAT(options.dry_run, Eq(true));
  52. }
  53. TEST(FlagWithDefaultTest, BooleanFlagCanBeInverted) {
  54. auto const options = parse<FlagWithDefaultTest>({"", "--no-dry-run"});
  55. EXPECT_THAT(options.dry_run, Eq(false));
  56. }
  57. struct FlagWithAbbrevTest : program::Arguments<FlagWithAbbrevTest> {
  58. using Arguments::Arguments;
  59. bool dry_run = flag("dry-run", 'k');
  60. int verbosity = flag("verbose", 'v');
  61. };
  62. TEST(FlagWithAbbrevTest, BooleanFlagSetsState) {
  63. auto const options = parse<FlagWithAbbrevTest>({"", "-k"});
  64. EXPECT_THAT(options.dry_run, Eq(true));
  65. }
  66. TEST(FlagWithAbbrevTest, IntegerFlagIncrementsState) {
  67. auto const options = parse<FlagWithAbbrevTest>({"", "-v"});
  68. EXPECT_THAT(options.verbosity, Eq(1));
  69. }
  70. TEST(FlagWithAbbrevTest, CanComposeTogetherAbbreviatedFlags) {
  71. auto const options = parse<FlagWithAbbrevTest>({"", "-vk"});
  72. EXPECT_THAT(options.dry_run, Eq(true));
  73. EXPECT_THAT(options.verbosity, Eq(1));
  74. }
  75. TEST(FlagWithAbbrevTest, CanComposeTogetherSameAbbrevFlags) {
  76. auto const options = parse<FlagWithAbbrevTest>({"", "-vv"});
  77. EXPECT_THAT(options.verbosity, Eq(2));
  78. }
  79. TEST(FlagWithAbbrevTest, CanNumberRepeatAbbrevFlags) {
  80. auto const options = parse<FlagWithAbbrevTest>({"", "-v3"});
  81. EXPECT_THAT(options.verbosity, Eq(3));
  82. }
  83. TEST(FlagWithAbbrevTest, CannotNumberRepeatAndConcatAbbrevFlags) {
  84. EXPECT_THROW(parse<FlagWithAbbrevTest>({"", "-v3k"}),
  85. program::NotAnArgumentError);
  86. }
  87. struct ShortFlagTest : program::Arguments<ShortFlagTest> {
  88. using Arguments::Arguments;
  89. int arg = flag('n');
  90. };
  91. TEST(ShortFlagTest, DoesNotAllowDoubleDash) {
  92. EXPECT_THROW(parse<ShortFlagTest>({"", "--n"}), program::NotAnArgumentError);
  93. }
  94. TEST(ShortFlagTest, CanConstructWithOnlyAbbrev) {
  95. auto const options = parse<ShortFlagTest>({"", "-n"});
  96. EXPECT_THAT(options.arg, 1);
  97. }