Improve tests for typed DBI
This commit is contained in:
parent
bda69c292d
commit
3a2160ee67
|
@ -10,9 +10,9 @@
|
|||
|
||||
#include <c++utilities/application/global.h>
|
||||
|
||||
#include <time.h>
|
||||
#include <ctime>
|
||||
|
||||
#include <iostream>
|
||||
#include <unistd.h>
|
||||
|
||||
using namespace std;
|
||||
using namespace LMDBSafe;
|
||||
|
@ -20,7 +20,7 @@ using namespace LMDBSafe;
|
|||
struct Member {
|
||||
std::string firstName;
|
||||
std::string lastName;
|
||||
time_t enrolled;
|
||||
std::time_t enrolled;
|
||||
};
|
||||
|
||||
template <class Archive> void serialize(Archive &ar, Member &g, const unsigned int version)
|
||||
|
@ -32,42 +32,77 @@ template <class Archive> void serialize(Archive &ar, Member &g, const unsigned i
|
|||
TEST_CASE("Basic typed tests", "[basictyped]")
|
||||
{
|
||||
unlink("./tests-typed");
|
||||
typedef TypedDBI<Member, index_on<Member, string, &Member::firstName>, index_on<Member, string, &Member::lastName>,
|
||||
index_on<Member, time_t, &Member::enrolled>>
|
||||
tmembers_t;
|
||||
|
||||
using tmembers_t = TypedDBI<Member, index_on<Member, string, &Member::firstName>, index_on<Member, string, &Member::lastName>,
|
||||
index_on<Member, time_t, &Member::enrolled>>;
|
||||
auto tmembers = tmembers_t(getMDBEnv("./tests-typed.lmdb", MDB_CREATE | MDB_NOSUBDIR, 0600), "members");
|
||||
|
||||
REQUIRE(1);
|
||||
|
||||
// insert three rows
|
||||
auto txn = tmembers.getRWTransaction();
|
||||
Member m{ "bert", "hubert" };
|
||||
auto m = Member{ "bert", "hubert", std::time_t() };
|
||||
txn.put(m);
|
||||
m.firstName = "bertus";
|
||||
m.lastName = "testperson";
|
||||
m.enrolled = time(0);
|
||||
txn.put(m);
|
||||
|
||||
m.firstName = "other";
|
||||
txn.put(m);
|
||||
|
||||
Member out;
|
||||
// find and read back inserted rows via ID
|
||||
auto out = Member{};
|
||||
REQUIRE(txn.get(1, out));
|
||||
REQUIRE(out.firstName == "bert");
|
||||
REQUIRE(out.lastName == "hubert");
|
||||
REQUIRE(out.enrolled == std::time_t());
|
||||
REQUIRE(txn.get(2, out));
|
||||
REQUIRE(out.firstName == "bertus");
|
||||
REQUIRE(out.lastName == "testperson");
|
||||
|
||||
REQUIRE(out.enrolled == m.enrolled);
|
||||
REQUIRE(txn.get(3, out));
|
||||
REQUIRE(out.firstName == "other");
|
||||
REQUIRE(out.lastName == "testperson");
|
||||
REQUIRE(out.enrolled == m.enrolled);
|
||||
REQUIRE(!txn.get(4, out));
|
||||
REQUIRE(txn.size<0>() == txn.size());
|
||||
REQUIRE(txn.size<1>() == txn.size());
|
||||
REQUIRE(txn.size<2>() == txn.size());
|
||||
|
||||
// find rows by prefix via index
|
||||
auto range = txn.prefix_range<0>("bert");
|
||||
vector<std::string> names;
|
||||
auto names = std::vector<std::string>();
|
||||
for (auto &iter = range.first; iter != range.second; ++iter) {
|
||||
names.push_back(iter->firstName);
|
||||
}
|
||||
REQUIRE(names == vector<std::string>{ "bert", "bertus" });
|
||||
|
||||
REQUIRE(names == std::vector<std::string>{ "bert", "bertus" });
|
||||
auto range2 = txn.prefix_range<0>("nosuchperson");
|
||||
REQUIRE(!(range2.first == range2.second));
|
||||
REQUIRE(range2.first != range2.second);
|
||||
|
||||
// override existing row
|
||||
m.firstName = "another";
|
||||
m.enrolled += 1;
|
||||
txn.put(m, 3);
|
||||
REQUIRE(txn.get(3, out));
|
||||
REQUIRE(out.firstName == "another");
|
||||
REQUIRE(out.lastName == "testperson");
|
||||
REQUIRE(out.enrolled == m.enrolled);
|
||||
REQUIRE(txn.size<0>() == txn.size());
|
||||
REQUIRE(txn.size<1>() == txn.size());
|
||||
REQUIRE(txn.size<2>() == txn.size());
|
||||
|
||||
// row only retrievable via index with updated field value
|
||||
REQUIRE(!txn.get<0>("other", out));
|
||||
out.firstName.clear();
|
||||
out.lastName.clear();
|
||||
REQUIRE(txn.get<0>("another", out));
|
||||
REQUIRE(out.firstName == "another");
|
||||
REQUIRE(out.lastName == "testperson");
|
||||
|
||||
// modify existing row via modify function
|
||||
txn.modify(3, [] (Member &member) { member.firstName = "yetanother"; });
|
||||
REQUIRE(!txn.get<0>("another", out));
|
||||
REQUIRE(txn.get<0>("yetanother", out));
|
||||
REQUIRE(out.firstName == "yetanother");
|
||||
REQUIRE(out.lastName == "testperson");
|
||||
REQUIRE(out.enrolled == m.enrolled);
|
||||
|
||||
txn.abort();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue