DataTest.cpp 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248
  1. //
  2. // DataTest.cpp
  3. //
  4. // $Id: //poco/Main/Data/testsuite/src/DataTest.cpp#12 $
  5. //
  6. // Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
  7. // and Contributors.
  8. //
  9. // Permission is hereby granted, free of charge, to any person or organization
  10. // obtaining a copy of the software and accompanying documentation covered by
  11. // this license (the "Software") to use, reproduce, display, distribute,
  12. // execute, and transmit the Software, and to prepare derivative works of the
  13. // Software, and to permit third-parties to whom the Software is furnished to
  14. // do so, all subject to the following:
  15. //
  16. // The copyright notices in the Software and this entire statement, including
  17. // the above license grant, this restriction and the following disclaimer,
  18. // must be included in all copies of the Software, in whole or in part, and
  19. // all derivative works of the Software, unless such copies or derivative
  20. // works are solely in the form of machine-executable object code generated by
  21. // a source language processor.
  22. //
  23. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  24. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  25. // FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
  26. // SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
  27. // FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
  28. // ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  29. // DEALINGS IN THE SOFTWARE.
  30. //
  31. #include "DataTest.h"
  32. #include "CppUnit/TestCaller.h"
  33. #include "CppUnit/TestSuite.h"
  34. #include "Poco/Data/Session.h"
  35. #include "Poco/Data/SessionFactory.h"
  36. #include "Poco/Data/BLOB.h"
  37. #include "Poco/Data/BLOBStream.h"
  38. #include "Poco/Data/MetaColumn.h"
  39. #include "Poco/Data/Column.h"
  40. #include "Poco/Data/Date.h"
  41. #include "Poco/Data/Time.h"
  42. #include "Poco/Data/SimpleRowFormatter.h"
  43. #include "Connector.h"
  44. #include "Poco/BinaryReader.h"
  45. #include "Poco/BinaryWriter.h"
  46. #include "Poco/DateTime.h"
  47. #include "Poco/Types.h"
  48. #include "Poco/Exception.h"
  49. #include <cstring>
  50. #include <sstream>
  51. #include <iomanip>
  52. #include <set>
  53. using namespace Poco::Data::Keywords;
  54. using Poco::BinaryReader;
  55. using Poco::BinaryWriter;
  56. using Poco::UInt32;
  57. using Poco::Int64;
  58. using Poco::UInt64;
  59. using Poco::DateTime;
  60. using Poco::InvalidAccessException;
  61. using Poco::RangeException;
  62. using Poco::NotFoundException;
  63. using Poco::InvalidArgumentException;
  64. using Poco::NotImplementedException;
  65. using Poco::Data::Session;
  66. using Poco::Data::SessionFactory;
  67. using Poco::Data::Statement;
  68. using Poco::Data::NotSupportedException;
  69. using Poco::Data::BLOB;
  70. using Poco::Data::BLOBInputStream;
  71. using Poco::Data::BLOBOutputStream;
  72. using Poco::Data::MetaColumn;
  73. using Poco::Data::Column;
  74. using Poco::Data::Row;
  75. using Poco::Data::SimpleRowFormatter;
  76. using Poco::Data::Date;
  77. using Poco::Data::Time;
  78. using Poco::Data::AbstractExtraction;
  79. using Poco::Data::AbstractExtractionVec;
  80. using Poco::Data::AbstractExtractionVecVec;
  81. using Poco::Data::AbstractBinding;
  82. using Poco::Data::AbstractBindingVec;
  83. DataTest::DataTest(const std::string& name): CppUnit::TestCase(name)
  84. {
  85. Poco::Data::Test::Connector::addToFactory();
  86. }
  87. DataTest::~DataTest()
  88. {
  89. Poco::Data::Test::Connector::removeFromFactory();
  90. }
  91. void DataTest::testSession()
  92. {
  93. Session sess(SessionFactory::instance().create("test", "cs"));
  94. sess << "DROP TABLE IF EXISTS Test", now;
  95. int count;
  96. sess << "SELECT COUNT(*) FROM PERSON", into(count), now;
  97. std::string str;
  98. Statement stmt = (sess << "SELECT * FROM Strings", into(str), limit(50));
  99. stmt.execute();
  100. }
  101. void DataTest::testStatementFormatting()
  102. {
  103. Session sess(SessionFactory::instance().create("test", "cs"));
  104. Statement stmt = (sess << "SELECT %s%c%s,%d,%u,%f,%s FROM Person WHERE Name LIKE 'Simp%%'",
  105. "'",'a',"'",-1, 1u, 1.5, "42", now);
  106. assert ("SELECT 'a',-1,1,1.500000,42 FROM Person WHERE Name LIKE 'Simp%'" == stmt.toString());
  107. }
  108. void DataTest::testFeatures()
  109. {
  110. Session sess(SessionFactory::instance().create("test", "cs"));
  111. sess.setFeature("f1", true);
  112. assert (sess.getFeature("f1"));
  113. assert (sess.getFeature("f2"));
  114. try
  115. {
  116. sess.setFeature("f2", false);
  117. }
  118. catch (NotImplementedException&)
  119. {
  120. }
  121. sess.setFeature("f3", false);
  122. assert (!sess.getFeature("f2"));
  123. try
  124. {
  125. sess.setFeature("f3", true);
  126. }
  127. catch (NotImplementedException&)
  128. {
  129. }
  130. try
  131. {
  132. sess.setFeature("f4", false);
  133. }
  134. catch (NotSupportedException&)
  135. {
  136. }
  137. }
  138. void DataTest::testProperties()
  139. {
  140. Session sess(SessionFactory::instance().create("test", "cs"));
  141. sess.setProperty("p1", 1);
  142. Poco::Any v1 = sess.getProperty("p1");
  143. assert (Poco::AnyCast<int>(v1) == 1);
  144. Poco::Any v2 = sess.getProperty("p2");
  145. assert (Poco::AnyCast<int>(v2) == 1);
  146. try
  147. {
  148. sess.setProperty("p2", 2);
  149. }
  150. catch (NotImplementedException&)
  151. {
  152. }
  153. sess.setProperty("p3", 2);
  154. v1 = sess.getProperty("p2");
  155. assert (Poco::AnyCast<int>(v1) == 2);
  156. try
  157. {
  158. sess.setProperty("p3", 3);
  159. }
  160. catch (NotImplementedException&)
  161. {
  162. }
  163. try
  164. {
  165. sess.setProperty("p4", 4);
  166. }
  167. catch (NotSupportedException&)
  168. {
  169. }
  170. }
  171. void DataTest::testBLOB()
  172. {
  173. std::string strDigit = "1234567890";
  174. std::string strAlpha = "abcdefghijklmnopqrstuvwxyz";
  175. std::vector<char> vecAlpha(strAlpha.begin(), strAlpha.end());
  176. std::vector<char> vecDigit(strDigit.begin(), strDigit.end());
  177. BLOB blobNumStr(strDigit.c_str(), strDigit.size());
  178. assert (blobNumStr.size() == strDigit.size());
  179. assert (0 == std::strncmp(strDigit.c_str(), blobNumStr.rawContent(), blobNumStr.size()));
  180. assert (*blobNumStr.begin() == '1');
  181. assert (*(blobNumStr.end()-1) == '0');
  182. BLOB blobNumVec(vecDigit);
  183. assert (blobNumVec.size() == vecDigit.size());
  184. assert (blobNumVec == blobNumStr);
  185. blobNumVec.swap(blobNumStr);
  186. assert (blobNumVec.size() == blobNumStr.size());
  187. assert (blobNumVec == blobNumStr);
  188. BLOB blobChrStr(strAlpha.c_str(), strAlpha.size());
  189. BLOB blobChrVec(vecAlpha);
  190. assert (blobChrStr.size() == strAlpha.size());
  191. assert (0 == std::strncmp(strAlpha.c_str(), blobChrStr.rawContent(), blobChrStr.size()));
  192. assert (*blobChrStr.begin() == 'a');
  193. assert (*(blobChrStr.end()-1) == 'z');
  194. assert (blobChrStr == blobChrVec);
  195. blobNumStr.swap(blobChrStr);
  196. assert (blobNumStr != blobChrStr);
  197. assert (&blobNumStr != &blobChrStr);
  198. assert (blobNumStr.content() != blobChrStr.content());
  199. assert (&blobNumStr.content() != &blobChrStr.content());
  200. assert (blobNumStr == blobChrVec);
  201. Poco::Data::swap(blobNumStr, blobChrVec);
  202. assert (blobNumStr == blobChrVec);
  203. std::swap(blobNumStr, blobChrVec);
  204. assert (blobNumStr == blobChrVec);
  205. }
  206. void DataTest::testBLOBStreams()
  207. {
  208. BLOB blob;
  209. assert (0 == blob.size());
  210. BLOBOutputStream bos(blob);
  211. BinaryWriter bw(bos);
  212. assert (0 == blob.size());
  213. writeToBLOB(bw);
  214. assert (blob.size() > 0);
  215. BLOBInputStream bis(blob);
  216. BinaryReader br(bis);
  217. readFromBLOB(br);
  218. }
  219. void DataTest::writeToBLOB(BinaryWriter& writer)
  220. {
  221. writer << true;
  222. writer << false;
  223. writer << 'a';
  224. writer << (short) -100;
  225. writer << (unsigned short) 50000;
  226. writer << -123456;
  227. writer << (unsigned) 123456;
  228. writer << (long) -1234567890;
  229. writer << (unsigned long) 1234567890;
  230. writer << (Int64) -1234567890;
  231. writer << (UInt64) 1234567890;
  232. writer << (float) 1.5;
  233. writer << (double) -1.5;
  234. writer << "foo";
  235. writer << "";
  236. writer << std::string("bar");
  237. writer << std::string();
  238. writer.write7BitEncoded((UInt32) 100);
  239. writer.write7BitEncoded((UInt32) 1000);
  240. writer.write7BitEncoded((UInt32) 10000);
  241. writer.write7BitEncoded((UInt32) 100000);
  242. writer.write7BitEncoded((UInt32) 1000000);
  243. writer.write7BitEncoded((UInt64) 100);
  244. writer.write7BitEncoded((UInt64) 1000);
  245. writer.write7BitEncoded((UInt64) 10000);
  246. writer.write7BitEncoded((UInt64) 100000);
  247. writer.write7BitEncoded((UInt64) 1000000);
  248. writer.writeRaw("RAW");
  249. }
  250. void DataTest::readFromBLOB(BinaryReader& reader)
  251. {
  252. bool b = false;
  253. reader >> b;
  254. assert (b);
  255. reader >> b;
  256. assert (!b);
  257. char c = ' ';
  258. reader >> c;
  259. assert (c == 'a');
  260. short shortv = 0;
  261. reader >> shortv;
  262. assert (shortv == -100);
  263. unsigned short ushortv = 0;
  264. reader >> ushortv;
  265. assert (ushortv == 50000);
  266. int intv = 0;
  267. reader >> intv;
  268. assert (intv == -123456);
  269. unsigned uintv = 0;
  270. reader >> uintv;
  271. assert (uintv == 123456);
  272. long longv = 0;
  273. reader >> longv;
  274. assert (longv == -1234567890);
  275. unsigned long ulongv = 0;
  276. reader >> ulongv;
  277. assert (ulongv == 1234567890);
  278. Int64 int64v = 0;
  279. reader >> int64v;
  280. assert (int64v == -1234567890);
  281. UInt64 uint64v = 0;
  282. reader >> uint64v;
  283. assert (uint64v == 1234567890);
  284. float floatv = 0.0;
  285. reader >> floatv;
  286. assert (floatv == 1.5);
  287. double doublev = 0.0;
  288. reader >> doublev;
  289. assert (doublev == -1.5);
  290. std::string str;
  291. reader >> str;
  292. assert (str == "foo");
  293. reader >> str;
  294. assert (str == "");
  295. reader >> str;
  296. assert (str == "bar");
  297. reader >> str;
  298. assert (str == "");
  299. UInt32 uint32v;
  300. reader.read7BitEncoded(uint32v);
  301. assert (uint32v == 100);
  302. reader.read7BitEncoded(uint32v);
  303. assert (uint32v == 1000);
  304. reader.read7BitEncoded(uint32v);
  305. assert (uint32v == 10000);
  306. reader.read7BitEncoded(uint32v);
  307. assert (uint32v == 100000);
  308. reader.read7BitEncoded(uint32v);
  309. assert (uint32v == 1000000);
  310. reader.read7BitEncoded(uint64v);
  311. assert (uint64v == 100);
  312. reader.read7BitEncoded(uint64v);
  313. assert (uint64v == 1000);
  314. reader.read7BitEncoded(uint64v);
  315. assert (uint64v == 10000);
  316. reader.read7BitEncoded(uint64v);
  317. assert (uint64v == 100000);
  318. reader.read7BitEncoded(uint64v);
  319. assert (uint64v == 1000000);
  320. reader.readRaw(3, str);
  321. assert (str == "RAW");
  322. }
  323. void DataTest::testColumnVector()
  324. {
  325. MetaColumn mc(0, "mc", MetaColumn::FDT_DOUBLE, 2, 3, true);
  326. assert (mc.name() == "mc");
  327. assert (mc.position() == 0);
  328. assert (mc.length() == 2);
  329. assert (mc.precision() == 3);
  330. assert (mc.type() == MetaColumn::FDT_DOUBLE);
  331. assert (mc.isNullable());
  332. std::vector<int>* pData = new std::vector<int>;
  333. pData->push_back(1);
  334. pData->push_back(2);
  335. pData->push_back(3);
  336. pData->push_back(4);
  337. pData->push_back(5);
  338. Column<std::vector<int> > c(mc, pData);
  339. assert (c.rowCount() == 5);
  340. assert (c[0] == 1);
  341. assert (c[1] == 2);
  342. assert (c[2] == 3);
  343. assert (c[3] == 4);
  344. assert (c[4] == 5);
  345. assert (c.name() == "mc");
  346. assert (c.position() == 0);
  347. assert (c.length() == 2);
  348. assert (c.precision() == 3);
  349. assert (c.type() == MetaColumn::FDT_DOUBLE);
  350. try
  351. {
  352. int i; i = c[100]; // to silence gcc
  353. fail ("must fail");
  354. }
  355. catch (RangeException&) { }
  356. Column<std::vector<int> > c1 = c;
  357. assert (c1.rowCount() == 5);
  358. assert (c1[0] == 1);
  359. assert (c1[1] == 2);
  360. assert (c1[2] == 3);
  361. assert (c1[3] == 4);
  362. assert (c1[4] == 5);
  363. Column<std::vector<int> > c2(c1);
  364. assert (c2.rowCount() == 5);
  365. assert (c2[0] == 1);
  366. assert (c2[1] == 2);
  367. assert (c2[2] == 3);
  368. assert (c2[3] == 4);
  369. assert (c2[4] == 5);
  370. std::vector<int> vi;
  371. vi.assign(c.begin(), c.end());
  372. assert (vi.size() == 5);
  373. assert (vi[0] == 1);
  374. assert (vi[1] == 2);
  375. assert (vi[2] == 3);
  376. assert (vi[3] == 4);
  377. assert (vi[4] == 5);
  378. c.reset();
  379. assert (c.rowCount() == 0);
  380. assert (c1.rowCount() == 0);
  381. assert (c2.rowCount() == 0);
  382. std::vector<int>* pV1 = new std::vector<int>;
  383. pV1->push_back(1);
  384. pV1->push_back(2);
  385. pV1->push_back(3);
  386. pV1->push_back(4);
  387. pV1->push_back(5);
  388. std::vector<int>* pV2 = new std::vector<int>;
  389. pV2->push_back(5);
  390. pV2->push_back(4);
  391. pV2->push_back(3);
  392. pV2->push_back(2);
  393. pV2->push_back(1);
  394. Column<std::vector<int> > c3(mc, pV1);
  395. Column<std::vector<int> > c4(mc, pV2);
  396. Poco::Data::swap(c3, c4);
  397. assert (c3[0] == 5);
  398. assert (c3[1] == 4);
  399. assert (c3[2] == 3);
  400. assert (c3[3] == 2);
  401. assert (c3[4] == 1);
  402. assert (c4[0] == 1);
  403. assert (c4[1] == 2);
  404. assert (c4[2] == 3);
  405. assert (c4[3] == 4);
  406. assert (c4[4] == 5);
  407. std::swap(c3, c4);
  408. assert (c3[0] == 1);
  409. assert (c3[1] == 2);
  410. assert (c3[2] == 3);
  411. assert (c3[3] == 4);
  412. assert (c3[4] == 5);
  413. assert (c4[0] == 5);
  414. assert (c4[1] == 4);
  415. assert (c4[2] == 3);
  416. assert (c4[3] == 2);
  417. assert (c4[4] == 1);
  418. }
  419. void DataTest::testColumnVectorBool()
  420. {
  421. MetaColumn mc(0, "mc", MetaColumn::FDT_BOOL);
  422. std::vector<bool>* pData = new std::vector<bool>;
  423. pData->push_back(true);
  424. pData->push_back(false);
  425. pData->push_back(true);
  426. pData->push_back(false);
  427. pData->push_back(true);
  428. Column<std::vector<bool> > c(mc, pData);
  429. assert (c.rowCount() == 5);
  430. assert (c[0] == true);
  431. assert (c[1] == false);
  432. assert (c[2] == true);
  433. assert (c[3] == false);
  434. assert (c[4] == true);
  435. assert (c.type() == MetaColumn::FDT_BOOL);
  436. try
  437. {
  438. bool b; b = c[100]; // to silence gcc
  439. fail ("must fail");
  440. }
  441. catch (RangeException&) { }
  442. Column<std::vector<bool> > c1 = c;
  443. assert (c1.rowCount() == 5);
  444. assert (c1[0] == true);
  445. assert (c1[1] == false);
  446. assert (c1[2] == true);
  447. assert (c1[3] == false);
  448. assert (c1[4] == true);
  449. Column<std::vector<bool> > c2(c1);
  450. assert (c2.rowCount() == 5);
  451. assert (c2[0] == true);
  452. assert (c2[1] == false);
  453. assert (c2[2] == true);
  454. assert (c2[3] == false);
  455. assert (c2[4] == true);
  456. std::vector<bool> vi;
  457. vi.assign(c.begin(), c.end());
  458. assert (vi.size() == 5);
  459. assert (vi[0] == true);
  460. assert (vi[1] == false);
  461. assert (vi[2] == true);
  462. assert (vi[3] == false);
  463. assert (vi[4] == true);
  464. c.reset();
  465. assert (c.rowCount() == 0);
  466. assert (c1.rowCount() == 0);
  467. assert (c2.rowCount() == 0);
  468. }
  469. void DataTest::testColumnDeque()
  470. {
  471. typedef std::deque<int> ContainerType;
  472. typedef Column<ContainerType> ColumnType;
  473. MetaColumn mc(0, "mc", MetaColumn::FDT_DOUBLE, 2, 3, true);
  474. assert (mc.name() == "mc");
  475. assert (mc.position() == 0);
  476. assert (mc.length() == 2);
  477. assert (mc.precision() == 3);
  478. assert (mc.type() == MetaColumn::FDT_DOUBLE);
  479. assert (mc.isNullable());
  480. ContainerType* pData = new ContainerType;
  481. pData->push_back(1);
  482. pData->push_back(2);
  483. pData->push_back(3);
  484. pData->push_back(4);
  485. pData->push_back(5);
  486. ColumnType c(mc, pData);
  487. assert (c.rowCount() == 5);
  488. assert (c[0] == 1);
  489. assert (c[1] == 2);
  490. assert (c[2] == 3);
  491. assert (c[3] == 4);
  492. assert (c[4] == 5);
  493. assert (c.name() == "mc");
  494. assert (c.position() == 0);
  495. assert (c.length() == 2);
  496. assert (c.precision() == 3);
  497. assert (c.type() == MetaColumn::FDT_DOUBLE);
  498. try
  499. {
  500. int i; i = c[100]; // to silence gcc
  501. fail ("must fail");
  502. }
  503. catch (RangeException&) { }
  504. ColumnType c1 = c;
  505. assert (c1.rowCount() == 5);
  506. assert (c1[0] == 1);
  507. assert (c1[1] == 2);
  508. assert (c1[2] == 3);
  509. assert (c1[3] == 4);
  510. assert (c1[4] == 5);
  511. ColumnType c2(c1);
  512. assert (c2.rowCount() == 5);
  513. assert (c2[0] == 1);
  514. assert (c2[1] == 2);
  515. assert (c2[2] == 3);
  516. assert (c2[3] == 4);
  517. assert (c2[4] == 5);
  518. ContainerType vi;
  519. vi.assign(c.begin(), c.end());
  520. assert (vi.size() == 5);
  521. assert (vi[0] == 1);
  522. assert (vi[1] == 2);
  523. assert (vi[2] == 3);
  524. assert (vi[3] == 4);
  525. assert (vi[4] == 5);
  526. c.reset();
  527. assert (c.rowCount() == 0);
  528. assert (c1.rowCount() == 0);
  529. assert (c2.rowCount() == 0);
  530. ContainerType* pV1 = new ContainerType;
  531. pV1->push_back(1);
  532. pV1->push_back(2);
  533. pV1->push_back(3);
  534. pV1->push_back(4);
  535. pV1->push_back(5);
  536. ContainerType* pV2 = new ContainerType;
  537. pV2->push_back(5);
  538. pV2->push_back(4);
  539. pV2->push_back(3);
  540. pV2->push_back(2);
  541. pV2->push_back(1);
  542. Column<ContainerType> c3(mc, pV1);
  543. Column<ContainerType> c4(mc, pV2);
  544. Poco::Data::swap(c3, c4);
  545. assert (c3[0] == 5);
  546. assert (c3[1] == 4);
  547. assert (c3[2] == 3);
  548. assert (c3[3] == 2);
  549. assert (c3[4] == 1);
  550. assert (c4[0] == 1);
  551. assert (c4[1] == 2);
  552. assert (c4[2] == 3);
  553. assert (c4[3] == 4);
  554. assert (c4[4] == 5);
  555. std::swap(c3, c4);
  556. assert (c3[0] == 1);
  557. assert (c3[1] == 2);
  558. assert (c3[2] == 3);
  559. assert (c3[3] == 4);
  560. assert (c3[4] == 5);
  561. assert (c4[0] == 5);
  562. assert (c4[1] == 4);
  563. assert (c4[2] == 3);
  564. assert (c4[3] == 2);
  565. assert (c4[4] == 1);
  566. }
  567. void DataTest::testColumnList()
  568. {
  569. typedef std::list<int> ContainerType;
  570. typedef Column<ContainerType> ColumnType;
  571. MetaColumn mc(0, "mc", MetaColumn::FDT_DOUBLE, 2, 3, true);
  572. assert (mc.name() == "mc");
  573. assert (mc.position() == 0);
  574. assert (mc.length() == 2);
  575. assert (mc.precision() == 3);
  576. assert (mc.type() == MetaColumn::FDT_DOUBLE);
  577. assert (mc.isNullable());
  578. ContainerType* pData = new ContainerType;
  579. pData->push_back(1);
  580. pData->push_back(2);
  581. pData->push_back(3);
  582. pData->push_back(4);
  583. pData->push_back(5);
  584. ColumnType c(mc, pData);
  585. assert (c.rowCount() == 5);
  586. assert (c[0] == 1);
  587. assert (c[1] == 2);
  588. assert (c[2] == 3);
  589. assert (c[3] == 4);
  590. assert (c[4] == 5);
  591. assert (c.name() == "mc");
  592. assert (c.position() == 0);
  593. assert (c.length() == 2);
  594. assert (c.precision() == 3);
  595. assert (c.type() == MetaColumn::FDT_DOUBLE);
  596. try
  597. {
  598. int i; i = c[100]; // to silence gcc
  599. fail ("must fail");
  600. }
  601. catch (RangeException&) { }
  602. ColumnType c1 = c;
  603. assert (c1.rowCount() == 5);
  604. assert (c1[0] == 1);
  605. assert (c1[1] == 2);
  606. assert (c1[2] == 3);
  607. assert (c1[3] == 4);
  608. assert (c1[4] == 5);
  609. ColumnType c2(c1);
  610. assert (c2.rowCount() == 5);
  611. assert (c2[0] == 1);
  612. assert (c2[1] == 2);
  613. assert (c2[2] == 3);
  614. assert (c2[3] == 4);
  615. assert (c2[4] == 5);
  616. ContainerType vi;
  617. vi.assign(c.begin(), c.end());
  618. assert (vi.size() == 5);
  619. ContainerType::const_iterator it = vi.begin();
  620. ContainerType::const_iterator end = vi.end();
  621. for (int i = 1; it != end; ++it, ++i)
  622. assert (*it == i);
  623. c.reset();
  624. assert (c.rowCount() == 0);
  625. assert (c1.rowCount() == 0);
  626. assert (c2.rowCount() == 0);
  627. ContainerType* pV1 = new ContainerType;
  628. pV1->push_back(1);
  629. pV1->push_back(2);
  630. pV1->push_back(3);
  631. pV1->push_back(4);
  632. pV1->push_back(5);
  633. ContainerType* pV2 = new ContainerType;
  634. pV2->push_back(5);
  635. pV2->push_back(4);
  636. pV2->push_back(3);
  637. pV2->push_back(2);
  638. pV2->push_back(1);
  639. Column<ContainerType> c3(mc, pV1);
  640. Column<ContainerType> c4(mc, pV2);
  641. Poco::Data::swap(c3, c4);
  642. assert (c3[0] == 5);
  643. assert (c3[1] == 4);
  644. assert (c3[2] == 3);
  645. assert (c3[3] == 2);
  646. assert (c3[4] == 1);
  647. assert (c4[0] == 1);
  648. assert (c4[1] == 2);
  649. assert (c4[2] == 3);
  650. assert (c4[3] == 4);
  651. assert (c4[4] == 5);
  652. std::swap(c3, c4);
  653. assert (c3[0] == 1);
  654. assert (c3[1] == 2);
  655. assert (c3[2] == 3);
  656. assert (c3[3] == 4);
  657. assert (c3[4] == 5);
  658. assert (c4[0] == 5);
  659. assert (c4[1] == 4);
  660. assert (c4[2] == 3);
  661. assert (c4[3] == 2);
  662. assert (c4[4] == 1);
  663. }
  664. void DataTest::testRow()
  665. {
  666. Row row;
  667. row.append("field0", 0);
  668. row.append("field1", 1);
  669. row.append("field2", 2);
  670. row.append("field3", 3);
  671. row.append("field4", 4);
  672. assert (row["field0"] == 0);
  673. assert (row["field1"] == 1);
  674. assert (row["field2"] == 2);
  675. assert (row["field3"] == 3);
  676. assert (row["field4"] == 4);
  677. assert (row[0] == 0);
  678. assert (row[1] == 1);
  679. assert (row[2] == 2);
  680. assert (row[3] == 3);
  681. assert (row[4] == 4);
  682. try
  683. {
  684. int i; i = row[5]; // to silence gcc
  685. fail ("must fail");
  686. }catch (RangeException&) {}
  687. try
  688. {
  689. int i; i = row["a bad name"]; // to silence gcc
  690. fail ("must fail");
  691. }catch (NotFoundException&) {}
  692. assert (5 == row.fieldCount());
  693. assert (row[0] == 0);
  694. assert (row["field0"] == 0);
  695. assert (row[1] == 1);
  696. assert (row["field1"] == 1);
  697. assert (row[2] == 2);
  698. assert (row["field2"] == 2);
  699. assert (row[3] == 3);
  700. assert (row["field3"] == 3);
  701. assert (row[4] == 4);
  702. assert (row["field4"] == 4);
  703. Row row2;
  704. row2.append("field0", 5);
  705. row2.append("field1", 4);
  706. row2.append("field2", 3);
  707. row2.append("field3", 2);
  708. row2.append("field4", 1);
  709. assert (row != row2);
  710. Row row3;
  711. row3.append("field0", 0);
  712. row3.append("field1", 1);
  713. row3.append("field2", 2);
  714. row3.append("field3", 3);
  715. row3.append("field4", 4);
  716. assert (row3 == row);
  717. assert (!(row < row3 | row3 < row));
  718. Row row4(row3.names());
  719. try
  720. {
  721. row4.set("badfieldname", 0);
  722. fail ("must fail");
  723. }catch (NotFoundException&) {}
  724. row4.set("field0", 0);
  725. row4.set("field1", 1);
  726. row4.set("field2", 2);
  727. row4.set("field3", 3);
  728. row4.set("field4", 4);
  729. assert (row3 == row4);
  730. try
  731. {
  732. row4.set(5, 0);
  733. fail ("must fail");
  734. }catch (RangeException&) {}
  735. row4.set("field0", 1);
  736. assert (row3 != row4);
  737. assert (row3 < row4);
  738. }
  739. void DataTest::testRowSort()
  740. {
  741. Row row1;
  742. row1.append("0", 0);
  743. row1.append("1", 1);
  744. row1.append("2", 2);
  745. row1.append("3", 3);
  746. row1.append("4", 4);
  747. Row row2;
  748. row2.append("0", 0);
  749. row2.append("1", 1);
  750. row2.append("2", 2);
  751. row2.append("3", 3);
  752. row2.append("4", 4);
  753. std::multiset<Row> rowSet1;
  754. rowSet1.insert(row1);
  755. rowSet1.insert(row2);
  756. std::multiset<Row>::iterator it1 = rowSet1.begin();
  757. assert (row1 == *it1);
  758. ++it1;
  759. assert (row2 == *it1);
  760. Row row3;
  761. row3.append("0", 1);
  762. row3.append("1", 1);
  763. row3.append("2", 2);
  764. row3.append("3", 3);
  765. row3.append("4", 4);
  766. Row row4;
  767. row4.append("0", 0);
  768. row4.append("1", 1);
  769. row4.append("2", 2);
  770. row4.append("3", 3);
  771. row4.append("4", 4);
  772. std::set<Row> rowSet2;
  773. rowSet2.insert(row4);
  774. rowSet2.insert(row3);
  775. std::set<Row>::iterator it2 = rowSet2.begin();
  776. assert (row4 == *it2);
  777. ++it2;
  778. assert (row3 == *it2);
  779. Row row5;
  780. row5.append("0", 2);
  781. row5.append("1", 2);
  782. row5.append("2", 0);
  783. row5.append("3", 3);
  784. row5.append("4", 4);
  785. row5.addSortField("1");
  786. Row row6;
  787. row6.append("0", 1);
  788. row6.append("1", 0);
  789. row6.append("2", 1);
  790. row6.append("3", 3);
  791. row6.append("4", 4);
  792. row6.addSortField("1");
  793. Row row7;
  794. row7.append("0", 0);
  795. row7.append("1", 1);
  796. row7.append("2", 2);
  797. row7.append("3", 3);
  798. row7.append("4", 4);
  799. std::set<Row> rowSet3;
  800. rowSet3.insert(row5);
  801. rowSet3.insert(row6);
  802. try
  803. {
  804. rowSet3.insert(row7);//has no same sort criteria
  805. fail ("must fail");
  806. } catch (InvalidAccessException&) {}
  807. row7.addSortField("1");
  808. testRowStrictWeak(row7, row6, row5);
  809. rowSet3.insert(row7);
  810. std::set<Row>::iterator it3 = rowSet3.begin();
  811. assert (row7 == *it3);
  812. ++it3;
  813. assert (row6 == *it3);
  814. ++it3;
  815. assert (row5 == *it3);
  816. row5.replaceSortField("0", "2");
  817. row6.replaceSortField("0", "2");
  818. row7.replaceSortField("0", "2");
  819. rowSet3.clear();
  820. rowSet3.insert(row7);
  821. rowSet3.insert(row6);
  822. rowSet3.insert(row5);
  823. it3 = rowSet3.begin();
  824. assert (row5 == *it3);
  825. ++it3;
  826. assert (row6 == *it3);
  827. ++it3;
  828. assert (row7 == *it3);
  829. row5.resetSort();
  830. row6.resetSort();
  831. row7.resetSort();
  832. rowSet3.clear();
  833. rowSet3.insert(row5);
  834. rowSet3.insert(row6);
  835. rowSet3.insert(row7);
  836. it3 = rowSet3.begin();
  837. assert (row7 == *it3);
  838. ++it3;
  839. assert (row6 == *it3);
  840. ++it3;
  841. assert (row5 == *it3);
  842. }
  843. void DataTest::testRowStrictWeak(const Row& row1, const Row& row2, const Row& row3)
  844. {
  845. assert (row1 < row2 && !(row2 < row1)); // antisymmetric
  846. assert (row1 < row2 && row2 < row3 && row1 < row3); // transitive
  847. assert (!(row1 < row1)); // irreflexive
  848. }
  849. void DataTest::testRowFormat()
  850. {
  851. Row row1;
  852. row1.append("field0", 0);
  853. row1.append("field1", 1);
  854. row1.append("field2", 2);
  855. row1.append("field3", 3);
  856. row1.append("field4", 4);
  857. SimpleRowFormatter rf;
  858. std::streamsize sz = rf.getColumnWidth();
  859. std::string line(sz * 5, '-');
  860. std::ostringstream os;
  861. os << std::left << std::setw(sz) << "field0"
  862. << std::setw(sz) << "field1"
  863. << std::setw(sz) << "field2"
  864. << std::setw(sz) << "field3"
  865. << std::setw(sz) << "field4" << std::endl
  866. << line << std::endl;
  867. assert (row1.namesToString() == os.str());
  868. os.str("");
  869. os << std::right << std::setw(sz) << "0"
  870. << std::setw(sz) << "1"
  871. << std::setw(sz) << "2"
  872. << std::setw(sz) << "3"
  873. << std::setw(sz) << "4" << std::endl;
  874. assert (row1.valuesToString() == os.str());
  875. }
  876. void DataTest::testDateAndTime()
  877. {
  878. DateTime dt;
  879. Date d(dt);
  880. Time t(dt);
  881. assert (dt.year() == d.year());
  882. assert (dt.month() == d.month());
  883. assert (dt.day() == d.day());
  884. assert (dt.hour() == t.hour());
  885. assert (dt.minute() == t.minute());
  886. assert (dt.second() == t.second());
  887. Date d1(2007, 6, 15);
  888. d1.assign(d.year() - 1, d.month(), d.day());
  889. assert (d1 < d); assert (d1 != d);
  890. if (d.month() > 1)
  891. d1.assign(d.year(), d.month() - 1, d.day());
  892. else
  893. d1.assign(d.year() - 1, 12, d.day());
  894. assert (d1 < d); assert (d1 != d);
  895. if (d.day() > 1)
  896. {
  897. d1.assign(d.year(), d.month(), d.day() - 1);
  898. assert (d1 < d); assert (d1 != d);
  899. }
  900. d1.assign(d.year() + 1, d.month(), d.day());
  901. assert (d1 > d); assert (d1 != d);
  902. if (d.month() < 12)
  903. d1.assign(d.year(), d.month() + 1, d.day());
  904. else
  905. d1.assign(d.year() + 1, 1, d.day());
  906. assert (d1 > d); assert (d1 != d);
  907. if (d.day() < dt.daysOfMonth(dt.year(), dt.month()))
  908. {
  909. d1.assign(d.year(), d.month(), d.day() + 1);
  910. assert (d1 > d); assert (d1 != d);
  911. }
  912. d1.assign(d.year(), d.month(), d.day());
  913. assert (d1 == d);
  914. try { d1.assign(-1, 1, 1); fail ("must fail"); }
  915. catch (InvalidArgumentException&) { }
  916. try { d1.assign(1, 0, 1); fail ("must fail"); }
  917. catch (InvalidArgumentException&) { }
  918. try { d1.assign(1, 1, 0); fail ("must fail"); }
  919. catch (InvalidArgumentException&) { }
  920. Time t1(12, 30, 15);
  921. if (t.hour() > 1)
  922. {
  923. t1.assign(t.hour() - 1, t.minute(), t.second());
  924. assert (t1 < t); assert (t1 != t);
  925. }
  926. if (t.minute() > 1)
  927. {
  928. t1.assign(t.hour(), t.minute() - 1, t.second());
  929. assert (t1 < t); assert (t1 != t);
  930. }
  931. if (t.second() > 1)
  932. {
  933. t1.assign(t.hour(), t.minute(), t.second() - 1);
  934. assert (t1 < t); assert (t1 != t);
  935. }
  936. if (t.hour() < 23)
  937. {
  938. t1.assign(t.hour() + 1, t.minute(), t.second());
  939. assert (t1 > t); assert (t1 != t);
  940. }
  941. if (t.minute() < 59)
  942. {
  943. t1.assign(t.hour(), t.minute() + 1, t.second());
  944. assert (t1 > t); assert (t1 != t);
  945. }
  946. if (t.second() < 59)
  947. {
  948. t1.assign(t.hour(), t.minute(), t.second() + 1);
  949. assert (t1 > t); assert (t1 != t);
  950. }
  951. t1.assign(t.hour(), t.minute(), t.second());
  952. assert (t1 == t);
  953. try { t1.assign(-1, 0, 0); fail ("must fail"); }
  954. catch (InvalidArgumentException&) { }
  955. try { t1.assign(0, -1, 0); fail ("must fail"); }
  956. catch (InvalidArgumentException&) { }
  957. try { t1.assign(0, 0, -1); fail ("must fail"); }
  958. catch (InvalidArgumentException&) { }
  959. d1 = dt;
  960. assert (d1 == dt);
  961. t1 = dt;
  962. assert (t1 == dt);
  963. }
  964. void DataTest::testExternalBindingAndExtraction()
  965. {
  966. AbstractExtractionVecVec extractionVec;
  967. AbstractExtractionVec extraction;
  968. AbstractBindingVec binding;
  969. Session tmp (Poco::Data::Test::Connector::KEY, "dummy.db");
  970. int i;
  971. AbstractExtraction* pExt1 = into(i);
  972. AbstractExtraction* pExt2 = into(i);
  973. assert (1 == pExt1->referenceCount());
  974. assert (1 == pExt2->referenceCount());
  975. {
  976. Statement stmt(tmp);
  977. stmt.addExtract(pExt1); // retain external ownership in addition to giving it to statement
  978. assert (2 == pExt1->referenceCount());
  979. stmt.addExtract(pExt2, false); // give ownership to statement
  980. assert (1 == pExt2->referenceCount());
  981. }
  982. assert (1 == pExt1->referenceCount()); delete pExt1;
  983. // pExt2 does not exist any more
  984. AbstractBinding* pBind1 = use(i, "mybind1");
  985. AbstractBinding* pBind2 = use(i, "mybind2");
  986. AbstractBinding* pBind3 = use(i, "mybind3");
  987. assert (1 == pBind1->referenceCount());
  988. assert (1 == pBind2->referenceCount());
  989. assert (1 == pBind3->referenceCount());
  990. {
  991. Statement stmt(tmp);
  992. stmt.addBind(pBind1); // retain external ownership in addition to giving it to statement
  993. assert (2 == pBind1->referenceCount());
  994. stmt.addBind(pBind2, false);// give ownership to statement
  995. assert (1 == pBind2->referenceCount());
  996. stmt.addBind(pBind3);// give ownership to statement
  997. assert (2 == pBind3->referenceCount());
  998. stmt.removeBind(pBind3->name());// take ownership from statement
  999. assert (1 == pBind3->referenceCount());
  1000. try { stmt.removeBind("a bad name"); fail("must fail"); }
  1001. catch (NotFoundException&) { }
  1002. }
  1003. assert (1 == pBind1->referenceCount()); delete pBind1;
  1004. // pBind2 does not exist any more
  1005. assert (1 == pBind3->referenceCount()); delete pBind3;
  1006. }
  1007. void DataTest::setUp()
  1008. {
  1009. }
  1010. void DataTest::tearDown()
  1011. {
  1012. }
  1013. CppUnit::Test* DataTest::suite()
  1014. {
  1015. CppUnit::TestSuite* pSuite = new CppUnit::TestSuite("DataTest");
  1016. CppUnit_addTest(pSuite, DataTest, testSession);
  1017. CppUnit_addTest(pSuite, DataTest, testStatementFormatting);
  1018. CppUnit_addTest(pSuite, DataTest, testFeatures);
  1019. CppUnit_addTest(pSuite, DataTest, testProperties);
  1020. CppUnit_addTest(pSuite, DataTest, testBLOB);
  1021. CppUnit_addTest(pSuite, DataTest, testBLOBStreams);
  1022. CppUnit_addTest(pSuite, DataTest, testColumnVector);
  1023. CppUnit_addTest(pSuite, DataTest, testColumnVectorBool);
  1024. CppUnit_addTest(pSuite, DataTest, testColumnDeque);
  1025. CppUnit_addTest(pSuite, DataTest, testColumnList);
  1026. CppUnit_addTest(pSuite, DataTest, testRow);
  1027. CppUnit_addTest(pSuite, DataTest, testRowSort);
  1028. CppUnit_addTest(pSuite, DataTest, testRowFormat);
  1029. CppUnit_addTest(pSuite, DataTest, testDateAndTime);
  1030. CppUnit_addTest(pSuite, DataTest, testExternalBindingAndExtraction);
  1031. return pSuite;
  1032. }