OptionParserTest.cc 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. #include "OptionParser.h"
  2. #include <cstring>
  3. #include <sstream>
  4. #include <cppunit/extensions/HelperMacros.h>
  5. #include "OptionHandlerImpl.h"
  6. #include "Exception.h"
  7. #include "util.h"
  8. #include "Option.h"
  9. #include "array_fun.h"
  10. namespace aria2 {
  11. class OptionParserTest:public CppUnit::TestFixture {
  12. CPPUNIT_TEST_SUITE(OptionParserTest);
  13. CPPUNIT_TEST(testFindAll);
  14. CPPUNIT_TEST(testFindByNameSubstring);
  15. CPPUNIT_TEST(testFindByTag);
  16. CPPUNIT_TEST(testFindByName);
  17. CPPUNIT_TEST(testFindByShortName);
  18. CPPUNIT_TEST(testFindByID);
  19. CPPUNIT_TEST(testParseDefaultValues);
  20. CPPUNIT_TEST(testParseArg);
  21. CPPUNIT_TEST(testParse);
  22. CPPUNIT_TEST_SUITE_END();
  23. private:
  24. SharedHandle<OptionParser> oparser_;
  25. public:
  26. void setUp()
  27. {
  28. oparser_.reset(new OptionParser());
  29. SharedHandle<OptionHandler> alpha
  30. (new DefaultOptionHandler("alpha", NO_DESCRIPTION, "ALPHA", "",
  31. OptionHandler::REQ_ARG, 'A'));
  32. alpha->addTag("apple");
  33. alpha->setEraseAfterParse(true);
  34. oparser_->addOptionHandler(alpha);
  35. SharedHandle<OptionHandler> bravo(new DefaultOptionHandler("bravo"));
  36. bravo->addTag("apple");
  37. bravo->addTag("orange");
  38. bravo->addTag("pineapple");
  39. oparser_->addOptionHandler(bravo);
  40. SharedHandle<DefaultOptionHandler> charlie
  41. (new DefaultOptionHandler("charlie", NO_DESCRIPTION, "CHARLIE", "",
  42. OptionHandler::REQ_ARG, 'C'));
  43. charlie->hide();
  44. charlie->addTag("pineapple");
  45. oparser_->addOptionHandler(charlie);
  46. SharedHandle<OptionHandler> delta
  47. (new UnitNumberOptionHandler("delta", NO_DESCRIPTION, "1M", -1, -1, 'D'));
  48. delta->addTag("pineapple");
  49. oparser_->addOptionHandler(delta);
  50. }
  51. void tearDown() {}
  52. void testFindAll();
  53. void testFindByNameSubstring();
  54. void testFindByTag();
  55. void testFindByName();
  56. void testFindByShortName();
  57. void testFindByID();
  58. void testParseDefaultValues();
  59. void testParseArg();
  60. void testParse();
  61. };
  62. CPPUNIT_TEST_SUITE_REGISTRATION(OptionParserTest);
  63. void OptionParserTest::testFindAll()
  64. {
  65. std::vector<SharedHandle<OptionHandler> > res = oparser_->findAll();
  66. CPPUNIT_ASSERT_EQUAL((size_t)3, res.size());
  67. CPPUNIT_ASSERT_EQUAL(std::string("alpha"), res[0]->getName());
  68. CPPUNIT_ASSERT_EQUAL(std::string("bravo"), res[1]->getName());
  69. CPPUNIT_ASSERT_EQUAL(std::string("delta"), res[2]->getName());
  70. }
  71. void OptionParserTest::testFindByNameSubstring()
  72. {
  73. std::vector<SharedHandle<OptionHandler> > res =
  74. oparser_->findByNameSubstring("l");
  75. CPPUNIT_ASSERT_EQUAL((size_t)2, res.size());
  76. CPPUNIT_ASSERT_EQUAL(std::string("alpha"), res[0]->getName());
  77. CPPUNIT_ASSERT_EQUAL(std::string("delta"), res[1]->getName());
  78. }
  79. void OptionParserTest::testFindByTag()
  80. {
  81. std::vector<SharedHandle<OptionHandler> > res =
  82. oparser_->findByTag("pineapple");
  83. CPPUNIT_ASSERT_EQUAL((size_t)2, res.size());
  84. CPPUNIT_ASSERT_EQUAL(std::string("bravo"), res[0]->getName());
  85. CPPUNIT_ASSERT_EQUAL(std::string("delta"), res[1]->getName());
  86. }
  87. void OptionParserTest::testFindByName()
  88. {
  89. SharedHandle<OptionHandler> bravo = oparser_->findByName("bravo");
  90. CPPUNIT_ASSERT(bravo);
  91. CPPUNIT_ASSERT_EQUAL(std::string("bravo"), bravo->getName());
  92. SharedHandle<OptionHandler> charlie = oparser_->findByName("charlie");
  93. CPPUNIT_ASSERT(!charlie);
  94. SharedHandle<OptionHandler> alpha2 = oparser_->findByName("alpha2");
  95. CPPUNIT_ASSERT(!alpha2);
  96. }
  97. void OptionParserTest::testFindByShortName()
  98. {
  99. SharedHandle<OptionHandler> alpha = oparser_->findByShortName('A');
  100. CPPUNIT_ASSERT(alpha);
  101. CPPUNIT_ASSERT_EQUAL(std::string("alpha"), alpha->getName());
  102. CPPUNIT_ASSERT(!oparser_->findByShortName('C'));
  103. }
  104. void OptionParserTest::testFindByID()
  105. {
  106. SharedHandle<OptionHandler> alpha = oparser_->findByID(1);
  107. CPPUNIT_ASSERT(alpha);
  108. CPPUNIT_ASSERT_EQUAL(std::string("alpha"), alpha->getName());
  109. CPPUNIT_ASSERT(!oparser_->findByID(3));
  110. }
  111. void OptionParserTest::testParseDefaultValues()
  112. {
  113. Option option;
  114. oparser_->parseDefaultValues(option);
  115. CPPUNIT_ASSERT_EQUAL(std::string("ALPHA"), option.get("alpha"));
  116. CPPUNIT_ASSERT_EQUAL(std::string("1048576"), option.get("delta"));
  117. CPPUNIT_ASSERT_EQUAL(std::string("CHARLIE"), option.get("charlie"));
  118. CPPUNIT_ASSERT(!option.defined("bravo"));
  119. }
  120. void OptionParserTest::testParseArg()
  121. {
  122. Option option;
  123. char prog[7];
  124. strncpy(prog, "aria2c", sizeof(prog));
  125. char optionAlpha[3];
  126. strncpy(optionAlpha, "-A", sizeof(optionAlpha));
  127. char argAlpha[6];
  128. strncpy(argAlpha, "ALPHA", sizeof(argAlpha));
  129. char optionBravo[8];
  130. strncpy(optionBravo, "--bravo", sizeof(optionBravo));
  131. char argBravo[6];
  132. strncpy(argBravo, "BRAVO", sizeof(argBravo));
  133. char nonopt1[8];
  134. strncpy(nonopt1, "nonopt1", sizeof(nonopt1));
  135. char nonopt2[8];
  136. strncpy(nonopt2, "nonopt2", sizeof(nonopt2));
  137. char* argv[] = { prog, optionAlpha, argAlpha, optionBravo, argBravo,
  138. nonopt1, nonopt2 };
  139. int argc = A2_ARRAY_LEN(argv);
  140. std::stringstream s;
  141. std::vector<std::string> nonopts;
  142. oparser_->parseArg(s, nonopts, argc, argv);
  143. CPPUNIT_ASSERT_EQUAL(std::string("alpha=ALPHA\n"
  144. "bravo=BRAVO\n"), s.str());
  145. CPPUNIT_ASSERT_EQUAL((size_t)2, nonopts.size());
  146. CPPUNIT_ASSERT_EQUAL(std::string("nonopt1"), nonopts[0]);
  147. CPPUNIT_ASSERT_EQUAL(std::string("nonopt2"), nonopts[1]);
  148. CPPUNIT_ASSERT_EQUAL(std::string("*****"), std::string(argAlpha));
  149. }
  150. void OptionParserTest::testParse()
  151. {
  152. Option option;
  153. std::istringstream in("alpha=Hello\n"
  154. "UNKNOWN=x\n"
  155. "\n"
  156. "bravo=World");
  157. oparser_->parse(option, in);
  158. CPPUNIT_ASSERT_EQUAL
  159. ((ptrdiff_t)2, std::distance(option.begin(), option.end()));
  160. CPPUNIT_ASSERT_EQUAL(std::string("Hello"), option.get("alpha"));
  161. CPPUNIT_ASSERT_EQUAL(std::string("World"), option.get("bravo"));
  162. }
  163. } // namespace aria2