160 namespace sph = oral::sph;
162 void OralTest::testAutoPKeyRecordInsertSelect ()
166 const auto& list = adapted->Select ();
170 void OralTest::testAutoPKeyRecordInsertRvalueReturnsPKey ()
175 for (
int i = 0; i < 3; ++i)
176 ids << adapted->Insert ({ 0, QString::number (i) });
181 void OralTest::testAutoPKeyRecordInsertConstLvalueReturnsPKey ()
186 for (
int i = 0; i < 3; ++i)
187 records.push_back ({ 0, QString::number (i) });
190 for (
const auto& record : records)
191 ids << adapted->Insert (record);
196 void OralTest::testAutoPKeyRecordInsertSetsPKey ()
201 for (
int i = 0; i < 3; ++i)
202 records.push_back ({ 0, QString::number (i) });
204 for (
auto& record : records)
205 adapted->Insert (record);
210 void OralTest::testNoPKeyRecordInsertSelect ()
213 const auto& list = adapted->Select ();
217 void OralTest::testNonInPlaceConstructibleRecordInsertSelect ()
220 for (
int i = 0; i < 3; ++i)
221 adapted->Insert ({ i, QString::number (i), 0 });
223 const auto& list = adapted->Select ();
227 void OralTest::testComplexConstraintsRecordInsertSelectDefault ()
231 adapted->Insert ({ 0,
"first",
"c1", 1, 2 });
232 QVERIFY_THROWS_EXCEPTION (oral::QueryException, adapted->Insert ({ 0,
"second",
"c1", 1, 2 }));
233 QVERIFY_THROWS_EXCEPTION (oral::QueryException, adapted->Insert ({ 0,
"first",
"c1", 1, 3 }));
234 adapted->Insert ({ 0,
"second",
"c2", 1, 3 });
235 QVERIFY_THROWS_EXCEPTION (oral::QueryException, adapted->Insert ({ 0,
"first",
"c1", 1, 3 }));
237 const auto& list = adapted->Select ();
238 QCOMPARE (list, (
QList<ComplexConstraintsRecord> { { 0,
"first",
"c1", 1, 2 }, { 0,
"second",
"c2", 1, 3 } }));
241 void OralTest::testComplexConstraintsRecordInsertSelectIgnore ()
251 const auto& list = adapted->Select ();
252 QCOMPARE (list, (
QList<ComplexConstraintsRecord> { { 0,
"first",
"c1", 1, 2 }, { 0,
"second",
"c4", 1, 3 } }));
255 void OralTest::testComplexConstraintsRecordInsertSelectReplace ()
259 adapted->Insert ({ 0,
"alice",
"city1", 1, 2 });
260 adapted->Insert ({ 0,
"bob",
"city2", 1, 2 },
264 adapted->Insert ({ 0,
"alice",
"city3", 2, 3 });
265 QCOMPARE (adapted->Select (), (
QList<ComplexConstraintsRecord> { { 0,
"bob",
"city1", 1, 2 }, { 0,
"alice",
"city3", 2, 3 } }));
268 QVERIFY_THROWS_EXCEPTION (oral::QueryException,
269 adapted->Insert ({ 1,
"bob",
"city4", 2, 3 },
272 adapted->Insert ({ 1,
"bob",
"city4", 2, 3 },
274 QCOMPARE (adapted->Select (), (
QList<ComplexConstraintsRecord> { { 0,
"bob",
"city1", 1, 2 }, { 1,
"bob",
"city4", 2, 3 } }));
277 void OralTest::testConstrainedAutogenPKeyRecordInsertIgnore ()
279 using Rec = ConstrainedAutogenPKeyRecord;
280 auto adapted = Util::oral::AdaptPtr<Rec, OralFactory> (MakeDatabase ());
282 QCOMPARE (adapted->Insert ({ .City_ =
"c1", .Population_ = 100 }), 1);
283 QCOMPARE (adapted->Insert ({ .City_ =
"c2", .Population_ = 200 }), 2);
284 QCOMPARE (adapted->Select (), (
QList<Rec> { { 1,
"c1", 100 }, { 2,
"c2", 200 } }));
288 QCOMPARE (adapted->Select (), (
QList<Rec> { { 1,
"c1", 100 }, { 2,
"c2", 200 } }));
291 void OralTest::testConstrainedAutogenPKeyRecordInsertReplace ()
293 using Rec = ConstrainedAutogenPKeyRecord;
294 auto adapted = Util::oral::AdaptPtr<Rec, OralFactory> (MakeDatabase ());
296 QCOMPARE (adapted->Insert ({ .City_ =
"c1", .Population_ = 100 }), 1);
297 QCOMPARE (adapted->Insert ({ .City_ =
"c2", .Population_ = 200 }), 2);
298 QCOMPARE (adapted->Select (), (
QList<Rec> { { 1,
"c1", 100 }, { 2,
"c2", 200 } }));
300 QVERIFY_THROWS_EXCEPTION (oral::QueryException, adapted->Insert ({ .City_ =
"c1", .Population_ = 300 }));
304 QCOMPARE (adapted->Select (), (
QList<Rec> { { 1,
"c1", 300 }, { 2,
"c2", 400 } }));
307 void OralTest::testOptionalFieldNullRoundTrip ()
309 using Rec = OptionalFieldRecord;
310 auto adapted = Util::oral::AdaptPtr<Rec, OralFactory> (MakeDatabase ());
312 adapted->Insert ({ {},
"alice", std::nullopt, std::nullopt });
313 adapted->Insert ({ {},
"bob", std::nullopt, std::nullopt });
315 const auto& list = adapted->Select ();
316 QCOMPARE (list.size (), 2);
317 QCOMPARE (list [0].NickName_, std::nullopt);
318 QCOMPARE (list [0].Extra_, std::nullopt);
319 QCOMPARE (list [1].NickName_, std::nullopt);
320 QCOMPARE (list [1].Extra_, std::nullopt);
323 void OralTest::testOptionalFieldValueRoundTrip ()
325 using Rec = OptionalFieldRecord;
326 auto adapted = Util::oral::AdaptPtr<Rec, OralFactory> (MakeDatabase ());
328 adapted->Insert ({ {},
"alice",
"Al", QByteArray {
"data1" } });
329 adapted->Insert ({ {},
"bob", std::nullopt, std::nullopt });
331 const auto& list = adapted->Select ();
332 QCOMPARE (list.size (), 2);
333 QCOMPARE (list [0].NickName_, std::optional<QString> {
"Al" });
334 QCOMPARE (list [0].Extra_, std::optional<QByteArray> {
"data1" });
335 QCOMPARE (list [1].NickName_, std::nullopt);
336 QCOMPARE (list [1].Extra_, std::nullopt);
339 void OralTest::testOptionalFieldUpdateNullToValue ()
341 using Rec = OptionalFieldRecord;
342 auto adapted = Util::oral::AdaptPtr<Rec, OralFactory> (MakeDatabase ());
344 adapted->Insert ({ {},
"alice", std::nullopt, std::nullopt });
345 adapted->Update (sph::f<&Rec::NickName_> = QString {
"Al" },
346 sph::f<&Rec::Name_> == QString {
"alice" });
348 const auto& list = adapted->Select ();
349 QCOMPARE (list.size (), 1);
350 QCOMPARE (list [0].NickName_, std::optional<QString> {
"Al" });
351 QCOMPARE (list [0].Extra_, std::nullopt);
354 void OralTest::testOptionalFieldUpdateValueToNull ()
356 using Rec = OptionalFieldRecord;
357 auto adapted = Util::oral::AdaptPtr<Rec, OralFactory> (MakeDatabase ());
359 adapted->Insert ({ {},
"alice",
"Al", QByteArray {
"data" } });
360 adapted->Update (sph::f<&Rec::NickName_> = std::optional<QString> {},
361 sph::f<&Rec::Name_> == QString {
"alice" });
363 const auto& list = adapted->Select ();
364 QCOMPARE (list.size (), 1);
365 QCOMPARE (list [0].NickName_, std::nullopt);
366 QCOMPARE (list [0].Extra_, std::optional<QByteArray> {
"data" });