-
Joscha Schmiedt authored
TODO: Add tests checking support for caosdb_client.json
Joscha Schmiedt authoredTODO: Add tests checking support for caosdb_client.json
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
test_protobuf.cpp 4.52 KiB
/*
*
* This file is a part of the LinkAhead Project.
*
* Copyright (C) 2021 Timm Fitschen <t.fitschen@indiscale.com>
* Copyright (C) 2021-2024 IndiScale GmbH <info@indiscale.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
#include "linkahead/data_type.h" // for DataType, ReferenceDataType
#include "linkahead/entity.h" // for Entity
#include "caosdb/entity/v1/main.pb.h" // for RepeatedPtrField, Message
#include <google/protobuf/arena.h> // for Arena
#include <gtest/gtest.h>
#include <gtest/gtest-message.h> // for Message
#include <gtest/gtest-test-part.h> // for SuiteApiResolver, TestPa...
#include <gtest/gtest_pred_impl.h> // for Test, TestInfo, TEST
#include <memory> // for allocator
namespace linkahead {
using ProtoEntity = caosdb::entity::v1::Entity;
using caosdb::entity::v1::Message;
using google::protobuf::Arena;
using linkahead::entity::Entity;
TEST(test_protobuf, test_swap_trivial) {
Arena arena;
auto *message_source = Arena::CreateMessage<Message>(&arena);
message_source->set_code(1234);
message_source->set_description("desc");
auto *message_destination = Arena::CreateMessage<Message>(&arena);
EXPECT_EQ(message_source->code(), 1234);
EXPECT_EQ(message_source->description(), "desc");
EXPECT_EQ(message_destination->code(), 0);
EXPECT_EQ(message_destination->description(), "");
message_source->Swap(message_destination);
EXPECT_EQ(message_source->code(), 0);
EXPECT_EQ(message_source->description(), "");
EXPECT_EQ(message_destination->code(), 1234);
EXPECT_EQ(message_destination->description(), "desc");
}
TEST(test_protobuf, test_swap_nested) {
Arena arena;
auto *entity_source = Arena::CreateMessage<ProtoEntity>(&arena);
entity_source->set_id("entity_id");
auto *version_source = entity_source->mutable_version();
version_source->set_id("version_id");
auto *entity_destination = Arena::CreateMessage<ProtoEntity>(&arena);
auto *version_destination = entity_destination->mutable_version();
EXPECT_EQ(entity_source->id(), "entity_id");
EXPECT_EQ(entity_source->version().id(), "version_id");
EXPECT_EQ(version_source->id(), "version_id");
EXPECT_EQ(entity_destination->id(), "");
EXPECT_EQ(entity_destination->version().id(), "");
EXPECT_EQ(version_destination->id(), "");
entity_source->Swap(entity_destination);
EXPECT_EQ(entity_source->id(), "");
EXPECT_EQ(entity_source->version().id(), "");
EXPECT_EQ(entity_destination->id(), "entity_id");
EXPECT_EQ(entity_destination->version().id(), "version_id");
// has not been swapped!
EXPECT_EQ(version_source->id(), "version_id");
EXPECT_EQ(version_destination->id(), "");
// Member pointers to nested messages have been swapped
EXPECT_EQ(entity_source->mutable_version(), version_destination);
EXPECT_EQ(entity_destination->mutable_version(), version_source);
}
TEST(test_protobuf, test_copy_nested) {
Arena arena;
auto *entity_source = Arena::CreateMessage<ProtoEntity>(&arena);
auto *data_type_source = entity_source->mutable_data_type();
data_type_source->mutable_reference_data_type()->set_name("src_per");
auto *entity_destination = Arena::CreateMessage<ProtoEntity>(&arena);
auto *data_type_destination = entity_destination->mutable_data_type();
data_type_destination->mutable_reference_data_type()->set_name("dest_per");
EXPECT_EQ(entity_source->data_type().reference_data_type().name(), "src_per");
EXPECT_EQ(entity_destination->data_type().reference_data_type().name(), "dest_per");
entity_destination->CopyFrom(*entity_source);
EXPECT_EQ(entity_source->data_type().reference_data_type().name(), "src_per");
EXPECT_EQ(entity_destination->data_type().reference_data_type().name(), "src_per");
Entity entity(entity_destination);
EXPECT_EQ(entity.GetDataType().GetAsReference().GetName(), "src_per");
const Entity ©_entity(entity);
EXPECT_EQ(copy_entity.GetDataType().GetAsReference().GetName(), "src_per");
}
} // namespace linkahead