19 static QString ClassName ()
21 return "AutogenPKeyRecord";
26 return std::tie (ID_,
Value_);
41 static QString ClassName ()
43 return "NoPKeyRecord";
48 return std::tie (ID_,
Value_);
58 struct NonInPlaceConstructibleRecord
63 NonInPlaceConstructibleRecord () =
default;
65 NonInPlaceConstructibleRecord (
int id,
const QString& value,
double someExtraArgument)
69 Q_UNUSED (someExtraArgument)
72 static QString ClassName ()
74 return "NonInPlaceConstructibleRecord";
79 return std::tie (ID_,
Value_);
87 TOSTRING (NonInPlaceConstructibleRecord)
89 struct ComplexConstraintsRecord
96 static QString ClassName ()
98 return "ComplexConstraintsRecord";
101 auto AsTuple ()
const
103 return std::tie (ID_,
Value_, Age_, Weight_);
124 namespace sph = oral::sph;
126 void OralTest::testAutoPKeyRecordInsertSelect ()
128 auto adapted = PrepareRecords<AutogenPKeyRecord> (
MakeDatabase ());
129 const auto& list = adapted->Select ();
133 void OralTest::testAutoPKeyRecordInsertRvalueReturnsPKey ()
135 auto adapted = Util::oral::AdaptPtr<AutogenPKeyRecord, OralFactory> (
MakeDatabase ());
138 for (
int i = 0; i < 3; ++i)
139 ids << adapted->Insert ({ 0, QString::number (i) });
144 void OralTest::testAutoPKeyRecordInsertConstLvalueReturnsPKey ()
146 auto adapted = Util::oral::AdaptPtr<AutogenPKeyRecord, OralFactory> (
MakeDatabase ());
149 for (
int i = 0; i < 3; ++i)
150 records.push_back ({ 0, QString::number (i) });
153 for (
const auto& record : records)
154 ids << adapted->Insert (record);
159 void OralTest::testAutoPKeyRecordInsertSetsPKey ()
161 auto adapted = Util::oral::AdaptPtr<AutogenPKeyRecord, OralFactory> (
MakeDatabase ());
164 for (
int i = 0; i < 3; ++i)
165 records.push_back ({ 0, QString::number (i) });
167 for (
auto& record : records)
168 adapted->Insert (record);
173 void OralTest::testNoPKeyRecordInsertSelect ()
175 auto adapted = PrepareRecords<NoPKeyRecord> (
MakeDatabase ());
176 const auto& list = adapted->Select ();
180 void OralTest::testNonInPlaceConstructibleRecordInsertSelect ()
182 auto adapted = Util::oral::AdaptPtr<NonInPlaceConstructibleRecord, OralFactory> (
MakeDatabase ());
183 for (
int i = 0; i < 3; ++i)
184 adapted->Insert ({ i, QString::number (i), 0 });
186 const auto& list = adapted->Select ();
192 template<
typename Ex,
typename F>
193 void ShallThrow (F&&
f)
205 QCOMPARE (failed,
true);
209 void OralTest::testComplexConstraintsRecordInsertSelectDefault ()
211 auto adapted = Util::oral::AdaptPtr<ComplexConstraintsRecord, OralFactory> (
MakeDatabase ());
213 adapted->Insert ({ 0,
"first", 1, 2 });
214 ShallThrow<oral::QueryException> ([&] { adapted->Insert ({ 0,
"second", 1, 2 }); });
215 ShallThrow<oral::QueryException> ([&] { adapted->Insert ({ 0,
"first", 1, 3 }); });
216 adapted->Insert ({ 0,
"second", 1, 3 });
217 ShallThrow<oral::QueryException> ([&] { adapted->Insert ({ 0,
"first", 1, 3 }); });
219 const auto& list = adapted->Select ();
223 void OralTest::testComplexConstraintsRecordInsertSelectIgnore ()
225 auto adapted = Util::oral::AdaptPtr<ComplexConstraintsRecord, OralFactory> (
MakeDatabase ());
233 const auto& list = adapted->Select ();
237 void OralTest::testComplexConstraintsRecordInsertSelectReplace ()
239 auto adapted = Util::oral::AdaptPtr<ComplexConstraintsRecord, OralFactory> (
MakeDatabase ());
241 const auto idValueFields = lco::InsertAction::Replace::Fields<
242 &ComplexConstraintsRecord::ID_,
245 const auto weightAgeFields = lco::InsertAction::Replace::Fields<
246 &ComplexConstraintsRecord::Weight_,
247 &ComplexConstraintsRecord::Age_
249 adapted->Insert ({ 0,
"first", 1, 2 }, idValueFields);
250 adapted->Insert ({ 0,
"second", 1, 2 }, weightAgeFields);
251 adapted->Insert ({ 0,
"first", 1, 3 }, idValueFields);
252 adapted->Insert ({ 0,
"third", 1, 3 }, weightAgeFields);
253 adapted->Insert ({ 0,
"first", 1, 3 }, weightAgeFields);
255 const auto& list = adapted->Select ();