ConceptCore/ccl/core/test/src/testOSSSourceFacet.cpp
2024-04-15 22:16:14 +03:00

393 lines
12 KiB
C++

#define GTEST_LANG_CXX11 1
#include "gtest/gtest.h"
#include "FakeSourceManager.hpp"
#include "ccl/env/cclEnvironment.h"
#include "ccl/oss/OSSchema.h"
class UTossSrcFacet: public ::testing::Test {
protected:
using Environment = ccl::Environment;
using SrcType = ccl::src::SrcType;
using Descriptor = ccl::src::Descriptor;
using PictID = ccl::oss::PictID;
using CstType = ccl::semantic::CstType;
using OSSchema = ccl::oss::OSSchema;
using ossSourceFacet = ccl::oss::ossSourceFacet;
protected:
OSSchema oss{};
ossSourceFacet& srcFacet{ oss.Src() };
void SetUp() override {
Environment::Instance().SetSourceManager(std::make_unique<FakeSourceManager>());
}
void TearDown() override {
Environment::Instance().SetSourceManager(std::make_unique<ccl::SourceManager>());
}
FakeSourceManager& SrcManager() {
return dynamic_cast<FakeSourceManager&>(Environment::Sources());
}
auto CreateBasicConnection() {
auto& src = SrcManager().CreateNewRS();
auto pid = oss.InsertBase()->uid;
srcFacet.ConnectPict2Src(pid, src);
return std::pair(&src, pid);
}
FakeTRS& Source(const PictID pid) {
return SrcManager().DummyCast(*srcFacet(pid)->src);
}
};
TEST_F(UTossSrcFacet, InvalidId) {
const ccl::oss::PictID someID{ 42U };
EXPECT_TRUE(srcFacet(someID) == nullptr);
EXPECT_TRUE(srcFacet.OpenSrc(someID) == nullptr);
EXPECT_TRUE(srcFacet.ActiveSrc(someID) == nullptr);
EXPECT_TRUE(srcFacet.DataFor(someID) == nullptr);
EXPECT_NO_THROW(srcFacet.Discard(someID));
EXPECT_FALSE(srcFacet.Rename(42U, u8"42"));
}
TEST_F(UTossSrcFacet, UnrelatedSource) {
auto& src = SrcManager().CreateNewRS();
EXPECT_NO_THROW(src.TriggerOpen());
EXPECT_NO_THROW(src.TriggerSave());
EXPECT_NO_THROW(src.TriggerClose());
EXPECT_FALSE(srcFacet.IsConnectedWith(src));
EXPECT_FALSE(srcFacet.Src2PID(src).has_value());
}
TEST_F(UTossSrcFacet, MissingSrc) {
auto[src, pid] = CreateBasicConnection();
SrcManager().DestroySource(*src);
EXPECT_TRUE(srcFacet(pid)->src == nullptr);
EXPECT_TRUE(srcFacet.OpenSrc(pid) == nullptr);
EXPECT_TRUE(srcFacet.ActiveSrc(pid) == nullptr);
EXPECT_TRUE(srcFacet.DataFor(pid) == nullptr);
EXPECT_EQ(srcFacet(pid)->desc.type, SrcType::rsDoc);
EXPECT_FALSE(std::empty(srcFacet(pid)->desc.name));
}
TEST_F(UTossSrcFacet, ActiveSrc) {
auto[src, pid] = CreateBasicConnection();
EXPECT_EQ(srcFacet.ActiveSrc(pid), src);
src->TriggerClose();
EXPECT_TRUE(srcFacet.ActiveSrc(pid) == nullptr);
EXPECT_EQ(srcFacet.OpenSrc(pid), src);
}
TEST_F(UTossSrcFacet, ConnectPict2Src) {
auto[src, pid] = CreateBasicConnection();
ASSERT_EQ(srcFacet(pid)->src, src);
EXPECT_EQ(srcFacet(pid)->desc.type, SrcType::rsDoc);
EXPECT_TRUE(src->IsClaimed());
EXPECT_TRUE(srcFacet.ConnectPict2Src(pid, *src));
}
TEST_F(UTossSrcFacet, ConnectUnsavable) {
auto& src = SrcManager().CreateNewRS();
auto pid = oss.InsertBase()->uid;
src.unsavable = true;
EXPECT_FALSE(srcFacet.ConnectPict2Src(pid, src));
EXPECT_FALSE(srcFacet.ConnectSrc2Pict(pid, src));
}
TEST_F(UTossSrcFacet, ConnectDual) {
auto[src, pid] = CreateBasicConnection();
const auto pid2 = oss.InsertBase()->uid;
EXPECT_FALSE(srcFacet.ConnectPict2Src(pid2, *src));
}
TEST_F(UTossSrcFacet, ConnectDataIn) {
auto& src = SrcManager().CreateNewRS();
const std::string testStr{ "test" };
src.schema.title = testStr;
src.schema.alias = testStr;
src.schema.comment = testStr;
const auto hash1 = src.schema.CoreHash();
const auto hash2 = src.schema.FullHash();
const auto pid = oss.InsertBase()->uid;
srcFacet.ConnectPict2Src(pid, src);
const auto* srcHandle = srcFacet(pid);
EXPECT_TRUE(src.fullName == srcHandle->desc.name);
EXPECT_EQ(oss(pid)->title, testStr);
EXPECT_EQ(oss(pid)->alias, testStr);
EXPECT_EQ(oss(pid)->comment, testStr);
EXPECT_EQ(srcHandle->desc.type, src.Type());
EXPECT_EQ(srcHandle->coreHash, hash1);
EXPECT_EQ(srcHandle->fullHash, hash2);
}
TEST_F(UTossSrcFacet, ConnectDataOut) {
auto& src = SrcManager().CreateNewRS();
EXPECT_FALSE(srcFacet.ConnectSrc2Pict(PictID{ 42 }, src));
const auto pid = oss.InsertBase()->uid;
const std::string testStr{ "test" };
oss.SetPictComment(pid, testStr);
oss.SetPictTitle(pid, testStr);
oss.SetPictAlias(pid, testStr);
ASSERT_TRUE(srcFacet.ConnectSrc2Pict(pid, src));
const auto* srcHandle = srcFacet(pid);
EXPECT_EQ(src.schema.alias, testStr);
EXPECT_EQ(src.schema.comment, testStr);
EXPECT_EQ(src.schema.title, testStr);
EXPECT_EQ(src.schema.CoreHash(), srcHandle->coreHash);
EXPECT_EQ(src.schema.FullHash(), srcHandle->fullHash);
}
TEST_F(UTossSrcFacet, ConnectToAnotherDesc) {
auto& src1 = SrcManager().CreateNewRS();
auto src1Desc = ccl::Environment::Sources().GetDescriptor(src1);
auto& src2 = SrcManager().CreateNewRS();
auto src2Desc = ccl::Environment::Sources().GetDescriptor(src2);
ASSERT_NE(src1Desc, src2Desc);
const auto pid = oss.InsertBase()->uid;
ASSERT_TRUE(srcFacet.ConnectPict2Src(pid, src1));
EXPECT_EQ(ccl::Environment::Sources().GetDescriptor(src1), src1Desc);
EXPECT_EQ(srcFacet(pid)->desc, src1Desc);
ASSERT_TRUE(srcFacet.ConnectPict2Src(pid, src2));
EXPECT_EQ(ccl::Environment::Sources().GetDescriptor(src1), src1Desc);
EXPECT_EQ(ccl::Environment::Sources().GetDescriptor(src2), src2Desc);
EXPECT_EQ(srcFacet(pid)->desc, src2Desc);
EXPECT_FALSE(src1.IsOpened());
EXPECT_FALSE(srcFacet.ConnectSrc2Pict(pid, src1));
src1.TriggerOpen();
ASSERT_TRUE(srcFacet.ConnectSrc2Pict(pid, src1));
EXPECT_EQ(ccl::Environment::Sources().GetDescriptor(src1), src1Desc);
EXPECT_EQ(ccl::Environment::Sources().GetDescriptor(src2), src2Desc);
EXPECT_EQ(srcFacet(pid)->desc, src1Desc);
}
TEST_F(UTossSrcFacet, ConnectReconnectToAnother) {
const auto pid = oss.InsertBase()->uid;
auto& src1 = SrcManager().CreateNewRS();
auto& src2 = SrcManager().CreateNewRS();
srcFacet.ConnectSrc2Pict(pid, src1);
EXPECT_TRUE(src1.IsOpened());
EXPECT_TRUE(src2.IsOpened());
srcFacet.ConnectSrc2Pict(pid, src2);
EXPECT_FALSE(src1.IsOpened());
EXPECT_TRUE(src2.IsOpened());
}
TEST_F(UTossSrcFacet, IsConnectedWith) {
auto[src, pid] = CreateBasicConnection();
EXPECT_TRUE(srcFacet.IsConnectedWith(*src));
}
TEST_F(UTossSrcFacet, IsAssociatedWith) {
auto[src, pid] = CreateBasicConnection();
oss.InsertBase();
const auto descriptor = srcFacet(pid)->desc;
const Descriptor invalid{ SrcType::rsDoc, u8"43" };
EXPECT_TRUE(srcFacet.IsAssociatedWith(descriptor));
EXPECT_FALSE(srcFacet.IsAssociatedWith(invalid));
src->TriggerClose();
EXPECT_TRUE(srcFacet.IsAssociatedWith(descriptor));
EXPECT_FALSE(srcFacet.IsAssociatedWith(invalid));
}
TEST_F(UTossSrcFacet, FindID) {
auto[src, pid] = CreateBasicConnection();
ASSERT_TRUE(srcFacet.Src2PID(*src).has_value());
EXPECT_EQ(srcFacet.Src2PID(*src).value(), pid);
}
TEST_F(UTossSrcFacet, IDForUnrelated) {
auto& src = SrcManager().CreateNewRS();
oss.InsertBase();
EXPECT_FALSE(srcFacet.Src2PID(src).has_value());
}
TEST_F(UTossSrcFacet, Rename) {
auto[src, pid] = CreateBasicConnection();
auto newName = src->fullName + u8"42";
EXPECT_TRUE(srcFacet.Rename(pid, newName));
EXPECT_EQ(srcFacet(pid)->src, src);
EXPECT_TRUE(newName == srcFacet(pid)->desc.name);
}
TEST_F(UTossSrcFacet, RenameEmpty) {
auto[src, pid] = CreateBasicConnection();
EXPECT_FALSE(srcFacet.Rename(pid, u8""));
EXPECT_EQ(srcFacet(pid)->src, src);
EXPECT_TRUE(src->fullName != u8"");
EXPECT_TRUE(src->fullName == srcFacet(pid)->desc.name);
}
TEST_F(UTossSrcFacet, RenameSameName) {
auto[src, pid] = CreateBasicConnection();
EXPECT_FALSE(srcFacet.Rename(pid, srcFacet(pid)->desc.name));
}
TEST_F(UTossSrcFacet, RenameNoSrc) {
const auto pid = oss.InsertBase()->uid;
EXPECT_TRUE(std::empty(srcFacet(pid)->desc.name));
EXPECT_FALSE(srcFacet.Rename(pid, u8"42"));
EXPECT_TRUE(std::empty(srcFacet(pid)->desc.name));
}
TEST_F(UTossSrcFacet, RenameMissingSrc) {
auto[src, pid] = CreateBasicConnection();
SrcManager().DestroySource(*src);
EXPECT_FALSE(srcFacet.Rename(pid, u8"42"));
EXPECT_FALSE(std::empty(srcFacet(pid)->desc.name));
}
TEST_F(UTossSrcFacet, RenameNameTakenByOpenSrc) {
auto[src, pid] = CreateBasicConnection();
auto& src2 = SrcManager().CreateNewRS();
EXPECT_FALSE(srcFacet.Rename(pid, src2.fullName));
}
TEST_F(UTossSrcFacet, RenameNameTakenByClosedSrc) {
auto[src, pid] = CreateBasicConnection();
auto& src2 = SrcManager().CreateNewRS();
src2.TriggerClose();
EXPECT_FALSE(srcFacet.Rename(pid, src2.fullName));
}
TEST_F(UTossSrcFacet, AutoConnectOtherFile) {
auto[src1, pid] = CreateBasicConnection();
src1->TriggerClose();
auto& src2 = SrcManager().CreateNewRS();
src2.fullName = src1->fullName;
src1->fullName = u8"";
src2.TriggerOpen();
EXPECT_EQ(srcFacet(pid)->src, &src2);
}
TEST_F(UTossSrcFacet, ReconnectAll) {
auto[src1, pid1] = CreateBasicConnection();
auto[src2, pid2] = CreateBasicConnection();
auto[src3, pid3] = CreateBasicConnection();
src1->TriggerClose();
src2->TriggerClose();
src2->OpenNoTrigger();
srcFacet.ReconnectAll();
EXPECT_TRUE(srcFacet(pid1)->src == nullptr);
EXPECT_TRUE(srcFacet(pid2)->src == src2);
EXPECT_TRUE(srcFacet(pid3)->src == src3);
}
TEST_F(UTossSrcFacet, ReconnectAllNameChanged) {
auto[src1, pid] = CreateBasicConnection();
src1->fullName = u8"42";
ASSERT_TRUE(u8"42" != srcFacet(pid)->desc.name);
srcFacet.ReconnectAll();
EXPECT_TRUE(srcFacet(pid)->src == nullptr);
EXPECT_FALSE(src1->IsOpened());
EXPECT_TRUE(u8"42" == src1->fullName);
}
TEST_F(UTossSrcFacet, DataFor) {
auto[src, pid] = CreateBasicConnection();
EXPECT_EQ(srcFacet.DataFor(pid), &src->schema);
src->TriggerClose();
EXPECT_EQ(srcFacet.DataFor(pid), &src->schema);
const auto pid2 = oss.InsertBase()->uid;
EXPECT_TRUE(srcFacet.DataFor(pid2) == nullptr);
}
TEST_F(UTossSrcFacet, DiscardSource) {
auto[src, pid] = CreateBasicConnection();
EXPECT_TRUE(src->IsClaimed());
srcFacet.Discard(pid);
EXPECT_TRUE(srcFacet(pid)->src == nullptr);
EXPECT_TRUE(std::empty(*srcFacet(pid)));
EXPECT_FALSE(src->IsClaimed());
}
TEST_F(UTossSrcFacet, DiscardOnErase) {
auto[src, pid] = CreateBasicConnection();
EXPECT_TRUE(src->IsClaimed());
EXPECT_TRUE(src->IsOpened());
ASSERT_TRUE(oss.Erase(pid));
EXPECT_FALSE(src->IsClaimed());
EXPECT_FALSE(src->IsOpened());
}
TEST_F(UTossSrcFacet, DiscardMissingSource) {
auto[src, pid] = CreateBasicConnection();
src->TriggerClose();
SrcManager().DestroySource(*src);
srcFacet.Discard(pid);
EXPECT_TRUE(srcFacet(pid)->src == nullptr);
EXPECT_TRUE(std::empty(*srcFacet(pid)));
}
TEST_F(UTossSrcFacet, DestructorCloseSource) {
auto newOss = std::make_unique<ccl::oss::OSSchema>();
auto& src = SrcManager().CreateNewRS();
const auto pid = newOss->InsertBase()->uid;
newOss->Src().ConnectPict2Src(pid, src);
EXPECT_TRUE(src.IsOpened());
newOss = nullptr;
EXPECT_FALSE(src.IsOpened());
}
TEST_F(UTossSrcFacet, OnChangeUpdate) {
auto[src, pid] = CreateBasicConnection();
src->schema.Emplace(CstType::base);
src->schema.comment = "123";
EXPECT_NE(srcFacet(pid)->coreHash, src->schema.CoreHash());
EXPECT_NE(oss(pid)->comment, "123");
src->TriggerSave();
EXPECT_EQ(srcFacet(pid)->coreHash, src->schema.CoreHash());
EXPECT_EQ(oss(pid)->comment, "123");
}
TEST_F(UTossSrcFacet, OnCloseDisconnect) {
auto[src, pid] = CreateBasicConnection();
src->TriggerClose();
EXPECT_TRUE(srcFacet(pid)->src == nullptr);
EXPECT_FALSE(src->IsClaimed());
}
TEST_F(UTossSrcFacet, OnOpenConnect) {
auto[src, pid] = CreateBasicConnection();
auto* src2 = &SrcManager().CreateNewRS();
src->TriggerClose();
src2->TriggerClose();
src2->TriggerOpen();
EXPECT_TRUE(srcFacet(pid)->src == nullptr);
src->TriggerOpen();
EXPECT_EQ(srcFacet(pid)->src, src);
EXPECT_TRUE(src->IsClaimed());
src->TriggerClose();
SrcManager().rejectDomain = true;
src->TriggerOpen();
EXPECT_TRUE(srcFacet(pid)->src == nullptr);
EXPECT_FALSE(src->IsClaimed());
}