2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 #include <dpl/test/test_runner.h>
17 #include <dpl/foreach.h>
18 #include <dpl/db/thread_database_support.h>
19 #include <dpl/optional_typedefs.h>
20 #include <generator_dpl_orm_test.h>
23 const char* PATH_DB = "/opt/share/wrt/wrt-commons/tests/db/dpl_orm_test.db";
27 #define TEST_REPETITION 16
33 SmartAttach(bool autoattach = true) :
35 DPL::DB::SqlConnection::Flag::UseLucene),
36 m_autoattach(autoattach)
39 m_interface.AttachToThread(DPL::DB::SqlConnection::Flag::RW);
46 m_interface.DetachFromThread();
50 DPL::DB::ThreadDatabaseSupport* get()
56 DPL::DB::ThreadDatabaseSupport m_interface;
60 template<typename ContainerType1, typename ContainerType2>
61 bool ContainerContentsEqual(const ContainerType1& container1,
62 const ContainerType2& container2)
64 using namespace DPL::DB::ORM::dpl_orm_test::TestTableInsert;
65 typedef std::set<typename ContainerType1::value_type> Set1;
66 typedef std::set<typename ContainerType2::value_type> Set2;
67 Set1 set1(container1.begin(), container1.end());
68 Set2 set2(container2.begin(), container2.end());
70 for (typename Set1::iterator it = set1.begin();
76 WrtLogD("Set1 element: %s", ss.str().c_str());
79 for (typename Set2::iterator it = set2.begin(); it != set2.end(); it++)
83 WrtLogD("Set2 element: %s", ss.str().c_str());
90 std::list<T> makeList(const T& a, const T& b)
100 RUNNER_TEST_GROUP_INIT(DPL)
103 Name: ORM_SelectSingleValue
104 Description: tests quering single value of single row from database
105 Expected: Values should match those which were prepared
107 RUNNER_TEST(ORM_SelectSingleValue)
109 SmartAttach interface;
110 using namespace DPL::DB::ORM;
111 using namespace DPL::DB::ORM::dpl_orm_test;
112 //Getting each column
114 TestTable::Select select(interface.get());
115 select.Where(Equals<TestTable::ColumnInt>(8));
117 RUNNER_ASSERT_MSG((result =
118 *select.GetSingleValue<TestTable::ColumnOptInt>())
123 TestTable::Select select(interface.get());
124 select.Where(Equals<TestTable::ColumnInt>(8));
126 RUNNER_ASSERT_MSG((result =
127 *select.GetSingleValue<TestTable::ColumnOptText>(
132 TestTable::Select select(interface.get());
133 select.Where(Equals<TestTable::ColumnInt>(8));
135 RUNNER_ASSERT_MSG((result = select.GetSingleValue<TestTable::ColumnInt>(
136 )) == 8, "Got " << result);
139 TestTable::Select select(interface.get());
140 select.Where(Equals<TestTable::ColumnInt>(8));
142 RUNNER_ASSERT_MSG((result = select.GetSingleValue<TestTable::ColumnInt2>(
143 )) == 9, "Got " << result);
146 TestTable::Select select(interface.get());
147 select.Where(Equals<TestTable::ColumnInt>(8));
149 RUNNER_ASSERT_MSG((result = select.GetSingleValue<TestTable::ColumnText>(
150 )) == L"ten", "Got " << result);
153 //Where on each column
155 TestTable::Select select(interface.get());
156 select.Where(Equals<TestTable::ColumnOptInt>(6));
158 RUNNER_ASSERT_MSG((result =
159 *select.GetSingleValue<TestTable::ColumnOptInt>())
164 TestTable::Select select(interface.get());
165 select.Where(Equals<TestTable::ColumnOptText>(DPL::String(L"seven")));
167 RUNNER_ASSERT_MSG((result =
168 *select.GetSingleValue<TestTable::ColumnOptText>(
173 TestTable::Select select(interface.get());
174 select.Where(Equals<TestTable::ColumnInt>(8));
176 RUNNER_ASSERT_MSG((result = select.GetSingleValue<TestTable::ColumnInt>(
177 )) == 8, "Got " << result);
180 TestTable::Select select(interface.get());
181 select.Where(Equals<TestTable::ColumnInt2>(9));
183 RUNNER_ASSERT_MSG((result = select.GetSingleValue<TestTable::ColumnInt2>(
184 )) == 9, "Got " << result);
187 TestTable::Select select(interface.get());
188 select.Where(Equals<TestTable::ColumnText>(L"ten"));
190 RUNNER_ASSERT_MSG((result = select.GetSingleValue<TestTable::ColumnText>(
191 )) == L"ten", "Got " << result);
196 Name: ORM_SelectSingleRow
197 Description: tests quering single row from database
198 Expected: Values should match those which were prepared
200 RUNNER_TEST(ORM_SelectSingleRow)
202 SmartAttach interface;
203 using namespace DPL::DB::ORM;
204 using namespace DPL::DB::ORM::dpl_orm_test;
206 TestTable::Select select(interface.get());
207 select.Where(Equals<TestTable::ColumnInt>(3));
208 TestTable::Row result = select.GetSingleRow();
209 TestTable::Row expected;
210 expected.Set_ColumnOptInt(1);
211 expected.Set_ColumnOptText(DPL::String(L"two"));
212 expected.Set_ColumnInt(3);
213 expected.Set_ColumnInt2(4);
214 expected.Set_ColumnText(L"five");
215 RUNNER_ASSERT_MSG(result == expected, "Got " << result);
219 TestTable::Select select(interface.get());
220 select.Where(Equals<TestTable::ColumnOptText>(DPL::String(L"seven")));
221 TestTable::Row result = select.GetSingleRow();
222 TestTable::Row expected;
223 expected.Set_ColumnOptInt(6);
224 expected.Set_ColumnOptText(DPL::String(L"seven"));
225 expected.Set_ColumnInt(8);
226 expected.Set_ColumnInt2(9);
227 expected.Set_ColumnText(L"ten");
228 RUNNER_ASSERT_MSG(result == expected, "Got " << result);
233 Name: ORM_SelectRowList
234 Description: tests quering multiple row from database
235 Expected: Values should match those which were prepared
237 RUNNER_TEST(ORM_SelectRowList)
239 SmartAttach interface;
240 using namespace DPL::DB::ORM;
241 using namespace DPL::DB::ORM::dpl_orm_test;
243 TestTable::Select select(interface.get());
244 select.Where(Equals<TestTable::ColumnInt>(3));
245 std::list<TestTable::Row> result = select.GetRowList();
246 RUNNER_ASSERT_MSG(result.size() == 1, "Got " << result.size());
248 TestTable::Row expected;
249 expected.Set_ColumnOptInt(1);
250 expected.Set_ColumnOptText(DPL::String(L"two"));
251 expected.Set_ColumnInt(3);
252 expected.Set_ColumnInt2(4);
253 expected.Set_ColumnText(L"five");
254 RUNNER_ASSERT_MSG(*(result.begin()) == expected, "Got " <<
259 TestTable::Select select(interface.get());
260 select.Where(Equals<TestTable::ColumnOptText>(DPL::String(L"seven")));
261 std::list<TestTable::Row> result = select.GetRowList();
262 RUNNER_ASSERT_MSG(result.size() == 1, "Got " << result.size());
264 TestTable::Row expected;
265 expected.Set_ColumnOptInt(6);
266 expected.Set_ColumnOptText(DPL::String(L"seven"));
267 expected.Set_ColumnInt(8);
268 expected.Set_ColumnInt2(9);
269 expected.Set_ColumnText(L"ten");
270 RUNNER_ASSERT_MSG(*(result.begin()) == expected, "Got " <<
275 TestTable::Select select(interface.get());
276 select.Where(Equals<TestTable::ColumnInt>(99));
277 std::list<TestTable::Row> result = select.GetRowList();
279 TestTable::Row expected1;
280 expected1.Set_ColumnInt(99);
281 expected1.Set_ColumnInt2(11);
282 expected1.Set_ColumnText(L"twelve");
284 TestTable::Row expected2;
285 expected2.Set_ColumnInt(99);
286 expected2.Set_ColumnInt2(13);
287 expected2.Set_ColumnText(L"fourteen");
289 RUNNER_ASSERT(ContainerContentsEqual(makeList(expected1,
290 expected2), result));
295 Name: ORM_SelectValueList
296 Description: tests quering single column from multiple row from database
297 Expected: Values should match those which were prepared
299 RUNNER_TEST(ORM_SelectValueList)
301 SmartAttach interface;
302 using namespace DPL::DB::ORM;
303 using namespace DPL::DB::ORM::dpl_orm_test;
304 //Getting each column
306 TestTable::Select select(interface.get());
307 select.Where(Is<TestTable::ColumnOptInt>(DPL::OptionalInt()));
308 RUNNER_ASSERT(ContainerContentsEqual(select.GetValueList<TestTable::
313 TestTable::Select select(interface.get());
314 select.Where(Is<TestTable::ColumnOptInt>(DPL::OptionalInt()));
315 RUNNER_ASSERT(ContainerContentsEqual(select.GetValueList<TestTable::
320 TestTable::Select select(interface.get());
321 select.Where(Is<TestTable::ColumnOptInt>(DPL::OptionalInt()));
322 RUNNER_ASSERT(ContainerContentsEqual(select.GetValueList<TestTable::
324 makeList(DPL::String(L"twelve"),
325 DPL::String(L"fourteen"))));
328 TestTable::Select select(interface.get());
329 select.Where(Is<TestTable::ColumnOptInt>(DPL::OptionalInt()));
330 RUNNER_ASSERT(ContainerContentsEqual(select.GetValueList<TestTable::
332 makeList(DPL::OptionalString(),
333 DPL::OptionalString())));
336 //Where on each column
338 TestTable::Select select(interface.get());
339 select.Where(Is<TestTable::ColumnOptInt>(DPL::OptionalInt()));
340 RUNNER_ASSERT(ContainerContentsEqual(select.GetValueList<TestTable::
345 TestTable::Select select(interface.get());
346 select.Where(Is<TestTable::ColumnOptText>(DPL::OptionalString()));
347 RUNNER_ASSERT(ContainerContentsEqual(select.GetValueList<TestTable::
352 TestTable::Select select(interface.get());
353 select.Where(Is<TestTable::ColumnInt>(99));
354 RUNNER_ASSERT(ContainerContentsEqual(select.GetValueList<TestTable::
361 Name: ORM_MultipleCalls
362 Description: tests sequnece of different queries
363 Expected: Values should match those which were prepared
365 RUNNER_TEST(ORM_MultipleCalls)
367 for (int j = 0; j < TEST_REPETITION; j++) {
368 for (int i = 0; i < TEST_REPETITION; i++) {
369 ORM_SelectSingleValue();
372 for (int i = 0; i < TEST_REPETITION; i++) {
373 ORM_SelectSingleRow();
376 for (int i = 0; i < TEST_REPETITION; i++) {
380 for (int i = 0; i < TEST_REPETITION; i++) {
381 ORM_SelectValueList();
388 Description: tests insering rows into database
389 Expected: Values should be inserted
391 RUNNER_TEST(ORM_Insert)
393 SmartAttach interface;
394 using namespace DPL::DB::ORM;
395 using namespace DPL::DB::ORM::dpl_orm_test;
397 TestTableInsert::Select select1(interface.get());
398 std::list<int> resultList = select1.GetValueList<TestTableInsert::ColumnInt>();
399 RUNNER_ASSERT_MSG(resultList.empty(),
400 "Returned list has wrong size: " << resultList.size());
402 std::list<TestTableInsert::Row> list;
404 TestTableInsert::Insert insert(interface.get());
405 TestTableInsert::Row row;
406 row.Set_ColumnOptInt(1);
407 row.Set_ColumnInt2(2);
408 row.Set_ColumnText(L"three");
412 row.Set_ColumnInt(99);
415 TestTableInsert::Select select2(interface.get());
416 RUNNER_ASSERT_MSG(ContainerContentsEqual(
417 select2.GetRowList(),
418 list), "Returned list doesn't match.");
421 TestTableInsert::Insert insert2(interface.get());
422 TestTableInsert::Row row2;
423 row2.Set_ColumnInt(4);
424 row2.Set_ColumnInt2(5);
425 row2.Set_ColumnText(L"six");
426 insert2.Values(row2);
429 list.push_back(row2);
431 TestTableInsert::Select select(interface.get());
432 RUNNER_ASSERT_MSG(ContainerContentsEqual(
434 list), "Returned list doesn't match.");
437 TestTableInsert::Insert insert3(interface.get());
438 TestTableInsert::Row row3;
439 row3.Set_ColumnOptInt(1);
440 row3.Set_ColumnInt2(7);
441 row3.Set_ColumnText(L"eight");
442 insert3.Values(row3);
445 row3.Set_ColumnInt(99);
446 list.push_back(row3);
448 TestTableInsert::Select select3(interface.get());
449 RUNNER_ASSERT_MSG(ContainerContentsEqual(
450 select3.GetRowList(),
451 list), "Returned list doesn't match.");
454 TestTableInsert::Insert insert4(interface.get());
455 TestTableInsert::Row row4;
456 row4.Set_ColumnOptInt(9);
457 row4.Set_ColumnInt2(10);
458 row4.Set_ColumnText(L"eleven");
459 insert4.Values(row4);
462 row4.Set_ColumnInt(99);
463 list.push_back(row4);
465 TestTableInsert::Select select4(interface.get());
466 RUNNER_ASSERT_MSG(ContainerContentsEqual(
467 select4.GetRowList(),
468 list), "Returned list doesn't match.");
471 // restore original table state
473 TestTableInsert::Delete del(interface.get());
476 TestTableInsert::Select select(interface.get());
477 RUNNER_ASSERT(select.GetRowList().size() == 0);
482 Name: ORM_MultipleBindInsert
483 Description: repeats ORM_Insert test several times
484 Expected: Values should be inserted
486 RUNNER_TEST(ORM_MultipleBindInsert)
488 for (int i = 0; i < TEST_REPETITION; i++) {
495 Description: tests deleting rows from database
496 Expected: deleted rows should not exist
498 RUNNER_TEST(ORM_Delete)
500 SmartAttach interface;
501 using namespace DPL::DB::ORM;
502 using namespace DPL::DB::ORM::dpl_orm_test;
503 TestTableDelete::Select selectStart(interface.get());
504 selectStart.OrderBy(DPL::TypeListDecl<OrderingAscending<TestTableDelete::
506 std::list<TestTableDelete::Row> list = selectStart.GetRowList();
507 std::list<TestTableDelete::Row> originalList = list;
509 std::vector<TestTableDelete::Row> vector(list.begin(), list.end());
511 list.size() == 4, "Returned list has wrong size: " << list.size());
513 typedef DPL::String S;
517 TestTableDelete::Delete del(interface.get());
518 del.Where(And(Equals<TestTableDelete::ColumnOptInt>(1),
519 Equals<TestTableDelete::ColumnOptText>(S(L"seven"))));
522 TestTableDelete::Select select(interface.get());
523 RUNNER_ASSERT_MSG(ContainerContentsEqual(
525 list), "Returned list doesn't match.");
529 TestTableDelete::Delete del(interface.get());
530 del.Where(And(Equals<TestTableDelete::ColumnOptInt>(6),
531 Equals<TestTableDelete::ColumnOptText>(S(L"two"))));
534 TestTableDelete::Select select(interface.get());
535 RUNNER_ASSERT_MSG(ContainerContentsEqual(
537 list), "Returned list doesn't match.");
541 TestTableDelete::Delete del(interface.get());
542 del.Where(Equals<TestTableDelete::ColumnInt2>(10));
545 TestTableDelete::Select select(interface.get());
546 RUNNER_ASSERT_MSG(ContainerContentsEqual(
548 list), "Returned list doesn't match.");
553 list.remove(vector[1]);
555 TestTableDelete::Delete del(interface.get());
556 del.Where(And(Equals<TestTableDelete::ColumnOptInt>(6),
557 Equals<TestTableDelete::ColumnText>(L"ten")));
560 TestTableDelete::Select select(interface.get());
561 RUNNER_ASSERT_MSG(ContainerContentsEqual(
563 list), "Returned list doesn't match.");
567 list.remove(vector[2]);
568 list.remove(vector[3]);
570 TestTableDelete::Delete del(interface.get());
571 del.Where(Is<TestTableDelete::ColumnOptText>(DPL::OptionalString()));
574 TestTableDelete::Select select(interface.get());
575 RUNNER_ASSERT_MSG(ContainerContentsEqual(
577 list), "Returned list doesn't match.");
581 TestTableDelete::Delete del(interface.get());
584 TestTableDelete::Select select(interface.get());
586 select.GetRowList().size() == 0, "Returned list is not empty");
589 // Restore original table state
590 // This also tests if multiple different binds for Insert are working
592 for (std::list<TestTableDelete::Row>::iterator i = originalList.begin();
593 i != originalList.end();
596 TestTableDelete::Insert insert(interface.get());
602 TestTableDelete::Select select(interface.get());
603 RUNNER_ASSERT_MSG(ContainerContentsEqual(
606 "Returned list doesn't match.");
611 Name: ORM_MultipleBindDelete
612 Description: repeats ORM_Delete test several times
613 Expected: Values should be deleted
615 RUNNER_TEST(ORM_MultipleBindDelete)
617 for (int i = 0; i < TEST_REPETITION; i++) {
623 Name: ORM_MultipleBindWhere
624 Description: tests if multiple bind of same query obejct works
625 Expected: Each bind and execution of query should be correct
627 RUNNER_TEST(ORM_MultipleBindWhere)
629 SmartAttach interface;
630 using namespace DPL::DB::ORM;
631 using namespace DPL::DB::ORM::dpl_orm_test;
633 TestTable::Select select(interface.get());
635 select.Where(Equals<TestTable::ColumnInt>(8));
636 RUNNER_ASSERT_MSG((result =
637 *select.GetSingleValue<TestTable::ColumnOptInt>())
641 select.Where(Equals<TestTable::ColumnInt>(3));
642 RUNNER_ASSERT_MSG((result =
643 *select.GetSingleValue<TestTable::ColumnOptInt>())
647 select.Where(Equals<TestTable::ColumnInt>(8));
648 RUNNER_ASSERT_MSG((result =
649 *select.GetSingleValue<TestTable::ColumnOptInt>())
653 select.Where(Equals<TestTable::ColumnInt>(3));
654 RUNNER_ASSERT_MSG((result =
655 *select.GetSingleValue<TestTable::ColumnOptInt>())
661 TestTable::Select select(interface.get());
663 select.Where(And(Equals<TestTable::ColumnInt>(99),
664 Equals<TestTable::ColumnText>(L"fourteen")));
665 RUNNER_ASSERT_MSG((result = select.GetSingleValue<TestTable::ColumnInt2>(
666 )) == 13, "Got " << result);
668 select.Where(And(Equals<TestTable::ColumnInt>(99),
669 Equals<TestTable::ColumnText>(L"twelve")));
670 RUNNER_ASSERT_MSG((result = select.GetSingleValue<TestTable::ColumnInt2>(
671 )) == 11, "Got " << result);
673 select.Where(And(Equals<TestTable::ColumnInt>(99),
674 Equals<TestTable::ColumnText>(L"fourteen")));
675 RUNNER_ASSERT_MSG((result = select.GetSingleValue<TestTable::ColumnInt2>(
676 )) == 13, "Got " << result);
678 select.Where(And(Equals<TestTable::ColumnInt>(99),
679 Equals<TestTable::ColumnText>(L"twelve")));
680 RUNNER_ASSERT_MSG((result = select.GetSingleValue<TestTable::ColumnInt2>(
681 )) == 11, "Got " << result);
685 TestTable::Select select(interface.get());
687 select.Where(And(Equals<TestTable::ColumnText>(L"fourteen"),
688 Equals<TestTable::ColumnInt>(99)));
689 RUNNER_ASSERT_MSG((result = select.GetSingleValue<TestTable::ColumnInt2>(
690 )) == 13, "Got " << result);
692 select.Where(And(Equals<TestTable::ColumnText>(L"twelve"),
693 Equals<TestTable::ColumnInt>(99)));
694 RUNNER_ASSERT_MSG((result = select.GetSingleValue<TestTable::ColumnInt2>(
695 )) == 11, "Got " << result);
697 select.Where(And(Equals<TestTable::ColumnText>(L"fourteen"),
698 Equals<TestTable::ColumnInt>(99)));
699 RUNNER_ASSERT_MSG((result = select.GetSingleValue<TestTable::ColumnInt2>(
700 )) == 13, "Got " << result);
702 select.Where(And(Equals<TestTable::ColumnText>(L"twelve"),
703 Equals<TestTable::ColumnInt>(99)));
704 RUNNER_ASSERT_MSG((result = select.GetSingleValue<TestTable::ColumnInt2>(
705 )) == 11, "Got " << result);
711 Description: tests rows update in database
712 Expected: Successful update
714 RUNNER_TEST(ORM_Update)
716 SmartAttach interface;
717 using namespace DPL::DB::ORM;
718 using namespace DPL::DB::ORM::dpl_orm_test;
720 std::list<TestTableInsert::Row> list;
722 TestTableInsert::Delete del(interface.get());
727 TestTableInsert::Insert insert(interface.get());
728 TestTableInsert::Row row;
729 row.Set_ColumnOptInt(5);
730 row.Set_ColumnInt2(2);
731 row.Set_ColumnText(L"two");
735 row.Set_ColumnInt(99);
739 TestTableInsert::Insert insert(interface.get());
740 TestTableInsert::Row row;
741 row.Set_ColumnOptInt(1);
742 row.Set_ColumnInt2(2);
743 row.Set_ColumnText(L"three");
747 row.Set_ColumnInt(99);
751 TestTableInsert::Insert insert(interface.get());
752 TestTableInsert::Row row;
753 row.Set_ColumnOptInt(2);
754 row.Set_ColumnInt2(3);
755 row.Set_ColumnText(L"three");
759 row.Set_ColumnInt(99);
763 TestTableInsert::Select select(interface.get());
764 RUNNER_ASSERT_MSG(ContainerContentsEqual(
766 list), "Returned list doesn't match.");
770 TestTableInsert::Update update(interface.get());
771 TestTableInsert::Row row;
772 row.Set_ColumnInt2(4);
773 row.Set_ColumnText(L"four");
775 update.Where(Equals<TestTableInsert::ColumnInt2>(12));
779 TestTableInsert::Select select(interface.get());
780 RUNNER_ASSERT_MSG(ContainerContentsEqual(
782 list), "Returned list doesn't match.");
786 TestTableInsert::Update update(interface.get());
787 TestTableInsert::Row row;
788 row.Set_ColumnInt2(2);
789 row.Set_ColumnText(L"four");
791 update.Where(Equals<TestTableInsert::ColumnInt2>(3));
794 list.back().Set_ColumnInt2(2);
795 list.back().Set_ColumnText(L"four");
798 TestTableInsert::Select select(interface.get());
799 RUNNER_ASSERT_MSG(ContainerContentsEqual(
801 list), "Returned list doesn't match.");
805 // UPDATE - multiple rows
806 TestTableInsert::Update update(interface.get());
807 TestTableInsert::Row row;
808 row.Set_ColumnText(L"dup");
810 update.Where(Equals<TestTableInsert::ColumnInt2>(2));
815 it->Set_ColumnText(L"dup");
819 TestTableInsert::Select select(interface.get());
820 RUNNER_ASSERT_MSG(ContainerContentsEqual(
822 list), "Returned list doesn't match.");
825 // restore original table state
827 TestTableInsert::Delete del2(interface.get());
830 TestTableInsert::Select select(interface.get());
831 RUNNER_ASSERT(select.GetRowList().size() == 0);
836 Name: ORM_MultipleBindUpdate
837 Description: repeats ORM_Update severl times
838 Expected: Successful update
840 RUNNER_TEST(ORM_MultipleBindUpdate)
842 for (int i = 0; i < TEST_REPETITION; i++) {
848 Name: ORM_transactions
849 Description: checks creation of transation object
850 Expected: Successful creation of transaction object
852 RUNNER_TEST(ORM_transactions)
854 SmartAttach interface;
855 DPL::DB::ORM::dpl_orm_test::ScopedTransaction transaction(interface.get());
859 Name: ORM_MultiAttach
860 Description: checks correct behaviou in case of multiple tries to attach to database
861 Expected: Methods attaching/dettaching should be prepared for multiple calling
863 RUNNER_TEST(ORM_MultiAttach)
865 SmartAttach interface(false);
867 !interface.get()->IsAttached(), "Is attached, but shouldn't be.");
868 interface.get()->AttachToThread();
870 interface.get()->IsAttached(), "Isn't attached, but should be.");
871 interface.get()->AttachToThread();
873 interface.get()->IsAttached(), "Isn't attached, but should be.");
874 interface.get()->DetachFromThread();
876 interface.get()->IsAttached(), "Isn't attached, but should be.");
877 interface.get()->DetachFromThread();
879 !interface.get()->IsAttached(), "Is attached, but shouldn't be.");
884 Description: tests ORM's join operation
885 Expected: values should insist correct join operation
887 RUNNER_TEST(ORM_Join)
889 SmartAttach interface;
890 using namespace DPL::DB::ORM;
891 using namespace DPL::DB::ORM::dpl_orm_test;
893 typedef DPL::TypeListDecl<TestTableJoin1::TestText,
894 TestTableJoin2::TestText2,
895 DPL::TypeListGuard>::Type JoinColumns;
897 /* Test for correct join:
898 * 5 ids from first table matches 5 ids from second table thus join result
900 TestTableJoin1::Select select(interface.get());
901 select.Join<JoinColumns>(Equal<TestTableJoin1::TestID,
902 TestTableJoin2::TestID>());
903 std::list<CustomRow<JoinColumns> > rowlist =
904 select.GetCustomRowList<JoinColumns, CustomRow<JoinColumns> >();
907 rowlist.size() == 5, "Invalid number of rows fetched: " << rowlist.size());
910 std::ostringstream oss;
912 FOREACH(rowit, rowlist)
917 DPL::ToUTF8String((*rowit).GetColumnData<TestTableJoin1::TestText>());
918 oss << "text val " << cnt;
919 RUNNER_ASSERT_MSG(text.compare(
921 "Invalid value from first column: "
922 << text << " expected: " << oss.str());
923 oss.str(std::string());
926 DPL::ToUTF8String((*rowit).GetColumnData<TestTableJoin2::TestText2>());
927 oss << "text2 " << cnt;
928 RUNNER_ASSERT_MSG(text.compare(
930 "Invalid value from second column: "
931 << text << " expected: " << oss.str());
932 oss.str(std::string());
934 /* Test for empty join:
935 * None of number values from first table matches ids from second table
936 * - join result should be empty */
937 TestTableJoin1::Select select2(interface.get());
938 select2.Join<JoinColumns>(Equal<TestTableJoin1::TestNumber,
939 TestTableJoin2::TestID>());
940 rowlist = select2.GetCustomRowList<JoinColumns, CustomRow<JoinColumns> >();
942 RUNNER_ASSERT_MSG(rowlist.empty(), "Result should be empty but it is not!");
944 /* Test for "converted" join:
945 * - join made with int column and text column as keys
946 * - expected 5 matching rows (one row of 6 should not be matched)*/
947 TestTableJoin1::Select select3(interface.get());
948 select3.Join<JoinColumns>(Equal<TestTableJoin1::TestID,
949 TestTableJoin2::TestText1>());
950 rowlist = select3.GetCustomRowList<JoinColumns, CustomRow<JoinColumns> >();
952 rowlist.size() == 5, "Expected 5 rows while received: " << rowlist.size());
954 FOREACH(rowit, rowlist)
957 // look at last two insertions into TestTableJoin2
958 // for this skip understanding
963 DPL::ToUTF8String((*rowit).GetColumnData<TestTableJoin1::TestText>());
964 oss << "text val " << cnt;
965 RUNNER_ASSERT_MSG(text.compare(
967 "Invalid value from first column: "
968 << text << " expected: " << oss.str() <<
969 " iteration: " << cnt);
970 oss.str(std::string());
973 DPL::ToUTF8String((*rowit).GetColumnData<TestTableJoin2::TestText2>());
974 oss << "text2 " << cnt;
975 RUNNER_ASSERT_MSG(text.compare(
977 "Invalid value from second column: "
978 << text << " expected: " << oss.str() <<
979 " iteration: " << cnt);
980 oss.str(std::string());
983 /* Test for join with non-unique nullable columns given as keys*/
984 typedef DPL::TypeListDecl<TestTableJoin1::TestText,
985 TestTableJoin3::TestText33,
986 DPL::TypeListGuard>::Type JoinTables2;
987 TestTableJoin1::Select select4(interface.get());
988 select4.Join<JoinTables2>(Equal<TestTableJoin1::TestNumber,
989 TestTableJoin3::Value3>());
990 std::list<CustomRow<JoinTables2> > rowlist2 =
991 select4.GetCustomRowList<JoinTables2, CustomRow<JoinTables2> >();
993 rowlist2.size() == 4, "Expected 4 rows while received: " <<
996 DPL::OptionalString optext;
997 FOREACH(rowit, rowlist2)
1002 DPL::ToUTF8String((*rowit).GetColumnData<TestTableJoin1::TestText>());
1003 // values expected in subsequent (1,2,3,4) iterations: 1 1 2 2
1004 oss << "text val " << (1 + (int)(cnt / 3));
1005 RUNNER_ASSERT_MSG(text.compare(
1007 "Invalid value from first column: "
1008 << text << " expected: " << oss.str() <<
1009 " iteration: " << cnt);
1010 oss.str(std::string());
1012 optext = (*rowit).GetColumnData<TestTableJoin3::TestText33>();
1013 text = DPL::ToUTF8String(*optext);
1014 oss << "test " << cnt;
1015 RUNNER_ASSERT_MSG(text.compare(
1017 "Invalid value from second column: "
1018 << text << " expected: " << oss.str() <<
1019 " iteration: " << cnt);
1020 oss.str(std::string());
1023 /* Test for join made on three tables:
1024 * - 3 text columns selected for join
1025 * - Equal made for TestID of (table1 and table2) and (table1 and table3) */
1026 typedef DPL::TypeListDecl<TestTableJoin1::TestText,
1027 TestTableJoin2::TestText2,
1028 TestTableJoin3::TestText33,
1029 DPL::TypeListGuard>::Type Join3Tables;
1030 TestTableJoin1::Select select5(interface.get());
1031 select5.Join<Join3Tables>(Equal<TestTableJoin1::TestID,
1032 TestTableJoin2::TestID>());
1033 select5.Join<Join3Tables>(Equal<TestTableJoin1::TestID,
1034 TestTableJoin3::TestID>());
1035 std::list<CustomRow<Join3Tables> > rowlist3tab =
1036 select5.GetCustomRowList<Join3Tables, CustomRow<Join3Tables> >();
1038 rowlist3tab.size() == 3, "Expected 3 rows while received: " <<
1039 rowlist3tab.size());
1041 FOREACH(rowit, rowlist3tab)
1046 DPL::ToUTF8String((*rowit).GetColumnData<TestTableJoin1::TestText>());
1047 oss << "text val " << cnt;
1048 RUNNER_ASSERT_MSG(text.compare(
1050 "Invalid value from first column: "
1051 << text << " expected: " << oss.str() <<
1052 " iteration: " << cnt);
1053 oss.str(std::string());
1056 DPL::ToUTF8String((*rowit).GetColumnData<TestTableJoin2::TestText2>());
1057 oss << "text2 " << cnt;
1058 RUNNER_ASSERT_MSG(text.compare(
1060 "Invalid value from first column: "
1061 << text << " expected: " << oss.str() <<
1062 " iteration: " << cnt);
1063 oss.str(std::string());
1065 optext = (*rowit).GetColumnData<TestTableJoin3::TestText33>();
1066 text = DPL::ToUTF8String(*optext);
1067 oss << "test " << cnt;
1068 RUNNER_ASSERT_MSG(text.compare(
1070 "Invalid value from second column: "
1071 << text << " expected: " << oss.str() <<
1072 " iteration: " << cnt);
1073 oss.str(std::string());
1077 RUNNER_TEST(ORM_SelectOrderByMultipleColumns)
1079 SmartAttach interface;
1080 using namespace DPL::DB::ORM;
1081 using namespace DPL::DB::ORM::dpl_orm_test;
1083 TestTableJoin3::Select select(interface.get());
1085 // testing: " ORDER BY Value3 ASC, TestID DESC, TestID ASC"
1086 select.OrderBy(DPL::TypeListDecl<OrderingAscending<TestTableJoin3::
1088 OrderingDescending<TestTableJoin3::
1090 OrderingAscending<TestTableJoin3::
1093 std::list<TestTableJoin3::Row> result = select.GetRowList();
1094 std::list<TestTableJoin3::Row>::const_iterator iter = result.begin();
1096 RUNNER_ASSERT_MSG(*iter->Get_TestText33() ==
1097 DPL::FromASCIIString(
1098 "test 6"), "Wrong row 1 order");
1099 RUNNER_ASSERT_MSG(iter->Get_TestID() == 10, "Wrong row 1 order");
1103 RUNNER_ASSERT_MSG(*iter->Get_TestText33() ==
1104 DPL::FromASCIIString(
1105 "test 5"), "Wrong row 2 order");
1106 RUNNER_ASSERT_MSG(iter->Get_TestID() == 7, "Wrong row 2 order");
1110 RUNNER_ASSERT_MSG(iter->Get_Value3() == 111, "Wrong row 3 order");
1111 RUNNER_ASSERT_MSG(*iter->Get_TestText33() ==
1112 DPL::FromASCIIString(
1113 "test 2"), "Wrong row 3 order");
1114 RUNNER_ASSERT_MSG(iter->Get_TestID() == 2, "Wrong row 3 order");
1118 RUNNER_ASSERT_MSG(iter->Get_Value3() == 111, "Wrong row 4 order");
1119 RUNNER_ASSERT_MSG(*iter->Get_TestText33() ==
1120 DPL::FromASCIIString(
1121 "test 1"), "Wrong row 4 order");
1122 RUNNER_ASSERT_MSG(iter->Get_TestID() == 1, "Wrong row 4 order");
1126 RUNNER_ASSERT_MSG(iter->Get_Value3() == 222, "Wrong row 5 order");
1127 RUNNER_ASSERT_MSG(*iter->Get_TestText33() ==
1128 DPL::FromASCIIString(
1129 "test 4"), "Wrong row 5 order");
1130 RUNNER_ASSERT_MSG(iter->Get_TestID() == 6, "Wrong row 5 order");
1134 RUNNER_ASSERT_MSG(iter->Get_Value3() == 222, "Wrong row 6 order");
1135 RUNNER_ASSERT_MSG(*iter->Get_TestText33() ==
1136 DPL::FromASCIIString(
1137 "test 3"), "Wrong row 6 order");
1138 RUNNER_ASSERT_MSG(iter->Get_TestID() == 3, "Wrong row 6 order");