Skip to content
Snippets Groups Projects
Commit 0d7bbabb authored by Mikhail Svechnikov's avatar Mikhail Svechnikov
Browse files

FitSuiteItem: r/w FitParameterContainer

parent b5bf8a10
No related branches found
No related tags found
1 merge request!1120GUI: FitParameterModel and fit items are refactored
...@@ -12,12 +12,23 @@ ...@@ -12,12 +12,23 @@
// //
// ************************************************************************************************ // ************************************************************************************************
#include "GUI/Model/Job/FitSuiteItem.h"
#include "GUI/Model/Job/FitParameterContainerItem.h" #include "GUI/Model/Job/FitParameterContainerItem.h"
#include "GUI/Model/Job/FitSuiteItem.h"
#include "GUI/Model/Job/MinimizerItem.h" #include "GUI/Model/Job/MinimizerItem.h"
#include "GUI/Model/Model/SessionModel.h" #include "GUI/Model/Model/SessionModel.h"
#include "GUI/Support/XML/UtilXML.h"
#include "GUI/Util/Error.h" #include "GUI/Util/Error.h"
namespace {
namespace Tag {
const QString FitParameterContainer("FitParameterContainer");
} // namespace Tag
} // namespace
FitSuiteItem::FitSuiteItem() FitSuiteItem::FitSuiteItem()
: SessionItem(M_TYPE) : SessionItem(M_TYPE)
{ {
...@@ -96,3 +107,30 @@ void FitSuiteItem::setChi2(const double chi2) ...@@ -96,3 +107,30 @@ void FitSuiteItem::setChi2(const double chi2)
{ {
setItemValue(P_CHI2, chi2); setItemValue(P_CHI2, chi2);
} }
void FitSuiteItem::writeNonSessionItems(QXmlStreamWriter *writer) const
{
// fit parameter container
if(m_fitContainer) {
writer->writeStartElement(Tag::FitParameterContainer);
m_fitContainer->writeTo(writer);
writer->writeEndElement();
}
}
void FitSuiteItem::readNonSessionItems(QXmlStreamReader *reader)
{
while (reader->readNextStartElement()) {
// fit parameter container
if (reader->name() == Tag::FitParameterContainer) {
if(!m_fitContainer)
createFitParametersContainer();
m_fitContainer->readFrom(reader);
GUI::Session::XML::gotoEndElementOfTag(reader, Tag::FitParameterContainer);
} else {
reader->skipCurrentElement();
}
}
}
...@@ -49,6 +49,9 @@ public: ...@@ -49,6 +49,9 @@ public:
double chi2() const; double chi2() const;
void setChi2(double chi2); void setChi2(double chi2);
void writeNonSessionItems(QXmlStreamWriter* writer) const override;
void readNonSessionItems(QXmlStreamReader* reader) override;
signals: signals:
void iterationCountChanged(int count); void iterationCountChanged(int count);
void updateIntervalChanged(int interval); void updateIntervalChanged(int interval);
......
#include "GUI/Model/Job/FitParameterContainerItem.h" //#include "GUI/Model/Job/FitParameterContainerItem.h"
#include "GUI/Model/Job/FitParameterItem.h" //#include "GUI/Model/Job/FitParameterItem.h"
#include "GUI/Model/Job/FitParameterLinkItem.h" //#include "GUI/Model/Job/FitParameterLinkItem.h"
#include "GUI/Model/Job/FitSuiteItem.h" //#include "GUI/Model/Job/FitSuiteItem.h"
#include "GUI/Model/Model/FitParameterModel.h" //#include "GUI/Model/Model/FitParameterModel.h"
#include "GUI/Model/Model/JobModel.h" //#include "GUI/Model/Model/JobModel.h"
#include "Tests/GTestWrapper/google_test.h" //#include "Tests/GTestWrapper/google_test.h"
class TestFitParameterModel : public ::testing::Test {}; //class TestFitParameterModel : public ::testing::Test {};
TEST_F(TestFitParameterModel, InitialState) //TEST_F(TestFitParameterModel, InitialState)
{ //{
JobModel source; // JobModel source;
auto* fitSuiteItem = source.insertItem<FitSuiteItem>(); // auto* fitSuiteItem = source.insertItem<FitSuiteItem>();
auto* container = fitSuiteItem->createFitParametersContainer(); // auto* container = fitSuiteItem->createFitParametersContainer();
FitParameterModel proxy(dynamic_cast<FitParameterContainerItem*>(container)); // FitParameterModel proxy(dynamic_cast<FitParameterContainerItem*>(container));
EXPECT_EQ(0, proxy.rowCount(QModelIndex())); // EXPECT_EQ(0, proxy.rowCount(QModelIndex()));
EXPECT_EQ(static_cast<int>(FitParameterModel::NUM_COLUMNS), proxy.columnCount(QModelIndex())); // EXPECT_EQ(static_cast<int>(FitParameterModel::NUM_COLUMNS), proxy.columnCount(QModelIndex()));
EXPECT_EQ(container, proxy.itemForIndex(QModelIndex())); // EXPECT_EQ(container, proxy.itemForIndex(QModelIndex()));
} //}
TEST_F(TestFitParameterModel, addFitParameter) //TEST_F(TestFitParameterModel, addFitParameter)
{ //{
JobModel source; // JobModel source;
auto* fitSuiteItem = source.insertItem<FitSuiteItem>(); // auto* fitSuiteItem = source.insertItem<FitSuiteItem>();
auto* container = fitSuiteItem->createFitParametersContainer(); // auto* container = fitSuiteItem->createFitParametersContainer();
FitParameterModel proxy(dynamic_cast<FitParameterContainerItem*>(container)); // FitParameterModel proxy(dynamic_cast<FitParameterContainerItem*>(container));
// adding fit parameter // // adding fit parameter
auto* fitPar0 = source.insertItem<FitParameterItem>(container); // auto* fitPar0 = source.insertItem<FitParameterItem>(container);
fitPar0->setDisplayName("par"); // fitPar0->setDisplayName("par");
fitPar0->setMinimum(1.0); // fitPar0->setMinimum(1.0);
fitPar0->setMaximum(2.0); // fitPar0->setMaximum(2.0);
fitPar0->setStartValue(3.0); // fitPar0->setStartValue(3.0);
// checking index of root // // checking index of root
EXPECT_EQ(1, proxy.rowCount(QModelIndex())); // EXPECT_EQ(1, proxy.rowCount(QModelIndex()));
EXPECT_EQ(FitParameterModel::NUM_COLUMNS, proxy.columnCount(QModelIndex())); // EXPECT_EQ(FitParameterModel::NUM_COLUMNS, proxy.columnCount(QModelIndex()));
// accessing item at col=0 (original FitParameterItem) // // accessing item at col=0 (original FitParameterItem)
QModelIndex index = proxy.index(0, 0, QModelIndex()); // QModelIndex index = proxy.index(0, 0, QModelIndex());
EXPECT_EQ(index.row(), 0); // EXPECT_EQ(index.row(), 0);
EXPECT_EQ(index.column(), 0); // EXPECT_EQ(index.column(), 0);
EXPECT_EQ(proxy.rowCount(index), 0); // EXPECT_EQ(proxy.rowCount(index), 0);
EXPECT_EQ(proxy.columnCount(index), 0); // non existing linkItem // EXPECT_EQ(proxy.columnCount(index), 0); // non existing linkItem
EXPECT_EQ(fitPar0, proxy.itemForIndex(index)); // EXPECT_EQ(fitPar0, proxy.itemForIndex(index));
EXPECT_EQ(fitPar0->displayName(), proxy.data(index).toString()); // EXPECT_EQ(fitPar0->displayName(), proxy.data(index).toString());
EXPECT_EQ(index, proxy.indexOfItem(fitPar0)); // EXPECT_EQ(index, proxy.indexOfItem(fitPar0));
// accessing item at col=2 // // accessing item at col=2
index = proxy.index(0, FitParameterModel::COL_MIN, QModelIndex()); // index = proxy.index(0, FitParameterModel::COL_MIN, QModelIndex());
EXPECT_EQ(index.row(), 0); // EXPECT_EQ(index.row(), 0);
EXPECT_EQ(index.column(), FitParameterModel::COL_MIN); // EXPECT_EQ(index.column(), FitParameterModel::COL_MIN);
EXPECT_EQ(proxy.rowCount(index), 0); // EXPECT_EQ(proxy.rowCount(index), 0);
EXPECT_EQ(proxy.columnCount(index), 0); // EXPECT_EQ(proxy.columnCount(index), 0);
EXPECT_EQ(fitPar0->minimumItem(), proxy.itemForIndex(index)); // EXPECT_EQ(fitPar0->minimumItem(), proxy.itemForIndex(index));
EXPECT_EQ(fitPar0->minimum(), proxy.data(index).toDouble()); // EXPECT_EQ(fitPar0->minimum(), proxy.data(index).toDouble());
EXPECT_EQ(index, proxy.indexOfItem(fitPar0->minimumItem())); // EXPECT_EQ(index, proxy.indexOfItem(fitPar0->minimumItem()));
// accessing item at col=3 // // accessing item at col=3
index = proxy.index(0, FitParameterModel::COL_VALUE, QModelIndex()); // index = proxy.index(0, FitParameterModel::COL_VALUE, QModelIndex());
EXPECT_EQ(index.row(), 0); // EXPECT_EQ(index.row(), 0);
EXPECT_EQ(index.column(), FitParameterModel::COL_VALUE); // EXPECT_EQ(index.column(), FitParameterModel::COL_VALUE);
EXPECT_EQ(proxy.rowCount(index), 0); // EXPECT_EQ(proxy.rowCount(index), 0);
EXPECT_EQ(proxy.columnCount(index), 0); // EXPECT_EQ(proxy.columnCount(index), 0);
EXPECT_EQ(fitPar0->startValueItem(), proxy.itemForIndex(index)); // EXPECT_EQ(fitPar0->startValueItem(), proxy.itemForIndex(index));
EXPECT_EQ(fitPar0->startValue(), proxy.data(index).toDouble()); // EXPECT_EQ(fitPar0->startValue(), proxy.data(index).toDouble());
EXPECT_EQ(index, proxy.indexOfItem(fitPar0->startValueItem())); // EXPECT_EQ(index, proxy.indexOfItem(fitPar0->startValueItem()));
// accessing item at col=4 // // accessing item at col=4
index = proxy.index(0, FitParameterModel::COL_MAX, QModelIndex()); // index = proxy.index(0, FitParameterModel::COL_MAX, QModelIndex());
EXPECT_EQ(index.row(), 0); // EXPECT_EQ(index.row(), 0);
EXPECT_EQ(index.column(), FitParameterModel::COL_MAX); // EXPECT_EQ(index.column(), FitParameterModel::COL_MAX);
EXPECT_EQ(proxy.rowCount(index), 0); // EXPECT_EQ(proxy.rowCount(index), 0);
EXPECT_EQ(proxy.columnCount(index), 0); // EXPECT_EQ(proxy.columnCount(index), 0);
EXPECT_EQ(fitPar0->maximumItem(), proxy.itemForIndex(index)); // EXPECT_EQ(fitPar0->maximumItem(), proxy.itemForIndex(index));
EXPECT_EQ(fitPar0->maximum(), proxy.data(index).toDouble()); // EXPECT_EQ(fitPar0->maximum(), proxy.data(index).toDouble());
EXPECT_EQ(index, proxy.indexOfItem(fitPar0->maximumItem())); // EXPECT_EQ(index, proxy.indexOfItem(fitPar0->maximumItem()));
// ---------------------------------------------------- // // ----------------------------------------------------
// adding second fit parameter // // adding second fit parameter
// ---------------------------------------------------- // // ----------------------------------------------------
auto* fitPar1 = source.insertItem<FitParameterItem>(container); // auto* fitPar1 = source.insertItem<FitParameterItem>(container);
fitPar0->setDisplayName("par"); // fitPar0->setDisplayName("par");
fitPar0->setMinimum(10.0); // fitPar0->setMinimum(10.0);
fitPar0->setMaximum(20.0); // fitPar0->setMaximum(20.0);
fitPar0->setStartValue(30.0); // fitPar0->setStartValue(30.0);
// checking index of root // // checking index of root
EXPECT_EQ(2, proxy.rowCount(QModelIndex())); // EXPECT_EQ(2, proxy.rowCount(QModelIndex()));
EXPECT_EQ(FitParameterModel::NUM_COLUMNS, proxy.columnCount(QModelIndex())); // EXPECT_EQ(FitParameterModel::NUM_COLUMNS, proxy.columnCount(QModelIndex()));
// accessing item at col=3 for fitPar0 // // accessing item at col=3 for fitPar0
index = proxy.index(0, FitParameterModel::COL_VALUE, QModelIndex()); // index = proxy.index(0, FitParameterModel::COL_VALUE, QModelIndex());
EXPECT_EQ(index.row(), 0); // EXPECT_EQ(index.row(), 0);
EXPECT_EQ(index.column(), FitParameterModel::COL_VALUE); // EXPECT_EQ(index.column(), FitParameterModel::COL_VALUE);
EXPECT_EQ(proxy.rowCount(index), 0); // EXPECT_EQ(proxy.rowCount(index), 0);
EXPECT_EQ(proxy.columnCount(index), 0); // EXPECT_EQ(proxy.columnCount(index), 0);
EXPECT_EQ(fitPar0->startValueItem(), proxy.itemForIndex(index)); // EXPECT_EQ(fitPar0->startValueItem(), proxy.itemForIndex(index));
EXPECT_EQ(fitPar0->startValue(), proxy.data(index).toDouble()); // EXPECT_EQ(fitPar0->startValue(), proxy.data(index).toDouble());
EXPECT_EQ(index, proxy.indexOfItem(fitPar0->startValueItem())); // EXPECT_EQ(index, proxy.indexOfItem(fitPar0->startValueItem()));
// accessing item at col=3 for fitPar1 // // accessing item at col=3 for fitPar1
index = proxy.index(1, FitParameterModel::COL_VALUE, QModelIndex()); // index = proxy.index(1, FitParameterModel::COL_VALUE, QModelIndex());
EXPECT_EQ(index.row(), 1); // EXPECT_EQ(index.row(), 1);
EXPECT_EQ(index.column(), FitParameterModel::COL_VALUE); // EXPECT_EQ(index.column(), FitParameterModel::COL_VALUE);
EXPECT_EQ(proxy.rowCount(index), 0); // EXPECT_EQ(proxy.rowCount(index), 0);
EXPECT_EQ(proxy.columnCount(index), 0); // EXPECT_EQ(proxy.columnCount(index), 0);
EXPECT_EQ(fitPar1->startValueItem(), proxy.itemForIndex(index)); // EXPECT_EQ(fitPar1->startValueItem(), proxy.itemForIndex(index));
EXPECT_EQ(fitPar1->startValue(), proxy.data(index).toDouble()); // EXPECT_EQ(fitPar1->startValue(), proxy.data(index).toDouble());
EXPECT_EQ(index, proxy.indexOfItem(fitPar1->startValueItem())); // EXPECT_EQ(index, proxy.indexOfItem(fitPar1->startValueItem()));
} //}
TEST_F(TestFitParameterModel, addFitParameterAndLink) //TEST_F(TestFitParameterModel, addFitParameterAndLink)
{ //{
JobModel source; // JobModel source;
auto* fitSuiteItem = source.insertItem<FitSuiteItem>(); // auto* fitSuiteItem = source.insertItem<FitSuiteItem>();
auto* container = fitSuiteItem->createFitParametersContainer(); // auto* container = fitSuiteItem->createFitParametersContainer();
FitParameterModel proxy(dynamic_cast<FitParameterContainerItem*>(container)); // FitParameterModel proxy(dynamic_cast<FitParameterContainerItem*>(container));
// adding fit parameter // // adding fit parameter
auto* fitPar0 = source.insertItem<FitParameterItem>(container); // auto* fitPar0 = source.insertItem<FitParameterItem>(container);
fitPar0->setDisplayName("par"); // fitPar0->setDisplayName("par");
fitPar0->setMinimum(1.0); // fitPar0->setMinimum(1.0);
fitPar0->setMaximum(2.0); // fitPar0->setMaximum(2.0);
fitPar0->setStartValue(3.0); // fitPar0->setStartValue(3.0);
// adding link // // adding link
auto* link0 = source.insertItem<FitParameterLinkItem>(fitPar0); // auto* link0 = source.insertItem<FitParameterLinkItem>(fitPar0);
link0->setLink("link0"); // link0->setLink("link0");
link0->setTitle("TitleOfLink0"); // link0->setTitle("TitleOfLink0");
// checking index of root // // checking index of root
EXPECT_EQ(1, proxy.rowCount(QModelIndex())); // EXPECT_EQ(1, proxy.rowCount(QModelIndex()));
EXPECT_EQ(FitParameterModel::NUM_COLUMNS, proxy.columnCount(QModelIndex())); // EXPECT_EQ(FitParameterModel::NUM_COLUMNS, proxy.columnCount(QModelIndex()));
// accessing item at col=0 (original FitParameterItem) // // accessing item at col=0 (original FitParameterItem)
QModelIndex index = proxy.index(0, 0, QModelIndex()); // QModelIndex index = proxy.index(0, 0, QModelIndex());
EXPECT_EQ(index.row(), 0); // EXPECT_EQ(index.row(), 0);
EXPECT_EQ(index.column(), 0); // EXPECT_EQ(index.column(), 0);
EXPECT_EQ(proxy.rowCount(index), 1); // EXPECT_EQ(proxy.rowCount(index), 1);
EXPECT_EQ(proxy.columnCount(index), 1); // linkItem // EXPECT_EQ(proxy.columnCount(index), 1); // linkItem
// testing link0 index // // testing link0 index
QModelIndex linkIndex = proxy.index(0, 0, index); // QModelIndex linkIndex = proxy.index(0, 0, index);
EXPECT_EQ(linkIndex.row(), 0); // EXPECT_EQ(linkIndex.row(), 0);
EXPECT_EQ(linkIndex.column(), 0); // EXPECT_EQ(linkIndex.column(), 0);
EXPECT_EQ(linkIndex.parent(), index); // EXPECT_EQ(linkIndex.parent(), index);
EXPECT_EQ(proxy.rowCount(linkIndex), 0); // EXPECT_EQ(proxy.rowCount(linkIndex), 0);
EXPECT_EQ(proxy.columnCount(linkIndex), 0); // EXPECT_EQ(proxy.columnCount(linkIndex), 0);
EXPECT_EQ(proxy.parent(linkIndex), index); // EXPECT_EQ(proxy.parent(linkIndex), index);
EXPECT_EQ(proxy.itemForIndex(linkIndex), link0->linkItem()); // EXPECT_EQ(proxy.itemForIndex(linkIndex), link0->linkItem());
EXPECT_EQ(link0->title(), proxy.data(linkIndex).toString()); // EXPECT_EQ(link0->title(), proxy.data(linkIndex).toString());
EXPECT_EQ(linkIndex, proxy.indexOfItem(link0->linkItem())); // EXPECT_EQ(linkIndex, proxy.indexOfItem(link0->linkItem()));
// adding second link // // adding second link
auto* link1 = source.insertItem<FitParameterLinkItem>(fitPar0); // auto* link1 = source.insertItem<FitParameterLinkItem>(fitPar0);
link1->setLink("link1"); // link1->setLink("link1");
EXPECT_EQ(proxy.rowCount(index), 2); // EXPECT_EQ(proxy.rowCount(index), 2);
EXPECT_EQ(proxy.columnCount(index), 1); // linkItem // EXPECT_EQ(proxy.columnCount(index), 1); // linkItem
linkIndex = proxy.index(1, 0, index); // linkIndex = proxy.index(1, 0, index);
EXPECT_EQ(linkIndex.row(), 1); // EXPECT_EQ(linkIndex.row(), 1);
EXPECT_EQ(linkIndex.column(), 0); // EXPECT_EQ(linkIndex.column(), 0);
EXPECT_EQ(linkIndex.parent(), index); // EXPECT_EQ(linkIndex.parent(), index);
EXPECT_EQ(proxy.rowCount(linkIndex), 0); // EXPECT_EQ(proxy.rowCount(linkIndex), 0);
EXPECT_EQ(proxy.columnCount(linkIndex), 0); // EXPECT_EQ(proxy.columnCount(linkIndex), 0);
EXPECT_EQ(proxy.parent(linkIndex), index); // EXPECT_EQ(proxy.parent(linkIndex), index);
EXPECT_EQ(proxy.parent(linkIndex), index); // EXPECT_EQ(proxy.parent(linkIndex), index);
EXPECT_EQ(proxy.itemForIndex(linkIndex), link1->linkItem()); // EXPECT_EQ(proxy.itemForIndex(linkIndex), link1->linkItem());
} //}
TEST_F(TestFitParameterModel, addTwoFitParameterAndLinks) //TEST_F(TestFitParameterModel, addTwoFitParameterAndLinks)
{ //{
JobModel source; // JobModel source;
auto* fitSuiteItem = source.insertItem<FitSuiteItem>(); // auto* fitSuiteItem = source.insertItem<FitSuiteItem>();
auto* container = fitSuiteItem->createFitParametersContainer(); // auto* container = fitSuiteItem->createFitParametersContainer();
FitParameterModel proxy(dynamic_cast<FitParameterContainerItem*>(container)); // FitParameterModel proxy(dynamic_cast<FitParameterContainerItem*>(container));
// adding fit parameters // // adding fit parameters
auto* fitPar0 = source.insertItem<FitParameterItem>(container); // auto* fitPar0 = source.insertItem<FitParameterItem>(container);
auto* link0 = source.insertItem<FitParameterLinkItem>(fitPar0); // auto* link0 = source.insertItem<FitParameterLinkItem>(fitPar0);
Q_UNUSED(link0); // Q_UNUSED(link0);
auto* fitPar1 = source.insertItem<FitParameterItem>(container); // auto* fitPar1 = source.insertItem<FitParameterItem>(container);
auto* link1 = source.insertItem<FitParameterLinkItem>(fitPar1); // auto* link1 = source.insertItem<FitParameterLinkItem>(fitPar1);
Q_UNUSED(link1); // Q_UNUSED(link1);
// checking index of root // // checking index of root
EXPECT_EQ(2, proxy.rowCount(QModelIndex())); // EXPECT_EQ(2, proxy.rowCount(QModelIndex()));
EXPECT_EQ(FitParameterModel::NUM_COLUMNS, proxy.columnCount(QModelIndex())); // EXPECT_EQ(FitParameterModel::NUM_COLUMNS, proxy.columnCount(QModelIndex()));
// accessing fitPar1 // // accessing fitPar1
QModelIndex index1 = proxy.index(1, 0, QModelIndex()); // QModelIndex index1 = proxy.index(1, 0, QModelIndex());
EXPECT_EQ(index1.row(), 1); // EXPECT_EQ(index1.row(), 1);
EXPECT_EQ(index1.column(), 0); // EXPECT_EQ(index1.column(), 0);
EXPECT_EQ(index1.parent(), QModelIndex()); // EXPECT_EQ(index1.parent(), QModelIndex());
EXPECT_EQ(proxy.rowCount(index1), 1); // EXPECT_EQ(proxy.rowCount(index1), 1);
EXPECT_EQ(proxy.columnCount(index1), 1); // EXPECT_EQ(proxy.columnCount(index1), 1);
EXPECT_EQ(fitPar1, proxy.itemForIndex(index1)); // EXPECT_EQ(fitPar1, proxy.itemForIndex(index1));
EXPECT_EQ(fitPar1->displayName(), proxy.data(index1).toString()); // EXPECT_EQ(fitPar1->displayName(), proxy.data(index1).toString());
EXPECT_EQ(index1, proxy.indexOfItem(fitPar1)); // EXPECT_EQ(index1, proxy.indexOfItem(fitPar1));
// accessing link1 // // accessing link1
QModelIndex linkIndex1 = proxy.index(0, 0, index1); // QModelIndex linkIndex1 = proxy.index(0, 0, index1);
EXPECT_EQ(linkIndex1.row(), 0); // EXPECT_EQ(linkIndex1.row(), 0);
EXPECT_EQ(linkIndex1.column(), 0); // EXPECT_EQ(linkIndex1.column(), 0);
EXPECT_EQ(linkIndex1.parent(), index1); // EXPECT_EQ(linkIndex1.parent(), index1);
EXPECT_EQ(proxy.rowCount(linkIndex1), 0); // EXPECT_EQ(proxy.rowCount(linkIndex1), 0);
EXPECT_EQ(proxy.columnCount(linkIndex1), 0); // EXPECT_EQ(proxy.columnCount(linkIndex1), 0);
} //}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment