14using LC::operator
""_ct;
21 constexpr static auto ClassName =
"AutogenPKeyRecord"_ct;
40 constexpr static auto ClassName =
"NoPKeyRecord"_ct;
44 return std::tie (ID_,
Value_);
54struct NonInPlaceConstructibleRecord
59 NonInPlaceConstructibleRecord () =
default;
61 NonInPlaceConstructibleRecord (
int id,
const QString& value,
double someExtraArgument)
65 Q_UNUSED (someExtraArgument)
68 constexpr static auto ClassName =
"NonInPlaceConstructibleRecord"_ct;
72 return std::tie (ID_,
Value_);
80TOSTRING (NonInPlaceConstructibleRecord)
82struct ComplexConstraintsRecord
89 constexpr static auto ClassName =
"ComplexConstraintsRecord"_ct;
93 return std::tie (ID_,
Value_, Age_, Weight_);
110template<
typename... Args>
113 return std::apply ([&] (
auto&&... args) {
return ((dbg.nospace () << args <<
' '), ...); },
tup);
120 namespace sph = oral::sph;
122 void OralTest::testAutoPKeyRecordInsertSelect ()
124 qDebug () << oral::detail::FieldNames<AutogenPKeyRecord>;
126 const auto& list =
adapted->Select ();
130 void OralTest::testAutoPKeyRecordInsertRvalueReturnsPKey ()
135 for (
int i = 0;
i < 3; ++
i)
136 ids <<
adapted->Insert ({ 0, QString::number (i) });
141 void OralTest::testAutoPKeyRecordInsertConstLvalueReturnsPKey ()
146 for (
int i = 0;
i < 3; ++
i)
147 records.push_back ({ 0, QString::number (i) });
156 void OralTest::testAutoPKeyRecordInsertSetsPKey ()
161 for (
int i = 0;
i < 3; ++
i)
162 records.push_back ({ 0, QString::number (i) });
170 void OralTest::testNoPKeyRecordInsertSelect ()
173 const auto& list =
adapted->Select ();
177 void OralTest::testNonInPlaceConstructibleRecordInsertSelect ()
179 auto adapted = Util::oral::AdaptPtr<NonInPlaceConstructibleRecord, OralFactory> (
MakeDatabase ());
180 for (
int i = 0;
i < 3; ++
i)
181 adapted->Insert ({ i, QString::number (i), 0 });
183 const auto& list =
adapted->Select ();
189 template<
typename Ex,
typename F>
206 void OralTest::testComplexConstraintsRecordInsertSelectDefault ()
208 auto adapted = Util::oral::AdaptPtr<ComplexConstraintsRecord, OralFactory> (
MakeDatabase ());
210 adapted->Insert ({ 0,
"first", 1, 2 });
213 adapted->Insert ({ 0,
"second", 1, 3 });
216 const auto& list =
adapted->Select ();
220 void OralTest::testComplexConstraintsRecordInsertSelectIgnore ()
222 auto adapted = Util::oral::AdaptPtr<ComplexConstraintsRecord, OralFactory> (
MakeDatabase ());
224 adapted->Insert ({ 0,
"first", 1, 2 }, lco::InsertAction::Ignore);
225 adapted->Insert ({ 0,
"second", 1, 2 }, lco::InsertAction::Ignore);
226 adapted->Insert ({ 0,
"first", 1, 3 }, lco::InsertAction::Ignore);
227 adapted->Insert ({ 0,
"second", 1, 3 }, lco::InsertAction::Ignore);
228 adapted->Insert ({ 0,
"first", 1, 3 }, lco::InsertAction::Ignore);
230 const auto& list =
adapted->Select ();
234 void OralTest::testComplexConstraintsRecordInsertSelectReplace ()
236 auto adapted = Util::oral::AdaptPtr<ComplexConstraintsRecord, OralFactory> (
MakeDatabase ());
238 const auto idValueFields = lco::InsertAction::Replace::Fields<
239 &ComplexConstraintsRecord::ID_,
240 &ComplexConstraintsRecord::Value_
243 &ComplexConstraintsRecord::Weight_,
244 &ComplexConstraintsRecord::Age_
252 const auto& list =
adapted->Select ();
constexpr detail::ExprTree< detail::ExprType::LeafStaticPlaceholder, detail::MemberPtrs< Ptr > > f
Container< T > Filter(const Container< T > &c, F f)
QSqlDatabase MakeDatabase(const QString &name=":memory:")
#define ORAL_ADAPT_STRUCT(sname,...)
const std::tuple< Args... > & tup
QDataStream & operator<<(QDataStream &out, const LC::Util::RegExp &rx)
static constexpr auto ClassName