multi_pass_tests.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765
  1. /*=============================================================================
  2. Copyright (c) 2001-2003 Daniel Nuffer
  3. http://spirit.sourceforge.net/
  4. Use, modification and distribution is subject to the Boost Software
  5. License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  6. http://www.boost.org/LICENSE_1_0.txt)
  7. =============================================================================*/
  8. #include <boost/spirit/include/classic_multi_pass.hpp>
  9. #include <boost/scoped_ptr.hpp>
  10. #include <iterator>
  11. #include <string>
  12. #include <boost/detail/lightweight_test.hpp>
  13. #include "impl/sstream.hpp"
  14. using namespace std;
  15. using namespace BOOST_SPIRIT_CLASSIC_NS;
  16. sstream_t res;
  17. typedef multi_pass<istream_iterator<char> > default_multi_pass_t;
  18. typedef look_ahead<istream_iterator<char>, 6> fixed_multi_pass_t;
  19. typedef multi_pass<
  20. istream_iterator<char>,
  21. multi_pass_policies::input_iterator,
  22. multi_pass_policies::first_owner,
  23. multi_pass_policies::buf_id_check,
  24. multi_pass_policies::std_deque
  25. > first_owner_multi_pass_t;
  26. // a functor to test out the functor_multi_pass
  27. class my_functor
  28. {
  29. public:
  30. typedef char result_type;
  31. my_functor()
  32. : c('A')
  33. {}
  34. char operator()()
  35. {
  36. if (c == 'M')
  37. return eof;
  38. else
  39. return c++;
  40. }
  41. static result_type eof;
  42. private:
  43. char c;
  44. };
  45. my_functor::result_type my_functor::eof = '\0';
  46. typedef multi_pass<
  47. my_functor,
  48. multi_pass_policies::functor_input,
  49. multi_pass_policies::first_owner,
  50. multi_pass_policies::no_check,
  51. multi_pass_policies::std_deque
  52. > functor_multi_pass_t;
  53. void test_default_multi_pass()
  54. {
  55. res << "-*= test_default_multi_pass =*-\n";
  56. istream_iterator<char> end;
  57. boost::scoped_ptr<default_multi_pass_t> mpend(new default_multi_pass_t(end));
  58. {
  59. sstream_t ss;
  60. ss << "test string";
  61. istream_iterator<char> a(ss);
  62. boost::scoped_ptr<default_multi_pass_t> mp1(new default_multi_pass_t(a));
  63. while (*mp1 != *mpend)
  64. {
  65. res << *((*mp1)++);
  66. }
  67. res << endl;
  68. }
  69. {
  70. sstream_t ss;
  71. ss << "test string";
  72. istream_iterator<char> b(ss);
  73. boost::scoped_ptr<default_multi_pass_t> mp2(new default_multi_pass_t(b));
  74. boost::scoped_ptr<default_multi_pass_t> mp3(new default_multi_pass_t(b));
  75. *mp3 = *mp2;
  76. for (int i = 0; i < 4; ++i)
  77. {
  78. res << **mp2;
  79. ++*mp2;
  80. }
  81. mp3.reset();
  82. while (*mp2 != *mpend)
  83. {
  84. res << **mp2;
  85. ++*mp2;
  86. }
  87. res << endl;
  88. }
  89. {
  90. sstream_t ss;
  91. ss << "test string";
  92. istream_iterator<char> a(ss);
  93. boost::scoped_ptr<default_multi_pass_t> mp1(new default_multi_pass_t(a));
  94. boost::scoped_ptr<default_multi_pass_t> mp2(new default_multi_pass_t(*mp1));
  95. for (int i = 0; i < 4; ++i)
  96. {
  97. res << **mp1;
  98. ++*mp1;
  99. }
  100. while (*mp2 != *mpend)
  101. {
  102. res << **mp2;
  103. ++*mp2;
  104. }
  105. while (*mp1 != *mpend)
  106. {
  107. res << **mp1;
  108. ++*mp1;
  109. }
  110. res << endl;
  111. }
  112. {
  113. sstream_t ss;
  114. ss << "test string";
  115. istream_iterator<char> b(ss);
  116. boost::scoped_ptr<default_multi_pass_t> mp2(new default_multi_pass_t(b));
  117. boost::scoped_ptr<default_multi_pass_t> mp3(new default_multi_pass_t(b));
  118. *mp3 = *mp2;
  119. for (int i = 0; i < 4; ++i)
  120. {
  121. res << **mp2;
  122. ++*mp2;
  123. }
  124. mp3.reset();
  125. ++*mp2;
  126. while (*mp2 != *mpend)
  127. {
  128. res << **mp2;
  129. ++*mp2;
  130. }
  131. res << endl;
  132. }
  133. {
  134. sstream_t ss;
  135. ss << "test string";
  136. istream_iterator<char> a(ss);
  137. boost::scoped_ptr<default_multi_pass_t> mp1(new default_multi_pass_t(a));
  138. boost::scoped_ptr<default_multi_pass_t> mp2(new default_multi_pass_t(*mp1));
  139. BOOST_TEST(*mp1 == *mp2);
  140. BOOST_TEST(*mp1 >= *mp2);
  141. BOOST_TEST(*mp1 <= *mp2);
  142. for (int i = 0; i < 4; ++i)
  143. {
  144. res << **mp1;
  145. ++*mp1;
  146. }
  147. BOOST_TEST(*mp1 != *mp2);
  148. BOOST_TEST(*mp1 > *mp2);
  149. BOOST_TEST(*mp1 >= *mp2);
  150. BOOST_TEST(*mp2 < *mp1);
  151. BOOST_TEST(*mp2 <= *mp1);
  152. while (*mp2 != *mp1)
  153. {
  154. res << **mp2;
  155. ++*mp2;
  156. }
  157. BOOST_TEST(*mp1 == *mp2);
  158. BOOST_TEST(*mp1 >= *mp2);
  159. BOOST_TEST(*mp1 <= *mp2);
  160. while (*mp1 != *mpend)
  161. {
  162. res << **mp1;
  163. ++*mp1;
  164. }
  165. BOOST_TEST(*mp1 != *mp2);
  166. BOOST_TEST(*mp1 > *mp2);
  167. BOOST_TEST(*mp1 >= *mp2);
  168. BOOST_TEST(*mp2 < *mp1);
  169. BOOST_TEST(*mp2 <= *mp1);
  170. while (*mp2 != *mpend)
  171. {
  172. res << **mp2;
  173. ++*mp2;
  174. }
  175. BOOST_TEST(*mp1 == *mp2);
  176. BOOST_TEST(*mp1 >= *mp2);
  177. BOOST_TEST(*mp1 <= *mp2);
  178. res << endl;
  179. }
  180. {
  181. sstream_t ss;
  182. ss << "test string";
  183. istream_iterator<char> a(ss);
  184. boost::scoped_ptr<default_multi_pass_t> mp1(new default_multi_pass_t(a));
  185. boost::scoped_ptr<default_multi_pass_t> mp2(new default_multi_pass_t(a));
  186. BOOST_TEST(*mp1 != *mp2);
  187. ++*mp1;
  188. BOOST_TEST(*mp1 != *mp2);
  189. }
  190. {
  191. sstream_t ss;
  192. ss << "test string";
  193. istream_iterator<char> b(ss);
  194. boost::scoped_ptr<default_multi_pass_t> mp2(new default_multi_pass_t(b));
  195. boost::scoped_ptr<default_multi_pass_t> mp3(new default_multi_pass_t(b));
  196. *mp3 = *mp2;
  197. for (int i = 0; i < 4; ++i)
  198. {
  199. res << **mp2;
  200. ++*mp2;
  201. }
  202. mp2->clear_queue();
  203. while (*mp2 != *mpend)
  204. {
  205. res << **mp2;
  206. ++*mp2;
  207. }
  208. try
  209. {
  210. res << **mp3; // this should throw illegal_backtracking
  211. BOOST_TEST(0);
  212. }
  213. catch (const BOOST_SPIRIT_CLASSIC_NS::multi_pass_policies::illegal_backtracking& /*e*/)
  214. {
  215. }
  216. res << endl;
  217. }
  218. }
  219. void test_fixed_multi_pass()
  220. {
  221. res << "-*= test_fixed_multi_pass =*-\n";
  222. istream_iterator<char> end;
  223. boost::scoped_ptr<fixed_multi_pass_t> mpend(new fixed_multi_pass_t(end));
  224. {
  225. sstream_t ss;
  226. ss << "test string";
  227. istream_iterator<char> a(ss);
  228. boost::scoped_ptr<fixed_multi_pass_t> mp1(new fixed_multi_pass_t(a));
  229. while (*mp1 != *mpend)
  230. {
  231. res << *((*mp1)++);
  232. }
  233. res << endl;
  234. }
  235. {
  236. sstream_t ss;
  237. ss << "test string";
  238. istream_iterator<char> b(ss);
  239. boost::scoped_ptr<fixed_multi_pass_t> mp2(new fixed_multi_pass_t(b));
  240. boost::scoped_ptr<fixed_multi_pass_t> mp3(new fixed_multi_pass_t(*mp2));
  241. for (int i = 0; i < 4; ++i)
  242. {
  243. res << **mp2;
  244. ++*mp2;
  245. }
  246. mp3.reset();
  247. while (*mp2 != *mpend)
  248. {
  249. res << **mp2;
  250. ++*mp2;
  251. }
  252. res << endl;
  253. }
  254. {
  255. sstream_t ss;
  256. ss << "test string";
  257. istream_iterator<char> a(ss);
  258. boost::scoped_ptr<fixed_multi_pass_t> mp1(new fixed_multi_pass_t(a));
  259. boost::scoped_ptr<fixed_multi_pass_t> mp2(new fixed_multi_pass_t(*mp1));
  260. for (int i = 0; i < 4; ++i)
  261. {
  262. res << **mp1;
  263. ++*mp1;
  264. }
  265. while (*mp2 != *mpend)
  266. {
  267. res << **mp2;
  268. ++*mp2;
  269. }
  270. while (*mp1 != *mpend)
  271. {
  272. res << **mp1;
  273. ++*mp1;
  274. }
  275. res << endl;
  276. }
  277. {
  278. sstream_t ss;
  279. ss << "test string";
  280. istream_iterator<char> b(ss);
  281. boost::scoped_ptr<fixed_multi_pass_t> mp2(new fixed_multi_pass_t(b));
  282. boost::scoped_ptr<fixed_multi_pass_t> mp3(new fixed_multi_pass_t(*mp2));
  283. for (int i = 0; i < 4; ++i)
  284. {
  285. res << **mp2;
  286. ++*mp2;
  287. }
  288. mp3.reset();
  289. ++*mp2;
  290. while (*mp2 != *mpend)
  291. {
  292. res << **mp2;
  293. ++*mp2;
  294. }
  295. res << endl;
  296. }
  297. {
  298. sstream_t ss;
  299. ss << "test string";
  300. istream_iterator<char> a(ss);
  301. boost::scoped_ptr<fixed_multi_pass_t> mp1(new fixed_multi_pass_t(a));
  302. boost::scoped_ptr<fixed_multi_pass_t> mp2(new fixed_multi_pass_t(*mp1));
  303. BOOST_TEST(*mp1 == *mp2);
  304. BOOST_TEST(*mp1 >= *mp2);
  305. BOOST_TEST(*mp1 <= *mp2);
  306. for (int i = 0; i < 4; ++i)
  307. {
  308. res << **mp1;
  309. ++*mp1;
  310. }
  311. BOOST_TEST(*mp1 != *mp2);
  312. BOOST_TEST(*mp1 > *mp2);
  313. BOOST_TEST(*mp1 >= *mp2);
  314. BOOST_TEST(*mp2 < *mp1);
  315. BOOST_TEST(*mp2 <= *mp1);
  316. while (*mp2 != *mp1)
  317. {
  318. res << **mp2;
  319. ++*mp2;
  320. }
  321. BOOST_TEST(*mp1 == *mp2);
  322. BOOST_TEST(*mp1 >= *mp2);
  323. BOOST_TEST(*mp1 <= *mp2);
  324. while (*mp1 != *mpend)
  325. {
  326. res << **mp1;
  327. ++*mp1;
  328. }
  329. BOOST_TEST(*mp1 != *mp2);
  330. BOOST_TEST(*mp1 > *mp2);
  331. BOOST_TEST(*mp1 >= *mp2);
  332. BOOST_TEST(*mp2 < *mp1);
  333. BOOST_TEST(*mp2 <= *mp1);
  334. while (*mp2 != *mpend)
  335. {
  336. res << **mp2;
  337. ++*mp2;
  338. }
  339. BOOST_TEST(*mp1 == *mp2);
  340. BOOST_TEST(*mp1 >= *mp2);
  341. BOOST_TEST(*mp1 <= *mp2);
  342. res << endl;
  343. }
  344. {
  345. sstream_t ss;
  346. ss << "test string";
  347. istream_iterator<char> a(ss);
  348. boost::scoped_ptr<fixed_multi_pass_t> mp1(new fixed_multi_pass_t(a));
  349. boost::scoped_ptr<fixed_multi_pass_t> mp2(new fixed_multi_pass_t(a));
  350. BOOST_TEST(*mp1 != *mp2);
  351. ++*mp1;
  352. BOOST_TEST(*mp1 != *mp2);
  353. }
  354. }
  355. void test_first_owner_multi_pass()
  356. {
  357. res << "-*= test_first_owner_multi_pass =*-\n";
  358. istream_iterator<char> end;
  359. boost::scoped_ptr<first_owner_multi_pass_t> mpend(new first_owner_multi_pass_t(end));
  360. {
  361. sstream_t ss;
  362. ss << "test string";
  363. istream_iterator<char> a(ss);
  364. boost::scoped_ptr<first_owner_multi_pass_t> mp1(new first_owner_multi_pass_t(a));
  365. while (*mp1 != *mpend)
  366. {
  367. res << *((*mp1)++);
  368. }
  369. res << endl;
  370. }
  371. {
  372. sstream_t ss;
  373. ss << "test string";
  374. istream_iterator<char> b(ss);
  375. boost::scoped_ptr<first_owner_multi_pass_t> mp2(new first_owner_multi_pass_t(b));
  376. boost::scoped_ptr<first_owner_multi_pass_t> mp3(new first_owner_multi_pass_t(*mp2));
  377. for (int i = 0; i < 4; ++i)
  378. {
  379. res << **mp2;
  380. ++*mp2;
  381. }
  382. mp3.reset();
  383. while (*mp2 != *mpend)
  384. {
  385. res << **mp2;
  386. ++*mp2;
  387. }
  388. res << endl;
  389. }
  390. {
  391. sstream_t ss;
  392. ss << "test string";
  393. istream_iterator<char> a(ss);
  394. boost::scoped_ptr<first_owner_multi_pass_t> mp1(new first_owner_multi_pass_t(a));
  395. boost::scoped_ptr<first_owner_multi_pass_t> mp2(new first_owner_multi_pass_t(*mp1));
  396. for (int i = 0; i < 4; ++i)
  397. {
  398. res << **mp1;
  399. ++*mp1;
  400. }
  401. while (*mp2 != *mpend)
  402. {
  403. res << **mp2;
  404. ++*mp2;
  405. }
  406. while (*mp1 != *mpend)
  407. {
  408. res << **mp1;
  409. ++*mp1;
  410. }
  411. res << endl;
  412. }
  413. {
  414. sstream_t ss;
  415. ss << "test string";
  416. istream_iterator<char> b(ss);
  417. boost::scoped_ptr<first_owner_multi_pass_t> mp2(new first_owner_multi_pass_t(b));
  418. boost::scoped_ptr<first_owner_multi_pass_t> mp3(new first_owner_multi_pass_t(*mp2));
  419. for (int i = 0; i < 4; ++i)
  420. {
  421. res << **mp2;
  422. ++*mp2;
  423. }
  424. mp3.reset();
  425. ++*mp2;
  426. while (*mp2 != *mpend)
  427. {
  428. res << **mp2;
  429. ++*mp2;
  430. }
  431. res << endl;
  432. }
  433. {
  434. sstream_t ss;
  435. ss << "test string";
  436. istream_iterator<char> a(ss);
  437. boost::scoped_ptr<first_owner_multi_pass_t> mp1(new first_owner_multi_pass_t(a));
  438. boost::scoped_ptr<first_owner_multi_pass_t> mp2(new first_owner_multi_pass_t(*mp1));
  439. BOOST_TEST(*mp1 == *mp2);
  440. BOOST_TEST(*mp1 >= *mp2);
  441. BOOST_TEST(*mp1 <= *mp2);
  442. for (int i = 0; i < 4; ++i)
  443. {
  444. res << **mp1;
  445. ++*mp1;
  446. }
  447. BOOST_TEST(*mp1 != *mp2);
  448. BOOST_TEST(*mp1 > *mp2);
  449. BOOST_TEST(*mp1 >= *mp2);
  450. BOOST_TEST(*mp2 < *mp1);
  451. BOOST_TEST(*mp2 <= *mp1);
  452. while (*mp2 != *mp1)
  453. {
  454. res << **mp2;
  455. ++*mp2;
  456. }
  457. BOOST_TEST(*mp1 == *mp2);
  458. BOOST_TEST(*mp1 >= *mp2);
  459. BOOST_TEST(*mp1 <= *mp2);
  460. while (*mp1 != *mpend)
  461. {
  462. res << **mp1;
  463. ++*mp1;
  464. }
  465. BOOST_TEST(*mp1 != *mp2);
  466. BOOST_TEST(*mp1 > *mp2);
  467. BOOST_TEST(*mp1 >= *mp2);
  468. BOOST_TEST(*mp2 < *mp1);
  469. BOOST_TEST(*mp2 <= *mp1);
  470. while (*mp2 != *mpend)
  471. {
  472. res << **mp2;
  473. ++*mp2;
  474. }
  475. BOOST_TEST(*mp1 == *mp2);
  476. BOOST_TEST(*mp1 >= *mp2);
  477. BOOST_TEST(*mp1 <= *mp2);
  478. res << endl;
  479. }
  480. {
  481. sstream_t ss;
  482. ss << "test string";
  483. istream_iterator<char> a(ss);
  484. boost::scoped_ptr<first_owner_multi_pass_t> mp1(new first_owner_multi_pass_t(a));
  485. boost::scoped_ptr<first_owner_multi_pass_t> mp2(new first_owner_multi_pass_t(a));
  486. BOOST_TEST(*mp1 != *mp2);
  487. ++*mp1;
  488. BOOST_TEST(*mp1 != *mp2);
  489. }
  490. {
  491. sstream_t ss;
  492. ss << "test string";
  493. istream_iterator<char> b(ss);
  494. boost::scoped_ptr<first_owner_multi_pass_t> mp2(new first_owner_multi_pass_t(b));
  495. boost::scoped_ptr<first_owner_multi_pass_t> mp3(new first_owner_multi_pass_t(*mp2));
  496. for (int i = 0; i < 4; ++i)
  497. {
  498. res << **mp2;
  499. ++*mp2;
  500. }
  501. mp2->clear_queue();
  502. while (*mp2 != *mpend)
  503. {
  504. res << **mp2;
  505. ++*mp2;
  506. }
  507. try
  508. {
  509. res << **mp3; // this should throw illegal_backtracking
  510. BOOST_TEST(0);
  511. }
  512. catch (const BOOST_SPIRIT_CLASSIC_NS::multi_pass_policies::illegal_backtracking& /*e*/)
  513. {
  514. }
  515. res << endl;
  516. }
  517. }
  518. void test_functor_multi_pass()
  519. {
  520. res << "-*= test_functor_multi_pass =*-\n";
  521. functor_multi_pass_t mpend;
  522. {
  523. functor_multi_pass_t mp1 = functor_multi_pass_t(my_functor());
  524. while (mp1 != mpend)
  525. {
  526. res << *(mp1++);
  527. }
  528. res << endl;
  529. }
  530. {
  531. functor_multi_pass_t mp1 = functor_multi_pass_t(my_functor());
  532. functor_multi_pass_t mp2 = functor_multi_pass_t(mp1);
  533. for (int i = 0; i < 4; ++i)
  534. {
  535. res << *mp1;
  536. ++mp1;
  537. }
  538. while (mp2 != mpend)
  539. {
  540. res << *mp2;
  541. ++mp2;
  542. }
  543. while (mp1 != mpend)
  544. {
  545. res << *mp1;
  546. ++mp1;
  547. }
  548. res << endl;
  549. }
  550. {
  551. functor_multi_pass_t mp1 = functor_multi_pass_t(my_functor());
  552. functor_multi_pass_t mp2 = functor_multi_pass_t(mp1);
  553. BOOST_TEST(mp1 == mp2);
  554. BOOST_TEST(mp1 >= mp2);
  555. BOOST_TEST(mp1 <= mp2);
  556. for (int i = 0; i < 4; ++i)
  557. {
  558. res << *mp1;
  559. ++mp1;
  560. }
  561. BOOST_TEST(mp1 != mp2);
  562. BOOST_TEST(mp1 > mp2);
  563. BOOST_TEST(mp1 >= mp2);
  564. BOOST_TEST(mp2 < mp1);
  565. BOOST_TEST(mp2 <= mp1);
  566. while (mp2 != mp1)
  567. {
  568. res << *mp2;
  569. ++mp2;
  570. }
  571. BOOST_TEST(mp1 == mp2);
  572. BOOST_TEST(mp1 >= mp2);
  573. BOOST_TEST(mp1 <= mp2);
  574. while (mp1 != mpend)
  575. {
  576. res << *mp1;
  577. ++mp1;
  578. }
  579. BOOST_TEST(mp1 != mp2);
  580. BOOST_TEST(mp1 > mp2);
  581. BOOST_TEST(mp1 >= mp2);
  582. BOOST_TEST(mp2 < mp1);
  583. BOOST_TEST(mp2 <= mp1);
  584. while (mp2 != mpend)
  585. {
  586. res << *mp2;
  587. ++mp2;
  588. }
  589. BOOST_TEST(mp1 == mp2);
  590. BOOST_TEST(mp1 >= mp2);
  591. BOOST_TEST(mp1 <= mp2);
  592. res << endl;
  593. }
  594. {
  595. functor_multi_pass_t mp1 = functor_multi_pass_t(my_functor());
  596. functor_multi_pass_t mp2 = functor_multi_pass_t(my_functor());
  597. BOOST_TEST(mp1 != mp2);
  598. ++mp1;
  599. BOOST_TEST(mp1 != mp2);
  600. }
  601. }
  602. int main(int, char**)
  603. {
  604. test_default_multi_pass();
  605. test_fixed_multi_pass();
  606. test_first_owner_multi_pass();
  607. test_functor_multi_pass();
  608. BOOST_TEST(getstring(res) == "-*= test_default_multi_pass =*-\n"
  609. "teststring\n"
  610. "teststring\n"
  611. "testteststringstring\n"
  612. "testtring\n"
  613. "testteststringstring\n"
  614. "teststring\n"
  615. "-*= test_fixed_multi_pass =*-\n"
  616. "teststring\n"
  617. "teststring\n"
  618. "testteststringstring\n"
  619. "testtring\n"
  620. "testteststringstring\n"
  621. "-*= test_first_owner_multi_pass =*-\n"
  622. "teststring\n"
  623. "teststring\n"
  624. "testteststringstring\n"
  625. "testtring\n"
  626. "testteststringstring\n"
  627. "teststring\n"
  628. "-*= test_functor_multi_pass =*-\n"
  629. "ABCDEFGHIJKL\n"
  630. "ABCDABCDEFGHIJKLEFGHIJKL\n"
  631. "ABCDABCDEFGHIJKLEFGHIJKL\n");
  632. return boost::report_errors();
  633. }