Skip to content
Snippets Groups Projects
TestDataItemViews.cpp 6.12 KiB
#include "google_test.h"
#include "ApplicationModels.h"
#include "ComboProperty.h"
#include "DataItem.h"
#include "DataPropertyContainer.h"
#include "DataProperties.h"
#include "GUIHelpers.h"
#include "MessageService.h"
#include "projectdocument.h"
#include "RealDataModel.h"
#include "SessionModel.h"
#include "test_utils.h"

class TestDataItemViews : public ::testing::Test
{
public:
    ~TestDataItemViews();

    DataItem* insertNewDataItem(SessionModel& model, double val);
};

TestDataItemViews::~TestDataItemViews() = default;

DataItem* TestDataItemViews::insertNewDataItem(SessionModel& model, double val)
{
    DataItem* item = dynamic_cast<DataItem*>(model.insertNewItem(Constants::SpecularDataType));
    auto data = TestUtils::createData(val, TestUtils::DIM::D1);
    item->setOutputData(data.release());
    return item;
}

TEST_F(TestDataItemViews, testDataLinking)
{
    SessionModel model("TempModel");
    auto view_item = dynamic_cast<DataPropertyContainer*>(model.insertNewItem(Constants::DataPropertyContainerType));
    DataItem* item = insertNewDataItem(model, 0.0);
    view_item->addItem(item);

    auto stored_items = view_item->propertyItems();
    EXPECT_EQ(stored_items.size(), 1);
    EXPECT_EQ(stored_items[0]->dataItem(), item);
}

TEST_F(TestDataItemViews, testLinkingSeveralItems)
{
    SessionModel model("TempModel");
    auto view_item = dynamic_cast<DataPropertyContainer*>(model.insertNewItem(Constants::DataPropertyContainerType));
    DataItem* item = insertNewDataItem(model, 0.0);
    DataItem* item2 = insertNewDataItem(model, 1.0);
    DataItem* item3 = insertNewDataItem(model, 2.0);
    view_item->addItem(item);
    view_item->addItem(item2);
    view_item->addItem(item3);

    auto stored_items = view_item->propertyItems();
    EXPECT_EQ(stored_items.size(), 3);
    EXPECT_EQ(stored_items[0]->dataItem(), item);
    EXPECT_EQ(stored_items[1]->dataItem(), item2);
    EXPECT_EQ(stored_items[2]->dataItem(), item3);
}

TEST_F(TestDataItemViews, testColors)
{
    SessionModel model("TempModel");
    auto view_item = dynamic_cast<DataPropertyContainer*>(model.insertNewItem(Constants::DataPropertyContainerType));
    DataItem* item = insertNewDataItem(model, 0.0);
    DataItem* item2 = insertNewDataItem(model, 1.0);
    DataItem* item3 = insertNewDataItem(model, 2.0);
    DataItem* item4 = insertNewDataItem(model, 3.0);
    DataItem* item5 = insertNewDataItem(model, 4.0);
    DataItem* item6 = insertNewDataItem(model, 5.0);
    DataItem* item7 = insertNewDataItem(model, 6.0);
    view_item->addItem(item);
    view_item->addItem(item2);
    view_item->addItem(item3);
    view_item->addItem(item4);
    view_item->addItem(item5);
    view_item->addItem(item6);
    view_item->addItem(item7);

    auto stored_items = view_item->propertyItems();
    auto getColorName = [](SessionItem* item) {
        QString P_COLOR = Data1DProperties::P_COLOR; // analogue of using
        auto name = item->getItemValue(P_COLOR).value<ComboProperty>().getValue();
        return name;
    };

    EXPECT_EQ(stored_items.size(), 7);
    EXPECT_EQ(getColorName(stored_items[0]), "Black");
    EXPECT_EQ(getColorName(stored_items[1]), "Blue");
    EXPECT_EQ(getColorName(stored_items[2]), "Red");
    EXPECT_EQ(getColorName(stored_items[3]), "Cyan");
    EXPECT_EQ(getColorName(stored_items[4]), "Gray");
    EXPECT_EQ(getColorName(stored_items[5]), "Magenta");
    EXPECT_EQ(getColorName(stored_items[6]), "Black");
}

TEST_F(TestDataItemViews, testBrokenLink)
{
    SessionModel model("TempModel");
    auto view_item = dynamic_cast<DataPropertyContainer*>(model.insertNewItem(Constants::DataPropertyContainerType));
    DataItem* item = insertNewDataItem(model, 0.0);
    view_item->addItem(item);

    auto stored_items = view_item->propertyItems();
    EXPECT_EQ(stored_items.size(), 1);
    EXPECT_EQ(stored_items[0]->dataItem(), item);

    DataItem* item2 = insertNewDataItem(model, 1.0);
    view_item->addItem(item2);
    EXPECT_THROW(view_item->propertyItem(0)->dataItem(), GUIHelpers::Error);
}

TEST_F(TestDataItemViews, testWrongHostingModel)
{
    SessionModel model("TempModel");
    DataItem* item = insertNewDataItem(model, 0.0);
    auto view_item = dynamic_cast<DataPropertyContainer*>(model.insertNewItem(Constants::DataPropertyContainerType));
    view_item->addItem(item);

    SessionModel model2("TempModel2");
    DataItem* item2 = insertNewDataItem(model2, 1.0);
    EXPECT_THROW(view_item->addItem(item2), GUIHelpers::Error);

    auto stored_items = view_item->propertyItems();
    EXPECT_EQ(stored_items.size(), 1);
    EXPECT_EQ(stored_items[0]->dataItem(), item);
}

TEST_F(TestDataItemViews, testSavingLinkedData)
{
    const QString projectDir("test_savingLinkedData");
    TestUtils::create_dir(projectDir);
    const QString projectFileName(projectDir + "/document.pro");
    {
        ApplicationModels models;
        ProjectDocument document;

        SessionModel* real_data_model = models.realDataModel();
        DataItem* item = insertNewDataItem(*real_data_model, 0.0);
        DataItem* item2 = insertNewDataItem(*real_data_model, 1.0);
        auto view_item = dynamic_cast<DataPropertyContainer*>(
            real_data_model->insertNewItem(Constants::DataPropertyContainerType));
        view_item->addItem(item);
        view_item->addItem(item2);

        document.setApplicationModels(&models);
        document.save(projectFileName);
    }

    ApplicationModels models;
    MessageService message_service;
    ProjectDocument document;
    document.setApplicationModels(&models);
    document.setLogger(&message_service);
    document.load(projectFileName);

    SessionModel* real_data_model = models.realDataModel();
    auto view_item = real_data_model->topItem<DataPropertyContainer>();
    EXPECT_TRUE(view_item);

    auto linked_items = view_item->propertyItems();
    auto model_items = real_data_model->topItems<DataItem>();
    EXPECT_EQ(linked_items.size(), 2);
    EXPECT_EQ(model_items.size(), 2);
    for (auto item : model_items) {
        auto data_item = dynamic_cast<DataItem*>(item);
        EXPECT_TRUE(data_item);
        EXPECT_TRUE(data_item == linked_items[0]->dataItem()
                    || data_item == linked_items[1]->dataItem());
    }
}