88#include < catch2/matchers/catch_matchers_floating_point.hpp>
99
1010namespace mostly_harmless ::testing {
11- // template <bool ShouldSucceed>
12- // auto tryCreateDatabase(const std::filesystem::path& destination, const std::vector<std::pair<std::string, data::DatabaseValueVariant>>& initialValues) -> std::optional<data::DatabaseState> {
13- // auto databaseOpt = data::DatabaseState::tryCreate(destination, initialValues);
14- // if constexpr (!ShouldSucceed) {
15- // REQUIRE(!databaseOpt);
16- // return {};
17- // } else {
18- // REQUIRE(databaseOpt);
19- // return databaseOpt;
20- // }
21- // }
22- //
23- // TEST_CASE("Test DatabaseState") {
24- // auto tempDir = utils::directories::getDirectory(utils::directories::DirectoryType::Temp);
25- // if (!tempDir) {
26- // REQUIRE(false);
27- // }
28- // auto dbFile = *tempDir / "moha_test_db.sqlite";
29- // SECTION("Test Valid Location, with no initial values") {
30- // {
31- // auto databaseOpt = tryCreateDatabase<true>(dbFile, {});
32- // auto& database = *databaseOpt;
33- // REQUIRE_NOTHROW(database.set<std::string>("Hello", "World"));
34- // const auto retrieved = database.get<std::string>("Hello");
35- // REQUIRE(retrieved.has_value());
36- // REQUIRE(*retrieved == "World");
37- // REQUIRE(!database.get<int>("aaaaa"));
38- // }
39- // {
40- // std::vector<std::pair<std::string, data::DatabaseValueVariant>> initialValues;
41- // initialValues.emplace_back("IntTest", 10);
42- // initialValues.emplace_back("DoubleTest", 15.0);
43- // auto databaseOpt = tryCreateDatabase<true>(dbFile, initialValues);
44- // auto& database = *databaseOpt;
45- // auto retrievedDouble = database.get<double>("DoubleTest");
46- // REQUIRE(retrievedDouble.has_value());
47- // REQUIRE_THAT(retrievedDouble.value(), Catch::Matchers::WithinRel(15.0));
48- // database.set<double>("DoubleTest", 20.0);
49- // retrievedDouble = database.get<double>("DoubleTest");
50- // REQUIRE(retrievedDouble.has_value());
51- // REQUIRE_THAT(retrievedDouble.value(), Catch::Matchers::WithinRel(20.0));
52- // auto database2Opt = tryCreateDatabase<true>(dbFile, initialValues);
53- // auto& database2 = *database2Opt;
54- // retrievedDouble = database2.get<double>("DoubleTest");
55- // REQUIRE(retrievedDouble.has_value());
56- // REQUIRE_THAT(retrievedDouble.value(), Catch::Matchers::WithinRel(20.0));
57- // }
58- //
59- // std::filesystem::remove(dbFile);
60- // }
61- //
62- // SECTION("Test Invalid Location") {
63- // tryCreateDatabase<false>("INVALID LOCATION", {});
64- // }
65- // SECTION("Test In-Memory") {
66- // tryCreateDatabase<true>(":memory:", {});
67- // }
68- //
69- // SECTION("Test Duplicate") {
70- // {
71- // auto connectionAOpt = tryCreateDatabase<true>(dbFile, { { "test", "aaaa" } });
72- // auto& databaseA = *connectionAOpt;
73- // auto connectionBOpt = databaseA.duplicate();
74- // REQUIRE(connectionBOpt.has_value());
75- // auto& databaseB = *connectionBOpt;
76- // auto retrievalOpt = databaseB.get<std::string>("test");
77- // REQUIRE(retrievalOpt.has_value());
78- // REQUIRE(*retrievalOpt == "aaaa");
79- // }
80- // std::filesystem::remove(dbFile);
81- // }
82- //
83- // SECTION("Test DatabasePropertyWatcher") {
84- // for (auto i = 0; i < 100; ++i) {
85- // {
86- // auto databaseOpt = tryCreateDatabase<true>(dbFile, { { "test", 0 } });
87- // auto& database = *databaseOpt;
88- // std::atomic<bool> wasPropertyChanged{ false };
89- // std::atomic<int> newValue{ 0 };
90- // {
91- // auto onPropertyChanged = [&wasPropertyChanged, &newValue](const auto& x) -> void {
92- // wasPropertyChanged.store(true);
93- // newValue = x;
94- // };
95- // auto listener = data::DatabasePropertyWatcher<int>::tryCreate(database, "test", 1, std::move(onPropertyChanged));
96- // REQUIRE(listener);
97- // database.set<int>("test", 10);
98- // std::this_thread::sleep_for(std::chrono::milliseconds(50));
99- // REQUIRE(wasPropertyChanged.load());
100- // database.set<int>("test", 20);
101- // std::this_thread::sleep_for(std::chrono::milliseconds(50));
102- // REQUIRE(newValue == 20);
103- // database.set<int>("test", 30);
104- // }
105- // }
106- // std::filesystem::remove(dbFile);
107- // }
108- // }
109- // }
11+ template <bool ShouldSucceed>
12+ auto tryCreateDatabase (const std::filesystem::path& destination, const std::vector<std::pair<std::string, data::DatabaseValueVariant>>& initialValues) -> std::optional<data::DatabaseState> {
13+ auto databaseOpt = data::DatabaseState::tryCreate (destination, initialValues);
14+ if constexpr (!ShouldSucceed) {
15+ REQUIRE (!databaseOpt);
16+ return {};
17+ } else {
18+ REQUIRE (databaseOpt);
19+ return databaseOpt;
20+ }
21+ }
22+
23+ TEST_CASE (" Test DatabaseState" ) {
24+ auto tempDir = utils::directories::getDirectory (utils::directories::DirectoryType::Temp);
25+ if (!tempDir) {
26+ REQUIRE (false );
27+ }
28+ auto dbFile = *tempDir / " moha_test_db.sqlite" ;
29+ SECTION (" Test Valid Location, with no initial values" ) {
30+ {
31+ auto databaseOpt = tryCreateDatabase<true >(dbFile, {});
32+ auto & database = *databaseOpt;
33+ REQUIRE_NOTHROW (database.set <std::string>(" Hello" , " World" ));
34+ const auto retrieved = database.get <std::string>(" Hello" );
35+ REQUIRE (retrieved.has_value ());
36+ REQUIRE (*retrieved == " World" );
37+ REQUIRE (!database.get <int >(" aaaaa" ));
38+ }
39+ {
40+ std::vector<std::pair<std::string, data::DatabaseValueVariant>> initialValues;
41+ initialValues.emplace_back (" IntTest" , 10 );
42+ initialValues.emplace_back (" DoubleTest" , 15.0 );
43+ auto databaseOpt = tryCreateDatabase<true >(dbFile, initialValues);
44+ auto & database = *databaseOpt;
45+ auto retrievedDouble = database.get <double >(" DoubleTest" );
46+ REQUIRE (retrievedDouble.has_value ());
47+ REQUIRE_THAT (retrievedDouble.value (), Catch::Matchers::WithinRel (15.0 ));
48+ database.set <double >(" DoubleTest" , 20.0 );
49+ retrievedDouble = database.get <double >(" DoubleTest" );
50+ REQUIRE (retrievedDouble.has_value ());
51+ REQUIRE_THAT (retrievedDouble.value (), Catch::Matchers::WithinRel (20.0 ));
52+ auto database2Opt = tryCreateDatabase<true >(dbFile, initialValues);
53+ auto & database2 = *database2Opt;
54+ retrievedDouble = database2.get <double >(" DoubleTest" );
55+ REQUIRE (retrievedDouble.has_value ());
56+ REQUIRE_THAT (retrievedDouble.value (), Catch::Matchers::WithinRel (20.0 ));
57+ }
58+
59+ std::filesystem::remove (dbFile);
60+ }
61+
62+ SECTION (" Test Invalid Location" ) {
63+ tryCreateDatabase<false >(" INVALID LOCATION" , {});
64+ }
65+ SECTION (" Test In-Memory" ) {
66+ tryCreateDatabase<true >(" :memory:" , {});
67+ }
68+
69+ SECTION (" Test Duplicate" ) {
70+ {
71+ auto connectionAOpt = tryCreateDatabase<true >(dbFile, { { " test" , " aaaa" } });
72+ auto & databaseA = *connectionAOpt;
73+ auto connectionBOpt = databaseA.duplicate ();
74+ REQUIRE (connectionBOpt.has_value ());
75+ auto & databaseB = *connectionBOpt;
76+ auto retrievalOpt = databaseB.get <std::string>(" test" );
77+ REQUIRE (retrievalOpt.has_value ());
78+ REQUIRE (*retrievalOpt == " aaaa" );
79+ }
80+ std::filesystem::remove (dbFile);
81+ }
82+
83+ SECTION (" Test DatabasePropertyWatcher" ) {
84+ for (auto i = 0 ; i < 100 ; ++i) {
85+ {
86+ auto databaseOpt = tryCreateDatabase<true >(dbFile, { { " test" , 0 } });
87+ auto & database = *databaseOpt;
88+ std::atomic<bool > wasPropertyChanged{ false };
89+ std::atomic<int > newValue{ 0 };
90+ {
91+ auto onPropertyChanged = [&wasPropertyChanged, &newValue](const auto & x) -> void {
92+ wasPropertyChanged.store (true );
93+ newValue = x;
94+ };
95+ auto listener = data::DatabasePropertyWatcher<int >::tryCreate (database, " test" , 1 , std::move (onPropertyChanged));
96+ REQUIRE (listener);
97+ database.set <int >(" test" , 10 );
98+ std::this_thread::sleep_for (std::chrono::milliseconds (50 ));
99+ REQUIRE (wasPropertyChanged.load ());
100+ database.set <int >(" test" , 20 );
101+ std::this_thread::sleep_for (std::chrono::milliseconds (50 ));
102+ REQUIRE (newValue == 20 );
103+ database.set <int >(" test" , 30 );
104+ }
105+ }
106+ std::filesystem::remove (dbFile);
107+ }
108+ }
109+ }
110110
111111} // namespace mostly_harmless::testing
0 commit comments