| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 | #include "OptionParser.h"#include <cstring>#include <sstream>#include <cppunit/extensions/HelperMacros.h>#include "OptionHandlerImpl.h"#include "Exception.h"#include "util.h"#include "Option.h"#include "array_fun.h"#include "prefs.h"namespace aria2 {class OptionParserTest:public CppUnit::TestFixture {  CPPUNIT_TEST_SUITE(OptionParserTest);  CPPUNIT_TEST(testFindAll);  CPPUNIT_TEST(testFindByNameSubstring);  CPPUNIT_TEST(testFindByTag);  CPPUNIT_TEST(testFind);  CPPUNIT_TEST(testFindByShortName);  CPPUNIT_TEST(testFindById);  CPPUNIT_TEST(testParseDefaultValues);  CPPUNIT_TEST(testParseArg);  CPPUNIT_TEST(testParse);  CPPUNIT_TEST_SUITE_END();private:  SharedHandle<OptionParser> oparser_;public:  void setUp()  {    oparser_.reset(new OptionParser());    SharedHandle<OptionHandler> timeout      (new DefaultOptionHandler(PREF_TIMEOUT, NO_DESCRIPTION, "ALPHA", "",                                OptionHandler::REQ_ARG, 'A'));    timeout->addTag("apple");    timeout->setEraseAfterParse(true);    oparser_->addOptionHandler(timeout);    SharedHandle<OptionHandler> dir(new DefaultOptionHandler(PREF_DIR));    dir->addTag("apple");    dir->addTag("orange");    dir->addTag("pineapple");    oparser_->addOptionHandler(dir);    SharedHandle<DefaultOptionHandler> daemon      (new DefaultOptionHandler(PREF_DAEMON, NO_DESCRIPTION, "CHARLIE", "",                                OptionHandler::REQ_ARG, 'C'));    daemon->hide();    daemon->addTag("pineapple");    oparser_->addOptionHandler(daemon);    SharedHandle<OptionHandler> out      (new UnitNumberOptionHandler(PREF_OUT, NO_DESCRIPTION, "1M",                                   -1, -1, 'D'));    out->addTag("pineapple");    oparser_->addOptionHandler(out);      }  void tearDown() {}  void testFindAll();  void testFindByNameSubstring();  void testFindByTag();  void testFind();  void testFindByShortName();  void testFindById();  void testParseDefaultValues();  void testParseArg();  void testParse();};CPPUNIT_TEST_SUITE_REGISTRATION(OptionParserTest);void OptionParserTest::testFindAll(){  std::vector<SharedHandle<OptionHandler> > res = oparser_->findAll();  CPPUNIT_ASSERT_EQUAL((size_t)3, res.size());  CPPUNIT_ASSERT_EQUAL(std::string("timeout"), std::string(res[0]->getName()));  CPPUNIT_ASSERT_EQUAL(std::string("dir"), std::string(res[1]->getName()));  CPPUNIT_ASSERT_EQUAL(std::string("out"), std::string(res[2]->getName()));}void OptionParserTest::testFindByNameSubstring(){  std::vector<SharedHandle<OptionHandler> > res =    oparser_->findByNameSubstring("i");  CPPUNIT_ASSERT_EQUAL((size_t)2, res.size());  CPPUNIT_ASSERT_EQUAL(std::string("timeout"), std::string(res[0]->getName()));  CPPUNIT_ASSERT_EQUAL(std::string("dir"), std::string(res[1]->getName()));}void OptionParserTest::testFindByTag(){  std::vector<SharedHandle<OptionHandler> > res =    oparser_->findByTag("pineapple");  CPPUNIT_ASSERT_EQUAL((size_t)2, res.size());  CPPUNIT_ASSERT_EQUAL(std::string("dir"), std::string(res[0]->getName()));  CPPUNIT_ASSERT_EQUAL(std::string("out"), std::string(res[1]->getName()));}void OptionParserTest::testFind(){  const SharedHandle<OptionHandler>& dir = oparser_->find(PREF_DIR);  CPPUNIT_ASSERT(dir);  CPPUNIT_ASSERT_EQUAL(std::string("dir"), std::string(dir->getName()));  const SharedHandle<OptionHandler>& daemon = oparser_->find(PREF_DAEMON);  CPPUNIT_ASSERT(!daemon);  const SharedHandle<OptionHandler>& log = oparser_->find(PREF_LOG);  CPPUNIT_ASSERT(!log);}void OptionParserTest::testFindByShortName(){  const SharedHandle<OptionHandler>& timeout = oparser_->findByShortName('A');  CPPUNIT_ASSERT(timeout);  CPPUNIT_ASSERT_EQUAL(std::string("timeout"), std::string(timeout->getName()));  CPPUNIT_ASSERT(!oparser_->findByShortName('C'));}void OptionParserTest::testFindById(){  const SharedHandle<OptionHandler>& timeout =    oparser_->findById(PREF_TIMEOUT->i);  CPPUNIT_ASSERT(timeout);  CPPUNIT_ASSERT_EQUAL(std::string("timeout"), std::string(timeout->getName()));  CPPUNIT_ASSERT(!oparser_->findById(9999));}void OptionParserTest::testParseDefaultValues(){  Option option;  oparser_->parseDefaultValues(option);  CPPUNIT_ASSERT_EQUAL(std::string("ALPHA"), option.get(PREF_TIMEOUT));  CPPUNIT_ASSERT_EQUAL(std::string("1048576"), option.get(PREF_OUT));  CPPUNIT_ASSERT_EQUAL(std::string("CHARLIE"), option.get(PREF_DAEMON));  CPPUNIT_ASSERT(!option.defined(PREF_DIR));}void OptionParserTest::testParseArg(){  Option option;  char prog[7];  strncpy(prog, "aria2c", sizeof(prog));  char optionTimeout[3];  strncpy(optionTimeout, "-A", sizeof(optionTimeout));  char argTimeout[6];  strncpy(argTimeout, "ALPHA", sizeof(argTimeout));  char optionDir[8];  strncpy(optionDir, "--dir", sizeof(optionDir));  char argDir[6];  strncpy(argDir, "BRAVO", sizeof(argDir));  char nonopt1[8];  strncpy(nonopt1, "nonopt1", sizeof(nonopt1));  char nonopt2[8];  strncpy(nonopt2, "nonopt2", sizeof(nonopt2));  char* argv[] = { prog, optionTimeout, argTimeout, optionDir, argDir,                   nonopt1, nonopt2 };  int argc = A2_ARRAY_LEN(argv);  std::stringstream s;  std::vector<std::string> nonopts;  oparser_->parseArg(s, nonopts, argc, argv);  CPPUNIT_ASSERT_EQUAL(std::string("timeout=ALPHA\n"                                   "dir=BRAVO\n"), s.str());  CPPUNIT_ASSERT_EQUAL((size_t)2, nonopts.size());  CPPUNIT_ASSERT_EQUAL(std::string("nonopt1"), nonopts[0]);  CPPUNIT_ASSERT_EQUAL(std::string("nonopt2"), nonopts[1]);  CPPUNIT_ASSERT_EQUAL(std::string("*****"), std::string(argTimeout));}void OptionParserTest::testParse(){  Option option;  std::istringstream in("timeout=Hello\n"                        "UNKNOWN=x\n"                        "\n"                        "dir=World");  oparser_->parse(option, in);  CPPUNIT_ASSERT_EQUAL(std::string("Hello"), option.get(PREF_TIMEOUT));  CPPUNIT_ASSERT_EQUAL(std::string("World"), option.get(PREF_DIR));}} // namespace aria2
 |