ParamedStringTest.cc 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. #include "paramed_string.h"
  2. #include <iostream>
  3. #include <cppunit/extensions/HelperMacros.h>
  4. namespace aria2 {
  5. class ParamedStringTest:public CppUnit::TestFixture {
  6. CPPUNIT_TEST_SUITE(ParamedStringTest);
  7. CPPUNIT_TEST(testExpand);
  8. CPPUNIT_TEST_SUITE_END();
  9. public:
  10. void testExpand();
  11. };
  12. CPPUNIT_TEST_SUITE_REGISTRATION( ParamedStringTest );
  13. void ParamedStringTest::testExpand()
  14. {
  15. std::vector<std::string> res;
  16. std::string s = "alpha:{01,02,03}:bravo:{001,002}";
  17. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  18. CPPUNIT_ASSERT_EQUAL((size_t)6, res.size());
  19. CPPUNIT_ASSERT_EQUAL(std::string("alpha:01:bravo:001"), res[0]);
  20. CPPUNIT_ASSERT_EQUAL(std::string("alpha:01:bravo:002"), res[1]);
  21. CPPUNIT_ASSERT_EQUAL(std::string("alpha:02:bravo:001"), res[2]);
  22. CPPUNIT_ASSERT_EQUAL(std::string("alpha:02:bravo:002"), res[3]);
  23. CPPUNIT_ASSERT_EQUAL(std::string("alpha:03:bravo:001"), res[4]);
  24. CPPUNIT_ASSERT_EQUAL(std::string("alpha:03:bravo:002"), res[5]);
  25. res.clear();
  26. s = "alpha:[1-3]:bravo";
  27. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  28. CPPUNIT_ASSERT_EQUAL((size_t)3, res.size());
  29. CPPUNIT_ASSERT_EQUAL(std::string("alpha:1:bravo"), res[0]);
  30. CPPUNIT_ASSERT_EQUAL(std::string("alpha:2:bravo"), res[1]);
  31. CPPUNIT_ASSERT_EQUAL(std::string("alpha:3:bravo"), res[2]);
  32. res.clear();
  33. s = "alpha:[5-12:3]:bravo";
  34. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  35. CPPUNIT_ASSERT_EQUAL((size_t)3, res.size());
  36. CPPUNIT_ASSERT_EQUAL(std::string("alpha:5:bravo"), res[0]);
  37. CPPUNIT_ASSERT_EQUAL(std::string("alpha:8:bravo"), res[1]);
  38. CPPUNIT_ASSERT_EQUAL(std::string("alpha:11:bravo"), res[2]);
  39. res.clear();
  40. s = "alpha:[05-12:3]:bravo";
  41. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  42. CPPUNIT_ASSERT_EQUAL((size_t)3, res.size());
  43. CPPUNIT_ASSERT_EQUAL(std::string("alpha:05:bravo"), res[0]);
  44. CPPUNIT_ASSERT_EQUAL(std::string("alpha:08:bravo"), res[1]);
  45. CPPUNIT_ASSERT_EQUAL(std::string("alpha:11:bravo"), res[2]);
  46. res.clear();
  47. s = "alpha:[99-00]:bravo";
  48. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  49. CPPUNIT_ASSERT_EQUAL((size_t)1, res.size());
  50. CPPUNIT_ASSERT_EQUAL(std::string("alpha::bravo"), res[0]);
  51. res.clear();
  52. s = "alpha:[65535-65535:65535]:bravo";
  53. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  54. CPPUNIT_ASSERT_EQUAL((size_t)1, res.size());
  55. CPPUNIT_ASSERT_EQUAL(std::string("alpha:65535:bravo"), res[0]);
  56. res.clear();
  57. // Invalid loop range
  58. s = "alpha:[1-]:bravo";
  59. try {
  60. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  61. CPPUNIT_FAIL("Exception must be thrown.");
  62. } catch(const Exception& e) {
  63. }
  64. // Invalid loop range
  65. s = "alpha:[-1]:bravo";
  66. try {
  67. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  68. CPPUNIT_FAIL("Exception must be thrown.");
  69. } catch(const Exception& e) {
  70. }
  71. // Invalid loop range
  72. s = "alpha:[1-3a]:bravo";
  73. try {
  74. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  75. CPPUNIT_FAIL("Exception must be thrown.");
  76. } catch(const Exception& e) {
  77. }
  78. // Missing loop step
  79. s = "alpha:[1-2:]:bravo";
  80. try {
  81. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  82. CPPUNIT_FAIL("Exception must be thrown.");
  83. } catch(const Exception& e) {
  84. }
  85. // Range overflow
  86. s = "alpha:[0-65536]:bravo";
  87. try {
  88. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  89. CPPUNIT_FAIL("Exception must be thrown.");
  90. } catch(const Exception& e) {
  91. }
  92. // Step overflow
  93. s = "alpha:[0-1:65536]:bravo";
  94. try {
  95. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  96. CPPUNIT_FAIL("Exception must be thrown.");
  97. } catch(const Exception& e) {
  98. }
  99. s = "alpha:[c-e]:bravo";
  100. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  101. CPPUNIT_ASSERT_EQUAL((size_t)3, res.size());
  102. CPPUNIT_ASSERT_EQUAL(std::string("alpha:c:bravo"), res[0]);
  103. CPPUNIT_ASSERT_EQUAL(std::string("alpha:d:bravo"), res[1]);
  104. CPPUNIT_ASSERT_EQUAL(std::string("alpha:e:bravo"), res[2]);
  105. res.clear();
  106. s = "alpha:[C-E]:bravo";
  107. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  108. CPPUNIT_ASSERT_EQUAL((size_t)3, res.size());
  109. CPPUNIT_ASSERT_EQUAL(std::string("alpha:C:bravo"), res[0]);
  110. CPPUNIT_ASSERT_EQUAL(std::string("alpha:D:bravo"), res[1]);
  111. CPPUNIT_ASSERT_EQUAL(std::string("alpha:E:bravo"), res[2]);
  112. res.clear();
  113. s = "alpha:[v-z:2]:bravo";
  114. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  115. CPPUNIT_ASSERT_EQUAL((size_t)3, res.size());
  116. CPPUNIT_ASSERT_EQUAL(std::string("alpha:v:bravo"), res[0]);
  117. CPPUNIT_ASSERT_EQUAL(std::string("alpha:x:bravo"), res[1]);
  118. CPPUNIT_ASSERT_EQUAL(std::string("alpha:z:bravo"), res[2]);
  119. res.clear();
  120. s = "alpha:[aa-ba]:bravo";
  121. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  122. CPPUNIT_ASSERT_EQUAL((size_t)27, res.size());
  123. CPPUNIT_ASSERT_EQUAL(std::string("alpha:aa:bravo"), res[0]);
  124. CPPUNIT_ASSERT_EQUAL(std::string("alpha:az:bravo"), res[25]);
  125. CPPUNIT_ASSERT_EQUAL(std::string("alpha:ba:bravo"), res[26]);
  126. res.clear();
  127. s = "alpha:[a-ba]:bravo";
  128. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  129. CPPUNIT_ASSERT_EQUAL((size_t)27, res.size());
  130. CPPUNIT_ASSERT_EQUAL(std::string("alpha:a:bravo"), res[0]);
  131. CPPUNIT_ASSERT_EQUAL(std::string("alpha:z:bravo"), res[25]);
  132. CPPUNIT_ASSERT_EQUAL(std::string("alpha:ba:bravo"), res[26]);
  133. res.clear();
  134. s = "alpha:[z-a]:bravo";
  135. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  136. CPPUNIT_ASSERT_EQUAL((size_t)1, res.size());
  137. CPPUNIT_ASSERT_EQUAL(std::string("alpha::bravo"), res[0]);
  138. res.clear();
  139. s = "alpha:[dsyo-dsyp]:bravo";
  140. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  141. CPPUNIT_ASSERT_EQUAL((size_t)2, res.size());
  142. CPPUNIT_ASSERT_EQUAL(std::string("alpha:dsyo:bravo"), res[0]);
  143. CPPUNIT_ASSERT_EQUAL(std::string("alpha:dsyp:bravo"), res[1]);
  144. res.clear();
  145. // Range overflow
  146. s = "alpha:[dsyo-dsyq]:bravo";
  147. try {
  148. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  149. CPPUNIT_FAIL("Exception must be thrown.");
  150. } catch(const Exception& e) {
  151. }
  152. // Invalid loop range
  153. s = "alpha:[a-Z]:bravo";
  154. try {
  155. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  156. CPPUNIT_FAIL("Exception must be thrown.");
  157. } catch(const Exception& e) {
  158. }
  159. // Combination of {} and []
  160. s = "http://{jp,us}.mirror/image_cd[000-001].iso";
  161. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  162. CPPUNIT_ASSERT_EQUAL((size_t)4, res.size());
  163. CPPUNIT_ASSERT_EQUAL(std::string("http://jp.mirror/image_cd000.iso"), res[0]);
  164. CPPUNIT_ASSERT_EQUAL(std::string("http://jp.mirror/image_cd001.iso"), res[1]);
  165. CPPUNIT_ASSERT_EQUAL(std::string("http://us.mirror/image_cd000.iso"), res[2]);
  166. CPPUNIT_ASSERT_EQUAL(std::string("http://us.mirror/image_cd001.iso"), res[3]);
  167. res.clear();
  168. }
  169. } // namespace aria2