ParamedStringTest.cc 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  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. }
  63. catch (const Exception& e) {
  64. }
  65. // Invalid loop range
  66. s = "alpha:[-1]:bravo";
  67. try {
  68. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  69. CPPUNIT_FAIL("Exception must be thrown.");
  70. }
  71. catch (const Exception& e) {
  72. }
  73. // Invalid loop range
  74. s = "alpha:[1-3a]:bravo";
  75. try {
  76. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  77. CPPUNIT_FAIL("Exception must be thrown.");
  78. }
  79. catch (const Exception& e) {
  80. }
  81. // Missing loop step
  82. s = "alpha:[1-2:]:bravo";
  83. try {
  84. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  85. CPPUNIT_FAIL("Exception must be thrown.");
  86. }
  87. catch (const Exception& e) {
  88. }
  89. // Range overflow
  90. s = "alpha:[0-65536]:bravo";
  91. try {
  92. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  93. CPPUNIT_FAIL("Exception must be thrown.");
  94. }
  95. catch (const Exception& e) {
  96. }
  97. // Step overflow
  98. s = "alpha:[0-1:65536]:bravo";
  99. try {
  100. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  101. CPPUNIT_FAIL("Exception must be thrown.");
  102. }
  103. catch (const Exception& e) {
  104. }
  105. s = "alpha:[c-e]:bravo";
  106. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  107. CPPUNIT_ASSERT_EQUAL((size_t)3, res.size());
  108. CPPUNIT_ASSERT_EQUAL(std::string("alpha:c:bravo"), res[0]);
  109. CPPUNIT_ASSERT_EQUAL(std::string("alpha:d:bravo"), res[1]);
  110. CPPUNIT_ASSERT_EQUAL(std::string("alpha:e:bravo"), res[2]);
  111. res.clear();
  112. s = "alpha:[C-E]:bravo";
  113. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  114. CPPUNIT_ASSERT_EQUAL((size_t)3, res.size());
  115. CPPUNIT_ASSERT_EQUAL(std::string("alpha:C:bravo"), res[0]);
  116. CPPUNIT_ASSERT_EQUAL(std::string("alpha:D:bravo"), res[1]);
  117. CPPUNIT_ASSERT_EQUAL(std::string("alpha:E:bravo"), res[2]);
  118. res.clear();
  119. s = "alpha:[v-z:2]:bravo";
  120. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  121. CPPUNIT_ASSERT_EQUAL((size_t)3, res.size());
  122. CPPUNIT_ASSERT_EQUAL(std::string("alpha:v:bravo"), res[0]);
  123. CPPUNIT_ASSERT_EQUAL(std::string("alpha:x:bravo"), res[1]);
  124. CPPUNIT_ASSERT_EQUAL(std::string("alpha:z:bravo"), res[2]);
  125. res.clear();
  126. s = "alpha:[aa-ba]:bravo";
  127. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  128. CPPUNIT_ASSERT_EQUAL((size_t)27, res.size());
  129. CPPUNIT_ASSERT_EQUAL(std::string("alpha:aa:bravo"), res[0]);
  130. CPPUNIT_ASSERT_EQUAL(std::string("alpha:az:bravo"), res[25]);
  131. CPPUNIT_ASSERT_EQUAL(std::string("alpha:ba:bravo"), res[26]);
  132. res.clear();
  133. s = "alpha:[a-ba]:bravo";
  134. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  135. CPPUNIT_ASSERT_EQUAL((size_t)27, res.size());
  136. CPPUNIT_ASSERT_EQUAL(std::string("alpha:a:bravo"), res[0]);
  137. CPPUNIT_ASSERT_EQUAL(std::string("alpha:z:bravo"), res[25]);
  138. CPPUNIT_ASSERT_EQUAL(std::string("alpha:ba:bravo"), res[26]);
  139. res.clear();
  140. s = "alpha:[z-a]:bravo";
  141. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  142. CPPUNIT_ASSERT_EQUAL((size_t)1, res.size());
  143. CPPUNIT_ASSERT_EQUAL(std::string("alpha::bravo"), res[0]);
  144. res.clear();
  145. s = "alpha:[dsyo-dsyp]:bravo";
  146. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  147. CPPUNIT_ASSERT_EQUAL((size_t)2, res.size());
  148. CPPUNIT_ASSERT_EQUAL(std::string("alpha:dsyo:bravo"), res[0]);
  149. CPPUNIT_ASSERT_EQUAL(std::string("alpha:dsyp:bravo"), res[1]);
  150. res.clear();
  151. // Range overflow
  152. s = "alpha:[dsyo-dsyq]:bravo";
  153. try {
  154. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  155. CPPUNIT_FAIL("Exception must be thrown.");
  156. }
  157. catch (const Exception& e) {
  158. }
  159. // Invalid loop range
  160. s = "alpha:[a-Z]:bravo";
  161. try {
  162. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  163. CPPUNIT_FAIL("Exception must be thrown.");
  164. }
  165. catch (const Exception& e) {
  166. }
  167. // Combination of {} and []
  168. s = "http://{jp,us}.mirror/image_cd[000-001].iso";
  169. paramed_string::expand(s.begin(), s.end(), std::back_inserter(res));
  170. CPPUNIT_ASSERT_EQUAL((size_t)4, res.size());
  171. CPPUNIT_ASSERT_EQUAL(std::string("http://jp.mirror/image_cd000.iso"), res[0]);
  172. CPPUNIT_ASSERT_EQUAL(std::string("http://jp.mirror/image_cd001.iso"), res[1]);
  173. CPPUNIT_ASSERT_EQUAL(std::string("http://us.mirror/image_cd000.iso"), res[2]);
  174. CPPUNIT_ASSERT_EQUAL(std::string("http://us.mirror/image_cd001.iso"), res[3]);
  175. res.clear();
  176. }
  177. } // namespace aria2