diff --git a/tests/data/mostlyharmless_DatabaseStateTests.cpp b/tests/data/mostlyharmless_DatabaseStateTests.cpp index 29c4475..001744d 100644 --- a/tests/data/mostlyharmless_DatabaseStateTests.cpp +++ b/tests/data/mostlyharmless_DatabaseStateTests.cpp @@ -8,104 +8,104 @@ #include namespace mostly_harmless::testing { - // template - // auto tryCreateDatabase(const std::filesystem::path& destination, const std::vector>& initialValues) -> std::optional { - // auto databaseOpt = data::DatabaseState::tryCreate(destination, initialValues); - // if constexpr (!ShouldSucceed) { - // REQUIRE(!databaseOpt); - // return {}; - // } else { - // REQUIRE(databaseOpt); - // return databaseOpt; - // } - // } - // - // TEST_CASE("Test DatabaseState") { - // auto tempDir = utils::directories::getDirectory(utils::directories::DirectoryType::Temp); - // if (!tempDir) { - // REQUIRE(false); - // } - // auto dbFile = *tempDir / "moha_test_db.sqlite"; - // SECTION("Test Valid Location, with no initial values") { - // { - // auto databaseOpt = tryCreateDatabase(dbFile, {}); - // auto& database = *databaseOpt; - // REQUIRE_NOTHROW(database.set("Hello", "World")); - // const auto retrieved = database.get("Hello"); - // REQUIRE(retrieved.has_value()); - // REQUIRE(*retrieved == "World"); - // REQUIRE(!database.get("aaaaa")); - // } - // { - // std::vector> initialValues; - // initialValues.emplace_back("IntTest", 10); - // initialValues.emplace_back("DoubleTest", 15.0); - // auto databaseOpt = tryCreateDatabase(dbFile, initialValues); - // auto& database = *databaseOpt; - // auto retrievedDouble = database.get("DoubleTest"); - // REQUIRE(retrievedDouble.has_value()); - // REQUIRE_THAT(retrievedDouble.value(), Catch::Matchers::WithinRel(15.0)); - // database.set("DoubleTest", 20.0); - // retrievedDouble = database.get("DoubleTest"); - // REQUIRE(retrievedDouble.has_value()); - // REQUIRE_THAT(retrievedDouble.value(), Catch::Matchers::WithinRel(20.0)); - // auto database2Opt = tryCreateDatabase(dbFile, initialValues); - // auto& database2 = *database2Opt; - // retrievedDouble = database2.get("DoubleTest"); - // REQUIRE(retrievedDouble.has_value()); - // REQUIRE_THAT(retrievedDouble.value(), Catch::Matchers::WithinRel(20.0)); - // } - // - // std::filesystem::remove(dbFile); - // } - // - // SECTION("Test Invalid Location") { - // tryCreateDatabase("INVALID LOCATION", {}); - // } - // SECTION("Test In-Memory") { - // tryCreateDatabase(":memory:", {}); - // } - // - // SECTION("Test Duplicate") { - // { - // auto connectionAOpt = tryCreateDatabase(dbFile, { { "test", "aaaa" } }); - // auto& databaseA = *connectionAOpt; - // auto connectionBOpt = databaseA.duplicate(); - // REQUIRE(connectionBOpt.has_value()); - // auto& databaseB = *connectionBOpt; - // auto retrievalOpt = databaseB.get("test"); - // REQUIRE(retrievalOpt.has_value()); - // REQUIRE(*retrievalOpt == "aaaa"); - // } - // std::filesystem::remove(dbFile); - // } - // - // SECTION("Test DatabasePropertyWatcher") { - // for (auto i = 0; i < 100; ++i) { - // { - // auto databaseOpt = tryCreateDatabase(dbFile, { { "test", 0 } }); - // auto& database = *databaseOpt; - // std::atomic wasPropertyChanged{ false }; - // std::atomic newValue{ 0 }; - // { - // auto onPropertyChanged = [&wasPropertyChanged, &newValue](const auto& x) -> void { - // wasPropertyChanged.store(true); - // newValue = x; - // }; - // auto listener = data::DatabasePropertyWatcher::tryCreate(database, "test", 1, std::move(onPropertyChanged)); - // REQUIRE(listener); - // database.set("test", 10); - // std::this_thread::sleep_for(std::chrono::milliseconds(50)); - // REQUIRE(wasPropertyChanged.load()); - // database.set("test", 20); - // std::this_thread::sleep_for(std::chrono::milliseconds(50)); - // REQUIRE(newValue == 20); - // database.set("test", 30); - // } - // } - // std::filesystem::remove(dbFile); - // } - // } - // } + template + auto tryCreateDatabase(const std::filesystem::path& destination, const std::vector>& initialValues) -> std::optional { + auto databaseOpt = data::DatabaseState::tryCreate(destination, initialValues); + if constexpr (!ShouldSucceed) { + REQUIRE(!databaseOpt); + return {}; + } else { + REQUIRE(databaseOpt); + return databaseOpt; + } + } + + TEST_CASE("Test DatabaseState") { + auto tempDir = utils::directories::getDirectory(utils::directories::DirectoryType::Temp); + if (!tempDir) { + REQUIRE(false); + } + auto dbFile = *tempDir / "moha_test_db.sqlite"; + SECTION("Test Valid Location, with no initial values") { + { + auto databaseOpt = tryCreateDatabase(dbFile, {}); + auto& database = *databaseOpt; + REQUIRE_NOTHROW(database.set("Hello", "World")); + const auto retrieved = database.get("Hello"); + REQUIRE(retrieved.has_value()); + REQUIRE(*retrieved == "World"); + REQUIRE(!database.get("aaaaa")); + } + { + std::vector> initialValues; + initialValues.emplace_back("IntTest", 10); + initialValues.emplace_back("DoubleTest", 15.0); + auto databaseOpt = tryCreateDatabase(dbFile, initialValues); + auto& database = *databaseOpt; + auto retrievedDouble = database.get("DoubleTest"); + REQUIRE(retrievedDouble.has_value()); + REQUIRE_THAT(retrievedDouble.value(), Catch::Matchers::WithinRel(15.0)); + database.set("DoubleTest", 20.0); + retrievedDouble = database.get("DoubleTest"); + REQUIRE(retrievedDouble.has_value()); + REQUIRE_THAT(retrievedDouble.value(), Catch::Matchers::WithinRel(20.0)); + auto database2Opt = tryCreateDatabase(dbFile, initialValues); + auto& database2 = *database2Opt; + retrievedDouble = database2.get("DoubleTest"); + REQUIRE(retrievedDouble.has_value()); + REQUIRE_THAT(retrievedDouble.value(), Catch::Matchers::WithinRel(20.0)); + } + + std::filesystem::remove(dbFile); + } + + SECTION("Test Invalid Location") { + tryCreateDatabase("INVALID LOCATION", {}); + } + SECTION("Test In-Memory") { + tryCreateDatabase(":memory:", {}); + } + + SECTION("Test Duplicate") { + { + auto connectionAOpt = tryCreateDatabase(dbFile, { { "test", "aaaa" } }); + auto& databaseA = *connectionAOpt; + auto connectionBOpt = databaseA.duplicate(); + REQUIRE(connectionBOpt.has_value()); + auto& databaseB = *connectionBOpt; + auto retrievalOpt = databaseB.get("test"); + REQUIRE(retrievalOpt.has_value()); + REQUIRE(*retrievalOpt == "aaaa"); + } + std::filesystem::remove(dbFile); + } + + SECTION("Test DatabasePropertyWatcher") { + for (auto i = 0; i < 100; ++i) { + { + auto databaseOpt = tryCreateDatabase(dbFile, { { "test", 0 } }); + auto& database = *databaseOpt; + std::atomic wasPropertyChanged{ false }; + std::atomic newValue{ 0 }; + { + auto onPropertyChanged = [&wasPropertyChanged, &newValue](const auto& x) -> void { + wasPropertyChanged.store(true); + newValue = x; + }; + auto listener = data::DatabasePropertyWatcher::tryCreate(database, "test", 1, std::move(onPropertyChanged)); + REQUIRE(listener); + database.set("test", 10); + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + REQUIRE(wasPropertyChanged.load()); + database.set("test", 20); + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + REQUIRE(newValue == 20); + database.set("test", 30); + } + } + std::filesystem::remove(dbFile); + } + } + } } // namespace mostly_harmless::testing \ No newline at end of file