You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

82 line
2.1 KiB

  1. #include <list>
  2. #include <vector>
  3. #include <gtest/gtest.h>
  4. #include <cppargs.h>
  5. struct simple
  6. {
  7. int i;
  8. std::string s;
  9. double d;
  10. };
  11. TEST(member_parser, simple_object)
  12. {
  13. using parser = ::cppargs::member_parser<simple>;
  14. simple s;
  15. parser p(
  16. nullptr,
  17. parser::make_member_option<simple>({ 'i', "int" }, &simple::i),
  18. parser::make_member_option<simple>({ 's', "string" }, &simple::s),
  19. parser::make_member_option<simple>({ 'd', "double" }, &simple::d)
  20. );
  21. std::vector<const char*> args({
  22. "/fuu/bar/exe",
  23. "-i", "123",
  24. "--string", "fuubar",
  25. "-d123.123"
  26. });
  27. p.parse(s, static_cast<int>(args.size()), args.data());
  28. EXPECT_EQ(s.i, 123);
  29. EXPECT_EQ(s.s, "fuubar");
  30. EXPECT_EQ(s.d, 123.123);
  31. }
  32. struct grouped
  33. : public simple
  34. {
  35. struct group1
  36. {
  37. std::list<std::string> list;
  38. std::vector<int> vec;
  39. };
  40. group1 g1;
  41. };
  42. TEST(member_parser, grouped_object)
  43. {
  44. using parser = ::cppargs::member_parser<grouped>;
  45. grouped g;
  46. parser p(
  47. nullptr,
  48. parser::make_member_option<grouped>({ 'i', "int" }, &grouped::i),
  49. parser::make_member_option<grouped>({ 's', "string" }, &grouped::s),
  50. parser::make_member_option<grouped>({ 'd', "double" }, &grouped::d),
  51. parser::make_member_group<grouped> ({ }, &grouped::g1,
  52. parser::make_member_option<grouped::group1>({ 'l', "list" }, &grouped::group1::list),
  53. parser::make_member_option<grouped::group1>({ 'v', "vector" }, &grouped::group1::vec))
  54. );
  55. std::vector<const char*> args({
  56. "/fuu/bar/exe",
  57. "-i", "123",
  58. "--string", "fuubar",
  59. "-d123.123",
  60. "--list=fuu,bar,baz",
  61. "--vector", "123", "456", "789"
  62. });
  63. p.parse(g, static_cast<int>(args.size()), args.data());
  64. EXPECT_EQ(g.i, 123);
  65. EXPECT_EQ(g.s, "fuubar");
  66. EXPECT_EQ(g.d, 123.123);
  67. EXPECT_EQ(g.g1.list, std::list<std::string>({ "fuu", "bar", "baz" }));
  68. EXPECT_EQ(g.g1.vec, std::vector<int>({ 123, 456, 789 }));
  69. }