comparison TestSQLGenerator.cpp @ 76:8136057988bc

Fixes to automatic report generating system. A lot of new unittests.
author Tom Fredrik Blenning Klaussen <bfg@bfgconsult.no>
date Sat, 16 Feb 2013 15:32:20 +0100
parents
children 9744ec195be3
comparison
equal deleted inserted replaced
75:aaf0a2878f67 76:8136057988bc
1 #include "SQLGenerator.hpp"
2 #include "TestFramework.hpp"
3 #include "TestDataBase.hpp"
4
5 #include "Exception/SQLException.hpp"
6
7 BOOST_AUTO_TEST_CASE( CreateInsertAndRetrieveQString )
8 {
9 TestDatabase tdb;
10 QSqlDatabase db = tdb.getDatabase();
11 QSqlQuery query(db);
12
13 QString tableName = "test";
14
15 QString fieldCreateString1 = SQLGenerator<QString>::createFields("value1");
16 QString fieldCreateString2 = SQLGenerator<QString>::createFields("value2");
17
18
19 QString createQuery = QString("CREATE TABLE %1(%2, %3);")
20 .arg(tableName)
21 .arg(fieldCreateString1)
22 .arg(fieldCreateString2);
23
24 BOOST_REQUIRE(query.exec(createQuery));
25
26
27 QString queryString = QString("INSERT into %1 (%2, %3) VALUES(%4, %5);")
28 .arg(tableName)
29 .arg(SQLGenerator<QString>::fieldName("value1"))
30 .arg(SQLGenerator<QString>::fieldName("value2"))
31 .arg(SQLGenerator<QString>::valueString("value1"))
32 .arg(SQLGenerator<QString>::valueString("value2"));
33 QSqlQuery insertQuery = QSqlQuery(db);
34 BOOST_REQUIRE(insertQuery.prepare(queryString));
35
36 QList<QString> valueList1, valueList2;
37 for (int i = 1; i <= 3; ++i) {
38 valueList1 << QString("a%1").arg(i);
39 valueList2 << QString("b%1").arg(i);
40 }
41
42 SQLGenerator<QString>::bindValues(insertQuery, valueList1, "value1");
43 SQLGenerator<QString>::bindValues(insertQuery, valueList2, "value2");
44 BOOST_REQUIRE(insertQuery.execBatch());
45 insertQuery.finish();
46
47 QString fieldValueString1 = SQLGenerator<QString>::fieldName("value1");
48 QString fieldValueString2 = SQLGenerator<QString>::fieldName("value2");
49
50 QString selectQuery = QString("SELECT %1, %2 FROM %3;")
51 .arg(fieldValueString1).arg(fieldValueString2).arg(tableName);
52
53 BOOST_REQUIRE(query.exec(selectQuery));
54
55 while (query.next()) {
56 QString value1 = *SQLGenerator<QString>::extract(query, "value1");
57 QString value2 = *SQLGenerator<QString>::extract(query, "value2");
58
59 BOOST_REQUIRE(valueList1.contains(value1));
60 BOOST_REQUIRE(valueList2.contains(value2));
61
62 valueList1.removeAt(valueList1.indexOf(value1));
63 valueList2.removeAt(valueList2.indexOf(value2));
64 }
65
66 boost::optional<QString> empty1 =
67 SQLGenerator<QString>::extract(query, "value1");
68 boost::optional<QString> empty2 =
69 SQLGenerator<QString>::extract(query, "value2");
70
71 BOOST_REQUIRE(!empty1);
72 BOOST_REQUIRE(!empty2);
73
74 BOOST_REQUIRE(valueList1.empty());
75 BOOST_REQUIRE(valueList2.empty());
76
77 query.finish();
78 }
79
80 BOOST_AUTO_TEST_CASE( CreateInsertAndRetrieveUniqueString )
81 {
82 TestDatabase tdb;
83 QSqlDatabase db = tdb.getDatabase();
84 QSqlQuery query(db);
85
86 QString tableName = "test";
87
88 QString fieldCreateString1 =
89 SQLGenerator<UniqueString>::createFields("value1");
90 QString fieldCreateString2 =
91 SQLGenerator<UniqueString>::createFields("value2");
92
93
94 QString createQuery = QString("CREATE TABLE %1(%2, %3);")
95 .arg(tableName)
96 .arg(fieldCreateString1)
97 .arg(fieldCreateString2);
98
99 BOOST_REQUIRE(query.exec(createQuery));
100
101
102 QString queryString = QString("INSERT into %1 (%2, %3) VALUES(%4, %5);")
103 .arg(tableName)
104 .arg(SQLGenerator<UniqueString>::fieldName("value1"))
105 .arg(SQLGenerator<UniqueString>::fieldName("value2"))
106 .arg(SQLGenerator<UniqueString>::valueString("value1"))
107 .arg(SQLGenerator<UniqueString>::valueString("value2"));
108 QSqlQuery insertQuery = QSqlQuery(db);
109 BOOST_REQUIRE(insertQuery.prepare(queryString));
110
111 QList<UniqueString> valueList1, valueList2;
112 for (int i = 1; i <= 3; ++i) {
113 valueList1 << QString("a%1").arg(i);
114 valueList2 << QString("b%1").arg(i);
115 }
116
117 SQLGenerator<UniqueString>::bindValues(insertQuery, valueList1, "value1");
118 SQLGenerator<UniqueString>::bindValues(insertQuery, valueList2, "value2");
119 BOOST_REQUIRE(insertQuery.execBatch());
120 insertQuery.finish();
121
122 QString fieldValueString1 = SQLGenerator<UniqueString>::fieldName("value1");
123 QString fieldValueString2 = SQLGenerator<UniqueString>::fieldName("value2");
124
125 QString selectQuery = QString("SELECT %1, %2 FROM %3;")
126 .arg(fieldValueString1).arg(fieldValueString2).arg(tableName);
127
128 BOOST_REQUIRE(query.exec(selectQuery));
129
130 while (query.next()) {
131 UniqueString value1 = *SQLGenerator<UniqueString>::extract(query, "value1");
132 UniqueString value2 = *SQLGenerator<UniqueString>::extract(query, "value2");
133
134 BOOST_REQUIRE(valueList1.contains(value1));
135 BOOST_REQUIRE(valueList2.contains(value2));
136
137 valueList1.removeAt(valueList1.indexOf(value1));
138 valueList2.removeAt(valueList2.indexOf(value2));
139 }
140
141 boost::optional<UniqueString> empty1 =
142 SQLGenerator<UniqueString>::extract(query, "value1");
143 boost::optional<UniqueString> empty2 =
144 SQLGenerator<UniqueString>::extract(query, "value2");
145
146 BOOST_REQUIRE(!empty1);
147 BOOST_REQUIRE(!empty2);
148
149 BOOST_REQUIRE(valueList1.empty());
150 BOOST_REQUIRE(valueList2.empty());
151
152 query.finish();
153 }
154
155 BOOST_AUTO_TEST_CASE( CreateInsertAndRetrieveInt )
156 {
157 TestDatabase tdb;
158 QSqlDatabase db = tdb.getDatabase();
159
160 QSqlQuery query(db);
161
162 QString tableName = "test";
163
164 QString fieldCreateString1 = SQLGenerator<int>::createFields("value1");
165 QString fieldCreateString2 = SQLGenerator<int>::createFields("value2");
166
167
168 QString createQuery = QString("CREATE TABLE %1(%2, %3);")
169 .arg(tableName)
170 .arg(fieldCreateString1)
171 .arg(fieldCreateString2);
172
173 BOOST_REQUIRE(query.exec(createQuery));
174
175 QString queryString = QString("INSERT into %1 (%2, %3) VALUES(%4, %5);")
176 .arg(tableName)
177 .arg(SQLGenerator<int>::fieldName("value1"))
178 .arg(SQLGenerator<int>::fieldName("value2"))
179 .arg(SQLGenerator<int>::valueString("value1"))
180 .arg(SQLGenerator<int>::valueString("value2"));
181 QSqlQuery insertQuery = QSqlQuery(db);
182 BOOST_REQUIRE(insertQuery.prepare(queryString));
183
184 QList<int> valueList1, valueList2;
185 int p1 = 2;
186 int p2 = 3;
187 int v1 = p1;
188 int v2 = p2;
189 for (int i = 1; i <= 3; ++i) {
190 valueList1 << v1;
191 valueList2 << v2;
192 v1 *= p1;
193 v2 *= p2;
194 }
195
196 SQLGenerator<int>::bindValues(insertQuery, valueList1, "value1");
197 SQLGenerator<int>::bindValues(insertQuery, valueList2, "value2");
198 BOOST_REQUIRE(insertQuery.execBatch());
199 insertQuery.finish();
200
201 QString fieldValueString1 = SQLGenerator<int>::fieldName("value1");
202 QString fieldValueString2 = SQLGenerator<int>::fieldName("value2");
203
204 QString selectQuery = QString("SELECT %1, %2 FROM %3;")
205 .arg(fieldValueString1).arg(fieldValueString2).arg(tableName);
206
207 BOOST_REQUIRE(query.exec(selectQuery));
208
209 while (query.next()) {
210 int value1 = *SQLGenerator<int>::extract(query, "value1");
211 int value2 = *SQLGenerator<int>::extract(query, "value2");
212
213 BOOST_REQUIRE(valueList1.contains(value1));
214 BOOST_REQUIRE(valueList2.contains(value2));
215
216 valueList1.removeAt(valueList1.indexOf(value1));
217 valueList2.removeAt(valueList2.indexOf(value2));
218 }
219 boost::optional<int> empty1 = SQLGenerator<int>::extract(query, "value1");
220 boost::optional<int> empty2 = SQLGenerator<int>::extract(query, "value2");
221
222 BOOST_REQUIRE(!empty1);
223 BOOST_REQUIRE(!empty2);
224
225 BOOST_REQUIRE(valueList1.empty());
226 BOOST_REQUIRE(valueList2.empty());
227
228 }
229
230 BOOST_AUTO_TEST_CASE( CreateInsertAndRetrieveOrderedPair )
231 {
232 TestDatabase tdb;
233 QSqlDatabase db = tdb.getDatabase();
234 QSqlQuery query(db);
235
236 QString tableName = "test";
237
238 QString fieldCreateString1 =
239 SQLGenerator<OrderedPair<int> >::createFields("value1");
240 QString fieldCreateString2 =
241 SQLGenerator<OrderedPair<int> >::createFields("value2");
242
243
244 QString createQuery = QString("CREATE TABLE %1(%2, %3);")
245 .arg(tableName)
246 .arg(fieldCreateString1)
247 .arg(fieldCreateString2);
248
249 BOOST_REQUIRE(query.exec(createQuery));
250
251
252 QString queryString = QString("INSERT into %1 (%2, %3) VALUES(%4, %5);")
253 .arg(tableName)
254 .arg(SQLGenerator<OrderedPair<int> >::fieldName("value1"))
255 .arg(SQLGenerator<OrderedPair<int> >::fieldName("value2"))
256 .arg(SQLGenerator<OrderedPair<int> >::valueString("value1"))
257 .arg(SQLGenerator<OrderedPair<int> >::valueString("value2"));
258 QSqlQuery insertQuery = QSqlQuery(db);
259 BOOST_REQUIRE(insertQuery.prepare(queryString));
260
261 QList<OrderedPair<int> > valueList1, valueList2;
262 int p [] = { 2, 3, 5, 7};
263 int v [] = { 2, 3, 5, 7};
264
265 for (int i = 1; i <= 3; ++i) {
266 valueList1 << OrderedPair<int>(v[0], v[1]);
267 valueList2 << OrderedPair<int>(v[2], v[3]);
268 for (int i = 0; i < 4; ++i)
269 v[i] *= p[i];
270 }
271
272 SQLGenerator<OrderedPair<int> >::bindValues(insertQuery, valueList1, "value1");
273 SQLGenerator<OrderedPair<int> >::bindValues(insertQuery, valueList2, "value2");
274 BOOST_REQUIRE(insertQuery.execBatch());
275 insertQuery.finish();
276
277 QString fieldValueString1 =
278 SQLGenerator<OrderedPair<int> >::fieldName("value1");
279 QString fieldValueString2 =
280 SQLGenerator<OrderedPair<int> >::fieldName("value2");
281
282 QString selectQuery = QString("SELECT %1, %2 FROM %3;")
283 .arg(fieldValueString1).arg(fieldValueString2).arg(tableName);
284
285 BOOST_REQUIRE(query.exec(selectQuery));
286
287 while (query.next()) {
288 OrderedPair<int> value1 =
289 *SQLGenerator<OrderedPair<int> >::extract(query, "value1");
290 OrderedPair<int> value2 =
291 *SQLGenerator<OrderedPair<int> >::extract(query, "value2");
292
293 BOOST_REQUIRE(valueList1.contains(value1));
294 BOOST_REQUIRE(valueList2.contains(value2));
295
296 valueList1.removeAt(valueList1.indexOf(value1));
297 valueList2.removeAt(valueList2.indexOf(value2));
298 }
299
300 boost::optional<OrderedPair<int> > empty1 =
301 SQLGenerator<OrderedPair<int> >::extract(query, "value1");
302 boost::optional<OrderedPair<int> > empty2 =
303 SQLGenerator<OrderedPair<int> >::extract(query, "value2");
304
305 BOOST_REQUIRE(!empty1);
306 BOOST_REQUIRE(!empty2);
307
308 BOOST_REQUIRE(valueList1.empty());
309 BOOST_REQUIRE(valueList2.empty());
310
311 query.finish();
312 }