argument_test.cpp 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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. template <typename T, size_t N> static T parse(char const * const (&argv)[N]) {
  12. return T(N, argv);
  13. }
  14. struct ArgumentTest : program::Arguments<ArgumentTest> {
  15. using program::Arguments<ArgumentTest>::Arguments;
  16. std::string arg0 = argument(0, "arg0");
  17. };
  18. TEST(ArgumentTest, ThrowsIfMissingArg) {
  19. EXPECT_THROW(parse<ArgumentTest>({""}), program::IllegalPositionError);
  20. }
  21. TEST(ArgumentTest, ProcessesArgument) {
  22. auto const options = parse<ArgumentTest>({"", "value"});
  23. EXPECT_THAT(options.arg0, Eq("value"));
  24. }
  25. TEST(ArgumentTest, HasNoIssueWithOverflowArg) {
  26. auto const options = parse<ArgumentTest>({"", "value", "extra"});
  27. EXPECT_THAT(options.arg0, Eq("value"));
  28. EXPECT_THAT(options.args(), ElementsAre("extra"));
  29. }
  30. struct OptionalArgumentTest : program::Arguments<OptionalArgumentTest> {
  31. using program::Arguments<OptionalArgumentTest>::Arguments;
  32. std::string arg0 = argument(0, "arg0");
  33. std::string arg1 = argument(1, "arg1") = "second";
  34. };
  35. TEST(OptionalArgumentTest, DoesNotRequireOptionalArg) {
  36. EXPECT_NO_THROW(parse<OptionalArgumentTest>({"", "value"}));
  37. }
  38. TEST(OptionalArgumentTest, DefaultsOutValueAsExpected) {
  39. auto const options = parse<OptionalArgumentTest>({"", "value"});
  40. EXPECT_THAT(options.arg1, Eq("second"));
  41. }
  42. TEST(OptionalArgumentTest, DoesNotOverflowSecondArg) {
  43. auto const options = parse<OptionalArgumentTest>({"", "value", "extra"});
  44. EXPECT_THAT(options.arg0, Eq("value"));
  45. EXPECT_THAT(options.arg1, Eq("extra"));
  46. EXPECT_THAT(options.args(), ElementsAre());
  47. }
  48. struct DuplicateArgumentTest : program::Arguments<DuplicateArgumentTest> {
  49. using program::Arguments<DuplicateArgumentTest>::Arguments;
  50. std::string arg0 = argument(0, "arg0");
  51. std::string arg1 = argument(0, "arg1");
  52. };
  53. TEST(DuplicateArgumentTest, ThrowsOnConstruction) {
  54. EXPECT_THROW(DuplicateArgumentTest(), program::IllegalPositionError);
  55. }
  56. struct SkippedArgumentTest : program::Arguments<SkippedArgumentTest> {
  57. using program::Arguments<SkippedArgumentTest>::Arguments;
  58. std::string arg0 = argument(1, "arg0");
  59. };
  60. TEST(SkippedArgumentTest, ThrowsOnParsing) {
  61. EXPECT_NO_THROW(SkippedArgumentTest());
  62. EXPECT_THROW(parse<SkippedArgumentTest>({"", "", ""}),
  63. program::IllegalPositionError);
  64. }
  65. struct OOOArgumentTest : program::Arguments<OOOArgumentTest> {
  66. using program::Arguments<OOOArgumentTest>::Arguments;
  67. std::string arg0 = argument(0, "arg0") = "";
  68. std::string arg1 = argument(1, "arg1");
  69. };
  70. TEST(OOOArgumentTest, ThrowsOnConstruction) {
  71. EXPECT_THROW(OOOArgumentTest(), program::ArgumentStructureError);
  72. }