From e279661d7c617753d10d6ea3c8335e58bd7d6975 Mon Sep 17 00:00:00 2001 From: Daniel <d.hornung@indiscale.com> Date: Thu, 26 Aug 2021 13:11:51 +0200 Subject: [PATCH] TEST: Test for numeric values. Also switched to 32 bit integer values. --- CHANGELOG.md | 22 +++++++ CMakeLists.txt | 1 + test/CMakeLists.txt | 1 + test/test_transaction.cpp | 122 +++++++++++++++++++++++--------------- 4 files changed, 98 insertions(+), 48 deletions(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..449e425 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,22 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +### Added + +### Changed + +* Integer values are 32 bit now. + +### Deprecated + +### Removed + +### Fixed + +### Security diff --git a/CMakeLists.txt b/CMakeLists.txt index f367a02..e4c84cf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -54,6 +54,7 @@ add_subdirectory(test) ####################################################### option(AUTOFORMATTING "call clang-format at configure time" ON) if(AUTOFORMATTING) + message("Autoformatting is on. To disable, call cmake with '-D AUTOFORMATTING=OFF'.") file(GLOB format_test_sources test/*.cpp test/*.h) execute_process(COMMAND clang-format -i --verbose ${format_test_sources} WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index c388869..bfc0e7b 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -54,6 +54,7 @@ add_compiler_flag("-g") ####################################################### option(LINTING "clang-tidy and iwye" ON) if(LINTING) + message("Linting is on. To disable, call cmake with '-D LINTING=OFF'.") ### set paranoid compiler flags #add_compiler_flag("-Wall") #add_compiler_flag("-Wextra") diff --git a/test/test_transaction.cpp b/test/test_transaction.cpp index 9bc7e82..e6dd5c3 100644 --- a/test/test_transaction.cpp +++ b/test/test_transaction.cpp @@ -31,7 +31,7 @@ #include <boost/filesystem/path.hpp> // for path #include <boost/filesystem/path_traits.hpp> // for filesystem #include <boost/lexical_cast.hpp> -#include <gtest/gtest-message.h> // for Message +#include <gtest/gtest-message.h> // for Message #include <gtest/gtest-test-part.h> // for TestPartResult, SuiteApiResolver #include <gtest/gtest_pred_impl.h> // for Test, EXPECT_EQ, AssertionResult #include <iostream> @@ -48,27 +48,31 @@ using caosdb::entity::MessageCode; using caosdb::entity::Parent; using caosdb::entity::Property; using caosdb::entity::Role; +using caosdb::entity::Value; class test_transaction : public ::testing::Test { public: - - // public utility functions //////////////////////////////////////////////////////// + // public utility functions + // //////////////////////////////////////////////////////// /** * Generate a vector with useful values for testing. */ template <typename T> static auto generateValues() -> std::vector<T> { std::vector<T> values = { - 0, - 1, - std::numeric_limits<T>::max(), - std::numeric_limits<T>::min(), - std::numeric_limits<T>::lowest(), - std::numeric_limits<T>::epsilon() // 0 for integers, but who cares? + 0, 1, + // (T)6.91629132943846e-310, + std::numeric_limits<T>::max(), std::numeric_limits<T>::min(), + std::numeric_limits<T>::denorm_min(), std::numeric_limits<T>::lowest(), + std::numeric_limits<T>::epsilon() // 0 for integers, but who cares? }; + return values; } + template <typename T> static auto getValueAs(const Value &value) -> T { + throw std::logic_error("Template not implemented for this type."); + } static void DeleteEntities() { // delete all entities const auto &connection = @@ -77,6 +81,9 @@ public: query_transaction->Query("FIND ENTITY WITH id > 99"); query_transaction->Execute(); if (query_transaction->GetResultSet().size() > 0) { + std::cout << "Cleanup: Deleting " + << query_transaction->GetResultSet().size() << " entities." + << std::endl; auto delete_transaction(connection->CreateTransaction()); for (const Entity &entity : query_transaction->GetResultSet()) { delete_transaction->DeleteById(entity.GetId()); @@ -85,7 +92,6 @@ public: } } - protected: fs::path test_upload_file_1; fs::path test_download_file_1; @@ -112,9 +118,18 @@ protected: fs::remove(test_download_file_1); DeleteEntities(); } - }; +template <> +auto test_transaction::getValueAs<double>(const Value &value) -> double { + return value.AsDouble(); +} + +template <> +auto test_transaction::getValueAs<int32_t>(const Value &value) -> int32_t { + return value.AsInteger(); +} + /* * Test the retrieval of a non-existing entity * @@ -667,49 +682,60 @@ TEST_F(test_transaction, test_query) { /** * Test numeric values (template). */ -template<typename T> +template <typename T> auto test_numeric_values_impl(AtomicDataType a_type) -> void { const auto &connection = - caosdb::connection::ConnectionManager::GetDefaultConnection(); + caosdb::connection::ConnectionManager::GetDefaultConnection(); // Insert entities - auto insert_transaction(connection->CreateTransaction()); auto values_orig = test_transaction::generateValues<T>(); auto props_orig = std::vector<Entity>(); size_t i = 0; --i; for (auto value : values_orig) { ++i; + auto insert_transaction(connection->CreateTransaction()); Entity prop; prop.SetRole(Role::PROPERTY); - prop.SetName(std::string("Prop ") + boost::lexical_cast<std::string>(i)); + const auto name = + std::string("Prop ") + boost::lexical_cast<std::string>(i); + std::cout << "Creating: " << name << std::endl; + prop.SetName(name); prop.SetDataType(a_type); + std::cout << "Setting value " << value << std::endl; prop.SetValue(value); props_orig.push_back(prop); - insert_transaction->InsertEntity(&prop); + auto i_stat = insert_transaction->InsertEntity(&prop); + EXPECT_EQ(i_stat, StatusCode::READY); insert_transaction->ExecuteAsynchronously(); auto t_stat = insert_transaction->WaitForIt(); - ASSERT_TRUE(t_stat.IsTerminated()); - ASSERT_FALSE(t_stat.IsError()); + EXPECT_TRUE(t_stat.IsTerminated()); + EXPECT_FALSE(t_stat.IsError()); } // Retrieve and verify - auto retrieve_transaction(connection->CreateTransaction()); i = 0; --i; - for (auto value : values_orig) { + for (const auto value : values_orig) { ++i; - auto prop = props_orig[i]; - auto name = std::string("Prop ") + boost::lexical_cast<std::string>(i); - auto query = std::string("FIND ENTITY \"Prop ") + boost::lexical_cast<std::string>(i) + "\""; + auto retrieve_transaction(connection->CreateTransaction()); + const auto prop = props_orig[i]; + const auto name = + std::string("Prop ") + boost::lexical_cast<std::string>(i); + std::cout << "Retrieving: " << name << std::endl; + const auto query = std::string("FIND ENTITY \"") + name + "\""; retrieve_transaction->Query(query); retrieve_transaction->ExecuteAsynchronously(); - auto t_stat = retrieve_transaction->WaitForIt(); - ASSERT_TRUE(t_stat.IsTerminated()); - ASSERT_FALSE(t_stat.IsError()); - - auto result = retrieve_transaction->GetResultSet().at(0); - ASSERT_EQ(result.GetDataType(), a_type); + const auto t_stat = retrieve_transaction->WaitForIt(); + EXPECT_TRUE(t_stat.IsTerminated()); + EXPECT_FALSE(t_stat.IsError()); + + const auto result = retrieve_transaction->GetResultSet().at(0); + EXPECT_EQ(result.GetDataType(), a_type); + const auto &retrieved_value = + test_transaction::getValueAs<T>(result.GetValue()); + // std::cout << "retrieved_value: " << retrieved_value << std::endl; + EXPECT_EQ(retrieved_value, value); } } @@ -718,26 +744,26 @@ auto test_numeric_values_impl(AtomicDataType a_type) -> void { */ TEST_F(test_transaction, test_numeric_values) { test_numeric_values_impl<double>(AtomicDataType::DOUBLE); - DeleteEntities(); - test_numeric_values_impl<int64_t>(AtomicDataType::INTEGER); + test_transaction::DeleteEntities(); + test_numeric_values_impl<int32_t>(AtomicDataType::INTEGER); } -/* - * test miscellaneous queries - */ -TEST_F(test_transaction, test_queries_misc) { - const auto &connection = - caosdb::connection::ConnectionManager::GetDefaultConnection(); - - auto query_transaction(connection->CreateTransaction()); - query_transaction->Query("FIND Property \"Prop *\""); - query_transaction->ExecuteAsynchronously(); - auto t_stat = query_transaction->WaitForIt(); - std::cout << "status: " << t_stat.GetCode() << " // " - << t_stat.GetDescription() << std::endl; - - EXPECT_TRUE(t_stat.GetCode() >= 0); -} +// /* +// * test miscellaneous queries +// */ +// TEST_F(test_transaction, test_queries_misc) { +// const auto &connection = +// caosdb::connection::ConnectionManager::GetDefaultConnection(); + +// // query empty database +// auto query_transaction(connection->CreateTransaction()); +// query_transaction->Query("FIND Property \"Prop *\""); +// query_transaction->ExecuteAsynchronously(); +// auto t_stat = query_transaction->WaitForIt(); +// std::cout << "status: " << t_stat.GetCode() << " // " +// << t_stat.GetDescription() << std::endl; +// EXPECT_TRUE(t_stat.GetCode() >= 0); +// } /* * insert three recordtypes and the submit multiple queries in different @@ -1034,7 +1060,7 @@ TEST_F(test_transaction, test_full_workflow) { experiment_rec.AppendProperty(volt_for_rt); notes_for_rt2.SetValue("This is important!"); experiment_rec.AppendProperty(notes_for_rt2); - part_for_rt3.SetValue(static_cast<int64_t>(6)); + part_for_rt3.SetValue(static_cast<int32_t>(6)); experiment_rec.AppendProperty(part_for_rt3); succ_for_rt.SetValue(true); experiment_rec.AppendProperty(succ_for_rt); -- GitLab