diff --git a/test/test_select.cpp b/test/test_select.cpp index e15f83a7e6c1460d40c299ab2d19879f604420dd..3ebf4357274acf87b478c84badc0b1aed32c2400 100644 --- a/test/test_select.cpp +++ b/test/test_select.cpp @@ -19,31 +19,43 @@ * along with this program. If not, see <https://www.gnu.org/licenses/>. * */ -#include "caosdb/connection.h" // for Connection, ConnectionManager -#include "caosdb/data_type.h" // for AtomicDataType -#include "caosdb/transaction.h" // for Transaction, ResultTable -#include "caosdb/value.h" // for Value -#include <gtest/gtest-message.h> // for Message -#include <gtest/gtest-test-part.h> // for SuiteApiResolver, TestFactoryImpl -#include <gtest/gtest_pred_impl.h> // for Test, TestInfo, EXPECT_EQ, TEST -#include <memory> // for allocator, unique_ptr, __shared_p... - // +#include "caosdb/connection.h" // for Connection, ConnectionManager +#include "caosdb/data_type.h" // for AtomicDataType +#include "caosdb/entity.h" // for Entity, Property, Role, Parent +#include "caosdb/result_set.h" // for Entity, ResultSet, ResultSet::ite... +#include "caosdb/result_table.h" // for ResultTable::HeaderIterator, Resu... +#include "caosdb/transaction.h" // for Transaction, ResultTable +#include "caosdb/value.h" // for Value +#include <gtest/gtest-message.h> // for Message +#include <gtest/gtest-test-part.h> // for SuiteApiResolver, TestFactoryImpl +#include <gtest/gtest_pred_impl.h> // for Test, TestInfo, EXPECT_EQ, TEST +#include <iostream> // for operator<<, basic_ostream::operat... +#include <memory> // for allocator, unique_ptr, __shared_p... +#include <string> // for string + namespace caosdb::transaction { using caosdb::entity::AtomicDataType; -using caosdb::entity::Role; -using caosdb::entity::Property; -using caosdb::entity::Parent; using caosdb::entity::Entity; +using caosdb::entity::Parent; +using caosdb::entity::Property; +using caosdb::entity::Role; using caosdb::entity::Value; class test_select : public ::testing::Test { public: + static void InsertEntity(Entity *entity) { + const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection(); + auto insert_transaction(connection->CreateTransaction()); + insert_transaction->InsertEntity(entity); + insert_transaction->Execute(); + } static void DeleteEntities() { // delete all entities const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection(); auto query_transaction(connection->CreateTransaction()); - query_transaction->Query("FIND Test*"); + query_transaction->Query("FIND Entity"); + // query_transaction->Query("FIND Test*"); query_transaction->Execute(); if (query_transaction->GetResultSet().size() > 0) { std::cout << "Cleanup: Deleting " << query_transaction->GetResultSet().size() << " entities." @@ -56,22 +68,24 @@ public: } } - static auto CreateTestProp() -> Entity { + static auto CreateTestProp(const std::string &name, AtomicDataType data_type) -> Entity { Entity entity; entity.SetRole(Role::PROPERTY); - entity.SetName("TestProp"); - entity.SetDataType(AtomicDataType::TEXT); + entity.SetName(name); + entity.SetDescription("Prop Description " + name); + entity.SetDataType(data_type); return entity; } static auto CreateTestRT() -> Entity { Entity entity; entity.SetRole(Role::RECORD_TYPE); + entity.SetDescription("RT Description"); entity.SetName("TestRT"); return entity; } - static auto CreateRecord(const std::string &property_name, Value value) -> Entity { + static auto CreateRecord(const std::string &property_name, const Value &value) -> Entity { Entity entity; entity.SetRole(Role::RECORD); Parent parent; @@ -82,6 +96,11 @@ public: property.SetValue(value); entity.AppendProperty(property); + Property dummyProperty; + dummyProperty.SetName("TestProp2"); + dummyProperty.SetValue("dummy value"); + entity.AppendProperty(dummyProperty); + return entity; } @@ -93,19 +112,50 @@ protected: const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection(); auto insert_transaction(connection->CreateTransaction()); - insert_transaction->InsertEntity(CreateTestRT()); - insert_transaction->InsertEntity(CreateTestProp()); + auto rt = CreateTestRT(); + insert_transaction->InsertEntity(&rt); + auto p = CreateTestProp("TestProp", AtomicDataType::TEXT); + insert_transaction->InsertEntity(&p); + p = CreateTestProp("TestProp2", AtomicDataType::TEXT); + insert_transaction->InsertEntity(&p); + p = CreateTestProp("TestPropDouble", AtomicDataType::DOUBLE); + p.SetUnit("m"); + insert_transaction->InsertEntity(&p); + p = CreateTestProp("TestPropInt", AtomicDataType::INTEGER); + p.SetUnit("m"); + insert_transaction->InsertEntity(&p); + p = CreateTestProp("TestPropBool", AtomicDataType::BOOLEAN); + insert_transaction->InsertEntity(&p); insert_transaction->Execute(); } - void TearDown() override { - DeleteEntities(); - } + void TearDown() override { DeleteEntities(); } }; /* * Test select query on empty database. */ +TEST_F(test_select, test_select_empy) { + test_select::DeleteEntities(); + const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection(); + + auto query_transaction(connection->CreateTransaction()); + query_transaction->Query("SELECT name FROM RecordType TestRT"); + query_transaction->Execute(); + EXPECT_EQ(query_transaction->GetResultTable().GetHeader().size(), 1); + for (const auto &column : query_transaction->GetResultTable().GetHeader()) { + EXPECT_EQ(column.GetName(), "name"); + } + + EXPECT_EQ(query_transaction->GetResultTable().size(), 0); + for (const auto &row : query_transaction->GetResultTable().GetRows()) { + EXPECT_EQ(row.GetValue("name").GetAsString(), "bla"); // should never be executed + } +} + +/* + * Test select name query on record type. + */ TEST_F(test_select, test_select_name) { const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection(); @@ -113,13 +163,152 @@ TEST_F(test_select, test_select_name) { query_transaction->Query("SELECT name FROM RecordType TestRT"); query_transaction->Execute(); EXPECT_EQ(query_transaction->GetResultTable().GetHeader().size(), 1); - for(const auto &column : query_transaction->GetResultTable().GetHeader()) { + for (const auto &column : query_transaction->GetResultTable().GetHeader()) { EXPECT_EQ(column.GetName(), "name"); } EXPECT_EQ(query_transaction->GetResultTable().size(), 1); - for(const auto &row : query_transaction->GetResultTable().GetRows()) { - EXPECT_EQ(row.GetValue("name").GetAsString(), "bla"); + for (const auto &row : query_transaction->GetResultTable().GetRows()) { + EXPECT_EQ(row.GetValue("name").GetAsString(), "TestRT"); + } +} + +/* + * Test select description query on record type. + */ +TEST_F(test_select, test_select_description) { + const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection(); + + auto query_transaction(connection->CreateTransaction()); + query_transaction->Query("SELECT description FROM RecordType TestRT"); + query_transaction->Execute(); + EXPECT_EQ(query_transaction->GetResultTable().GetHeader().size(), 1); + for (const auto &column : query_transaction->GetResultTable().GetHeader()) { + EXPECT_EQ(column.GetName(), "description"); + } + + EXPECT_EQ(query_transaction->GetResultTable().size(), 1); + for (const auto &row : query_transaction->GetResultTable().GetRows()) { + EXPECT_EQ(row.GetValue("description").GetAsString(), "RT Description"); + } +} + +/* + * Test select TestProp query on record. + */ +TEST_F(test_select, test_select_testprop) { + const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection(); + auto entity = test_select::CreateRecord("TestProp", Value("val1")); + test_select::InsertEntity(&entity); + + auto query_transaction(connection->CreateTransaction()); + query_transaction->Query("SELECT TestProp FROM Record TestRT"); + query_transaction->Execute(); + EXPECT_EQ(query_transaction->GetResultTable().GetHeader().size(), 1); + for (const auto &column : query_transaction->GetResultTable().GetHeader()) { + EXPECT_EQ(column.GetName(), "TestProp"); + } + + EXPECT_EQ(query_transaction->GetResultTable().size(), 1); + for (const auto &row : query_transaction->GetResultTable().GetRows()) { + EXPECT_EQ(row.GetValue("TestProp").GetAsString(), "val1"); + } +} + +/* + * Test select double value query on record. + */ +TEST_F(test_select, test_select_double) { + const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection(); + auto entity = test_select::CreateRecord("TestPropDouble", Value(2.123)); + test_select::InsertEntity(&entity); + + auto query_transaction(connection->CreateTransaction()); + query_transaction->Query("SELECT TestPropDouble FROM Record TestRT"); + query_transaction->Execute(); + EXPECT_EQ(query_transaction->GetResultTable().GetHeader().size(), 1); + for (const auto &column : query_transaction->GetResultTable().GetHeader()) { + EXPECT_EQ(column.GetName(), "TestPropDouble"); + } + + EXPECT_EQ(query_transaction->GetResultTable().size(), 1); + for (const auto &row : query_transaction->GetResultTable().GetRows()) { + EXPECT_TRUE(row.GetValue("TestPropDouble").IsDouble()); + EXPECT_EQ(row.GetValue("TestPropDouble").GetAsDouble(), 2.123); + } +} + +/* + * Test select unit value query on record. + */ +TEST_F(test_select, test_select_unit) { + const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection(); + auto entity = test_select::CreateRecord("TestPropDouble", Value(2.123)); + test_select::InsertEntity(&entity); + + auto check(connection->CreateTransaction()); + check->Query("FIND Record TestRT"); + check->Execute(); + std::cout << check->GetResultSet().at(0).ToString() << std::endl; + + auto query_transaction(connection->CreateTransaction()); + query_transaction->Query("SELECT TestPropDouble.unit FROM Record TestRT"); + query_transaction->Execute(); + EXPECT_EQ(query_transaction->GetResultTable().GetHeader().size(), 1); + for (const auto &column : query_transaction->GetResultTable().GetHeader()) { + EXPECT_EQ(column.GetName(), "TestPropDouble.unit"); + } + + EXPECT_EQ(query_transaction->GetResultTable().size(), 1); + for (const auto &row : query_transaction->GetResultTable().GetRows()) { + EXPECT_FALSE(row.GetValue("TestPropDouble.unit").IsNull()); + EXPECT_EQ(row.GetValue("TestPropDouble.unit").GetAsString(), "m"); + } +} + +/* + * Test select int value query on record. + */ +TEST_F(test_select, test_select_int) { + const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection(); + auto entity = test_select::CreateRecord("TestPropInt", Value(1234)); + test_select::InsertEntity(&entity); + + auto query_transaction(connection->CreateTransaction()); + query_transaction->Query("SELECT TestPropInt FROM Record TestRT"); + query_transaction->Execute(); + EXPECT_EQ(query_transaction->GetResultTable().GetHeader().size(), 1); + for (const auto &column : query_transaction->GetResultTable().GetHeader()) { + EXPECT_EQ(column.GetName(), "TestPropInt"); + } + + EXPECT_EQ(query_transaction->GetResultTable().size(), 1); + for (const auto &row : query_transaction->GetResultTable().GetRows()) { + EXPECT_TRUE(row.GetValue("TestPropInt").IsInt64()); + EXPECT_EQ(row.GetValue("TestPropInt").GetAsInt64(), 1234); + } +} + +/* + * Test select boolean value query on record. + */ +TEST_F(test_select, test_select_boolean) { + const auto &connection = caosdb::connection::ConnectionManager::GetDefaultConnection(); + auto entity = test_select::CreateRecord("TestPropBool", Value(true)); + test_select::InsertEntity(&entity); + + auto query_transaction(connection->CreateTransaction()); + query_transaction->Query("SELECT TestPropBool FROM Record TestRT"); + query_transaction->Execute(); + EXPECT_EQ(query_transaction->GetResultTable().GetHeader().size(), 1); + for (const auto &column : query_transaction->GetResultTable().GetHeader()) { + EXPECT_EQ(column.GetName(), "TestPropBool"); + } + + EXPECT_EQ(query_transaction->GetResultTable().size(), 1); + for (const auto &row : query_transaction->GetResultTable().GetRows()) { + EXPECT_TRUE(row.GetValue("TestPropBool").IsBool()); + EXPECT_EQ(row.GetValue("TestPropBool").GetAsBool(), true); } }