42 return "AutogenPKeyRecord";
47 return std::tie (ID_, Value_);
62 static QString ClassName ()
64 return "NoPKeyRecord";
69 return std::tie (ID_, Value_);
79 struct NonInPlaceConstructibleRecord
84 NonInPlaceConstructibleRecord () =
default;
86 NonInPlaceConstructibleRecord (
int id,
const QString& value,
double someExtraArgument)
90 Q_UNUSED (someExtraArgument)
93 static QString ClassName ()
95 return "NonInPlaceConstructibleRecord";
100 return std::tie (ID_, Value_);
108 TOSTRING (NonInPlaceConstructibleRecord)
110 struct ComplexConstraintsRecord
117 static QString ClassName ()
119 return "ComplexConstraintsRecord";
122 auto AsTuple ()
const 124 return std::tie (ID_, Value_, Age_, Weight_);
145 namespace sph = oral::sph;
147 void OralTest::testAutoPKeyRecordInsertSelect ()
149 auto adapted = PrepareRecords<AutogenPKeyRecord> (
MakeDatabase ());
150 const auto& list = adapted->Select ();
154 void OralTest::testAutoPKeyRecordInsertRvalueReturnsPKey ()
156 auto adapted = Util::oral::AdaptPtr<AutogenPKeyRecord, OralFactory> (
MakeDatabase ());
159 for (
int i = 0; i < 3; ++i)
160 ids << adapted->Insert ({ 0, QString::number (i) });
165 void OralTest::testAutoPKeyRecordInsertConstLvalueReturnsPKey ()
167 auto adapted = Util::oral::AdaptPtr<AutogenPKeyRecord, OralFactory> (
MakeDatabase ());
170 for (
int i = 0; i < 3; ++i)
171 records.push_back ({ 0, QString::number (i) });
174 for (
const auto& record : records)
175 ids << adapted->Insert (record);
180 void OralTest::testAutoPKeyRecordInsertSetsPKey ()
182 auto adapted = Util::oral::AdaptPtr<AutogenPKeyRecord, OralFactory> (
MakeDatabase ());
185 for (
int i = 0; i < 3; ++i)
186 records.push_back ({ 0, QString::number (i) });
188 for (
auto& record : records)
189 adapted->Insert (record);
194 void OralTest::testNoPKeyRecordInsertSelect ()
196 auto adapted = PrepareRecords<NoPKeyRecord> (
MakeDatabase ());
197 const auto& list = adapted->Select ();
201 void OralTest::testNonInPlaceConstructibleRecordInsertSelect ()
203 auto adapted = Util::oral::AdaptPtr<NonInPlaceConstructibleRecord, OralFactory> (
MakeDatabase ());
204 for (
int i = 0; i < 3; ++i)
205 adapted->Insert ({ i, QString::number (i), 0 });
207 const auto& list = adapted->Select ();
213 template<
typename Ex,
typename F>
214 void ShallThrow (F&&
f)
226 QCOMPARE (failed,
true);
230 void OralTest::testComplexConstraintsRecordInsertSelectDefault ()
232 auto adapted = Util::oral::AdaptPtr<ComplexConstraintsRecord, OralFactory> (
MakeDatabase ());
234 adapted->Insert ({ 0,
"first", 1, 2 });
235 ShallThrow<oral::QueryException> ([&] { adapted->Insert ({ 0,
"second", 1, 2 }); });
236 ShallThrow<oral::QueryException> ([&] { adapted->Insert ({ 0,
"first", 1, 3 }); });
237 adapted->Insert ({ 0,
"second", 1, 3 });
238 ShallThrow<oral::QueryException> ([&] { adapted->Insert ({ 0,
"first", 1, 3 }); });
240 const auto& list = adapted->Select ();
244 void OralTest::testComplexConstraintsRecordInsertSelectIgnore ()
246 auto adapted = Util::oral::AdaptPtr<ComplexConstraintsRecord, OralFactory> (
MakeDatabase ());
254 const auto& list = adapted->Select ();
258 void OralTest::testComplexConstraintsRecordInsertSelectReplace ()
260 auto adapted = Util::oral::AdaptPtr<ComplexConstraintsRecord, OralFactory> (
MakeDatabase ());
262 const auto idValueFields = lco::InsertAction::Replace::Fields<
263 &ComplexConstraintsRecord::ID_,
264 &ComplexConstraintsRecord::Value_
266 const auto weightAgeFields = lco::InsertAction::Replace::Fields<
267 &ComplexConstraintsRecord::Weight_,
268 &ComplexConstraintsRecord::Age_
270 adapted->Insert ({ 0,
"first", 1, 2 }, idValueFields);
271 adapted->Insert ({ 0,
"second", 1, 2 }, weightAgeFields);
272 adapted->Insert ({ 0,
"first", 1, 3 }, idValueFields);
273 adapted->Insert ({ 0,
"third", 1, 3 }, weightAgeFields);
274 adapted->Insert ({ 0,
"first", 1, 3 }, weightAgeFields);
276 const auto& list = adapted->Select ();
static struct LC::Util::oral::InsertAction::IgnoreTag Ignore
QSqlDatabase MakeDatabase(const QString &name=":memory:")
BOOST_FUSION_ADAPT_STRUCT(AutogenPKeyRecord, ID_, Value_) struct NoPKeyRecord
constexpr detail::ExprTree< detail::ExprType::LeafStaticPlaceholder, detail::MemberPtrs< Ptr > > f
Typelist< Args... > Constraints
static QString ClassName()