action_test.cpp 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. //
  2. // action_test.cpp
  3. // program_args-test
  4. //
  5. // Created by Sam Jaffe on 2/13/22.
  6. //
  7. #include "program_args/arguments.h"
  8. #include "xcode_gtest_helper.h"
  9. namespace program {
  10. struct ArgumentTestHelper {
  11. template <typename Impl> bool has_main(Arguments<Impl> const &args) const {
  12. return static_cast<bool>(args.main_callback);
  13. }
  14. template <typename Impl> int main(Arguments<Impl> const &args) const {
  15. return args.main_callback(args);
  16. }
  17. };
  18. }
  19. template <typename T, size_t N> static T parse(char const * const (&argv)[N]) {
  20. return T(N, argv);
  21. }
  22. std::string g_type_name;
  23. template <typename Args, typename Action>
  24. int typed_main(Args const &, Action const &) {
  25. g_type_name = typeid(Action).name();
  26. return 0;
  27. }
  28. struct Checkout : program::Arguments<Checkout> {
  29. using program::Arguments<Checkout>::Arguments;
  30. std::string commitish = argument(0, "commit-ish");
  31. };
  32. struct Commit : program::Arguments<Commit> {
  33. using program::Arguments<Commit>::Arguments;
  34. std::string message = option("message", 'm');
  35. };
  36. struct Bad1 : program::Arguments<Bad1> {
  37. using program::Arguments<Bad1>::Arguments;
  38. Commit commit = action("commit");
  39. std::string arg0 = argument(0, "arg0");
  40. };
  41. struct Bad2 : program::Arguments<Bad2> {
  42. using program::Arguments<Bad2>::Arguments;
  43. std::string arg0 = argument(0, "arg0");
  44. Commit commit = action("commit");
  45. };
  46. struct Git : program::Arguments<Git> {
  47. using program::Arguments<Git>::Arguments;
  48. bool verbose = flag("verbose", 'v');
  49. Commit commit = action("commit");
  50. Checkout checkout = action("checkout");
  51. };
  52. TEST(ActionTest, CannotMixActionAndArgument) {
  53. EXPECT_THROW(Bad1(), program::ArgumentMixingError);
  54. EXPECT_THROW(Bad2(), program::ArgumentMixingError);
  55. }
  56. TEST(ActionTest, CanRunWithMultipleActions) {
  57. EXPECT_NO_THROW(Git());
  58. }
  59. TEST(ActionTest, ActionIsRouted) {
  60. Git git = parse<Git>({"", "-v", "commit", "-m", "this is a message"});
  61. program::ArgumentTestHelper helper;
  62. EXPECT_TRUE(helper.has_main(git));
  63. helper.main(git);
  64. EXPECT_THAT(g_type_name, typeid(Commit).name());
  65. }