add tests for sqlite::Database

This commit is contained in:
falsycat 2023-09-03 13:01:40 +09:00
parent 8ae5d36629
commit 76df900a67
3 changed files with 113 additions and 0 deletions

View File

@ -43,6 +43,8 @@ target_sources(nf7_core_test
luajit/lambda_test.cc
luajit/thread_test.cc
luajit/thread_test.hh
sqlite/database_test.cc
sqlite/database_test.hh
uv/context_test.hh
uv/concurrency_test.cc
uv/file_test.cc

View File

@ -0,0 +1,84 @@
// No copyright
#include "core/sqlite/database.hh"
#include "core/sqlite/database_test.hh"
#include <gtest/gtest.h>
#include <string>
#include <vector>
#include "iface/subsys/database.hh"
using SQLiteDatabase = nf7::core::sqlite::test::DatabaseFixture;
TEST_F(SQLiteDatabase, CreateTable) {
const auto db = env().Get<nf7::subsys::Database>();
const auto fu = db->Exec("CREATE TABLE tbl (a, b, c);");
ConsumeTasks();
EXPECT_NO_THROW(fu.value());
}
TEST_F(SQLiteDatabase, SelectOneShot) {
const auto db = env().Get<nf7::subsys::Database>();
std::vector<std::string> rows;
const auto fu = db->Exec(
"CREATE TABLE tbl (idx, spell);"
"INSERT INTO tbl VALUES (0, 'zero');"
"INSERT INTO tbl VALUES (1, 'one');"
"INSERT INTO tbl VALUES (2, 'two');"
"SELECT * FROM tbl ORDER BY idx DESC;",
[&](auto& x) {
rows.push_back(std::get<std::string>(x.Fetch(1)));
return true;
});
ConsumeTasks();
EXPECT_NO_THROW(fu.value());
ASSERT_EQ(rows.size(), 3);
EXPECT_EQ(rows[2], "zero");
EXPECT_EQ(rows[1], "one");
EXPECT_EQ(rows[0], "two");
}
TEST_F(SQLiteDatabase, InsertMultiShot) {
const auto db = env().Get<nf7::subsys::Database>();
db->Exec("CREATE TABLE tbl (idx, spell);");
db->Compile("INSERT INTO tbl VALUES (?, ?);")
.Then([](auto& x) {
x->Run([](auto& x) {
x.Reset();
x.Bind(uint64_t {1}, int64_t {0});
x.Bind(uint64_t {2}, std::string {"zero"});
x.Exec();
x.Reset();
x.Bind(uint64_t {1}, int64_t {1});
x.Bind(uint64_t {2}, std::string {"one"});
x.Exec();
x.Reset();
x.Bind(uint64_t {1}, int64_t {2});
x.Bind(uint64_t {2}, std::string {"two"});
x.Exec();
});
});
ConsumeTasks();
std::vector<std::string> rows;
const auto fu = db->Exec(
"SELECT * FROM tbl ORDER BY idx ASC;",
[&](auto& x) {
rows.push_back(std::get<std::string>(x.Fetch(1)));
return true;
});
ConsumeTasks();
EXPECT_NO_THROW(fu.value());
ASSERT_EQ(rows.size(), 3);
EXPECT_EQ(rows[0], "zero");
EXPECT_EQ(rows[1], "one");
EXPECT_EQ(rows[2], "two");
}

View File

@ -0,0 +1,27 @@
// No copyright
#pragma once
#include "core/sqlite/database.hh"
#include <gtest/gtest.h>
#include <chrono>
#include <memory>
#include "iface/env_test.hh"
namespace nf7::core::sqlite::test {
class DatabaseFixture : public nf7::test::EnvFixtureWithTasking {
public:
DatabaseFixture()
: nf7::test::EnvFixtureWithTasking({
{typeid(nf7::subsys::Database), [](auto& env) {
return std::make_shared<Database>(env, ":memory:");
}},
}) {
}
};
} // namespace nf7::core::sqlite::test